Merge "selenium: invoke jobs to enforce eventual consistency"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 21 Sep 2018 07:59:13 +0000 (07:59 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 21 Sep 2018 07:59:13 +0000 (07:59 +0000)
570 files changed:
.eslintrc.json
.gitattributes
.phpcs.xml
HISTORY
RELEASE-NOTES-1.32
autoload.php
composer.json
docs/design.txt [deleted file]
docs/distributors.txt
docs/hooks.txt
includes/AutoLoader.php
includes/CategoryViewer.php
includes/DefaultSettings.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/OutputPage.php
includes/Revision/RenderedRevision.php
includes/Revision/SlotRenderingProvider.php [new file with mode: 0644]
includes/Storage/DerivedPageDataUpdater.php
includes/Storage/RevisionArchiveRecord.php
includes/Storage/RevisionRecord.php
includes/Storage/RevisionStore.php
includes/Storage/RevisionStoreRecord.php
includes/Title.php
includes/WebRequest.php
includes/actions/RollbackAction.php
includes/api/ApiLogin.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryInfo.php
includes/api/i18n/ar.json
includes/api/i18n/ja.json
includes/api/i18n/nb.json
includes/api/i18n/zh-hant.json
includes/cache/localisation/LocalisationCache.php
includes/changes/ChangesListBooleanFilter.php
includes/collation/Collation.php
includes/collation/CollationEt.php [deleted file]
includes/collation/IcuCollation.php
includes/content/Content.php
includes/content/ContentHandler.php
includes/diff/DifferenceEngine.php
includes/exception/MWException.php
includes/exception/MWExceptionRenderer.php
includes/filerepo/file/LocalFile.php
includes/gallery/PackedImageGallery.php
includes/htmlform/fields/HTMLFloatField.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/htmlform/fields/HTMLTextField.php
includes/installer/i18n/bg.json
includes/installer/i18n/nap.json
includes/installer/i18n/roa-tara.json
includes/jobqueue/JobQueueDB.php
includes/jobqueue/jobs/CategoryMembershipChangeJob.php
includes/libs/virtualrest/ParsoidVirtualRESTService.php
includes/mail/MailAddress.php
includes/media/JpegHandler.php
includes/page/Article.php
includes/page/ImageHistoryList.php
includes/page/ImagePage.php
includes/page/WikiPage.php
includes/parser/MWTidy.php
includes/parser/Parser.php
includes/parser/Preprocessor_Hash.php
includes/poolcounter/PoolWorkArticleView.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/search/SearchNearMatcher.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialFilepath.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRedirect.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialWatchlist.php
includes/specials/forms/PreferencesFormOOUI.php
includes/specials/pagers/ContribsPager.php
includes/tidy/RaggettBase.php
includes/tidy/RaggettExternal.php
includes/tidy/RaggettInternalHHVM.php
includes/tidy/RaggettInternalPHP.php
includes/tidy/RaggettWrapper.php
includes/user/BotPassword.php
includes/user/User.php
includes/watcheditem/WatchedItemStore.php
includes/widget/search/FullSearchResultWidget.php
languages/Language.php
languages/classes/LanguageKk.php
languages/data/CrhExceptions.php
languages/i18n/ar.json
languages/i18n/arz.json
languages/i18n/ast.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/cdo.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/de-ch.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/eu.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gcr.json
languages/i18n/gl.json
languages/i18n/gsw.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/io.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/kjp.json
languages/i18n/ko.json
languages/i18n/lez.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mk.json
languages/i18n/mni.json
languages/i18n/mnw.json
languages/i18n/mr.json
languages/i18n/my.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/or.json
languages/i18n/pfl.json
languages/i18n/pl.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sd.json
languages/i18n/skr-arab.json
languages/i18n/sl.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/sv.json
languages/i18n/ta.json
languages/i18n/tr.json
languages/i18n/uk.json
languages/i18n/wa.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesBi.php [new file with mode: 0644]
languages/messages/MessagesEn_ca.php [new file with mode: 0644]
languages/messages/MessagesEn_gb.php
languages/messages/MessagesJam.php [new file with mode: 0644]
languages/messages/MessagesPih.php [new file with mode: 0644]
languages/messages/MessagesSco.php [new file with mode: 0644]
maintenance/Maintenance.php
maintenance/benchmarks/benchmarkTidy.php
maintenance/cleanupInvalidDbKeys.php
maintenance/compareParserCache.php
maintenance/compareParsers.php
maintenance/createCommonPasswordCdb.php
maintenance/dumpIterator.php
maintenance/edit.php
maintenance/includes/DeleteLocalPasswords.php
maintenance/oracle/tables.sql
maintenance/populateChangeTagDef.php
maintenance/resources/foreign-resources.yaml
maintenance/resources/manageForeignResources.php
mw-config/config.js
package.json
resources/lib/ooui/History.md
resources/lib/ooui/i18n/diq.json
resources/lib/ooui/i18n/id.json
resources/lib/ooui/i18n/qqq.json
resources/lib/ooui/i18n/sr-ec.json
resources/lib/ooui/oojs-ui-apex.js
resources/lib/ooui/oojs-ui-core-apex.css
resources/lib/ooui/oojs-ui-core-wikimediaui.css
resources/lib/ooui/oojs-ui-core.js
resources/lib/ooui/oojs-ui-core.js.map.json
resources/lib/ooui/oojs-ui-toolbars-apex.css
resources/lib/ooui/oojs-ui-toolbars-wikimediaui.css
resources/lib/ooui/oojs-ui-toolbars.js
resources/lib/ooui/oojs-ui-toolbars.js.map.json
resources/lib/ooui/oojs-ui-widgets-apex.css
resources/lib/ooui/oojs-ui-widgets-wikimediaui.css
resources/lib/ooui/oojs-ui-widgets.js
resources/lib/ooui/oojs-ui-wikimediaui.js
resources/lib/ooui/oojs-ui-windows-apex.css
resources/lib/ooui/oojs-ui-windows-wikimediaui.css
resources/lib/ooui/oojs-ui-windows.js
resources/lib/ooui/themes/apex/icons-interactions.json
resources/lib/ooui/themes/apex/icons-location.json
resources/lib/ooui/themes/wikimediaui/icons-interactions.json
resources/lib/ooui/themes/wikimediaui/icons-location.json
resources/lib/ooui/themes/wikimediaui/images/icons/advanced-invert.png [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/advanced-invert.svg [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/advanced-progressive.png [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/advanced-progressive.svg [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/advanced.png [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/advanced.svg [deleted file]
resources/lib/ooui/themes/wikimediaui/images/icons/globe-invert.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/globe-invert.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/globe-progressive.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/globe-progressive.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/globe.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/globe.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/helpOutlined-ltr-invert.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/helpOutlined-ltr-invert.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/helpOutlined-ltr-progressive.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/helpOutlined-ltr-progressive.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/helpOutlined-ltr.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/helpOutlined-ltr.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/helpOutlined-rtl-invert.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/helpOutlined-rtl-invert.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/helpOutlined-rtl-progressive.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/helpOutlined-rtl-progressive.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/helpOutlined-rtl.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/helpOutlined-rtl.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/settings-invert.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/settings-invert.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/settings-progressive.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/settings-progressive.svg [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/settings.png [new file with mode: 0644]
resources/lib/ooui/themes/wikimediaui/images/icons/settings.svg [new file with mode: 0644]
resources/src/jquery.spinner/spinner.js
resources/src/jquery.tablesorter/jquery.tablesorter.js
resources/src/jquery.tipsy/jquery.tipsy.js
resources/src/jquery/jquery.accessKeyLabel.js
resources/src/jquery/jquery.byteLength.js
resources/src/jquery/jquery.checkboxShiftClick.js
resources/src/jquery/jquery.color.js
resources/src/jquery/jquery.colorUtil.js
resources/src/jquery/jquery.confirmable.js
resources/src/jquery/jquery.confirmable.mediawiki.js
resources/src/jquery/jquery.getAttrs.js
resources/src/jquery/jquery.hidpi.js
resources/src/jquery/jquery.highlightText.js
resources/src/jquery/jquery.lengthLimit.js
resources/src/jquery/jquery.localize.js
resources/src/jquery/jquery.makeCollapsible.js
resources/src/jquery/jquery.mw-jump.js
resources/src/jquery/jquery.suggestions.js
resources/src/jquery/jquery.tabIndex.js
resources/src/jquery/jquery.textSelection.js
resources/src/mediawiki.ForeignApi.core.js
resources/src/mediawiki.ForeignStructuredUpload.BookletLayout/BookletLayout.js
resources/src/mediawiki.ForeignStructuredUpload.js
resources/src/mediawiki.ForeignUpload.js
resources/src/mediawiki.RegExp.js
resources/src/mediawiki.Title/Title.js
resources/src/mediawiki.Title/phpCharToUpper.js
resources/src/mediawiki.Upload.BookletLayout/BookletLayout.js
resources/src/mediawiki.Upload.Dialog.js
resources/src/mediawiki.Upload.js
resources/src/mediawiki.Uri/Uri.js
resources/src/mediawiki.action/mediawiki.action.delete.file.js
resources/src/mediawiki.action/mediawiki.action.delete.js
resources/src/mediawiki.action/mediawiki.action.edit.collapsibleFooter.js
resources/src/mediawiki.action/mediawiki.action.edit.editWarning.js
resources/src/mediawiki.action/mediawiki.action.edit.js
resources/src/mediawiki.action/mediawiki.action.edit.preview.js
resources/src/mediawiki.action/mediawiki.action.edit.stash.js
resources/src/mediawiki.action/mediawiki.action.history.js
resources/src/mediawiki.action/mediawiki.action.view.dblClickEdit.js
resources/src/mediawiki.action/mediawiki.action.view.metadata.js
resources/src/mediawiki.action/mediawiki.action.view.postEdit.js
resources/src/mediawiki.action/mediawiki.action.view.redirect.js
resources/src/mediawiki.action/mediawiki.action.view.rightClickEdit.js
resources/src/mediawiki.api/category.js
resources/src/mediawiki.api/edit.js
resources/src/mediawiki.api/index.js
resources/src/mediawiki.api/login.js
resources/src/mediawiki.api/messages.js
resources/src/mediawiki.api/options.js
resources/src/mediawiki.api/parse.js
resources/src/mediawiki.api/rollback.js
resources/src/mediawiki.api/upload.js
resources/src/mediawiki.api/user.js
resources/src/mediawiki.api/watch.js
resources/src/mediawiki.base/mediawiki.base.js
resources/src/mediawiki.checkboxtoggle.js
resources/src/mediawiki.confirmCloseWindow.js
resources/src/mediawiki.cookie.js
resources/src/mediawiki.debug/debug.js
resources/src/mediawiki.debug/jquery.footHovzer.js
resources/src/mediawiki.experiments.js
resources/src/mediawiki.feedback/feedback.js
resources/src/mediawiki.filewarning/filewarning.js
resources/src/mediawiki.htmlform.checker.js
resources/src/mediawiki.htmlform.ooui/Element.js
resources/src/mediawiki.htmlform/autocomplete.js
resources/src/mediawiki.htmlform/autoinfuse.js
resources/src/mediawiki.htmlform/checkmatrix.js
resources/src/mediawiki.htmlform/cloner.js
resources/src/mediawiki.htmlform/hide-if.js
resources/src/mediawiki.htmlform/htmlform.js
resources/src/mediawiki.htmlform/multiselect.js
resources/src/mediawiki.htmlform/selectandother.js
resources/src/mediawiki.htmlform/selectorother.js
resources/src/mediawiki.inspect.js
resources/src/mediawiki.jqueryMsg/mediawiki.jqueryMsg.js
resources/src/mediawiki.language/languages/bs.js
resources/src/mediawiki.language/languages/dsb.js
resources/src/mediawiki.language/languages/fi.js
resources/src/mediawiki.language/languages/ga.js
resources/src/mediawiki.language/languages/hsb.js
resources/src/mediawiki.language/languages/hu.js
resources/src/mediawiki.language/languages/hy.js
resources/src/mediawiki.language/languages/la.js
resources/src/mediawiki.language/languages/os.js
resources/src/mediawiki.language/languages/sl.js
resources/src/mediawiki.language/mediawiki.cldr.js
resources/src/mediawiki.language/mediawiki.language.fallback.js
resources/src/mediawiki.language/mediawiki.language.init.js
resources/src/mediawiki.language/mediawiki.language.js
resources/src/mediawiki.language/mediawiki.language.months.js
resources/src/mediawiki.language/mediawiki.language.numbers.js
resources/src/mediawiki.legacy/protect.js
resources/src/mediawiki.legacy/wikibits.js
resources/src/mediawiki.libs.jpegmeta/export.js
resources/src/mediawiki.libs.pluralruleparser/export.js
resources/src/mediawiki.messagePoster.wikitext/WikitextMessagePoster.js
resources/src/mediawiki.messagePoster/MessagePoster.js
resources/src/mediawiki.messagePoster/factory.js
resources/src/mediawiki.notification.convertmessagebox.js
resources/src/mediawiki.notification/notification.js
resources/src/mediawiki.notify.js
resources/src/mediawiki.page.gallery.js
resources/src/mediawiki.page.gallery.slideshow.js
resources/src/mediawiki.page.image.pagination.js
resources/src/mediawiki.page.patrol.ajax.js
resources/src/mediawiki.page.ready.js
resources/src/mediawiki.page.rollback.js
resources/src/mediawiki.page.startup.js
resources/src/mediawiki.page.watch.ajax.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ChangesListViewModel.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterGroup.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FilterItem.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.FiltersViewModel.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.ItemModel.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueriesModel.js
resources/src/mediawiki.rcfilters/dm/mw.rcfilters.dm.SavedQueryItemModel.js
resources/src/mediawiki.rcfilters/mw.rcfilters.Controller.js
resources/src/mediawiki.rcfilters/mw.rcfilters.HighlightColors.js
resources/src/mediawiki.rcfilters/mw.rcfilters.UriProcessor.js
resources/src/mediawiki.rcfilters/mw.rcfilters.init.js
resources/src/mediawiki.rcfilters/mw.rcfilters.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitAndDateButtonWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesLimitPopupWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ChangesListWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.CheckboxInputWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.DatePopupWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterItemHighlightButton.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuHeaderWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuOptionWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterMenuSectionOptionWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagItemWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterTagMultiselectWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FilterWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.FormWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.GroupWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightColorPickerWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.HighlightPopupWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ItemMenuOptionWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.LiveUpdateButtonWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MainWrapperWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MarkSeenButtonWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.MenuSelectWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RcTopSectionWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclTargetPageWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclToOrFromWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.RclTopSectionWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SaveFiltersPopupButtonWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListItemWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.SavedLinksListWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.TagItemWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ValuePickerWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.ViewSwitchWidget.js
resources/src/mediawiki.rcfilters/ui/mw.rcfilters.ui.WatchlistTopSectionWidget.js
resources/src/mediawiki.searchSuggest/searchSuggest.js
resources/src/mediawiki.skinning/content.parsoid.less
resources/src/mediawiki.special.apisandbox/apisandbox.js
resources/src/mediawiki.special.block.js
resources/src/mediawiki.special.changecredentials.js
resources/src/mediawiki.special.changeslist.legend.js
resources/src/mediawiki.special.contributions.js
resources/src/mediawiki.special.edittags.js
resources/src/mediawiki.special.import.js
resources/src/mediawiki.special.movePage.js
resources/src/mediawiki.special.pageLanguage.js
resources/src/mediawiki.special.preferences.ooui/editfont.js
resources/src/mediawiki.special.preferences.ooui/tabs.js
resources/src/mediawiki.special.preferences.styles.ooui.less
resources/src/mediawiki.special.preferences/confirmClose.js
resources/src/mediawiki.special.preferences/convertmessagebox.js
resources/src/mediawiki.special.preferences/personalEmail.js
resources/src/mediawiki.special.preferences/tabs.legacy.js
resources/src/mediawiki.special.preferences/timezone.js
resources/src/mediawiki.special.recentchanges.js
resources/src/mediawiki.special.revisionDelete.js
resources/src/mediawiki.special.search.commonsInterwikiWidget.js
resources/src/mediawiki.special.search/search.js
resources/src/mediawiki.special.undelete.js
resources/src/mediawiki.special.unwatchedPages/unwatchedPages.js
resources/src/mediawiki.special.upload/upload.js
resources/src/mediawiki.special.userlogin.signup.js
resources/src/mediawiki.special.userrights.js
resources/src/mediawiki.special.watchlist/visitedstatus.js
resources/src/mediawiki.special.watchlist/watchlist.js
resources/src/mediawiki.storage.js
resources/src/mediawiki.template.js
resources/src/mediawiki.template.mustache.js
resources/src/mediawiki.template.regexp.js
resources/src/mediawiki.toc/toc.js
resources/src/mediawiki.toolbar/toolbar.js
resources/src/mediawiki.user.js
resources/src/mediawiki.userSuggest.js
resources/src/mediawiki.util.js
resources/src/mediawiki.viewport.js
resources/src/mediawiki.visibleTimeout.js
resources/src/mediawiki.widgets.datetime/CalendarWidget.js
resources/src/mediawiki.widgets.datetime/DateTimeFormatter.js
resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.js
resources/src/mediawiki.widgets.datetime/DateTimeInputWidget.less
resources/src/mediawiki.widgets.datetime/DiscordianDateTimeFormatter.js
resources/src/mediawiki.widgets.datetime/ProlepticGregorianDateTimeFormatter.js
resources/src/mediawiki.widgets.datetime/mediawiki.widgets.datetime.definitions.less
resources/src/mediawiki.widgets.datetime/mediawiki.widgets.datetime.js
resources/src/mediawiki.widgets.visibleLengthLimit/mediawiki.widgets.visibleLengthLimit.js
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsProvider.js
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsQueue.js
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceProvider.js
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceQueue.js
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.js
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchProvider.js
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchQueue.js
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js
resources/src/mediawiki.widgets/mw.widgets.CategoryMultiselectWidget.js
resources/src/mediawiki.widgets/mw.widgets.CategoryTagItemWidget.js
resources/src/mediawiki.widgets/mw.widgets.CheckMatrixWidget.js
resources/src/mediawiki.widgets/mw.widgets.ComplexNamespaceInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.styles.less
resources/src/mediawiki.widgets/mw.widgets.ExpiryInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.SelectWithInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.SizeFilterWidget.js
resources/src/mediawiki.widgets/mw.widgets.StashedFileWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleOptionWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleSearchWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.less
resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.UsersMultiselectWidget.js
resources/src/moment/moment-locale-overrides.js
resources/src/ooui-local.js
resources/src/startup/.eslintrc.json [new file with mode: 0644]
resources/src/startup/mediawiki.js
resources/src/startup/mediawiki.log.js
resources/src/startup/mediawiki.requestIdleCallback.js
resources/src/startup/profiler.js
resources/src/startup/startup.js
tests/integration/includes/http/MWHttpRequestTestCase.php
tests/parser/ParserTestRunner.php
tests/parser/editTests.php
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/Revision/RenderedRevisionTest.php
tests/phpunit/includes/Revision/RevisionRendererTest.php
tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php
tests/phpunit/includes/Storage/MutableRevisionRecordTest.php
tests/phpunit/includes/Storage/RevisionRecordTests.php
tests/phpunit/includes/Storage/RevisionStoreDbTestBase.php
tests/phpunit/includes/api/ApiQueryPrefixSearchTest.php
tests/phpunit/includes/api/ApiQuerySiteinfoTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/libs/composer/ComposerLockTest.php
tests/phpunit/includes/linker/LinkRendererTest.php
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/page/ArticleViewTest.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/page/WikiPageMcrReadNewDbTest.php
tests/phpunit/includes/page/WikiPageNoContentModelDbTest.php
tests/phpunit/includes/poolcounter/PoolWorkArticleViewTest.php [new file with mode: 0644]
tests/phpunit/includes/preferences/DefaultPreferencesFactoryTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/search/SearchNearMatcherTest.php [new file with mode: 0644]
tests/phpunit/includes/sparql/SparqlClientTest.php
tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php
tests/phpunit/includes/specials/SpecialRedirectTest.php [new file with mode: 0644]
tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php
tests/phpunit/structure/StructureTest.php
tests/phpunit/suites/ParserTestTopLevelSuite.php
tests/qunit/.eslintrc.json
tests/qunit/data/mwLoaderTestCallback.js
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js
tests/qunit/suites/resources/jquery/jquery.color.test.js
tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js
tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js
tests/qunit/suites/resources/jquery/jquery.hidpi.test.js
tests/qunit/suites/resources/jquery/jquery.highlightText.test.js
tests/qunit/suites/resources/jquery/jquery.lengthLimit.test.js
tests/qunit/suites/resources/jquery/jquery.localize.test.js
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.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
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.SavedQueriesModel.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.SavedQueryItemModel.test.js
tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
tests/qunit/suites/resources/mediawiki.widgets/MediaSearch/mediawiki.widgets.APIResultsQueue.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.RegExp.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.String.trimByteLength.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.errorLogger.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.experiments.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.messagePoster.factory.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.requestIdleCallback.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.storage.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.track.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.viewport.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.visibleTimeout.test.js

index 4630e07..c076751 100644 (file)
@@ -8,8 +8,6 @@
                "module": false,
                "mw": false,
                "$": false,
-               "mediaWiki": false,
-               "jQuery": false,
                "OO": false
        },
        "rules": {
index 786c09f..81b7a33 100644 (file)
@@ -5,6 +5,7 @@
 *~ export-ignore
 #*# export-ignore
 .* export-ignore
+*.htaccess -export-ignore
 package.json export-ignore
 README.mediawiki export-ignore
 Gemfile* export-ignore
index bd0ab82..2bce5b2 100644 (file)
@@ -2,14 +2,12 @@
 <ruleset name="MediaWiki">
        <rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
                <exclude name="Generic.ControlStructures.InlineControlStructure" />
-               <exclude name="MediaWiki.Commenting.FunctionAnnotations.UnrecognizedAnnotation" />
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationProtected" />
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic" />
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamTag" />
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingReturn" />
                <exclude name="MediaWiki.Commenting.FunctionComment.ExtraParamComment" />
                <exclude name="MediaWiki.Commenting.FunctionComment.WrongStyle" />
-               <exclude name="MediaWiki.Commenting.PhpunitAnnotations.NotClassTrait" />
                <exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentStart" />
                <exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentEnd" />
                <exclude name="MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures" />
diff --git a/HISTORY b/HISTORY
index bc74a6b..4665036 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -2,6 +2,32 @@ Change notes from older releases. For current info see RELEASE-NOTES-1.32.
 
 = MediaWiki 1.31 =
 
+== MediaWiki 1.31.1 ==
+
+This is a security and maintenance release of the MediaWiki 1.31 branch.
+
+=== Changes since MediaWiki 1.31.0 ===
+* (T169545, CVE-2018-0503) SECURITY: $wgRateLimits entry for 'user' overrides
+  'newbie'.
+* (T194605, CVE-2018-0505) SECURITY: BotPasswords can bypass CentralAuth's
+  account lock.
+* (T199029, CVE-2018-13258) SECURITY: Tarball was missing .htaccess files.
+* (T197229) Bundle Nuke extension, it was accidentally omitted.
+* (T193995) Fix undefined patchPath() method call in parser tests.
+* (T198687) Fix various selectFields methods to use the string 'NULL', not null.
+* Special:BotPasswords now requires reauthentication.
+* (T191608, T187638) Add 'logid' parameter to Special:Log.
+* (T193829) Indicate when a Bot Password needs reset.
+* (T198037) GitInfo: Don't try shelling out if it's disabled.
+* (T151415) Log email changes.
+* (T197206) Fix performance regression when multiple DB used without caching.
+* (T197030) PHPSessionHandler: Suppress headers warnings in initialize().
+* (T182377, T196793) Exif: Guard against uncountable tag values.
+* (T200861) Fix total breakage of SQLite web upgrade.
+* (T200864) Fix pingback over-reporting on non-MySQL databases
+* (T202550) Unbreak SpecialListusersHeaderForm and SpecialListusersHeader
+  hooks.
+
 == MediaWiki 1.31.0 ==
 
 === Changes since MediaWiki 1.31.0-rc.2 ===
@@ -488,6 +514,43 @@ There's usually someone online in #mediawiki on irc.freenode.net.
 
 = MediaWiki 1.30 =
 
+== MediaWiki 1.30.1 ==
+
+This is a security and maintenance release of the MediaWiki 1.30 branch.
+
+=== Changes since MediaWiki 1.30.0 ===
+* (T169545, CVE-2018-0503) SECURITY: $wgRateLimits entry for 'user' overrides
+  'newbie'.
+* (T194605, CVE-2018-0505) SECURITY: BotPasswords can bypass CentralAuth's
+  account lock.
+* (T87572) Make FormatMetadata::flattenArrayReal() work for an associative array.
+* Updated composer/spdx-licenses from 1.1.4 to 1.3.0 (development dependency).
+* (T189567) the CLI installer (maintenance/install.php) learned to detect and
+  include extensions. Pass --with-extensions to enable that feature.
+* (T190503) Let built-in web server (maintenance/dev) handle .php requests.
+* (T167507) selenium: Run Chrome headlessly.
+* selenium: Pass -no-sandbox to Chrome under Docker.
+* (T179190) selenium: Move logic for running tests from package.json to selenium.sh
+* (T192584) Stop incorrectly passing USE INDEX to RecentChange::newFromConds().
+* Add default edit rate limit of 90 edits/minute for all users.
+* (T186565) Fix PHP Notice from `ob_end_flush()` in `FileRepo::streamFile()`.
+* oojs/oojs-ui updated to remove an unnecessary dependancy.
+* (T196125) php-memcached 3.0 (provided with PHP 7.0) is now supported.
+* (T118683) Fix exception from &$user deref on HHVM in the TitleMoveComplete hook.
+* (T196672) The mtime of extension.json files is now able to be zero
+* (T180403) Validate $length in padleft/padright parser functions.
+* (T143790) Make $wgEmailConfirmToEdit only affect edit actions.
+* (T193995) Fix undefined patchPath() method call in parser tests.
+* Special:BotPasswords now requires reauthentication.
+* (T191608, T187638) Add 'logid' parameter to Special:Log.
+* (T193829) Indicate when a Bot Password needs reset.
+* (T151415) Log email changes.
+* (T200861) Fix total breakage of SQLite web upgrade.
+* (T202550) Unbreak SpecialListusersHeaderForm and SpecialListusersHeader
+  hooks.
+* (T190539) Explicitly require Postgres 9.1.
+* (T118420) Unbreak Oracle installer.
+
 == MediaWiki 1.30.0 ==
 
 === Changes since MediaWiki 1.30.0-rc.0 ===
@@ -751,6 +814,49 @@ changes to languages because of Phabricator reports.
 
 = MediaWiki 1.29 =
 
+== MediaWiki 1.29.3 ==
+
+This is a security and maintenance release of the MediaWiki 1.29 branch.
+
+=== Changes since 1.29.2 ===
+* (T169545, CVE-2018-0503) SECURITY: $wgRateLimits entry for 'user' overrides
+  'newbie'.
+* (T194605, CVE-2018-0505) SECURITY: BotPasswords can bypass CentralAuth's
+  account lock.
+* (T180551) Fix LanguageSrTest for language converter
+* (T180552) Fix langauge converter parser test with self-close tags
+* (T180537) Remove $wgAuth usage from wrapOldPasswords.php
+* (T180485) InputBox: Have inputbox langconvert certain attributes
+* (T161732, T181547) Upgraded Moment.js from v2.15.0 to v2.19.3.
+* (T172927) Drop vendor from MW release branch
+* (T87572) Make FormatMetadata::flattenArrayReal() work for an associative array
+* Updated composer/spdx-licenses from 1.1.4 to 1.3.0 (development dependency).
+* (T189567) the CLI installer (maintenance/install.php) learned to detect and
+  include extensions. Pass --with-extensions to enable that feature.
+* (T182381) Mask deprecated call in WatchedItemUnitTest
+* (T190503) Let built-in web server (maintenance/dev) handle .php requests.
+* The karma qunit tests would fail on some configuration due to headers already
+  sent. Check headers_sent() before sending cpPosTime headers
+* (T167507) selenium: Run Chrome headlessly.
+* selenium: Pass -no-sandbox to Chrome under Docker
+* (T191247) Use MediaWiki\SuppressWarnings around trigger_error('') instead @
+* (T75174, T161041) Unit test ChangesListSpecialPageTest::testFilterUserExpLevel
+  fails under SQLite.
+* (T192584) Stop incorrectly passing USE INDEX to RecentChange::newFromConds().
+* (T179190) selenium: Move test running logic from package.json to selenium.sh.
+* (T117839, T193200) PDFHandler: Fix for pdfinfo changes in poppler-utils 0.48.
+* Add default edit rate limit of 90 edits/minute for all users.
+* (T196125) php-memcached 3.0 (provided with PHP 7.0) is now supported.
+* (T196672) The mtime of extension.json files is now able to be zero
+* (T180403) Validate $length in padleft/padright parser functions.
+* (T143790) Make $wgEmailConfirmToEdit only affect edit actions.
+* (T194237) Special:BotPasswords now requires reauthentication.
+* (T191608, T187638) Add 'logid' parameter to Special:Log.
+* (T176097) resourceloader: Disable a flaky MessageBlobStoreTest case
+* (T193829) Indicate when a Bot Password needs reset.
+* (T151415) Log email changes.
+* (T118420) Unbreak Oracle installer.
+
 == MediaWiki 1.29.2 ==
 
 This is a security and maintenance release of the MediaWiki 1.29 branch.
@@ -1526,6 +1632,34 @@ There's usually someone online in #mediawiki on irc.freenode.net.
 
 = MediaWiki 1.27 =
 
+== MediaWiki 1.27.5 ==
+
+This is a security and maintenance release of the MediaWiki 1.27 branch.
+
+=== Changes since 1.27.4 ===
+* (T169545, CVE-2018-0503) SECURITY: $wgRateLimits entry for 'user' overrides
+  'newbie'.
+* (T194605, CVE-2018-0505) SECURITY: BotPasswords can bypass CentralAuth's
+  account lock.
+* Upgraded Moment.js from v2.8.4 to v2.19.3.
+* (T160298) Fixed Special:ActiveUsers due to bad backport.
+* (T87572) Make FormatMetadata::flattenArrayReal() work for an associative array.
+* Updated list of SPDX licenses for extensions.
+* (T189567) the CLI installer (maintenance/install.php) learned to detect and
+  include extensions. Pass --with-extensions to enable that feature.
+* (T192584) Stop incorrectly passing USE INDEX to RecentChange::newFromConds().
+* Add default edit rate limit of 90 edits/minute for all users.
+* (T196125) php-memcached 3.0 (provided with PHP 7.0) is now supported.
+* (T196672) The mtime of extension.json files is now able to be zero.
+* (T118683) Fix exception from &$user deref on HHVM in the TitleMoveComplete hook.
+* (T180403) Validate $length in padleft/padright parser functions.
+* (T143790) Make $wgEmailConfirmToEdit only affect edit actions.
+* Special:BotPasswords now requires reauthentication.
+* (T191608, T187638) Add 'logid' parameter to Special:Log.
+* (T193829) Indicate when a Bot Password needs reset.
+* (T151415) Log email changes.
+* (T118420) Unbreak Oracle installer.
+
 == MediaWiki 1.27.4 ==
 This is a security and maintenance release of the MediaWiki 1.27 branch.
 
index ff59d43..16eec55 100644 (file)
@@ -36,6 +36,10 @@ production.
   (e.g. MediaWiki:Common.js), CSS or JSON was separated from 'editinterface'
   and is available under 'editsitejs'/'editsitecss'/'editsitejson'. Having
   'editinterface' is still necessary to edit such pages.
+* $wgMultiContentRevisionSchemaMigrationStage now defaults to writing both the
+  old and the new schema, but reading the new schema, so Multi-Content Revisions
+  (MCR) are now functional per default. The new default value of the setting is
+  SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW.
 
 ==== Removed configuration ====
 * $wgEnableAPI and $wgEnableWriteAPI – These settings, deprecated in 1.31,
@@ -114,6 +118,7 @@ production.
 === Bug fixes in 1.32 ===
 * SpecialPage::execute() will now only call checkLoginSecurityLevel() if
   getLoginSecurityLevel() returns non-false.
+* (T43720, T46197) Improved page display title handling for category pages
 
 === Action API changes in 1.32 ===
 * Added templated parameters.
@@ -289,6 +294,26 @@ because of Phabricator reports.
   Define $wgProfiler via LocalSettings.php instead.
 * The mw.loader.addSource() is now considered a private method, and no longer
   supports the `id, url` signature. Use the `Object` parameter instead.
+* The backwards-compatibility code in HTMLForm to add a drop-down control to an
+  option that is not set to be a drop-down if the "mw-chosen" class is present,
+  is now removed.
+* Several collations were removed. They were workarounds for bugs in the ICU
+  library and they are no longer needed (as of ICU 57.1):
+  * 'uppercase-se' (NorthernSamiUppercaseCollation) - use 'uca-se' instead
+  * 'xx-uca-et' (CollationEt) - use 'uca-et' instead
+  * 'xx-uca-fa' (CollationFa) - use 'uca-fa' instead
+* The hooks 'SpecialRecentChangesFilters' & 'SpecialWatchlistFilters' deprecated
+  in 1.23 were removed. Instead, use 'ChangesListSpecialPageStructuredFilters'.
+  The ChangesListSpecialPage code for these legacy hooks, and their use in
+  SpecialRecentchanges.php and SpecialWatchlist, was also removed:
+  * ChangesListSpecialPage->getCustomFilters()
+  * ChangesListSpecialPage->getFilterGroupDefinitionFromLegacyCustomFilters()
+  * ChangesListSpecialPage::customFilters
+* The global function wfUseMW, deprecated since 1.26, has now been removed. Use
+  the "requires" property of static extension registration instead.
+* $wgSpecialPages no longer accepts array syntax, deprecated since 1.18.
+* The MailAddress constructor can no longer be called with a User object,
+  behaviour which has been deprecated since 1.24.
 
 === Deprecations in 1.32 ===
 * HTMLForm::setSubmitProgressive() is deprecated. No need to call it. Submit
@@ -301,7 +326,6 @@ because of Phabricator reports.
 * Overriding SearchEngine::{searchText,searchTitle,searchArchiveTitle}
   in extending classes is deprecated.  Extend related doSearch* methods
   instead.
-* CollationFa has been removed completely as it's not needed anymore
 * The following 'mediawiki.api' plugin modules were merged into mediawiki.api
   and deprecated: mediawiki.api.category, mediawiki.api.edit,
   mediawiki.api.login, mediawiki.api.options, mediawiki.api.parse,
@@ -412,6 +436,24 @@ because of Phabricator reports.
   'help', 'help-message', 'help-messages' instead.
 * (T197179) HTMLFormField::getNotices() is now deprecated.
 * The jquery.localize module is now deprecated. Use jquery.i18n instead.
+* The SecondaryDataUpdates hook was deprecated in favor of RevisionDataUpdates,
+  or overriding ContentHandler::getSecondaryDataUpdates (T194038).
+* The WikiPageDeletionUpdates hook was deprecated in favor of
+  PageDeletionDataUpdates, or overriding ContentHandler::getDeletionDataUpdates
+  (T194038).
+* Content::getSecondaryDataUpdates has been deprecated in favor of
+  ContentHandler::getSecondaryDataUpdates() for overriding by extensions
+  (T194038).
+  Application logic should call WikiPage::doSecondaryDataUpdates() (T194037).
+* Content::getDeletionUpdates has been deprecated in favor of
+  ContentHandler::getDeletionUpdates() for overriding by extensions (T194038).
+  Application logic should call WikiPage::doSecondaryDataUpdates() (T194037).
+* (T198214) Old Tidy-related configuration settings, which were soft-deprecated
+  in MediaWiki 1.26, have now been hard deprecated. This affects $wgUseTidy,
+  $wgTidyBin, $wgTidyConf, $wgTidyOpts, $wgTidyInternal, and $wgDebugTidy. Use
+  $wgTidyConfig instead.
+* All Tidy configurations other than Remex have been deprecated; future parsers
+  will not emit compatible output for these configurations.
 
 === Other changes in 1.32 ===
 * (T198811) The following tables have had their UNIQUE indexes turned into
@@ -422,6 +464,11 @@ because of Phabricator reports.
   `'help-inline' => false`.
 * The archive table's ar_rev_id field is now unique.
 * Special:BotPasswords now requires reauthentication.
+* (T174023) Multi-Content Revision (MCR) capabilities were introduced into the
+  storage layer and have basic support for display. No user interface exists
+  yet for creating or managing content in slots beides the main slot. See
+  <https://www.mediawiki.org/wiki/Multi-Content_Revisions> for more
+  information.
 * …
 
 == Compatibility ==
index dc9461e..67285d0 100644 (file)
@@ -285,7 +285,6 @@ $wgAutoloadLocalClasses = [
        'CodeContentHandler' => __DIR__ . '/includes/content/CodeContentHandler.php',
        'Collation' => __DIR__ . '/includes/collation/Collation.php',
        'CollationCkb' => __DIR__ . '/includes/collation/CollationCkb.php',
-       'CollationEt' => __DIR__ . '/includes/collation/CollationEt.php',
        'CommandLineInc' => __DIR__ . '/maintenance/commandLine.inc',
        'CommandLineInstaller' => __DIR__ . '/maintenance/install.php',
        'CommentStore' => __DIR__ . '/includes/CommentStore.php',
@@ -898,6 +897,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\ProcOpenError' => __DIR__ . '/includes/exception/ProcOpenError.php',
        'MediaWiki\\Revision\\RenderedRevision' => __DIR__ . '/includes/Revision/RenderedRevision.php',
        'MediaWiki\\Revision\\RevisionRenderer' => __DIR__ . '/includes/Revision/RevisionRenderer.php',
+       'MediaWiki\\Revision\\SlotRenderingProvider' => __DIR__ . '/includes/Revision/SlotRenderingProvider.php',
        'MediaWiki\\Search\\ParserOutputSearchDataExtractor' => __DIR__ . '/includes/search/ParserOutputSearchDataExtractor.php',
        'MediaWiki\\ShellDisabledError' => __DIR__ . '/includes/exception/ShellDisabledError.php',
        'MediaWiki\\Site\\MediaWikiPageNameNormalizer' => __DIR__ . '/includes/site/MediaWikiPageNameNormalizer.php',
index b9636cc..e99fe81 100644 (file)
@@ -25,7 +25,7 @@
                "ext-mbstring": "*",
                "ext-xml": "*",
                "liuggio/statsd-php-client": "1.0.18",
-               "oojs/oojs-ui": "0.28.1",
+               "oojs/oojs-ui": "0.28.2",
                "oyejorge/less.php": "1.7.0.14",
                "pear/mail": "1.4.1",
                "pear/mail_mime": "1.10.2",
@@ -62,7 +62,7 @@
                "jakub-onderka/php-parallel-lint": "0.9.2",
                "jetbrains/phpstorm-stubs": "dev-master#38ff1a581b297f7901e961b8c923862ea80c3b96",
                "justinrainbow/json-schema": "~5.2",
-               "mediawiki/mediawiki-codesniffer": "21.0.0",
+               "mediawiki/mediawiki-codesniffer": "22.0.0",
                "monolog/monolog": "~1.22.1",
                "nikic/php-parser": "3.1.3",
                "seld/jsonlint": "1.7.1",
diff --git a/docs/design.txt b/docs/design.txt
deleted file mode 100644 (file)
index 5c04add..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-design.txt
-
-This is a brief overview of the new design.
-
-More thorough and up-to-date information is available on the documentation
-wiki at https://www.mediawiki.org/
-
-Primary classes:
-
-  User
-    Encapsulates the state of the user viewing/using the site. Can be queried
-    for things like the user's settings, name, etc. Handles the details of
-    getting and saving to the "user" table of the database, and dealing with
-    sessions and cookies.
-
-  OutputPage
-    Encapsulates the entire HTML page that will be sent in response to any
-    server request. It is used by calling its functions to add text, headers,
-    etc., in any order, and then calling output() to send it all. It could be
-    easily changed to send incrementally if that becomes useful, but I prefer
-    the flexibility. This should also do the output encoding. The system
-    allocates a global one in $wgOut.
-
-  Title
-    Represents the title of an article, and does all the work of translating
-    among various forms such as plain text, URL, database key, etc. For
-    convenience, and for historical reasons, it also represents a few features
-    of articles that don't involve their text, such as access rights.
-    See also title.txt.
-
-  Article
-    Encapsulates access to the "page" table of the database. The object
-    represents a an article, and maintains state such as text (in Wikitext
-    format), flags, etc.
-
-  Revision
-    Encapsulates individual page revision data and access to the
-    revision/text/blobs storage system. Higher-level code should never touch
-    text storage directly; this class mediates it.
-
-  Skin
-    Encapsulates a "look and feel" for the wiki. All of the functions that
-    render HTML, and make choices about how to render it, are here, and are
-    called from various other places when needed (most notably,
-    OutputPage::addWikiText()). The StandardSkin object is a complete
-    implementation, and is meant to be subclassed with other skins that may
-    override some of its functions. The User object contains a reference to a
-    skin (according to that user's preference), and so rather than having a
-    global skin object we just rely on the global User and get the skin with
-    $wgUser->getSkin().
-    See also skin.txt.
-
-  Language
-    Represents the language used for incidental text, and also has some
-    character encoding functions and other locale stuff. The current user
-    interface language is instantiated as $wgLang, and the local content
-    language as $wgContLang; be sure to use the *correct* language object
-    depending upon the circumstances.
-    See also language.txt.
-
-  Parser
-    Class used to transform wikitext to html.
-
-  LinkCache
-    Keeps information on existence of articles. See linkcache.txt.
-
-Naming/coding conventions:
-
-  These are meant to be descriptive, not dictatorial; I won't presume to tell
-  you how to program, I'm just describing the methods I chose to use for myself.
-  If you do choose to follow these guidelines, it will probably be easier for
-  you to collaborate with others on the project, but if you want to contribute
-  without bothering, by all means do so (and don't be surprised if I reformat
-  your code).
-
-  - I have the code indented with tabs to save file size and so that users can
-    set their tab stops to any depth they like. I use 4-space tab stops, which
-    work well. I also use K&R brace matching style. I know that's a religious
-    issue for some, so if you want to use a style that puts opening braces on
-    the next line, that's OK too, but please don't use a style where closing
-    braces don't align with either the opening brace on its own line or the
-    statement that opened the block--that's confusing as hell.
-
-  - Certain functions and class members are marked with /* private */, rather
-    than being marked as such. This is a hold-over from PHP 4, which didn't
-    support proper visibilities. You should not access things marked in this
-    manner outside the class/inheritance line as this code is subjected to be
-    updated in a manner that enforces this at some time in the near future, and
-    things will break. New code should use the standard method of setting
-    visibilities as normal.
-
-  - Globals are particularly evil in PHP; it sets a lot of them automatically
-    from cookies, query strings, and such, leading to namespace conflicts; when
-    a variable name is used in a function, it is silently declared as a new
-    local masking the global, so you'll get weird error because you forgot the
-    global declaration; lack of static class member variables means you have to
-    use globals for them, etc. Evil, evil.
-
-    I think I've managed to pare down the number of globals we use to a scant
-    few dozen or so, and I've prefixed them all with "wg" so you can spot errors
-    better (odds are, if you see a "wg" variable being used in a function that
-    doesn't declare it global, that's probably an error).
-
-    Other conventions: Top-level functions are wfFuncname(), names of session
-    variables are wsName, cookies wcName, and form field values wpName ("p" for
-    "POST").
index 729dffa..f2af458 100644 (file)
@@ -174,8 +174,6 @@ perhaps configure it to use them (see Configuration section of this document):
   "$wgAntivirus = 'clamav';".
   * 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
-       "$wgUseTidy = true;".
   * 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
index 436131c..8223814 100644 (file)
@@ -624,8 +624,8 @@ a chance to hide their (unrelated) log entries.
   AND in the final query)
 $logTypes: Array of log types being queried
 
-'ArticleAfterFetchContentObject': After fetching content of an article from the
-database.
+'ArticleAfterFetchContentObject': DEPRECATED since 1.32, use ArticleRevisionViewCustom
+to control output. After fetching content of an article from the database.
 &$article: the article (object) being loaded from the database
 &$content: the content of the article, as a Content object
 
@@ -640,12 +640,21 @@ this to change the content in this area or how it is loaded.
 $diffEngine: the DifferenceEngine
 $output: the OutputPage object
 
-'ArticleContentViewCustom': Allows to output the text of the article in a
-different format than wikitext. Note that it is preferable to implement proper
-handing for a custom data type using the ContentHandler facility.
+'ArticleRevisionViewCustom': Allows custom rendering of an article's content.
+Note that it is preferable to implement proper handing for a custom data type using
+the ContentHandler facility.
+$revision: content of the page, as a RevisionRecord object, or null if the revision
+  could not be loaded. May also be a fake that wraps content supplied by an extension.
+$title: title of the page
+$oldid: the requested revision id, or 0 for the currrent revision.
+$output: a ParserOutput object
+
+'ArticleContentViewCustom': DEPRECATED since 1.32, use ArticleRevisionViewCustom instead,
+or provide an appropriate ContentHandler. Allows to output the text of the article in a
+different format than wikitext.
 $content: content of the page, as a Content object
 $title: title of the page
-$output: reference to $wgOut
+$output: a ParserOutput object
 
 'ArticleDelete': Before an article is deleted.
 &$wikiPage: the WikiPage (object) being deleted
@@ -775,8 +784,8 @@ $article: the article
 $article: Article object
 $patrolFooterShown: boolean whether patrol footer is shown
 
-'ArticleViewHeader': Before the parser cache is about to be tried for article
-viewing.
+'ArticleViewHeader': Control article output. Called before the parser cache is about
+to be tried for article viewing.
 &$article: the article
 &$pcache: whether to try the parser cache or not
 &$outputDone: whether the output for this page finished or not. Set to
@@ -2537,6 +2546,12 @@ $originalRevId: if the edit restores or repeats an earlier revision (such as a
   (Used to be called $baseRevId.)
 $undidRevId: the rev ID (or 0) this edit undid
 
+'PageDeletionDataUpdates': Called when constructing a list of DeferrableUpdate to be
+executed when a page is deleted.
+$title The Title of the page being deleted.
+$revision A RevisionRecord representing the page's current revision at the time of deletion.
+&$updates A list of DeferrableUpdate that can be manipulated by the hook handler.
+
 'PageHistoryBeforeList': When a history page list is about to be constructed.
 &$article: the article that the history is loading for
 $context: RequestContext object
@@ -2910,6 +2925,13 @@ called after the addition of 'qunit' and MediaWiki testing resources.
   added to any module.
 &$ResourceLoader: object
 
+'RevisionDataUpdates': Called when constructing a list of DeferrableUpdate to be
+executed to record secondary data about a revision.
+$title The Title of the page the revision  belongs to
+$renderedRevision a RenderedRevision object representing the new revision and providing access
+  to the RevisionRecord as well as ParserOutput of that revision.
+&$updates A list of DeferrableUpdate that can be manipulated by the hook handler.
+
 'RevisionRecordInserted': Called after a revision is inserted into the database.
 $revisionRecord: the RevisionRecord that has just been inserted.
 
@@ -2969,9 +2991,9 @@ result augmentors.
 Note that lists should be in the format name => object and the names in both
   lists should be distinct.
 
-'SecondaryDataUpdates': Allows modification of the list of DataUpdates to
-perform when page content is modified. Currently called by
-AbstractContent::getSecondaryDataUpdates.
+'SecondaryDataUpdates': DEPRECATED! Use RevisionDataUpdates or override
+ContentHandler::getSecondaryDataUpdates instead.
+Allows modification of the list of DataUpdates to perform when page content is modified.
 $title: Title of the page that is being edited.
 $oldContent: Content object representing the page's content before the edit.
 $recursive: bool indicating whether DataUpdates should trigger recursive
@@ -3311,14 +3333,6 @@ use this to change some selection criteria or substitute a different title.
 &$title: If the hook returns false, a Title object to use instead of the
   result from the normal query
 
-'SpecialRecentChangesFilters': DEPRECATED since 1.23! Use
-ChangesListSpecialPageStructuredFilters instead.
-Called after building form options at RecentChanges.
-$special: the special page object
-&$filters: associative array of filter definitions. The keys are the HTML
-  name/URL parameters. Each key maps to an associative array with a 'msg'
-  (message key) and a 'default' value.
-
 'SpecialRecentChangesPanel': Called when building form options in
 SpecialRecentChanges.
 &$extraOpts: array of added items, to which can be added
@@ -3433,14 +3447,6 @@ Special:Upload.
 $wgVersion: Current $wgVersion for you to use
 &$versionUrl: Raw url to link to (eg: release notes)
 
-'SpecialWatchlistFilters': DEPRECATED since 1.23! Use
-ChangesListSpecialPageStructuredFilters instead.
-Called after building form options at Watchlist.
-$special: the special page object
-&$filters: associative array of filter definitions. The keys are the HTML
-  name/URL parameters. Each key maps to an associative array with a 'msg'
-  (message key) and a 'default' value.
-
 'SpecialWatchlistGetNonRevisionTypes': Called when building sql query for
 SpecialWatchlist. Allows extensions to register custom values they have
 inserted to rc_type so they can be returned as part of the watchlist.
@@ -4045,10 +4051,9 @@ dumps. One, and only one hook should set this, and return false.
 &$opts: Options to use for the query
 &$join: Join conditions
 
-'WikiPageDeletionUpdates': manipulate the list of DeferrableUpdates to be
-applied when a page is deleted. Called in WikiPage::getDeletionUpdates(). Note
-that updates specific to a content model should be provided by the respective
-Content's getDeletionUpdates() method.
+'WikiPageDeletionUpdates': DEPRECATED! Use PageDeletionDataUpdates or
+override ContentHandler::getDeletionDataUpdates instead.
+Manipulates the list of DeferrableUpdates to be applied when a page is deleted.
 $page: the WikiPage
 $content: the Content to generate updates for, or null in case the page revision
   could not be loaded. The delete will succeed despite this.
index c9932d6..5482f6a 100644 (file)
@@ -132,14 +132,14 @@ class AutoLoader {
                        'MediaWiki\\Auth\\' => __DIR__ . '/auth/',
                        'MediaWiki\\Edit\\' => __DIR__ . '/edit/',
                        'MediaWiki\\EditPage\\' => __DIR__ . '/editpage/',
-                       'MediaWiki\\Linker\\' => __DIR__ .'/linker/',
-                       'MediaWiki\\Preferences\\' => __DIR__ .'/preferences/',
-                       'MediaWiki\\Services\\' => __DIR__ .'/services/',
-                       'MediaWiki\\Session\\' => __DIR__ .'/session/',
-                       'MediaWiki\\Shell\\' => __DIR__ .'/shell/',
-                       'MediaWiki\\Sparql\\' => __DIR__ .'/sparql/',
-                       'MediaWiki\\Storage\\' => __DIR__ .'/Storage/',
-                       'MediaWiki\\Tidy\\' => __DIR__ .'/tidy/',
+                       'MediaWiki\\Linker\\' => __DIR__ . '/linker/',
+                       'MediaWiki\\Preferences\\' => __DIR__ . '/preferences/',
+                       'MediaWiki\\Services\\' => __DIR__ . '/services/',
+                       'MediaWiki\\Session\\' => __DIR__ . '/session/',
+                       'MediaWiki\\Shell\\' => __DIR__ . '/shell/',
+                       'MediaWiki\\Sparql\\' => __DIR__ . '/sparql/',
+                       'MediaWiki\\Storage\\' => __DIR__ . '/Storage/',
+                       'MediaWiki\\Tidy\\' => __DIR__ . '/tidy/',
                ];
        }
 }
index 46a1473..a07e1b4 100644 (file)
@@ -424,7 +424,7 @@ class CategoryViewer extends ContextSource {
         * @return string
         */
        function getPagesSection() {
-               $ti = wfEscapeWikiText( $this->title->getText() );
+               $name = $this->getOutput()->getUnprefixedDisplayTitle();
                # Don't show articles section if there are none.
                $r = '';
 
@@ -440,7 +440,7 @@ class CategoryViewer extends ContextSource {
 
                if ( $rescnt > 0 ) {
                        $r = "<div id=\"mw-pages\">\n";
-                       $r .= '<h2>' . $this->msg( 'category_header', $ti )->parse() . "</h2>\n";
+                       $r .= '<h2>' . $this->msg( 'category_header' )->rawParams( $name )->parse() . "</h2>\n";
                        $r .= $countmsg;
                        $r .= $this->getSectionPagingLinks( 'page' );
                        $r .= $this->formatList( $this->articles, $this->articles_start_char );
@@ -454,6 +454,7 @@ class CategoryViewer extends ContextSource {
         * @return string
         */
        function getImageSection() {
+               $name = $this->getOutput()->getUnprefixedDisplayTitle();
                $r = '';
                $rescnt = $this->showGallery ? $this->gallery->count() : count( $this->imgsNoGallery );
                $dbcnt = $this->cat->getFileCount();
@@ -463,10 +464,7 @@ class CategoryViewer extends ContextSource {
                if ( $rescnt > 0 ) {
                        $r .= "<div id=\"mw-category-media\">\n";
                        $r .= '<h2>' .
-                               $this->msg(
-                                       'category-media-header',
-                                       wfEscapeWikiText( $this->title->getText() )
-                               )->text() .
+                               $this->msg( 'category-media-header' )->rawParams( $name )->parse() .
                                "</h2>\n";
                        $r .= $countmsg;
                        $r .= $this->getSectionPagingLinks( 'file' );
index 343e80d..d335dcc 100644 (file)
@@ -3288,7 +3288,7 @@ $wgUseMediaWikiUIEverywhere = false;
  *
  * @since 1.32
  */
-$wgOOUIPreferences = false;
+$wgOOUIPreferences = true;
 
 /**
  * Whether to label the store-to-database-and-show-to-others button in the editor
@@ -4267,17 +4267,26 @@ $wgAllowImageTag = false;
  * library; historically, Dave Raggett's "HTML Tidy" was typically used.
  * See https://www.w3.org/People/Raggett/tidy/
  *
+ * Setting this to null is deprecated.
+ *
  * If this is null and $wgUseTidy is true, the deprecated configuration
  * parameters will be used instead.
  *
  * If this is null and $wgUseTidy is false, a pure PHP fallback will be used.
+ * (Equivalent to setting `$wgTidyConfig['driver'] = 'disabled'`.)
  *
  * Keys are:
  *  - driver: May be:
+ *    - RemexHtml: Use the RemexHtml library in PHP
  *    - RaggettInternalHHVM: Use the limited-functionality HHVM extension
+ *      Deprecated since 1.32.
  *    - RaggettInternalPHP: Use the PECL extension
+ *      Deprecated since 1.32.
  *    - RaggettExternal: Shell out to an external binary (tidyBin)
- *    - RemexHtml: Use the RemexHtml library in PHP
+ *      Deprecated since 1.32.
+ *    - disabled: Disable tidy pass and use a hacky pure PHP workaround
+ *      (this is what setting $wgUseTidy to false used to do)
+ *      Deprecated since 1.32.
  *
  *  - tidyConfigFile: Path to configuration file for any of the Raggett drivers
  *  - debugComment: True to add a comment to the output with warning messages
@@ -4288,37 +4297,38 @@ $wgTidyConfig = [ 'driver' => 'RemexHtml' ];
 
 /**
  * Set this to true to use the deprecated tidy configuration parameters.
- * @deprecated use $wgTidyConfig
+ * @deprecated since 1.26, use $wgTidyConfig['driver'] = 'disabled'
  */
 $wgUseTidy = false;
 
 /**
  * The path to the tidy binary.
- * @deprecated Use $wgTidyConfig['tidyBin']
+ * @deprecated since 1.26, use $wgTidyConfig['tidyBin']
  */
 $wgTidyBin = 'tidy';
 
 /**
  * The path to the tidy config file
- * @deprecated Use $wgTidyConfig['tidyConfigFile']
+ * @deprecated since 1.26, use $wgTidyConfig['tidyConfigFile']
  */
 $wgTidyConf = $IP . '/includes/tidy/tidy.conf';
 
 /**
  * The command line options to the tidy binary
- * @deprecated Use $wgTidyConfig['tidyCommandLine']
+ * @deprecated since 1.26, use $wgTidyConfig['tidyCommandLine']
  */
 $wgTidyOpts = '';
 
 /**
  * Set this to true to use the tidy extension
- * @deprecated Use $wgTidyConfig['driver']
+ * @deprecated since 1.26, use $wgTidyConfig['driver']
  */
 $wgTidyInternal = extension_loaded( 'tidy' );
 
 /**
  * Put tidy warnings in HTML comments
  * Only works for internal tidy.
+ * @deprecated since 1.26, use $wgTidyConfig['debugComment']
  */
 $wgDebugTidy = false;
 
@@ -4833,7 +4843,7 @@ $wgReservedUsernames = [
        'Maintenance script', // Maintenance scripts which perform editing, image import script
        'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
        'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
-       'Unknown user', // Used in WikiImporter when importing revisions with no author
+       'Unknown user', // Used in WikiImporter and RevisionStore for revisions with no author
        'msg:double-redirect-fixer', // Automatic double redirect fix
        'msg:usermessage-editor', // Default user for leaving user messages
        'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
index d8903c3..f1f0572 100644 (file)
@@ -1689,7 +1689,7 @@ class EditPage {
                                // is if an extension hook aborted from inside ArticleSave.
                                // Render the status object into $this->hookError
                                // FIXME this sucks, we should just use the Status object throughout
-                               $this->hookError = '<div class="error">' ."\n" . $status->getWikiText() .
+                               $this->hookError = '<div class="error">' . "\n" . $status->getWikiText() .
                                        '</div>';
                                return true;
                }
@@ -2490,6 +2490,8 @@ ERROR;
                $displayTitle = isset( $this->mParserOutput ) ? $this->mParserOutput->getDisplayTitle() : false;
                if ( $displayTitle === false ) {
                        $displayTitle = $contextTitle->getPrefixedText();
+               } else {
+                       $out->setDisplayTitle( $displayTitle );
                }
                $out->setPageTitle( $this->context->msg( $msg, $displayTitle ) );
 
index 4f12110..336cb89 100644 (file)
@@ -2503,38 +2503,6 @@ function wfUsePHP( $req_ver ) {
        }
 }
 
-/**
- * This function works like "use VERSION" in Perl except it checks the version
- * of MediaWiki, the program will die with a backtrace if the current version
- * of MediaWiki is less than the version provided.
- *
- * This is useful for extensions which due to their nature are not kept in sync
- * with releases
- *
- * Note: Due to the behavior of PHP's version_compare() which is used in this
- * function, if you want to allow the 'wmf' development versions add a 'c' (or
- * any single letter other than 'a', 'b' or 'p') as a post-fix to your
- * targeted version number. For example if you wanted to allow any variation
- * of 1.22 use `wfUseMW( '1.22c' )`. Using an 'a' or 'b' instead of 'c' will
- * not result in the same comparison due to the internal logic of
- * version_compare().
- *
- * @see perldoc -f use
- *
- * @deprecated since 1.26, use the "requires" property of extension.json
- * @param string|int|float $req_ver The version to check, can be a string, an integer, or a float
- * @throws MWException
- */
-function wfUseMW( $req_ver ) {
-       global $wgVersion;
-
-       wfDeprecated( __FUNCTION__, '1.26' );
-
-       if ( version_compare( $wgVersion, (string)$req_ver, '<' ) ) {
-               throw new MWException( "MediaWiki $req_ver required--this is only $wgVersion" );
-       }
-}
-
 /**
  * Return the final portion of a pathname.
  * Reimplemented because PHP5's "basename()" is buggy with multibyte text.
index 4f12e0c..99a4c2b 100644 (file)
@@ -58,6 +58,15 @@ class OutputPage extends ContextSource {
         * @var string The contents of <h1> */
        private $mPageTitle = '';
 
+       /**
+        * @var string The displayed title of the page. Different from page title
+        * if overridden by display title magic word or hooks. Can contain safe
+        * HTML. Different from page title which may contain messages such as
+        * "Editing X" which is displayed in h1. This can be used for other places
+        * where the page name is referred on the page.
+        */
+       private $displayTitle;
+
        /**
         * @var string Contains all of the "<body>" content. Should be private we
         *   got set/get accessors and the append() method.
@@ -964,6 +973,48 @@ class OutputPage extends ContextSource {
                return $this->mPageTitle;
        }
 
+       /**
+        * Same as page title but only contains name of the page, not any other text.
+        *
+        * @since 1.32
+        * @param string $html Page title text.
+        * @see OutputPage::setPageTitle
+        */
+       public function setDisplayTitle( $html ) {
+               $this->displayTitle = $html;
+       }
+
+       /**
+        * Returns page display title.
+        *
+        * Performs some normalization, but this not as strict the magic word.
+        *
+        * @since 1.32
+        * @return string HTML
+        */
+       public function getDisplayTitle() {
+               $html = $this->displayTitle;
+               if ( $html === null ) {
+                       $html = $this->getTitle()->getPrefixedText();
+               }
+
+               return Sanitizer::normalizeCharReferences( Sanitizer::removeHTMLtags( $html ) );
+       }
+
+       /**
+        * Returns page display title without namespace prefix if possible.
+        *
+        * @since 1.32
+        * @return string HTML
+        */
+       public function getUnprefixedDisplayTitle() {
+               $text = $this->getDisplayTitle();
+               $nsPrefix = $this->getTitle()->getNsText() . ':';
+               $prefix = preg_quote( $nsPrefix, '/' );
+
+               return preg_replace( "/^$prefix/i", '', $text );
+       }
+
        /**
         * Set the Title object to use
         *
index 0c052d1..fa16c61 100644 (file)
@@ -42,7 +42,7 @@ use Wikimedia\Assert\Assert;
  *
  * @since 1.32
  */
-class RenderedRevision {
+class RenderedRevision implements SlotRenderingProvider {
 
        /**
         * @var Title
@@ -95,7 +95,11 @@ class RenderedRevision {
         * but should use a RevisionRenderer instead.
         *
         * @param Title $title
-        * @param RevisionRecord $revision
+        * @param RevisionRecord $revision The revision to render. The content for rendering will be
+        *        taken from this RevisionRecord. However, if the RevisionRecord is not complete
+        *        according isReadyForInsertion(), but a revision ID is known, the parser may load
+        *        the revision from the database if it needs revision meta data to handle magic
+        *        words like {{REVISIONUSER}}.
         * @param ParserOptions $options
         * @param callable $combineOutput Callback for combining slot output into revision output.
         *        Signature: function ( RenderedRevision $this ): ParserOutput.
@@ -287,19 +291,50 @@ class RenderedRevision {
        private function setRevisionInternal( RevisionRecord $revision ) {
                $this->revision = $revision;
 
-               // Make sure the parser uses the correct Revision object
-               $title = $this->title;
-               $oldCallback = $this->options->getCurrentRevisionCallback();
-               $this->options->setCurrentRevisionCallback(
-                       function ( Title $parserTitle, $parser = false ) use ( $title, $oldCallback ) {
-                               if ( $parserTitle->equals( $title ) ) {
-                                       $legacyRevision = new Revision( $this->revision );
-                                       return $legacyRevision;
-                               } else {
-                                       return call_user_func( $oldCallback, $parserTitle, $parser );
+               // Force the parser to use  $this->revision to resolve magic words like {{REVISIONUSER}}
+               // if the revision is either known to be complete, or it doesn't have a revision ID set.
+               // If it's incomplete and we have a revision ID, the parser can do better by loading
+               // the revision from the database if needed to handle a magic word.
+               //
+               // The following considerations inform the logic described above:
+               //
+               // 1) If we have a saved revision already loaded, we want the parser to use it, instead of
+               // loading it again.
+               //
+               // 2) If the revision is a fake that wraps some kind of synthetic content, such as an
+               // error message from Article, it should be used directly and things like {{REVISIONUSER}}
+               // should not expected to work, since there may not even be an actual revision to
+               // refer to.
+               //
+               // 3) If the revision is a fake constructed around a Title, a Content object, and
+               // a revision ID, to provide backwards compatibility to code that has access to those
+               // but not to a complete RevisionRecord for rendering, then we want the Parser to
+               // load the actual revision from the database when it encounters a magic word like
+               // {{REVISIONUSER}}, but we don't want to load that revision ahead of time just in case.
+               //
+               // 4) Previewing an edit to a template should use the submitted unsaved
+               // MutableRevisionRecord for self-transclusions in the template's documentation (see T7278).
+               // That revision would be complete except for the ID field.
+               //
+               // 5) Pre-save transform would provide a RevisionRecord that has all meta-data but is
+               // incomplete due to not yet having content set. However, since it doesn't have a revision
+               // ID either, the below code would still force it to be used, allowing
+               // {{subst::REVISIONUSER}} to function as expected.
+
+               if ( $this->revision->isReadyForInsertion() || !$this->revision->getId() ) {
+                       $title = $this->title;
+                       $oldCallback = $this->options->getCurrentRevisionCallback();
+                       $this->options->setCurrentRevisionCallback(
+                               function ( Title $parserTitle, $parser = false ) use ( $title, $oldCallback ) {
+                                       if ( $title->equals( $parserTitle ) ) {
+                                               $legacyRevision = new Revision( $this->revision );
+                                               return $legacyRevision;
+                                       } else {
+                                               return call_user_func( $oldCallback, $parserTitle, $parser );
+                                       }
                                }
-                       }
-               );
+                       );
+               }
        }
 
        /**
diff --git a/includes/Revision/SlotRenderingProvider.php b/includes/Revision/SlotRenderingProvider.php
new file mode 100644 (file)
index 0000000..740f0f2
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: daki
+ * Date: 05.09.18
+ * Time: 16:08
+ */
+namespace MediaWiki\Revision;
+
+use MediaWiki\Storage\SuppressedDataException;
+use ParserOutput;
+
+/**
+ * A lazy provider of ParserOutput objects for a revision's individual slots.
+ *
+ * @since 1.32
+ */
+interface SlotRenderingProvider {
+
+       /**
+        * @param string $role
+        * @param array $hints Hints given as an associative array. Known keys:
+        *      - 'generate-html' => bool: Whether the caller is interested in output HTML (as opposed
+        *        to just meta-data). Default is to generate HTML.
+        *
+        * @throws SuppressedDataException if the content is not accessible for the audience
+        *         specified in the constructor.
+        * @return ParserOutput
+        */
+       public function getSlotParserOutput( $role, array $hints = [] );
+
+}
index 99c31b2..e34e406 100644 (file)
@@ -27,12 +27,14 @@ use CategoryMembershipChangeJob;
 use Content;
 use ContentHandler;
 use DataUpdate;
+use DeferrableUpdate;
 use DeferredUpdates;
 use Hooks;
 use IDBAccessObject;
 use InvalidArgumentException;
 use JobQueueGroup;
 use Language;
+use LinksDeletionUpdate;
 use LinksUpdate;
 use LogicException;
 use MediaWiki\Edit\PreparedEdit;
@@ -165,8 +167,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         *
         * Contains the following fields:
         * - oldRevision (RevisionRecord|null): the revision that was current before the change
-        *   associated with this update. Might not be set, use getOldRevision() instead of direct
-        *   access.
+        *   associated with this update. Might not be set, use getParentRevision().
         * - oldId (int|null): the id of the above revision. 0 if there is no such revision (the change
         *   was about creating a new page); null if not known (that should not happen).
         * - oldIsRedirect (bool|null): whether the page was a redirect before the change. Lazy-loaded,
@@ -183,6 +184,11 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         */
        private $slotsUpdate = null;
 
+       /**
+        * @var RevisionRecord|null
+        */
+       private $parentRevision = null;
+
        /**
         * @var RevisionRecord|null
         */
@@ -456,29 +462,34 @@ class DerivedPageDataUpdater implements IDBAccessObject {
        }
 
        /**
-        * Returns the revision that was current before the edit. This would be null if the edit
-        * created the page, or the revision's parent for a regular edit, or the revision itself
-        * for a null-edit.
-        * Only defined after calling grabCurrentRevision() or prepareContent() or prepareUpdate()!
+        * Returns the parent revision of the new revision wrapped by this update.
+        * If the update is a null-edit, this will return the parent of the current (and new) revision.
+        * This will return null if the revision wrapped by this update created the page.
+        * Only defined after calling prepareContent() or prepareUpdate()!
         *
-        * @return RevisionRecord|null the revision that was current before the edit, or null if
-        *         the edit created the page.
+        * @return RevisionRecord|null the parent revision of the new revision, or null if
+        *         the update created the page.
         */
-       private function getOldRevision() {
-               $this->assertHasPageState( __METHOD__ );
+       private function getParentRevision() {
+               $this->assertPrepared( __METHOD__ );
 
-               // If 'oldRevision' is not set, load it!
-               // Useful if $this->oldPageState is initialized by prepareUpdate.
-               if ( !array_key_exists( 'oldRevision', $this->pageState ) ) {
-                       /** @var int $oldId */
-                       $oldId = $this->pageState['oldId'];
-                       $flags = $this->useMaster() ? RevisionStore::READ_LATEST : 0;
-                       $this->pageState['oldRevision'] = $oldId
-                               ? $this->revisionStore->getRevisionById( $oldId, $flags )
-                               : null;
+               if ( $this->parentRevision ) {
+                       return $this->parentRevision;
                }
 
-               return $this->pageState['oldRevision'];
+               if ( !$this->pageState['oldId'] ) {
+                       // If there was no current revision, there is no parent revision,
+                       // since the page didn't exist.
+                       return null;
+               }
+
+               $oldId = $this->revision->getParentId();
+               $flags = $this->useMaster() ? RevisionStore::READ_LATEST : 0;
+               $this->parentRevision = $oldId
+                       ? $this->revisionStore->getRevisionById( $oldId, $flags )
+                       : null;
+
+               return $this->parentRevision;
        }
 
        /**
@@ -495,8 +506,8 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         * @note After prepareUpdate() was called, grabCurrentRevision() will throw an exception
         * to avoid confusion, since the page's current revision is then the new revision after
         * the edit, which was presumably passed to prepareUpdate() as the $revision parameter.
-        * Use getOldRevision() instead to access the revision that used to be current before the
-        * edit.
+        * Use getParentRevision() instead to access the revision that is the parent of the
+        * new revision.
         *
         * @return RevisionRecord|null the page's current revision, or null if the page does not
         * yet exist.
@@ -834,6 +845,8 @@ class DerivedPageDataUpdater implements IDBAccessObject {
 
                        // prepareUpdate() is redundant for null-edits
                        $this->doTransition( 'has-revision' );
+               } else {
+                       $this->parentRevision = $parentRevision;
                }
        }
 
@@ -969,7 +982,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                $this->assertPrepared( __METHOD__ );
 
                if ( !$this->slotsUpdate ) {
-                       $old = $this->getOldRevision();
+                       $old = $this->getParentRevision();
                        $this->slotsUpdate = RevisionSlotsUpdate::newFromRevisionSlots(
                                $this->revision->getSlots(),
                                $old ? $old->getSlots() : null
@@ -1077,7 +1090,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                        } else {
                                throw new LogicException(
                                        'Trying to re-use DerivedPageDataUpdater with revision '
-                                       .$revision->getId()
+                                       . $revision->getId()
                                        . ', but it\'s already bound to revision '
                                        . $this->revision->getId()
                                );
@@ -1138,7 +1151,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                        if ( !$this->user->equals( $user ) ) {
                                throw new LogicException(
                                        'The Revision provided has a mismatching actor: expected '
-                                       .$this->user->getName()
+                                       . $this->user->getName()
                                        . ', got '
                                        . $user->getName()
                                );
@@ -1252,34 +1265,103 @@ class DerivedPageDataUpdater implements IDBAccessObject {
        /**
         * @param bool $recursive
         *
-        * @return DataUpdate[]
+        * @return DeferrableUpdate[]
         */
        public function getSecondaryDataUpdates( $recursive = false ) {
-               // TODO: MCR: getSecondaryDataUpdates() needs a complete overhaul to avoid DataUpdates
-               // from different slots overwriting each other in the database. Plan:
-               // * replace direct calls to Content::getSecondaryDataUpdates() with calls to this method
-               // * Construct LinksUpdate here, on the combined ParserOutput, instead of in AbstractContent
-               //   for each slot.
-               // * Pass $slot into getSecondaryDataUpdates() - probably be introducing a new duplicate
-               //   version of this function in ContentHandler.
-               // * The new method gets the PreparedEdit, but no $recursive flag (that's for LinksUpdate)
-               // * Hack: call both the old and the new getSecondaryDataUpdates method here; Pass
-               //   the per-slot ParserOutput to the old method, for B/C.
-               // * Hack: If there is more than one slot, filter LinksUpdate from the DataUpdates
-               //   returned by getSecondaryDataUpdates, and use a LinksUpdated for the combined output
-               //   instead.
-               // * Call the SecondaryDataUpdates hook here (or kill it - its signature doesn't make sense)
-
-               $content = $this->getSlots()->getContent( 'main' );
-
-               // NOTE: $output is the combined output, to be shown in the default view.
+               if ( $this->isContentDeleted() ) {
+                       // This shouldn't happen, since the current content is always public,
+                       // and DataUpates are only needed for current content.
+                       return [];
+               }
+
                $output = $this->getCanonicalParserOutput();
 
-               $updates = $content->getSecondaryDataUpdates(
-                       $this->getTitle(), null, $recursive, $output
+               // Construct a LinksUpdate for the combined canonical output.
+               $linksUpdate = new LinksUpdate(
+                       $this->getTitle(),
+                       $output,
+                       $recursive
                );
 
-               return $updates;
+               $allUpdates = [ $linksUpdate ];
+
+               // NOTE: Run updates for all slots, not just the modified slots! Otherwise,
+               // info for an inherited slot may end up being removed. This is also needed
+               // to ensure that purges are effective.
+               $renderedRevision = $this->getRenderedRevision();
+               foreach ( $this->getSlots()->getSlotRoles() as $role ) {
+                       $slot = $this->getRawSlot( $role );
+                       $content = $slot->getContent();
+                       $handler = $content->getContentHandler();
+
+                       $updates = $handler->getSecondaryDataUpdates(
+                               $this->getTitle(),
+                               $content,
+                               $role,
+                               $renderedRevision
+                       );
+                       $allUpdates = array_merge( $allUpdates, $updates );
+
+                       // TODO: remove B/C hack in 1.32!
+                       // NOTE: we assume that the combined output contains all relevant meta-data for
+                       // all slots!
+                       $legacyUpdates = $content->getSecondaryDataUpdates(
+                               $this->getTitle(),
+                               null,
+                               $recursive,
+                               $output
+                       );
+
+                       // HACK: filter out redundant and incomplete LinksUpdates
+                       $legacyUpdates = array_filter( $legacyUpdates, function ( $update ) {
+                               return !( $update instanceof LinksUpdate );
+                       } );
+
+                       $allUpdates = array_merge( $allUpdates, $legacyUpdates );
+               }
+
+               // XXX: if a slot was removed by an earlier edit, but deletion updates failed to run at
+               // that time, we don't know for which slots to run deletion updates when purging a page.
+               // We'd have to examine the entire history of the page to determine that. Perhaps there
+               // could be a "try extra hard" mode for that case that would run a DB query to find all
+               // roles/models ever used on the page. On the other hand, removing slots should be quite
+               // rare, so perhaps this isn't worth the trouble.
+
+               // TODO: consolidate with similar logic in WikiPage::getDeletionUpdates()
+               $wikiPage = $this->getWikiPage();
+               $parentRevision = $this->getParentRevision();
+               foreach ( $this->getRemovedSlotRoles() as $role ) {
+                       // HACK: we should get the content model of the removed slot from a SlotRoleHandler!
+                       // For now, find the slot in the parent revision - if the slot was removed, it should
+                       // always exist in the parent revision.
+                       $parentSlot = $parentRevision->getSlot( $role, RevisionRecord::RAW );
+                       $content = $parentSlot->getContent();
+                       $handler = $content->getContentHandler();
+
+                       $updates = $handler->getDeletionUpdates(
+                               $this->getTitle(),
+                               $role
+                       );
+                       $allUpdates = array_merge( $allUpdates, $updates );
+
+                       // TODO: remove B/C hack in 1.32!
+                       $legacyUpdates = $content->getDeletionUpdates( $wikiPage );
+
+                       // HACK: filter out redundant and incomplete LinksDeletionUpdate
+                       $legacyUpdates = array_filter( $legacyUpdates, function ( $update ) {
+                               return !( $update instanceof LinksDeletionUpdate );
+                       } );
+
+                       $allUpdates = array_merge( $allUpdates, $legacyUpdates );
+               }
+
+               // TODO: hard deprecate SecondaryDataUpdates in favor of RevisionDataUpdates in 1.33!
+               Hooks::run(
+                       'RevisionDataUpdates',
+                       [ $this->getTitle(), $renderedRevision, &$allUpdates ]
+               );
+
+               return $allUpdates;
        }
 
        /**
@@ -1425,7 +1507,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                        WikiPage::onArticleEdit( $title, $legacyRevision, $this->getTouchedSlotRoles() );
                }
 
-               $oldRevision = $this->getOldRevision();
+               $oldRevision = $this->getParentRevision();
                $oldLegacyRevision = $oldRevision ? new Revision( $oldRevision ) : null;
 
                // TODO: In the wiring, register a listener for this on the new PageEventEmitter
@@ -1484,7 +1566,9 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                }
 
                foreach ( $updates as $update ) {
-                       $update->setCause( $causeAction, $causeAgent );
+                       if ( $update instanceof DataUpdate ) {
+                               $update->setCause( $causeAction, $causeAgent );
+                       }
                        if ( $update instanceof LinksUpdate ) {
                                $update->setRevision( $legacyRevision );
                                $update->setTriggeringUser( $triggeringUser );
index 213ee3c..173da51 100644 (file)
@@ -167,4 +167,13 @@ class RevisionArchiveRecord extends RevisionRecord {
                return parent::getTimestamp();
        }
 
+       /**
+        * @see RevisionStore::isComplete
+        *
+        * @return bool always true.
+        */
+       public function isReadyForInsertion() {
+               return true;
+       }
+
 }
index 17c56ea..8c31a3c 100644 (file)
@@ -532,4 +532,29 @@ abstract class RevisionRecord {
                }
        }
 
+       /**
+        * Returns whether this RevisionRecord is ready for insertion, that is, whether it contains all
+        * information needed to save it to the database. This should trivially be true for
+        * RevisionRecords loaded from the database.
+        *
+        * Note that this may return true even if getId() or getPage() return null or 0, since these
+        * are generally assigned while the revision is saved to the database, and may not be available
+        * before.
+        *
+        * @return bool
+        */
+       public function isReadyForInsertion() {
+               // NOTE: don't check getSize() and getSha1(), since that may cause the full content to
+               // be loaded in order to calculate the values. Just assume these methods will not return
+               // null if mSlots is not empty.
+
+               // NOTE: getId() and getPageId() may return null before a revision is saved, so don't
+               //check them.
+
+               return $this->getTimestamp() !== null
+                       && $this->getComment( self::RAW ) !== null
+                       && $this->getUser( self::RAW ) !== null
+                       && $this->mSlots->getSlotRoles() !== [];
+       }
+
 }
index ce8a088..61b428f 100644 (file)
@@ -466,6 +466,12 @@ class RevisionStore
                $this->failOnNull( $user->getId(), 'user field' );
                $this->failOnEmpty( $user->getName(), 'user_text field' );
 
+               if ( !$rev->isReadyForInsertion() ) {
+                       // This is here for future-proofing. At the time this check being added, it
+                       // was redundant to the individual checks above.
+                       throw new IncompleteRevisionException( 'Revision is incomplete' );
+               }
+
                // TODO: we shouldn't need an actual Title here.
                $title = Title::newFromLinkTarget( $rev->getPageAsLinkTarget() );
                $pageId = $this->failOnEmpty( $rev->getPageId(), 'rev_page field' ); // check this early
@@ -519,11 +525,11 @@ class RevisionStore
                        $slot = $rev->getSlot( $role, RevisionRecord::RAW );
                        Assert::postcondition(
                                $slot->getContent() !== null,
-                               $role .  ' slot must have content'
+                               $role . ' slot must have content'
                        );
                        Assert::postcondition(
                                $slot->hasRevision(),
-                               $role .  ' slot must have a revision associated'
+                               $role . ' slot must have a revision associated'
                        );
                }
 
@@ -1705,8 +1711,8 @@ class RevisionStore
                                $row->ar_actor ?? null
                        );
                } catch ( InvalidArgumentException $ex ) {
-                       wfWarn( __METHOD__ . ': ' . $ex->getMessage() );
-                       $user = new UserIdentityValue( 0, '', 0 );
+                       wfWarn( __METHOD__ . ': ' . $title->getPrefixedDBkey() . ': ' . $ex->getMessage() );
+                       $user = new UserIdentityValue( 0, 'Unknown user', 0 );
                }
 
                $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
@@ -1753,8 +1759,8 @@ class RevisionStore
                                $row->rev_actor ?? null
                        );
                } catch ( InvalidArgumentException $ex ) {
-                       wfWarn( __METHOD__ . ': ' . $ex->getMessage() );
-                       $user = new UserIdentityValue( 0, '', 0 );
+                       wfWarn( __METHOD__ . ': ' . $title->getPrefixedDBkey() . ': ' . $ex->getMessage() );
+                       $user = new UserIdentityValue( 0, 'Unknown user', 0 );
                }
 
                $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
index d092f22..6148c44 100644 (file)
@@ -207,4 +207,13 @@ class RevisionStoreRecord extends RevisionRecord {
                return parent::getTimestamp();
        }
 
+       /**
+        * @see RevisionStore::isComplete
+        *
+        * @return bool always true.
+        */
+       public function isReadyForInsertion() {
+               return true;
+       }
+
 }
index ca62e0e..bbc1d63 100644 (file)
@@ -1665,7 +1665,7 @@ class Title implements LinkTarget {
                        if ( $nsText === false ) {
                                // See T165149. Awkward, but better than erroneously linking to the main namespace.
                                $nsText = MediaWikiServices::getInstance()->getContentLanguage()->
-                                       getNsText( NS_SPECIAL ) .  ":Badtitle/NS{$this->mNamespace}";
+                                       getNsText( NS_SPECIAL ) . ":Badtitle/NS{$this->mNamespace}";
                        }
 
                        $p .= $nsText . ':';
index 327dd54..ed10615 100644 (file)
@@ -856,7 +856,7 @@ class WebRequest {
         * @return string
         */
        public function getFullRequestURL() {
-               return wfGetServerUrl( PROTO_CURRENT ) .  $this->getRequestURL();
+               return wfGetServerUrl( PROTO_CURRENT ) . $this->getRequestURL();
        }
 
        /**
index 9d336e4..dc7b00e 100644 (file)
@@ -151,7 +151,6 @@ class RollbackAction extends FormlessAction {
                        );
                        $de->showDiff( '', '' );
                }
-               return;
        }
 
        protected function getDescription() {
index 0248f25..14491da 100644 (file)
@@ -132,7 +132,8 @@ class ApiLogin extends ApiBase {
                                $loginType = 'BotPassword';
                        } elseif ( !$botLoginData[2] ||
                                $status->hasMessage( 'login-throttled' ) ||
-                               $status->hasMessage( 'botpasswords-needs-reset' )
+                               $status->hasMessage( 'botpasswords-needs-reset' ) ||
+                               $status->hasMessage( 'botpasswords-locked' )
                        ) {
                                $authRes = 'Failed';
                                $message = $status->getMessage();
index 830df59..bae6885 100644 (file)
@@ -76,7 +76,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                                if ( !is_null( $params[$param] ) ) {
                                        $p = $this->getModulePrefix();
                                        $this->dieWithError(
-                                               [ 'apierror-invalidparammix-cannotusewith', $p.$param, "{$p}user" ],
+                                               [ 'apierror-invalidparammix-cannotusewith', $p . $param, "{$p}user" ],
                                                'invalidparammix'
                                        );
                                }
@@ -86,7 +86,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                                if ( !is_null( $params[$param] ) ) {
                                        $p = $this->getModulePrefix();
                                        $this->dieWithError(
-                                               [ 'apierror-invalidparammix-mustusewith', $p.$param, "{$p}user" ],
+                                               [ 'apierror-invalidparammix-mustusewith', $p . $param, "{$p}user" ],
                                                'invalidparammix'
                                        );
                                }
index 0cf6b04..3b7b00d 100644 (file)
@@ -522,7 +522,7 @@ class ApiQueryInfo extends ApiQueryBase {
                }
 
                if ( $this->params['testactions'] ) {
-                       $limit = $this->getMain()->canApiHighLimits() ? self::LIMIT_SML1 : self::LIMIT_SML2;
+                       $limit = $this->getMain()->canApiHighLimits() ? self::LIMIT_SML2 : self::LIMIT_SML1;
                        if ( $this->countTestedActions >= $limit ) {
                                return null; // force a continuation
                        }
index a4f0794..d6af2f1 100644 (file)
        "apihelp-compare-param-fromtitle": "العنوان الأول للمقارنة.",
        "apihelp-compare-param-fromid": "رقم الصفحة الأول للمقارنة.",
        "apihelp-compare-param-fromrev": "أول مراجعة للمقارنة.",
-       "apihelp-compare-param-frompst": "قم بإجراء تحويل ما قبل الحفظ على <var>fromtext</var>.",
-       "apihelp-compare-param-fromtext": "استخدم هذا النص بدلا من محتوى المراجعة المحدد بواسطة <var>fromtitle</var>، <var>fromid</var> أو <var>fromrev</var>.",
-       "apihelp-compare-param-fromcontentmodel": "نموذج محتوى <var>fromtext</var>، إذا لم يتم توفيره، فسيتم تخمينه استنادا إلى الوسائط الأخرى.",
-       "apihelp-compare-param-fromcontentformat": "تنسيق محتوى تسلسل <var>fromtext</var>.",
+       "apihelp-compare-param-frompst": "قم بإجراء تحويل ما قبل الحفظ على <var>fromtext-&#x7B;slot}</var>.",
+       "apihelp-compare-param-fromslots": "تجاوز محتوى المراجعة المحددة بواسطة <var>fromtitle</var> أو <var>fromid</var> أو <var>fromrev</var>.\n\nيحدد هذا الوسيط الفتحات المراد تعديلها، استخدم <var>fromtext-&#x7B;slot}</var> و<var>fromcontentmodel-&#x7B;slot}</var> و<var>fromcontentformat-&#x7B;slot}</var> لتحديد محتوى لكل فتحة.",
+       "apihelp-compare-param-fromtext-{slot}": "نص الفتحة المحددة، إذا تم حذفها، تتم إزالة الفتحة من المراجعة.",
+       "apihelp-compare-param-fromsection-{slot}": "عندما يكون <var>fromtext-&#x7B;slot}</var> هو محتوى قسم واحد، فهذا هو رقم القسم، سيتم دمجه في المراجعة المحددة بواسطة <var>fromtitle</var> أو <var>fromid</var> أو <var>fromrev</var> كما لو كانت لتعديل القسم.",
+       "apihelp-compare-param-fromcontentmodel-{slot}": "نموذج محتوى <var>fromtext-&#x7B;slot}</var>، إذا لم يتم توفيره، فسيتم تخمينه استنادا إلى الوسائط الأخرى.",
+       "apihelp-compare-param-fromcontentformat-{slot}": "تنسيق تسلسل محتوى <var>fromtext-&#x7B;slot}</var>.",
+       "apihelp-compare-param-fromtext": "حدد <kbd>fromslots=main</kbd> واستخدم <var>fromtext-main</var> كبديل.",
+       "apihelp-compare-param-fromcontentmodel": "حدد <kbd>fromslots=main</kbd> واستخدم <var>fromcontentmodel-main</var> كبديل.",
+       "apihelp-compare-param-fromcontentformat": "حدد <kbd>fromslots=main</kbd> واستخدم <var>fromcontentformat-main</var> كبديل.",
        "apihelp-compare-param-fromsection": "استخدم فقط القسم المحدد في المحتوى 'من' المحدد.",
        "apihelp-compare-param-totitle": "العنوان الثاني للمقارنة.",
        "apihelp-compare-param-toid": "رقم الصفحة الثاني للمقارنة.",
        "apihelp-compare-param-torev": "المراجعة الثانية للمقارنة.",
        "apihelp-compare-param-torelative": "استخدم مراجعة متعلقة بالمراجعة المحددة من <var>fromtitle</var> أو <var>fromid</var> أو <var>fromrev</var>، سيتم تجاهل جميع خيارات 'إلى' الأخرى.",
        "apihelp-compare-param-topst": "قم بإجراء تحويل ما قبل الحفظ على <var>totext</var>.",
-       "apihelp-compare-param-totext": "استخدم هذا النص بدلا من محتوى المراجعة المحدد بواسطة <var>totitle</var> أو <var>toid</var> أو <var>torev</var>.",
-       "apihelp-compare-param-tocontentmodel": "نموذج محتوى <var>totext</var>، إذا لم يتم توفيره، فسيتم تخمينه استنادا إلى الوسائط الأخرى.",
-       "apihelp-compare-param-tocontentformat": "تنسيق محتوى تسلسل <var>totext</var>.",
+       "apihelp-compare-param-toslots": "تجاوز محتوى المراجعة المحددة بواسطة <var>totitle</var> أو <var>toid</var> أو <var>torev</var>.\n\nيحدد هذا الوسيط الفتحات المراد تعديلها، استخدم <var>totext-&#x7B;slot}</var> و<var>tocontentmodel-&#x7B;slot}</var> و<var>tocontentformat-&#x7B;slot}</var> لتحديد محتوى لكل فتحة.",
+       "apihelp-compare-param-totext-{slot}": "نص الفتحة المحددة، إذا تم حذفه، تتم إزالة الفتحة من المراجعة.",
+       "apihelp-compare-param-tosection-{slot}": "عندما يكون <var>totext-&#x7B;slot}</var> هو محتوى قسم واحد، فهذا هو رقم القسم، سيتم دمجه في المراجعة المحددة بواسطة <var>totitle</var> أو <var>toid</var> أو <var>torev</var> كما لو كانت لتعديل القسم.",
+       "apihelp-compare-param-tocontentmodel-{slot}": "نموذج محتوى <var>totext-&#x7B;slot}</var>، إذا لم يتم توفيره، فسيتم تخمينه استنادا إلى الوسائط الأخرى.",
+       "apihelp-compare-param-tocontentformat-{slot}": "تنسيق تسلسل محتوى <var>totext-&#x7B;slot}</var>.",
+       "apihelp-compare-param-totext": "حدد <kbd>toslots=main</kbd> واستخدم <var>totext-main</var> كبديل.",
+       "apihelp-compare-param-tocontentmodel": "حدد <kbd>toslots=main</kbd> واستخدم <var>tocontentmodel-main</var> كبديل.",
+       "apihelp-compare-param-tocontentformat": "حدد <kbd>toslots=main</kbd> واستخدم <var>tocontentformat-main</var> كبديل.",
        "apihelp-compare-param-tosection": "استخدم فقط القسم المحدد في المحتوى 'إلى' المحدد.",
        "apihelp-compare-param-prop": "أية قطعة من المعلومات للحصول عليها.",
        "apihelp-compare-paramvalue-prop-diff": "HTML الفرق.",
@@ -88,6 +98,7 @@
        "apihelp-compare-paramvalue-prop-comment": "التعليق على المراجعات 'من' و'إلى'.",
        "apihelp-compare-paramvalue-prop-parsedcomment": "التعليق المحلل على المراجعات 'من' و'إلى'.",
        "apihelp-compare-paramvalue-prop-size": "حجم المراجعات 'من' و'إلى'.",
+       "apihelp-compare-param-slots": "إرجاع فرق فردي لهذه الفتحات، بدلا من فرق واحد مشترك لجميع فتحات.",
        "apihelp-compare-example-1": "إنشاء فرق بين المراجعة 1 و2.",
        "apihelp-createaccount-summary": "انشاء حساب مستخدم جديد",
        "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-query+iwbacklinks-paramvalue-prop-iwprefix": "يضيف بادئة الإنترويكي.",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "يضيف عنوان الإنترويكي.",
        "apihelp-query+iwbacklinks-param-dir": "الاتجاه للإدراج فيه.",
+       "apihelp-query+iwbacklinks-example-simple": "الحصول على الصفحات التي تصل إلى [[wikibooks:Test]].",
+       "apihelp-query+iwbacklinks-example-generator": "الحصول على معلومات عن الصفحات التي تصل إلى [[wikibooks:Test]].",
        "apihelp-query+iwlinks-summary": "يعرض جميع روابط الإنترويكي من الصفحات المحددة.",
        "apihelp-query+iwlinks-param-url": "ما إذا كنت تريد الحصول على المسار الكامل (لا يمكن استخدامه مع $1prop).",
        "apihelp-query+iwlinks-param-prop": "الخصائص الإضافية التي يمكنك الحصول عليها لكل رابط بين اللغات:",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "وسوم للمراجعة.",
        "apihelp-query+revisions+base-paramvalue-prop-roles": "أدرج أدوار فتحة المحتوى الموجودة في المراجعة.",
        "apihelp-query+revisions+base-paramvalue-prop-parsetree": "استخدم <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> أو <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> بدلا من ذلك، شجرة تحليل XML لمحتوى المراجعة (تتطلب نموذج المحتوى <code>$1</code>).",
+       "apihelp-query+revisions+base-param-slots": "أي الفتحات المراجعة لتعيد البيانات، عندما يتم تضمين الخصائص ذات الصلة بالفتحات في <var>$1props</var>، إذا تم حذفها، فسيتم إرجاع البيانات من فتحة <kbd>main</kbd> بتنسيق متوافق مع الإصدارات السابقة.",
        "apihelp-query+revisions+base-param-limit": "الحد من عدد المراجعات التي سيتم إرجاعها.",
        "apihelp-query+revisions+base-param-expandtemplates": "استخدم <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> بدلا من ذلك، قم بتوسيع القوالب في محتوى المراجعة (يتطلب $1prop=content).",
        "apihelp-query+revisions+base-param-generatexml": "استخدم <kbd>[[Special:ApiHelp/expandtemplates|action=expandtemplates]]</kbd> أو <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd> بدلا من ذلك، قم بتوليد شجرة تحليل XML لمحتوى المراجعة (تتطلب $1prop=content).",
        "apihelp-json-param-callback": "إذا تم تحديده، فسيقوم بإخراج الإخراج في استدعاء دالة معينة، للسلامة; سيتم تقييد جميع البيانات الخاصة بالمستخدم.",
        "apihelp-json-param-utf8": "إذا تم تحديده، يقوم بترميز معظم (وليس كل) الأحرف غير ASCII كـUTF-8 بدلا من استبدالها بتسلسلات الهروب السداسية العشرية، افتراضي عندما لا يكون <var>formatversion</var>  <kbd>1</kbd>.",
        "apihelp-json-param-ascii": "إذا تم تحديده، يشفر كل غير ASCII باستخدام تسلسلات الهروب السداسية العشرية، افتراضي عندما يكون <var>formatversion</var> <kbd>1</kbd>.",
+       "apihelp-json-param-formatversion": "تنسيق الإخراج: \n;1:تنسيق متوافق مع الإصدارات السابقة (مصفوفات منطقية بتنسيق XML، ومفاتيح  <samp>*</samp>  لعقد المحتوى، وما إلى ذلك).\n;2:التنسيق الحديث التجريبي، التفاصيل قد تتغير!\n;الأحدث: استخدم أحدث تنسيق (حاليا <kbd>2</kbd>)، قد يتغير دون سابق إنذار.",
        "apihelp-jsonfm-summary": "بيانات الإخراج بتنسيق JSON (الطباعة بـHTML).",
        "apihelp-none-summary": "عدم إخراج أي شيء.",
        "apihelp-php-summary": "بيانات الإخراج بتنسيق PHP المتسلسل.",
+       "apihelp-php-param-formatversion": "تنسيق الإخراج: \n;1:تنسيق متوافق مع الإصدارات السابقة (مصفوفات منطقية بتنسيق XML، ومفاتيح  <samp>*</samp>  لعقد المحتوى، وما إلى ذلك).\n;2:التنسيق الحديث التجريبي، التفاصيل قد تتغير!\n;الأحدث: استخدم أحدث تنسيق (حاليا <kbd>2</kbd>)، قد يتغير دون سابق إنذار.",
        "apihelp-phpfm-summary": "بيانات الإخراج بتنسيق JSON (الطباعة بـHTML).",
        "apihelp-rawfm-summary": "بيانات الإخراج، بما في ذلك عناصر تصحيح الأخطاء، بتنسيق JSON (الطباعة بـHTML).",
        "apihelp-xml-summary": "بيانات الإخراج بتنسيق XML.",
        "apierror-changeauth-norequest": "فشل في إنشاء طلب التغيير.",
        "apierror-chunk-too-small": "الحد الأدنى لحجم القطعة هو $1 {{PLURAL:$1|بايت}} للقطع غير النهائية.",
        "apierror-cidrtoobroad": "لا يُقبَل مدى $1 CIDR أكبر من /$2.",
+       "apierror-compare-maintextrequired": "الوسيط <var>$1text-main</var> مطلوب عندما يكون <var>$1slots</var> يحتوي على <kbd>main</kbd> (لا يمكن حذف الفتحة الرئيسية).",
        "apierror-compare-no-title": "لا يمكن الحفظ المسبق للحفظ بدون عنوان; حاول تحديد <var>fromtitle</var> أو <var>totitle</var>.",
        "apierror-compare-nosuchfromsection": "لا يوجد قسم $1 في المحتوى 'من'.",
        "apierror-compare-nosuchtosection": "لا يوجد قسم $1 في المحتوى 'إلى'.",
+       "apierror-compare-nofromrevision": "ليس 'من' مراجعة، حدد <var>fromrev</var> أو <var>fromtitle</var> أو <var>fromid</var>.",
+       "apierror-compare-notext": "لا يمكن استخدام الوسيط <var>$1</var> بدون <var>$2</var>.",
+       "apierror-compare-notorevision": "ليس 'إلى' مراجعة، حدد <var>torev</var> أو <var>totitle</var> أو <var>toid</var>.",
        "apierror-compare-relative-to-nothing": "لا توجد مراجعة 'من' لـ<var>torelative</var> لتكون نسبة.",
        "apierror-contentserializationexception": "فشل تسلسل المحتوى: $1",
        "apierror-contenttoobig": "يتجاوز المحتوى الذي أدخلته حد حجم المقالة البالغ $1 {{PLURAL:$1|كيلوبايت}}.",
        "apierror-mimesearchdisabled": "تم تعطيل بحث MIME في وضع Miser.",
        "apierror-missingcontent-pageid": "محتوى مفقود لمعرف الصفحة $1.",
        "apierror-missingcontent-revid": "محتوى مفقود لمعرف المراجعة $1.",
+       "apierror-missingcontent-revid-role": "محتوى مفقود لمعرف المراجعة $1 للدور $2.",
        "apierror-missingparam-at-least-one-of": "مطلوب {{PLURAL:$2|الوسيط|واحد على الأقل من الوسائط}} $1.",
        "apierror-missingparam-one-of": "مطلوب {{PLURAL:$2|الوسيط|واحد على الأقل من الوسائط}} $1.",
        "apierror-missingparam": "يجب تعيين الوسيط <var>$1</var>.",
        "apiwarn-deprecation-login-botpw": "تم إيقاف تسجيل الدخول إلى الحساب الرئيسي عبر <kbd>action=login</kbd> وقد يتوقف عن العمل دون سابق إنذار، لمتابعة تسجيل الدخول باستخدام <kbd>action=login</kbd>; راجع [[Special:BotPasswords]]، لمتابعة استخدام تسجيل الدخول إلى الحساب الرئيسي بأمان; راجع <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-nobotpw": "تم إيقاف تسجيل الدخول إلى الحساب الرئيسي عبر <kbd>action=login</kbd>، وقد يتوقف عن العمل دون سابق إنذار، لتسجيل الدخول بأمان; راجع <kbd>action=clientlogin</kbd>.",
        "apiwarn-deprecation-login-token": "تم إيقاف عمل رمز مميز عبر <kbd>action=login</kbd> ;استخدم <kbd>action=query&meta=tokens&type=login</kbd> بدلا من ذلك.",
+       "apiwarn-deprecation-missingparam": "نظرا لعدم تحديد <var>$1</var>; تم استخدام تنسيق قديم للإخراج، تم إيقاف هذا التنسيق، وسيتم دائما استخدام التنسيق الجديد في المستقبل.",
        "apiwarn-deprecation-parameter": "تم إيقاف الوسيط <var>$1</var>.",
        "apiwarn-deprecation-parse-headitems": "تم إيقاف <kbd>prop=headitems</kbd> منذ ميدياويكي 1.28; استخدم <kbd>prop=headhtml</kbd> عند إنشاء مستندات HTML جديدة، أو <kbd>prop=modules|jsconfigvars</kbd> عند تحديث مستند من جانب العميل.",
        "apiwarn-deprecation-purge-get": "تم إيقاف استخدام <kbd>action=purge</kbd> عبر GET; استخدم POST بدلا من ذلك.",
        "apiwarn-parse-nocontentmodel": "لم يتم إعطاء <var>title</var> أو <var>contentmodel</var>، على افتراض $1.",
        "apiwarn-parse-revidwithouttext": "تم استخدام <var>revid</var> بدون <var>text</var>، وتم طلب خصائص الصفحة المحللة، هل تقصد استخدام <var>oldid</var> بدلا من <var>revid</var>؟",
        "apiwarn-parse-titlewithouttext": "تم استخدام <var>title</var> بدون <var>text</var>، وتم طلب خصائص الصفحة المحللة، هل تقصد استخدام <var>page</var> بدلا من <var>title</var>؟",
+       "apiwarn-redirectsandrevids": "لا يمكن استخدام دقة تحويلة مع الوسيط <var>revids</var>، أية تحويلات لنقطة <var>revids</var> لم يتم حلها.",
        "apiwarn-tokennotallowed": "الإجراء \"$1\" غير مسموح به للمستخدم الحالي.",
        "apiwarn-tokens-origin": "قد لا يتم الحصول على الرموز عند عدم تطبيق السياسة الأصلية.",
        "apiwarn-truncatedresult": "تم اقتطاع هذه النتيجة لأنها قد تكون أكبر من حد الـ$1 بايت.",
index 8022833..d943e47 100644 (file)
@@ -63,8 +63,8 @@
        "apihelp-compare-param-fromtitle": "比較する1つ目のページ名。",
        "apihelp-compare-param-fromid": "比較する1つ目のページID。",
        "apihelp-compare-param-fromrev": "比較する1つ目の版。",
-       "apihelp-compare-param-frompst": "<var>fromtext</var>に保存前変換を行います。",
-       "apihelp-compare-param-fromtext": "<var>fromtitle</var>, <var>fromid</var> or <var>fromrev</var> で指定された版の内容の代わりに、このテキストを使用します。",
+       "apihelp-compare-param-frompst": "<var>fromtext-&#x7B;slot}</var>に保存前変換を行います。",
+       "apihelp-compare-param-fromtext": "<kbd>fromslots=main</kbd>を指定し、代わりに<var>fromtext-main</var> を使用してください。",
        "apihelp-compare-param-fromcontentmodel": "<var>fromtext</var>のコンテンツモデル。指定されていない場合は、他のパラメータに基づいて推測されます。",
        "apihelp-compare-param-fromsection": "'from' の内容のうち指定された節のみを使用します。",
        "apihelp-compare-param-totitle": "比較する2つ目のページ名。",
        "apihelp-query+revisions+base-paramvalue-prop-size": "その版の長さ (バイト) 。",
        "apihelp-query+revisions+base-paramvalue-prop-comment": "その版の利用者によるコメント。",
        "apihelp-query+revisions+base-paramvalue-prop-parsedcomment": "その版の利用者による、構文解析されたコメント。",
-       "apihelp-query+revisions+base-paramvalue-prop-content": "その版のテキスト。",
+       "apihelp-query+revisions+base-paramvalue-prop-content": "各リビジョンスロットの内容。",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "その版のタグ。",
        "apihelp-query+revisions+base-param-limit": "返す版の数を制限する。",
        "apihelp-query+search-summary": "全文検索を行います。",
index 8edddda..5e30c1a 100644 (file)
@@ -53,7 +53,7 @@
        "apihelp-clearhasmsg-example-1": "Fjern <code>hasmsg</code>-flagget for aktuell bruker.",
        "apihelp-clientlogin-summary": "Logg inn på wikien med den interaktive flyten.",
        "apihelp-clientlogin-example-login": "Start prosessen med å logge inn til wikien som bruker <kbd>Example</kbd> med passord <kbd>ExamplePassword</kbd>.",
-       "apihelp-clientlogin-example-login2": "Fortsett å logge inn etter en <samp>UI</samp>-respons for tofaktor-autentisering, ved å oppgi en <var>OATHToken</var> på <kbd>987654</kbd>.",
+       "apihelp-clientlogin-example-login2": "Fortsett å logge inn etter en <samp>UI</samp>-respons for totrinns pålogging, ved å oppgi en <var>OATHToken</var> på <kbd>987654</kbd>.",
        "apihelp-compare-summary": "Hent forskjellen mellom to sider.",
        "apihelp-compare-extended-description": "Et revisjonsnummer, en sidetittel eller en side-ID for både «fra» og «til» må sendes.",
        "apihelp-compare-param-fromtitle": "Første tittel å sammenligne.",
index ae46595..55c0671 100644 (file)
        "apihelp-options-example-complex": "重置所有偏好設定,然後再設定 <kbd>skin</kbd> 與 <kbd>nickname</kbd>。",
        "apihelp-paraminfo-summary": "獲得有關 API 模組的資訊。",
        "apihelp-paraminfo-param-helpformat": "說明字串的格式。",
+       "apihelp-paraminfo-param-formatmodules": "格式模組名稱清單(<var>format</var> 參數的值)。請改用 <var>$1modules</var> 。",
        "apihelp-paraminfo-example-1": "顯示 <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>、<kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>、<kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>、和 <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> 的資訊。",
        "apihelp-paraminfo-example-2": "顯示 <kbd>[[Special:ApiHelp/query|action=query]]</kbd> 所有子模組的資訊。",
        "apihelp-parse-summary": "解析內容併回傳解析器輸出。",
        "apihelp-query+allimages-param-to": "要停止列舉的圖片標題。僅能與 $1sort=name 一起使用。",
        "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": "限制圖片至少要有這樣多的位元組。",
        "apihelp-query+allimages-param-maxsize": "限制圖片最多只能這樣多的位元組。",
        "apihelp-query+allimages-param-sha1": "圖片的 SHA1 雜湊值。覆蓋 $1sha1base36。",
        "apihelp-query+allusers-example-Y": "列出以<kbd>Y</kbd>開頭的使用者。",
        "apihelp-query+authmanagerinfo-summary": "取得目前身分核對狀態的資訊。",
        "apihelp-query+backlinks-summary": "找出連結至指定頁面的所有頁面。",
+       "apihelp-query+backlinks-param-title": "要搜尋的標題。不能與 <var>$1pageid</var> 一起使用。",
        "apihelp-query+backlinks-param-pageid": "要搜尋的頁面 ID。不能與 <var>$1title</var> 一起使用。",
        "apihelp-query+backlinks-param-namespace": "要列舉的命名空間。",
        "apihelp-query+backlinks-param-dir": "列出時所採用的方向。",
        "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-example-simple": "列出封鎖。",
        "apihelp-query+blocks-example-users": "列出使用者 <kbd>Alice</kbd> 與 <kbd>Bob</kbd> 的封鎖。",
        "apihelp-query+categorymembers-paramvalue-prop-timestamp": "添加在頁面有被包含時的時間戳記。",
        "apihelp-query+categorymembers-param-limit": "回傳的頁面數量上限。",
        "apihelp-query+categorymembers-param-sort": "作為排序順序的屬性。",
+       "apihelp-query+categorymembers-param-start": "起始列出的時間戳記。僅能與 <kbd>$1sort=timestamp</kbd> 一起使用。",
+       "apihelp-query+categorymembers-param-end": "結束列出的時間戳記。僅能與 <kbd>$1sort=timestamp</kbd> 一起使用。",
        "apihelp-query+categorymembers-param-startsortkey": "請改用 $1starthexsortkey。",
        "apihelp-query+categorymembers-param-endsortkey": "請改用 $1endhexsortkey。",
        "apihelp-query+categorymembers-example-simple": "取得在 <kbd>Category:Physics</kbd> 裡前 10 項的頁面。",
        "apihelp-query+logevents-paramvalue-prop-userid": "添加承擔日誌事件的使用者 ID。",
        "apihelp-query+logevents-paramvalue-prop-timestamp": "添加日誌事件的時間戳記。",
        "apihelp-query+logevents-paramvalue-prop-comment": "添加日誌事件的註釋。",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "添加日誌事件的解析註釋。",
        "apihelp-query+logevents-paramvalue-prop-details": "列出日誌事件的額外詳細資訊。",
        "apihelp-query+logevents-paramvalue-prop-tags": "列出日誌事件的標籤。",
        "apihelp-query+logevents-param-type": "篩選僅為此類型的日誌項目。",
        "apihelp-query+logevents-param-tag": "僅列出以此標籤所標記的事件項目。",
        "apihelp-query+logevents-param-limit": "要回傳的事件項目總數。",
        "apihelp-query+logevents-example-simple": "列出近期日誌事件。",
+       "apihelp-query+pagepropnames-summary": "列出所有在 wiki 使用的頁面屬性名稱。",
        "apihelp-query+pagepropnames-param-limit": "回傳的名稱數量上限。",
        "apihelp-query+pagepropnames-example-simple": "取得前 10 個屬性名稱。",
        "apihelp-query+pageprops-example-simple": "取得頁面 <kbd>Main Page</kbd> 與 <kbd>MediaWiki</kbd> 的屬性。",
        "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-param-namespace": "僅列出這些命名空間的標題。",
        "apihelp-query+protectedtitles-param-level": "僅列出具有這些保護層級的標題。",
        "apihelp-query+protectedtitles-param-limit": "要回傳的頁面總數。",
        "apihelp-query+protectedtitles-param-prop": "要取得的屬性。",
+       "apihelp-query+protectedtitles-paramvalue-prop-user": "添加做出添加保護操作的使用者。",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "添加做出添加保護操作的使用者 ID。",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "添加保護的註釋。",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "添加保護的解析註釋。",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "添加保護層級。",
        "apihelp-query+protectedtitles-example-simple": "列出已保護的標題。",
+       "apihelp-query+querypage-summary": "取得透過特殊頁面 QueryPage-based 所提供的清單。",
        "apihelp-query+querypage-param-page": "特殊頁面的名稱。註:區分大小寫。",
        "apihelp-query+querypage-param-limit": "回傳的結果數量。",
+       "apihelp-query+querypage-example-ancientpages": "回傳來自 [[Special:Ancientpages]] 的結果。",
        "apihelp-query+random-summary": "取得隨機頁面集合",
        "apihelp-query+random-param-namespace": "僅回傳在這些命名空間的頁面。",
        "apihelp-query+random-param-redirect": "請改用 <kbd>$1filterredir=redirects</kbd>。",
        "apihelp-query+recentchanges-param-excludeuser": "不要列出由該使用者作出的更改。",
        "apihelp-query+recentchanges-param-tag": "僅列出以此標籤所標記的更改。",
        "apihelp-query+recentchanges-param-prop": "包含的額外資訊部份:",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "添加編輯的註釋。",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "添加編輯的解析註釋。",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "添加編輯的標籤。",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
        "apihelp-query+recentchanges-paramvalue-prop-title": "添加編輯的頁面標題。",
        "apihelp-query+revisions-example-first5-user": "取得 <kbd>Main Page</kbd> 裡由使用者 <kbd>MediaWiki default</kbd> 所做出的最早前 5 筆修訂。",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "修訂 ID。",
        "apihelp-query+revisions+base-paramvalue-prop-flags": "修訂標籤(小修改)。",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "修訂的時間戳記。",
        "apihelp-query+revisions+base-paramvalue-prop-user": "做出修訂的使用者。",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "修訂創建者的使用者 ID",
        "apihelp-query+revisions+base-paramvalue-prop-size": "修訂的長度(位元組)。",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "修訂的 SHA-1(base 16)。",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "修訂標籤。",
        "apihelp-query+revisions+base-param-limit": "限制所回傳的修訂數量。",
        "apihelp-query+search-summary": "執行全文搜尋。",
        "apihelp-query+search-param-limit": "要回傳的頁面總數。",
        "apihelp-query+search-param-interwiki": "若可用的話,在搜尋裡包含跨 wiki 結果。",
        "apihelp-query+search-param-backend": "是否搜尋使用的後端,若否則為預設。",
+       "apihelp-query+search-param-sort": "設定回傳結果的排序。",
        "apihelp-query+search-example-simple": "搜尋 <kbd>meaning</kbd>。",
        "apihelp-query+search-example-text": "搜尋 <kbd>meaning</kbd> 的文字。",
        "apihelp-query+siteinfo-summary": "回傳有關站台的一般資訊。",
        "apihelp-query+siteinfo-param-prop": "要取得的資訊:",
        "apihelp-query+siteinfo-paramvalue-prop-general": "全面系統資訊。",
        "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "特殊頁面別名清單。",
+       "apihelp-query+siteinfo-param-showalldb": "列出所有資料庫伺服器,不是只有最延遲的那台。",
        "apihelp-query+siteinfo-param-numberingroup": "列出在使用者群組裡的使用者數目。",
+       "apihelp-query+siteinfo-param-inlanguagecode": "用於本地化語言的語言代碼(盡可能)與外觀名稱。",
        "apihelp-query+siteinfo-example-simple": "索取站台資訊。",
        "apihelp-query+siteinfo-example-interwiki": "索取本地端跨 wiki 前綴的清單。",
        "apihelp-query+siteinfo-example-replag": "檢查目前的響應延遲。",
        "apihelp-query+usercontribs-paramvalue-prop-title": "添加標題與頁面的命名空間 ID。",
        "apihelp-query+usercontribs-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
        "apihelp-query+usercontribs-paramvalue-prop-comment": "添加編輯的註釋。",
-       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "添加編輯的已解析註解。",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "添加編輯的解析註釋。",
        "apihelp-query+usercontribs-paramvalue-prop-size": "添加編輯的新大小。",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "添加編輯的標籤。",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "標記已巡查編輯。",
        "apihelp-query+usercontribs-paramvalue-prop-autopatrolled": "標記自動巡查編輯。",
        "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-summary": "取得目前使用者的資訊。",
        "apihelp-query+userinfo-param-prop": "要包含的資訊部份:",
        "apihelp-query+userinfo-paramvalue-prop-groups": "列出目前使用者所隸屬的所有群組。",
        "apihelp-query+users-paramvalue-prop-rights": "列出各使用者所擁有的權限。",
        "apihelp-query+users-paramvalue-prop-editcount": "添加使用者的編輯數。",
        "apihelp-query+users-paramvalue-prop-registration": "添加使用者的註冊時間戳記。",
+       "apihelp-query+users-param-users": "要獲取的使用者清單。",
+       "apihelp-query+users-param-userids": "要獲取的使用者 ID 清單。",
+       "apihelp-query+users-param-token": "請改用 <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+watchlist-param-start": "起始列舉的時間戳記。",
        "apihelp-query+watchlist-param-end": "結束列舉的時間戳記。",
        "apihelp-query+watchlist-param-user": "此列出由該使用者作出的更改。",
        "apihelp-query+watchlist-paramvalue-prop-flags": "添加編輯的標籤。",
        "apihelp-query+watchlist-paramvalue-prop-user": "添加有做出編輯的使用者。",
        "apihelp-query+watchlist-paramvalue-prop-userid": "添加有做出編輯的使用者 ID。",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "添加編輯的註釋。",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "添加編輯的解析註釋。",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
        "apihelp-query+watchlist-paramvalue-prop-tags": "列出項目的標籤。",
        "apihelp-query+watchlist-param-type": "要顯示的更改類型:",
        "apihelp-query+watchlist-paramvalue-type-edit": "一般頁面編輯。",
        "apihelp-revisiondelete-param-hide": "各修訂所要隱藏的內容。",
        "apihelp-revisiondelete-param-show": "各修訂所要取消隱藏的內容。",
        "apihelp-revisiondelete-param-reason": "刪除或取消刪除的原因。",
+       "apihelp-revisiondelete-param-tags": "在刪除日誌裡套用到項目的標籤。",
        "apihelp-rollback-summary": "撤修頁面的最後一次編輯。",
+       "apihelp-rollback-param-tags": "套用到回退的標籤。",
+       "apihelp-rollback-param-summary": "自定義編輯摘要。若為空,則使用預設摘要。",
+       "apihelp-rollback-param-watchlist": "無條件使用設置將頁面加入或移除目前使用者的監視清單或者是不更改監視清單。",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "在所有已監視頁面運作。",
+       "apihelp-setnotificationtimestamp-example-page": "重新設定用於 <kbd>Main page</kbd> 的通知狀態。",
+       "apihelp-setnotificationtimestamp-example-allpages": "重新設定在 <kbd>{{ns:user}}</kbd> 命名空間裡頁面的通知狀態。",
        "apihelp-setpagelanguage-summary": "更改頁面的語言。",
+       "apihelp-setpagelanguage-extended-description-disabled": "您不被允許在此 wiki 上變更頁面的語言。\n\n請啟用 <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> 來進行此操作。",
        "apihelp-setpagelanguage-param-reason": "變更的原因。",
        "apihelp-setpagelanguage-example-language": "更改 <kbd>Main Page</kbd> 的語言成巴斯克語。",
        "apihelp-stashedit-summary": "在分享快取裡預備編輯。",
        "apihelp-tokens-summary": "取得資料修改動作的密鑰。",
        "apihelp-tokens-extended-description": "此模組已因支援 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] 而停用。",
        "apihelp-unblock-summary": "解除封鎖一位使用者。",
+       "apihelp-unblock-param-user": "要封鎖的使用者名稱、IP 位址或 IP 範圍。不能與 <var>$1id</var> 或 <var>$1userid</var> 一起使用",
+       "apihelp-unblock-param-userid": "要封鎖的使用者 ID。不可與 <var>$1id</var> 或 <var>$1user</var> 一同使用。",
        "apihelp-unblock-param-reason": "解除封鎖的原因。",
        "apihelp-unblock-param-tags": "在封鎖日誌裡更改套用到項目的標籤。",
        "apihelp-unblock-example-id": "解除封銷 ID #<kbd>105</kbd>。",
+       "apihelp-undelete-summary": "恢復已刪除頁面的修訂。",
        "apihelp-undelete-param-title": "要恢復的頁面標題。",
        "apihelp-undelete-param-reason": "還原的原因。",
        "apihelp-undelete-param-tags": "在刪除日誌裡更改套用到項目的標籤。",
        "apihelp-undelete-example-page": "取消刪除頁面 <kbd>Main Page</kbd>。",
        "apihelp-undelete-example-revisions": "取消刪除 <kbd>Main Page</kbd> 的兩筆修訂。",
        "apihelp-unlinkaccount-summary": "移除目前使用者所連結到的第三方帳號。",
+       "apihelp-upload-summary": "上傳檔案,或取得等待上傳的狀態。",
        "apihelp-upload-param-filename": "目標檔案名稱。",
        "apihelp-upload-param-comment": "上傳註釋。如果 <var>$1text</var> 未指定的話,也會作為新檔案用的初始頁面文字。",
        "apihelp-upload-param-text": "用於新檔案的初始頁面文字。",
        "api-format-prettyprint-header-hyperlinked": "這是$1格式的HTML實現。HTML對除錯很有用,但不適合應用程式使用。\n\n指定<var>format</var>參數以更改輸出格式。要查看$1格式的非HTML實現,設置[$3 <kbd>format=$2</kbd>]。\n\n參見[[mw:API|完整文件]],或[[Special:ApiHelp/main|API幫助]]以獲取更多信息。",
        "api-format-prettyprint-status": "此回應將會傳回HTTP狀態$1 $2。",
        "api-login-fail-badsessionprovider": "當使用$1無法登入。",
+       "api-login-fail-sameorigin": "當未套用相同原有方針時無法登入。",
        "api-pageset-param-titles": "要使用的標題清單。",
        "api-pageset-param-pageids": "要使用的頁面 ID 清單。",
        "api-pageset-param-revids": "要使用的修訂 ID 清單。",
        "api-help-param-upload": "必須使用 multipart/form-data 以檔案上傳的方式傳送。",
        "api-help-param-multi-separate": "將幾個值以 <kbd>|</kbd> 或 [[Special:ApiHelp/main#main/datatypes|alternative]] 分隔。",
        "api-help-param-multi-max": "上限值為 {{PLURAL:$1|$1}} (機器人為 {{PLURAL:$2|$2}})。",
+       "api-help-param-multi-max-simple": "值的最大數量為 {{PLURAL:$1|$1}}。",
        "api-help-param-multi-all": "要指定所有值,請使用<kbd>$1</kbd>。",
        "api-help-param-default": "預設值:$1",
        "api-help-param-default-empty": "預設值:<span class=\"apihelp-empty\">(空)</span>",
        "api-help-authmanagerhelper-returnurl": "為第三方身份驗證流程傳回URL,必須為絕對值。需要此值或<var>$1continue</var>兩者之一。\n\n在接收<samp>REDIRECT</samp>回應時,一般狀況下您將打開瀏覽器或網站瀏覽功能到特定的<samp>redirecttarget</samp> URL以進行第三方身份驗證流程。當它完成時,第三方會將瀏覽器或網站瀏覽功能送至此URL。您應當提取任何來自URL的查詢或POST參數,並將之作為<var>$1continue</var>請求傳遞至此API模組。",
        "api-help-authmanagerhelper-continue": "此請求是在先前的<samp>UI</samp>或<samp>REDIRECT</samp>回應之後的後續動作。必須為此值或<var>$1returnurl</var>。",
        "api-help-authmanagerhelper-additional-params": "此模組允許額外參數,取決於可用的身份驗證請求。使用<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>与<kbd>amirequestsfor=$1</kbd>(或之前來自此模組的回應,如果合適)以決定可用請求及其使用的欄位。",
+       "apierror-appendnotsupported": "無法附加到使用內容模組 $1 的頁面。",
        "apierror-articleexists": "您所嘗試建立的條目剛剛已被創建。",
+       "apierror-assertbotfailed": "斷言使用者擁有的 <code>bot</code> 權限失效。",
+       "apierror-assertnameduserfailed": "斷言使用者「$1」出錯。",
+       "apierror-assertuserfailed": "斷言使用者已登入失敗。",
        "apierror-autoblocked": "您的 IP 位址已經被自動封鎖,因為它曾經被一名已封鎖的使用者使用過。",
        "apierror-badgenerator-notgenerator": "模組 <kbd>$1</kbd> 不能作為產生器。",
        "apierror-badgenerator-unknown": "未知的 <kbd>generator=$1</kbd>。",
        "apierror-contentserializationexception": "內容序列化失敗:$1",
        "apierror-copyuploadbadurl": "不允許從此 URL 來上傳。",
        "apierror-csp-report": "處理 CSP 報告時錯誤:$1。",
+       "apierror-emptypage": "不允許建立空白的新頁面。",
        "apierror-filedoesnotexist": "檔案不存在。",
        "apierror-filenopath": "無法取得本地端檔案路徑。",
        "apierror-filetypecannotberotated": "無法旋轉的檔案類型。",
        "apierror-imageusage-badtitle": "<kbd>$1</kbd>的標題必須是檔案。",
        "apierror-import-unknownerror": "未知的匯入錯誤:$1",
        "apierror-invalidcategory": "您所輸入的分類名稱無效。",
+       "apierror-invalidlang": "用於參數 <var>$1</var> 的語言代碼無效。",
+       "apierror-invalidoldimage": "<var>oldimage</var> 參數含有無效格式。",
+       "apierror-invalidparammix-cannotusewith": "參數 <kbd>$1</kbd> 不能與 <kbd>$2</kbd> 一起使用。",
+       "apierror-invalidparammix-mustusewith": "<kbd>$1</kbd> 參數僅能與 <kbd>$2</kbd> 一起使用。",
        "apierror-invalidparammix": "{{PLURAL:$2|參數}} $1 不能一起使用。",
        "apierror-invalidsha1base36hash": "所提供的 SHA1Base36 雜湊無效。",
        "apierror-invalidsha1hash": "所提供的 SHA1 雜湊無效。",
        "apierror-invalidtitle": "錯誤標題「$1」。",
+       "apierror-invalidurlparam": "<var>$1urlparam</var> 的值無效(<kbd>$2=$3</kbd>)。",
        "apierror-invaliduser": "無效的使用者名稱「$1」。",
        "apierror-invaliduserid": "使用者 ID <var>$1</var> 無效。",
+       "apierror-maxbytes": "參數 <var>$1</var> 不能大於 $2 {{PLURAL:$2|位元組|位元組}}",
+       "apierror-maxchars": "參數 <var>$1</var> 不能多於 $2 個{{PLURAL:$2|字元|字元}}",
+       "apierror-maxlag-generic": "正等待資料庫伺服器:已延遲 $1 {{PLURAL:$1|秒|秒}}。",
+       "apierror-maxlag": "正等待$2:已延遲 $1 {{PLURAL:$1|秒|秒}}。",
+       "apierror-mimesearchdisabled": "MIME 搜尋在 Miser 模式裡被停用。",
        "apierror-missingcontent-pageid": "遺失頁面 ID 為 $1 的內容。",
        "apierror-missingcontent-revid": "遺失修訂 ID 為 $1 的內容。",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|參數|參數其一}} $1 為必要。",
        "apierror-missingparam": "<var>$1</var>參數必須被設定。",
        "apierror-missingrev-pageid": "沒有頁面 ID 為 $1 的目前修訂。",
        "apierror-missingrev-title": "沒有標題為$1的目前修訂。",
        "apierror-missingtitle": "您所指定的頁面不存在。",
        "apierror-missingtitle-byname": "頁面$1不存在。",
+       "apierror-moduledisabled": "模組 <kbd>$1</kbd> 已停用。",
        "apierror-mustbeloggedin-changeauth": "必須登入,才能變更身分核對資取。",
        "apierror-mustbeloggedin-generic": "您必須登入。",
        "apierror-mustbeloggedin-linkaccounts": "您必須登入到連結帳號。",
index 9cf7acf..d0381cf 100644 (file)
@@ -838,17 +838,23 @@ class LocalisationCache {
                }
 
                # Fill in the fallback if it's not there already
-               if ( is_null( $coreData['fallback'] ) ) {
-                       $coreData['fallback'] = $code === 'en' ? false : 'en';
-               }
-               if ( $coreData['fallback'] === false ) {
-                       $coreData['fallbackSequence'] = [];
+               if ( ( is_null( $coreData['fallback'] ) || $coreData['fallback'] === false ) && $code === 'en' ) {
+                       $coreData['fallback'] = false;
+                       $coreData['originalFallbackSequence'] = $coreData['fallbackSequence'] = [];
                } else {
-                       $coreData['fallbackSequence'] = array_map( 'trim', explode( ',', $coreData['fallback'] ) );
+                       if ( !is_null( $coreData['fallback'] ) ) {
+                               $coreData['fallbackSequence'] = array_map( 'trim', explode( ',', $coreData['fallback'] ) );
+                       } else {
+                               $coreData['fallbackSequence'] = [];
+                       }
                        $len = count( $coreData['fallbackSequence'] );
 
-                       # Ensure that the sequence ends at en
-                       if ( $coreData['fallbackSequence'][$len - 1] !== 'en' ) {
+                       # Before we add the 'en' fallback for messages, keep a copy of
+                       # the original fallback sequence
+                       $coreData['originalFallbackSequence'] = $coreData['fallbackSequence'];
+
+                       # Ensure that the sequence ends at 'en' for messages
+                       if ( !$len || $coreData['fallbackSequence'][$len - 1] !== 'en' ) {
                                $coreData['fallbackSequence'][] = 'en';
                        }
                }
index fc37882..c781d71 100644 (file)
@@ -29,13 +29,6 @@ use Wikimedia\Rdbms\IDatabase;
  * @since 1.29
  */
 class ChangesListBooleanFilter extends ChangesListFilter {
-       // This can sometimes be different on Special:RecentChanges
-       // and Special:Watchlist, due to the double-legacy hooks
-       // (SpecialRecentChangesFilters and SpecialWatchlistFilters)
-
-       // but there will be separate sets of ChangesListFilterGroup and ChangesListFilter instances
-       // for those pages (it should work even if they're both loaded
-       // at once, but that can't happen).
        /**
         * Main unstructured UI i18n key
         *
index 25b3d94..ab3c6fb 100644 (file)
@@ -62,8 +62,6 @@ abstract class Collation {
                                return new IcuCollation( 'root-u-kn' );
                        case 'xx-uca-ckb':
                                return new CollationCkb;
-                       case 'xx-uca-et':
-                               return new CollationEt;
                        case 'uppercase-ab':
                                return new AbkhazUppercaseCollation;
                        case 'uppercase-ba':
diff --git a/includes/collation/CollationEt.php b/includes/collation/CollationEt.php
deleted file mode 100644 (file)
index ca7b765..0000000
+++ /dev/null
@@ -1,60 +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
- */
-
-/**
- * Workaround for incorrect collation of Estonian language ('et') in ICU (T56168).
- *
- * 'W' and 'V' should not be considered the same letter for the purposes of collation in modern
- * Estonian. We work around this by replacing 'W' and 'w' with 'ᴡ' U+1D21 'LATIN LETTER SMALL
- * CAPITAL W' for sortkey generation, which is collated like 'W' and is not tailored to have the
- * same primary weight as 'V' in Estonian.
- *
- * @since 1.24
- */
-class CollationEt extends IcuCollation {
-       public function __construct() {
-               parent::__construct( 'et' );
-       }
-
-       private static function mangle( $string ) {
-               return str_replace(
-                       [ 'w', 'W' ],
-                       'ᴡ', // U+1D21 'LATIN LETTER SMALL CAPITAL W'
-                       $string
-               );
-       }
-
-       private static function unmangle( $string ) {
-               // Casing data is lost…
-               return str_replace(
-                       'ᴡ', // U+1D21 'LATIN LETTER SMALL CAPITAL W'
-                       'W',
-                       $string
-               );
-       }
-
-       public function getSortKey( $string ) {
-               return parent::getSortKey( self::mangle( $string ) );
-       }
-
-       public function getFirstLetter( $string ) {
-               return self::unmangle( parent::getFirstLetter( self::mangle( $string ) ) );
-       }
-}
index 7d9f168..ad94d47 100644 (file)
@@ -124,7 +124,7 @@ class IcuCollation extends Collation {
                'en' => [],
                'eo' => [ "Ĉ", "Ĝ", "Ĥ", "Ĵ", "Ŝ", "Ŭ" ],
                'es' => [ "Ñ" ],
-               'et' => [ "Š", "Ž", "Õ", "Ä", "Ö", "Ü", "W" ], // added W for CollationEt (xx-uca-et)
+               'et' => [ "Š", "Ž", "Õ", "Ä", "Ö", "Ü" ],
                'eu' => [ "Ñ" ], // not in libicu
                'fa' => [
                        // RTL, let's put each letter on a new line
index 000bff2..bb3fb10 100644 (file)
@@ -284,13 +284,8 @@ interface Content {
         * made to replace information about the old content with information about
         * the new content.
         *
-        * This default implementation calls
-        * $this->getParserOutput( $content, $title, null, null, false ),
-        * and then calls getSecondaryDataUpdates( $title, $recursive ) on the
-        * resulting ParserOutput object.
-        *
-        * Subclasses may implement this to determine the necessary updates more
-        * efficiently, or make use of information about the old content.
+        * @deprecated since 1.32, call and override
+        *   ContentHandler::getSecondaryDataUpdates instead.
         *
         * @note Implementations should call the SecondaryDataUpdates hook, like
         *   AbstractContent does.
@@ -481,8 +476,10 @@ interface Content {
         * the current state of the database.
         *
         * @since 1.21
+        * @deprecated since 1.32, call and override
+        *   ContentHandler::getDeletionUpdates instead.
         *
-        * @param WikiPage $page The deleted page
+        * @param WikiPage $page The page the content was deleted from.
         * @param ParserOutput|null $parserOutput Optional parser output object
         *    for efficient access to meta-information about the content object.
         *    Provide if you have one handy.
index 344d040..fab043a 100644 (file)
@@ -28,6 +28,7 @@
 use Wikimedia\Assert\Assert;
 use MediaWiki\Logger\LoggerFactory;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\SlotRenderingProvider;
 use MediaWiki\Search\ParserOutputSearchDataExtractor;
 
 /**
@@ -1389,14 +1390,20 @@ abstract class ContentHandler {
         * @return ParserOutput
         */
        public function getParserOutputForIndexing( WikiPage $page, ParserCache $cache = null ) {
+               // TODO: MCR: ContentHandler should be called per slot, not for the whole page.
+               // See T190066.
                $parserOptions = $page->makeParserOptions( 'canonical' );
-               $revId = $page->getRevision()->getId();
                if ( $cache ) {
                        $parserOutput = $cache->get( $page, $parserOptions );
                }
+
                if ( empty( $parserOutput ) ) {
+                       $renderer = MediaWikiServices::getInstance()->getRevisionRenderer();
                        $parserOutput =
-                               $page->getContent()->getParserOutput( $page->getTitle(), $revId, $parserOptions );
+                               $renderer->getRenderedRevision(
+                                       $page->getRevision()->getRevisionRecord(),
+                                       $parserOptions
+                               )->getRevisionParserOutput();
                        if ( $cache ) {
                                $cache->save( $parserOutput, $page, $parserOptions );
                        }
@@ -1404,4 +1411,75 @@ abstract class ContentHandler {
                return $parserOutput;
        }
 
+       /**
+        * Returns a list of DeferrableUpdate objects for recording information about the
+        * given Content in some secondary data store.
+        *
+        * Application logic should not call this method directly. Instead, it should call
+        * DerivedPageDataUpdater::getSecondaryDataUpdates().
+        *
+        * @note Implementations must not return a LinksUpdate instance. Instead, a LinksUpdate
+        * is created by the calling code in DerivedPageDataUpdater, on the combined ParserOutput
+        * of all slots, not for each slot individually. This is in contrast to the old
+        * getSecondaryDataUpdates method defined by AbstractContent, which returned a LinksUpdate.
+        *
+        * @note Implementations should not call $content->getParserOutput, they should call
+        * $slotOutput->getSlotRendering( $role, false ) instead if they need to access a ParserOutput
+        * of $content. This allows existing ParserOutput objects to be re-used, while avoiding
+        * creating a ParserOutput when none is needed.
+        *
+        * @param Title $title The title of the page to supply the updates for
+        * @param Content $content The content to generate data updates for.
+        * @param string $role The role (slot) in which the content is being used. Which updates
+        *        are performed should generally not depend on the role the content has, but the
+        *        DeferrableUpdates themselves may need to know the role, to track to which slot the
+        *        data refers, and to avoid overwriting data of the same kind from another slot.
+        * @param SlotRenderingProvider $slotOutput A provider that can be used to gain access to
+        *        a ParserOutput of $content by calling $slotOutput->getSlotParserOutput( $role, false ).
+        * @return DeferrableUpdate[] A list of DeferrableUpdate objects for putting information
+        *        about this content object somewhere. The default implementation returns an empty
+        *        array.
+        * @since 1.32
+        */
+       public function getSecondaryDataUpdates(
+               Title $title,
+               Content $content,
+               $role,
+               SlotRenderingProvider $slotOutput
+       ) {
+               return [];
+       }
+
+       /**
+        * Returns a list of DeferrableUpdate objects for removing information about content
+        * in some secondary data store. This is used when a page is deleted, and also when
+        * a slot is removed from a page.
+        *
+        * Application logic should not call this method directly. Instead, it should call
+        * WikiPage::getSecondaryDataUpdates().
+        *
+        * @note Implementations must not return a LinksDeletionUpdate instance. Instead, a
+        * LinksDeletionUpdate is created by the calling code in WikiPage.
+        * This is in contrast to the old getDeletionUpdates method defined by AbstractContent,
+        * which returned a LinksUpdate.
+        *
+        * @note Implementations should not rely on the page's current content, but rather the current
+        * state of the secondary data store.
+        *
+        * @param Title $title The title of the page to supply the updates for
+        * @param string $role The role (slot) in which the content is being used. Which updates
+        *        are performed should generally not depend on the role the content has, but the
+        *        DeferrableUpdates themselves may need to know the role, to track to which slot the
+        *        data refers, and to avoid overwriting data of the same kind from another slot.
+        *
+        * @return DeferrableUpdate[] A list of DeferrableUpdate objects for putting information
+        *        about this content object somewhere. The default implementation returns an empty
+        *        array.
+        *
+        * @since 1.32
+        */
+       public function getDeletionUpdates( Title $title, $role ) {
+               return [];
+       }
+
 }
index 1d69f12..387e9e3 100644 (file)
@@ -822,8 +822,20 @@ class DifferenceEngine extends ContextSource {
 
        /**
         * Show the new revision of the page.
+        *
+        * @note Not supported after calling setContent().
         */
        public function renderNewRevision() {
+               if ( $this->isContentOverridden ) {
+                       // The code below only works with a Revision object. We could construct a fake revision
+                       // (here or in setContent), but since this does not seem needed at the moment,
+                       // we'll just fail for now.
+                       throw new LogicException(
+                               __METHOD__
+                               . ' is not supported after calling setContent(). Use setRevisions() instead.'
+                       );
+               }
+
                $out = $this->getOutput();
                $revHeader = $this->getRevisionHeader( $this->mNewRev );
                # Add "current version as of X" title
@@ -842,10 +854,16 @@ class DifferenceEngine extends ContextSource {
                        $out->setRevisionTimestamp( $this->mNewRev->getTimestamp() );
                        $out->setArticleFlag( true );
 
-                       if ( !Hooks::run( 'ArticleContentViewCustom',
-                               [ $this->mNewContent, $this->mNewPage, $out ] )
+                       if ( !Hooks::run( 'ArticleRevisionViewCustom',
+                               [ $this->mNewRev->getRevisionRecord(), $this->mNewPage, $out ] )
                        ) {
                                // Handled by extension
+                               // NOTE: sync with hooks called in Article::view()
+                       } elseif ( !Hooks::run( 'ArticleContentViewCustom',
+                               [ $this->mNewContent, $this->mNewPage, $out ], '1.32' )
+                       ) {
+                               // Handled by extension
+                               // NOTE: sync with hooks called in Article::view()
                        } else {
                                // Normal page
                                if ( $this->getTitle()->equals( $this->mNewPage ) ) {
@@ -889,6 +907,13 @@ class DifferenceEngine extends ContextSource {
         * @return ParserOutput|bool False if the revision was not found
         */
        protected function getParserOutput( WikiPage $page, Revision $rev ) {
+               if ( !$rev->getId() ) {
+                       // WikiPage::getParserOutput wants a revision ID. Passing 0 will incorrectly show
+                       // the current revision, so fail instead. If need be, WikiPage::getParserOutput
+                       // could be made to accept a Revision or RevisionRecord instead of the id.
+                       return false;
+               }
+
                $parserOptions = $page->makeParserOptions( $this->getContext() );
                $parserOutput = $page->getParserOutput( $parserOptions, $rev->getId() );
 
index b3e9422..652a87d 100644 (file)
@@ -73,15 +73,23 @@ class MWException extends Exception {
         * @return string Message with arguments replaced
         */
        public function msg( $key, $fallback /*[, params...] */ ) {
+               global $wgSitename;
                $args = array_slice( func_get_args(), 2 );
 
+               $res = false;
                if ( $this->useMessageCache() ) {
                        try {
-                               return wfMessage( $key, $args )->text();
+                               $res = wfMessage( $key, $args )->text();
                        } catch ( Exception $e ) {
                        }
                }
-               return wfMsgReplaceArgs( $fallback, $args );
+               if ( $res === false ) {
+                       $res = wfMsgReplaceArgs( $fallback, $args );
+                       // If an exception happens inside message rendering,
+                       // {{SITENAME}} sometimes won't be replaced.
+                       $res = preg_replace( '/\{\{SITENAME\}\}/', $wgSitename, $res );
+               }
+               return $res;
        }
 
        /**
@@ -154,6 +162,16 @@ class MWException extends Exception {
                global $wgOut, $wgSitename;
                if ( $this->useOutputPage() ) {
                        $wgOut->prepareErrorPage( $this->getPageTitle() );
+                       // Manually set the html title, since sometimes
+                       // {{SITENAME}} does not get replaced for exceptions
+                       // happening inside message rendering.
+                       $wgOut->setHTMLTitle(
+                               $this->msg(
+                                       'pagetitle',
+                                       "$1 - $wgSitename",
+                                       $this->getPageTitle()
+                               )
+                       );
 
                        $wgOut->addHTML( $this->getHTML() );
 
index 49cf71e..1f1cabe 100644 (file)
@@ -197,12 +197,17 @@ class MWExceptionRenderer {
         * @return string Message with arguments replaced
         */
        private static function msg( $key, $fallback /*[, params...] */ ) {
+               global $wgSitename;
                $args = array_slice( func_get_args(), 2 );
                try {
-                       return wfMessage( $key, $args )->text();
+                       $res = wfMessage( $key, $args )->text();
                } catch ( Exception $e ) {
-                       return wfMsgReplaceArgs( $fallback, $args );
+                       $res = wfMsgReplaceArgs( $fallback, $args );
+                       // If an exception happens inside message rendering,
+                       // {{SITENAME}} sometimes won't be replaced.
+                       $res = preg_replace( '/\{\{SITENAME\}\}/', $wgSitename, $res );
                }
+               return $res;
        }
 
        /**
index 7920e9c..fa6e180 100644 (file)
@@ -2116,16 +2116,21 @@ class LocalFile extends File {
         * @return string|false
         */
        function getDescriptionText( Language $lang = null ) {
-               $revision = Revision::newFromTitle( $this->title, false, Revision::READ_NORMAL );
+               $store = MediaWikiServices::getInstance()->getRevisionStore();
+               $revision = $store->getRevisionByTitle( $this->title, 0, Revision::READ_NORMAL );
                if ( !$revision ) {
                        return false;
                }
-               $content = $revision->getContent();
-               if ( !$content ) {
+
+               $renderer = MediaWikiServices::getInstance()->getRevisionRenderer();
+               $rendered = $renderer->getRenderedRevision( $revision, new ParserOptions( null, $lang ) );
+
+               if ( !$rendered ) {
+                       // audience check failed
                        return false;
                }
-               $pout = $content->getParserOutput( $this->title, null, new ParserOptions( null, $lang ) );
 
+               $pout = $rendered->getRevisionParserOutput();
                return $pout->getText();
        }
 
index d1c9455..7aa8c78 100644 (file)
@@ -107,6 +107,5 @@ class PackedImageGallery extends TraditionalImageGallery {
         * @param int $num
         */
        public function setPerRow( $num ) {
-               return;
        }
 }
index 72381f0..15426fd 100644 (file)
@@ -43,4 +43,8 @@ class HTMLFloatField extends HTMLTextField {
 
                return true;
        }
+
+       protected function getInputWidget( $params ) {
+               return new OOUI\NumberInputWidget( $params );
+       }
 }
index 2038606..e9ecc40 100644 (file)
@@ -22,8 +22,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                        $this->mParams['disabled-options'] = [];
                }
 
-               // For backwards compatibility, also handle the old way with 'cssclass' => 'mw-chosen'
-               if ( isset( $params['dropdown'] ) || strpos( $this->mClass, 'mw-chosen' ) !== false ) {
+               if ( isset( $params['dropdown'] ) ) {
                        $this->mClass .= ' mw-htmlform-dropdown';
                }
 
index b51182a..60c63d6 100644 (file)
@@ -85,18 +85,19 @@ class HTMLTextField extends HTMLFormField {
                        'type',
                        'min',
                        'max',
-                       'pattern',
-                       'title',
                        'step',
-                       'list',
+                       'title',
                        'maxlength',
                        'tabindex',
                        'disabled',
                        'required',
                        'autofocus',
-                       'multiple',
                        'readonly',
                        'autocomplete',
+                       // Only used in HTML mode:
+                       'pattern',
+                       'list',
+                       'multiple',
                ];
 
                $attribs += $this->getAttributes( $allowedParams );
@@ -117,6 +118,7 @@ class HTMLTextField extends HTMLFormField {
                        switch ( $this->mParams['type'] ) {
                                case 'int':
                                        $type = 'number';
+                                       $attribs['step'] = 1;
                                        break;
                                case 'float':
                                        $type = 'number';
@@ -152,17 +154,22 @@ class HTMLTextField extends HTMLFormField {
                # @todo Enforce pattern, step, required, readonly on the server side as
                # well
                $allowedParams = [
+                       'type',
+                       'min',
+                       'max',
+                       'step',
+                       'title',
+                       'maxlength',
+                       'tabindex',
+                       'disabled',
+                       'required',
                        'autofocus',
+                       'readonly',
+                       'autocomplete',
+                       // Only used in OOUI mode:
                        'autosize',
-                       'disabled',
                        'flags',
                        'indicator',
-                       'maxlength',
-                       'readonly',
-                       'required',
-                       'tabindex',
-                       'type',
-                       'autocomplete',
                ];
 
                $attribs += OOUI\Element::configFromHtmlAttributes(
@@ -181,6 +188,9 @@ class HTMLTextField extends HTMLFormField {
                }
 
                $type = $this->getType( $attribs );
+               if ( isset( $attribs['step'] ) && $attribs['step'] === 'any' ) {
+                       $attribs['step'] = null;
+               }
 
                return $this->getInputWidget( [
                        'id' => $this->mID,
index 2e72e67..3805dfa 100644 (file)
@@ -23,9 +23,9 @@
        "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-your-language": "Вашият език:",
-       "config-your-language-help": "Ð\98збиÑ\80ане на език за използване по време на инсталацията.",
+       "config-your-language-help": "Ð\98збоÑ\80 на език за използване по време на инсталацията.",
        "config-wiki-language": "Език на уикито:",
-       "config-wiki-language-help": "Ð\98збиÑ\80ане на език, на който ще е основното съдържание на уикито.",
+       "config-wiki-language-help": "Ð\98збоÑ\80 на език, на който ще е основното съдържание на уикито.",
        "config-back": "← Връщане",
        "config-continue": "Продължаване →",
        "config-page-language": "Език",
        "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.",
+       "config-env-php": "PHP $1 е инсталирано.",
        "config-env-hhvm": "HHVM $1 е инсталиран.",
        "config-unicode-using-intl": "Използване на разширението [https://pecl.php.net/intl intl PECL] за нормализация на Уникод.",
        "config-unicode-pure-php-warning": "<strong>Внимание:</strong> [https://pecl.php.net/intl Разширението intl PECL] не е налично за справяне с нормализацията на Уникод, превключване към по-бавното изпълнение на чист PHP.\nАко сайтът е с голям трафик, препоръчително е да се запознаете с [https://www.mediawiki.org/wiki/Special:MyLanguage/Unicode_normalization_considerations нормализацията на Уникод].",
        "config-unicode-update-warning": "<strong>Предупреждение</strong>: Инсталираната версия на Обвивката за нормализация на 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>php-mysql</code>.",
        "config-outdated-sqlite": "<strong>Внимание:</strong> имате инсталиран SQLite  $1, а минималната допустима версия е $2. SQLite ще бъде недостъпна за ползване.",
-       "config-no-fts3": "'''Предупреждение''': SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.",
+       "config-no-fts3": "<strong>Предупреждение:</strong> SQLite е компилирана без [//sqlite.org/fts3.html модула FTS3], затова възможностите за търсене няма да са достъпни.",
        "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-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": "<strong>Внимание:</strong> <code>memory_limit</code> на PHP е $1.\nСтойността вероятно е твърде ниска.\nВъзможно е инсталацията да се провали!",
        "config-apc": "[https://secure.php.net/apc APC] е инсталиран",
-       "config-apcu": "[https://secure.php.net/apc APC] е инсталиран",
+       "config-apcu": "[https://secure.php.net/apcu APCu] е инсталиран",
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] е инсталиран",
        "config-no-cache-apcu": "<strong>Внимание:</strong> [https://secure.php.net/apcu APCu] и [https://www.iis.net/downloads/microsoft/wincache-extension WinCache] не могат да бъдат открити.\nКеширането на обекти не е активирано.",
        "config-mod-security": "<strong>Предупреждение:</strong> [https://modsecurity.org/ mod_security]/mod_security2 е включено на вашия уеб сървър. Много от обичайните му конфигурации пораждат проблеми с МедияУики и друг софтуер, който позволява публикуване на произволно съдържание.\nАко е възможно, моля изключете го. В противен случай се обърнете към [https://modsecurity.org/documentation/ документацията на mod_security] или се свържете с поддръжката на хостинга си, ако се сблъскате със случайни грешки.",
        "config-imagemagick": "Открит е ImageMagick: <code>$1</code>.\nПреоразмеряването на картинки ще бъде включено ако качването на файлове бъде разрешено.",
        "config-gd": "Открита е вградена графичната библиотека GD.\nАко качването на файлове бъде включено, ще бъде включена възможността за преоразмеряване на картинки.",
        "config-no-scaling": "Не са открити библиотеките GD или ImageMagick.\nПреоразмеряването на картинки ще бъде изключено.",
-       "config-no-uri": "'''Грешка:''' Не може да се определи текущия адрес.\nИнсталация беше прекратена.",
+       "config-no-uri": "<strong>Грешка:</strong> Не може да се определи текущия адрес.\nИнсталация беше прекратена.",
        "config-no-cli-uri": "<strong>Внимание:</strong> Не е зададен параметър <code>--scriptpath</code>, стойност по подразбиране: <code>$1</code>.",
-       "config-using-server": "Използване на сървърното име \"<nowiki>$1</nowiki>\".",
-       "config-using-uri": "Използване на сървърния адрес (URL) \"<nowiki>$1$2</nowiki>\".",
+       "config-using-server": "Използване на сървърното име „<nowiki>$1</nowiki>“.",
+       "config-using-uri": "Използване на сървърния адрес (URL) „<nowiki>$1$2</nowiki>“.",
        "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>) не е проверена за уязвимости при изпълнение на произволен скрипт по време на инсталацията от командния ред.",
        "config-brokenlibxml": "Вашата система използва комбинация от версии на PHP и libxml2, които са с много грешки и могат да причинят скрити повреди на данните в МедияУики или други уеб приложения.\nНеобходимо е обновяване до libxml2 2.7.3 или по-нова версия ([https://bugs.php.net/bug.php?id=45996 докладвана грешка при PHP]).\nИнсталацията беше прекратена.",
        "config-suhosin-max-value-length": "Suhosin е инсталиран и ограничава дължината GET параметъра <code>length</code> на $1 байта. Компонентът на МедияУики ResourceLoader ще може да пренебрегне частично това ограничение, но това ще намали производителността. По възможност е препоръчително да се настрои <code>suhosin.get.max_value_length</code> на 1024 или по-голяма стойност в <code>php.ini</code> и в LocalSettings.php да се настрои <code>$wgResourceLoaderMaxQueryLength</code> със същата стойност.",
        "config-using-32bit": "<strong>Внимание:</strong> изглежда, че системата Ви работи с 32-битови числа. Това [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit не се препоръчва].",
        "config-db-type": "Тип на базата от данни:",
-       "config-db-host": "ХоÑ\81Ñ\82 на базата от данни:",
+       "config-db-host": "СÑ\8aÑ\80вÑ\8aÑ\80 на базата от данни:",
        "config-db-host-help": "Ако базата от данни е на друг сървър, в кутията се въвежда името на хоста или IP адреса.\n\nАко се използва споделен уеб хостинг, доставчикът на услугата би трябвало да е предоставил в документацията си коректния хост.\n\nАко инсталацията протича на Windows-сървър и се използва MySQL, използването на \"localhost\" може да е неприемливо. В такива случаи се използва \"127.0.0.1\" за локален IP адрес.\n\nПри използване на PostgreSQL, това поле се оставя празно, за свързване чрез Unix socket.",
-       "config-db-host-oracle": "TNS на базата данни:",
+       "config-db-host-oracle": "TNS Ð½Ð° Ð±Ð°Ð·Ð°Ñ\82а Ð¾Ñ\82 Ð´Ð°Ð½Ð½Ð¸:",
        "config-db-host-oracle-help": "Въведете валидно [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Local Connect Name]; файлът tnsnames.ora трябва да бъде видим за инсталацията.<br />Ако използвате клиентска библиотека версия 10g или по-нова можете да използвате метода [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Easy Connect].",
        "config-db-wiki-settings": "Идентифициране на това уики",
        "config-db-name": "Име на базата от данни:",
        "config-db-port": "Порт на базата от данни:",
        "config-db-schema": "Схема за МедияУики",
        "config-db-schema-help": "Схемата по-горе обикновено е коректна.\nПромени се извършват ако наистина е необходимо.",
-       "config-pg-test-error": "Невъзможно свързване с базата данни '''$1''': $2",
+       "config-pg-test-error": "Невъзможно свързване с базата данни <strong>$1</strong>: $2",
        "config-sqlite-dir": "Директория за данни на SQLite:",
        "config-sqlite-dir-help": "SQLite съхранява всички данни в един файл.\n\nПо време на инсталацията уеб сървърът трябва да има права за писане в посочената директория.\n\nТя <strong>не трябва</strong> да е достъпна през уеб, затова не е там, където са PHP файловете.\n\nИнсталаторът ще съхрани заедно с нея файл <code>.htaccess</code>, но ако този метод пропадне, някой може да придобие достъп до суровите данни от базата от данни.\nТова включва сурови данни за потребителите (адреси за е-поща, хеширани пароли), както и изтрити версии на страници и друга чувствителна и с ограничен достъп информация от и за уикито.\n\nБазата от данни е препоръчително да се разположи на друго място, например в <code>/var/lib/mediawiki/yourwiki</code>.",
        "config-oracle-def-ts": "Таблично пространство по подразбиране:",
        "config-oracle-temp-ts": "Временно таблично пространство:",
-       "config-type-mysql": "MySQL (или съвместима)",
+       "config-type-mysql": "MariaDB, MySQL (или съвместима)",
        "config-type-mssql": "Microsoft SQL сървър",
        "config-support-info": "МедияУики поддържа следните системи за бази от данни:\n\n$1\n\nАко не виждате желаната за използване система в списъка по-долу, следвайте инструкциите за активиране на поддръжка по-горе.",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] е най-важна за МедияУики и се поддържа най-добре. МедияУики работи също така с [{{int:version-db-mariadb-url}} MariaDB] и [{{int:version-db-percona-url}} Percona Server], които са съвместими с MySQL.\n([https://secure.php.net/manual/bg/mysqli.installation.php Как се компилира PHP с поддръжка на MySQL])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] е най-важна за МедияУики и се поддържа най-добре. МедияУики работи също така с [{{int:version-db-mysql-url}} MySQL] и [{{int:version-db-percona-url}} Percona Server], които са съвместими с MariaDB.\n([https://secure.php.net/manual/en/mysqli.installation.php Как се компилира PHP с поддръжка на MySQL])",
        "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] е популярна система за управление на бази от данни, алтернатива на MySQL. ([https://secure.php.net/manual/bg/pgsql.installation.php Как се компилира PHP с поддръжка на PostgreSQL])",
-       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] е олекотена система за бази от данни, която е много добре поддържана. ([http://www.php.net/manual/bg/pdo.installation.php Как се компилира PHP с поддръжка на SQLite], използва PDO)",
-       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] е комерсиална корпоративна база от данни. ([http://www.php.net/manual/en/oci8.installation.php Как се компилира PHP с поддръжка на OCI8])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] е олекотена система за бази от данни, която е много добре поддържана. ([https://secure.php.net/manual/en/pdo.installation.php Как се компилира PHP с поддръжка на SQLite], използва PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] е комерсиална корпоративна база от данни. ([https://secure.php.net/manual/en/oci8.installation.php Как се компилира PHP с поддръжка на OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] е комерсиална корпоративна база от данни за Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Как да се компилира PHP с поддръжка на SQLSRV])",
        "config-header-mysql": "Настройки на MariaDB/MySQL",
        "config-header-postgres": "Настройки за PostgreSQL",
        "config-can-upgrade": "В базата от данни има таблици за МедияУики.\nЗа надграждането им за MediaWiki $1, натиска се <strong>Продължаване</strong>.",
        "config-upgrade-done": "Обновяването приключи.\n\nВече е възможно [$1 да използвате уикито].\n\nАко е необходимо, възможно е файлът <code>LocalSettings.php</code> да бъде създаден отново чрез натискане на бутона по-долу.\nТова <strong>не е препоръчително действие</strong>, освен ако не срещате затруднения с уикито.",
        "config-upgrade-done-no-regenerate": "Обновяването приключи.\n\nВече е възможно [$1 да използвате уикито].",
-       "config-regenerate": "Създаване на LocalSettings.php →",
+       "config-regenerate": "Ð\9fовÑ\82оÑ\80но Ñ\81ъздаване на LocalSettings.php →",
        "config-show-table-status": "Заявката <code>SHOW TABLE STATUS</code> не сполучи!",
-       "config-unknown-collation": "'''Предупреждение:''' Базата от данни използва неразпозната колация.",
+       "config-unknown-collation": "<strong>Предупреждение:</strong>  Базата от данни използва неразпозната колация.",
        "config-db-web-account": "Сметка за уеб достъп до базата от данни",
        "config-db-web-help": "Избиране на потребителско име и парола, които уеб сървърът ще използва да се свързва с базата от данни при обичайната работа на уикито.",
        "config-db-web-account-same": "Използване на същата сметка като при инсталацията.",
        "config-admin-password-confirm": "Парола (повторно):",
        "config-admin-help": "Въвежда се предпочитаното потребителско име, например „Иванчо Иванчев“.\nТова ще е потребителското име, което администраторът ще използва за влизане в уикито.",
        "config-admin-name-blank": "Необходимо е да бъде въведено потребителско име на администратора.",
-       "config-admin-name-invalid": "Посоченото потребителско име \"<nowiki>$1</nowiki>\" е невалидно.\nНеобходимо е да се посочи друго.",
+       "config-admin-name-invalid": "Посоченото потребителско име „<nowiki>$1</nowiki>“ е невалидно.\nНеобходимо е да се посочи друго.",
        "config-admin-password-blank": "Въведете парола за администраторската сметка.",
        "config-admin-password-mismatch": "Двете въведени пароли не съвпадат.",
        "config-admin-email": "Адрес за електронна поща:",
        "config-license-help": "Много публични уикита поставят всички приноси под [https://freedomdefined.org/Definition/Bg свободен лиценз].\nТова помага за създаването на усещане за общност и насърчава дългосрочните приноси. \nТова не е необходимо като цяло за частно или корпоративно уики.\n\nАко искате да използвате текстове от Уикипедия, и искате Уикипедия да може да приема текстове, копирани от вашето уики, трябва да изберете лиценз <strong>{{int:config-license-cc-by-sa}}</strong>.\n\nЛицензът за свободна документация на GNU е старият лиценз на съдържанието на Уикипедия.\nТой все още е валиден лиценз, но някои негови условия са трудни за разбиране и правят по-сложни повторното използване и интерпретацията.",
        "config-email-settings": "Настройки за е-поща",
        "config-enable-email": "Разрешаване на изходящи е-писма",
-       "config-enable-email-help": "За да работят възможностите за използване на е-поща, необходимо е [Config-dbsupport-oracle/manual/en/mail.configuration.php настройките за поща на PHP] да бъдат конфигурирани правилно.\nАко няма да се използват услугите за е-поща в уикито, те могат да бъдат изключени тук.",
+       "config-enable-email-help": "За да работят възможностите за използване на е-поща, необходимо е [https://secure.php.net/manual/en/mail.configuration.ph настройките за поща на PHP] да бъдат конфигурирани правилно.\nАко няма да се използват услугите за е-поща в уикито, те могат да бъдат изключени тук.",
        "config-email-user": "Позволяване на потребителите да си изпращат е-писма през уикито",
        "config-email-user-help": "Позволяване на потребителите да си изпращат е-писма ако са разрешили това в настройките си.",
        "config-email-usertalk": "Оповестяване при промяна на потребителската беседа",
        "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 Матрицата на разширенията] за пълен списък на разширенията.",
        "config-skins-screenshots": "$1 (снимки на екрана: $2)",
+       "config-extensions-requires": "$1 (изисква $2)",
        "config-screenshot": "снимка на екран",
        "mainpagetext": "<strong>МедияУики беше успешно инсталирано.</strong>",
        "mainpagedocfooter": "Разгледайте [https://www.mediawiki.org/wiki/Special:MyLanguage/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 ЧЗВ за МедияУики]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Пощенски списък относно нови версии на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локализиране на МедияУики]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Научете как да се справяте със спама във вашето уики]"
index e391609..8183ed7 100644 (file)
@@ -61,6 +61,7 @@
        "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-apc": "[https://secure.php.net/apc APC] è installato",
+       "config-apcu": "[https://secure.php.net/apcu APCu] è installato",
        "config-wincache": "[https://www.iis.net/downloads/microsoft/wincache-extension WinCache] è installato",
        "config-no-cache-apcu": "<strong>Attenziò:</strong> [https://secure.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] o [https://www.iis.net/downloads/microsoft/wincache-extension WinCache] nun so' state truvate.\n'A funziona caching 'e ll'oggette non è apicciata.",
        "config-mod-security": "<strong>Attenziò:</strong> 'O servitore web vuosto téne [https://modsecurity.org/ mod_security]/mod_security2 appicciato. Ce stanno tante mpustaziune commune ca 'o facessero causà prubbleme a MediaWiki e ll'ati software ca permettessero ll'utente 'e pubbrecà cuntenute.\nSi putite, stutate sta funziona. Sinò, riferite 'a [https://modsecurity.org/documentation/ documentaziona ncopp' 'o mod_security] o cuntattate 'o host vuosto pe' ve dà supporto quanno se scummogliasse cocch'errore.",
@@ -78,6 +79,7 @@
        "config-no-cli-uploads-check": "<strong>Attenziò:</strong> 'a cartella predefinita p' 'e carreche (<code>$1</code>) nun è stata cuntrullata p' 'a vulnerabbelità ncopp'a l'esecuzione arbitraria 'e script pe' tramente ca se fà l'installazione 'a linea 'e commando.",
        "config-brokenlibxml": "'O sistema vuosto ave na combinazione 'e verziune 'e PHP e libxml2 nguacchiata ca putesse scassà 'e date 'e MediaWiki 'n manera annascunnusa e pure l'ati apprecaziune p' 'o web.\nAgghiurnate a libxml2 2.7.3 o cchiù muderno ([https://bugs.php.net/bug.php?id=45996 'o bug studiato d' 'o lato PHP]).\nInstallaziona spezzata.",
        "config-suhosin-max-value-length": "Suhosin è installato e miette lemmeto 'o parametro GET <code>length</code> a $1 byte.\n'O componente MediaWiki ResourceLoader funzionarrà aggirann'a stu lemmeto, ma luvanno prestaziune.\nSi pussibile, avit'a mpustà <code>suhosin.get.max_value_length</code> a 1024 o cchiù auto 'n <code>php.ini</code>, e mpustà <code>$wgResourceLoaderMaxQueryLength</code> a 'o stesso valore 'n <code>LocalSettings.php</code>.",
+       "config-using-32bit": "<strong>Attenziò:</strong> 'o sistema vuosto pare c'ausasse nummere sane 'e 32-bit. Chest' [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:32-bit è scunzigliat].",
        "config-db-type": "Tipo 'e database:",
        "config-db-host": "Host d' 'o database:",
        "config-db-host-help": "Si 'o server database vuosto stà mpizzato dint' 'a nu server differente, miette 'o nomme d' 'o host o l'indirizzo IP sujo.\n\nSi state ausanno nu servizio spartuto web hosting, 'aggenzia 'e hosting v'avess'a dà 'o nomme buono 'e nomme host dint' 'a documentaziona suoja.\n\nSi state installanno chisto dint'a nu server Windows cu MySQL, ausanno \"localhost\" può darse ca nun funziona p' 'o nomme server. Si chisto nun funziona, mettite \"127.0.0.1\" p' 'o ndirizzo locale vuosto.\n\nSi state ausanno PostgreSQL, lassate abbacante stu campo pe' v'accucchià cu nu socket Unix.",
        "config-type-mysql": "MariaDB, MySQL o compatibbele",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki supporta 'e sisteme 'e database ccà abbascio:\n\n$1\n\nSi nfra chiste ccà nun vedite 'o sistema 'e database ca vulite ausà, allora avite liegge 'e instruziune ccà ncoppa pe' ne dà supporto.",
-       "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] è 'a configurazione cchiù mmeglio p' 'o MediaWiki e è chilla meglio suppurtata. MediaWiki può faticà pure cu' [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], ca fossero MySQL cumpatibbele. ([https://secure.php.net/manual/en/mysqli.installation.php Comme s'adda fà pe' cumpilà PHP cu suppuorto MySQL])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] è nu sistema canusciuto 'e database open source ca fosse n'alternativa a MySQL. Putess'avé cocch'errore p'arricettà, e nun è cunzigliato 'e ll'ausà dint'a n'ambiente 'e produziona. ([https://secure.php.net/manual/en/pgsql.installation.php Comme s'avess'a cumpilà PHP cu suppuorto PostgreSQL])",
-       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]  è nu sistema 'e database leggero, ca fosse assaje buono suppurtato. ([http://www.php.net/manual/en/pdo.installation.php Comme cumpilà PHP cu suppuorto SQLite], aùsa PDO)",
-       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] è nu database 'e na fraveca commerciale. ([http://www.php.net/manual/en/oci8.installation.php Comme cumpilà PHP cu suppuorto OCI8])",
+       "config-dbsupport-mysql": "* [{{int:version-db-mariadb-url}} MariaDB] è 'a configurazione cchiù mmeglio p' 'o MediaWiki e è chilla meglio suppurtata. MediaWiki può faticà pure cu' [{{int:version-db-mariadb-url}} MariaDB] e [{{int:version-db-percona-url}} Percona Server], ca fossero MariaDB cumpatibbele. ([https://secure.php.net/manual/en/mysqli.installation.php Comme s'adda fà pe' cumpilà PHP cu suppuorto MySQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] è nu sistema canusciuto 'e database open source ca fosse n'alternativa a MySQL.\n([https://secure.php.net/manual/en/pgsql.installation.php Comme s'avess'a cumpilà PHP cu suppuorto PostgreSQL])",
+       "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite]  è nu sistema 'e database leggero, ca fosse assaje buono suppurtato.\n([https://secure.php.net/manual/en/pdo.installation.php Comme cumpilà PHP cu suppuorto SQLite], aùsa PDO)",
+       "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] è nu database 'e na fraveca commerciale. ([https://secure.php.net/manual/en/oci8.installation.php Comme cumpilà PHP cu suppuorto OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] è nu database 'e na fraveca commerciale p' 'o Windows. ([https://secure.php.net/manual/en/sqlsrv.installation.php Comme cumpilà PHP cu suppuorto SQLSRV])",
-       "config-header-mysql": "Mpustaziune MySQL",
+       "config-header-mysql": "Mpustaziune MariaDB/MySQL",
        "config-header-postgres": "Mpustaziune PostgreSQL",
        "config-header-sqlite": "Mpustaziune SQLite",
        "config-header-oracle": "Mpustaziune Oracle",
        "config-db-web-create": "Crìa 'o cunto si nun esiste ancora",
        "config-db-web-no-create-privs": "'O cunto ausato pe' ne fà l'installazione nun tene diritte necessarie pe' ne putè crià n'atu cunto.\n'O cunto zegnàto ccà adda esistere già.",
        "config-mysql-engine": "Mutore d'astipo:",
-       "config-mysql-innodb": "InnoDB",
+       "config-mysql-innodb": "InnoDB (fosse 'o cunzigliato)",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-myisam-dep": "<strong>Attenziò:</strong> avite scigliuto MyISAM comm' 'o mutore 'archiviaziona MySQL, ca nun è raccummannato pe' l'ausà cu MediaWiki, pecché:\n* supporta debolmente 'a concorrenza p' 'o blocco d' 'a tabbella\n* è cchiù inchine 'a corruzione 'e l'ati mutore\n* 'o codece 'e base 'e MediaWiki nun gestisce sempe MyISAM comme l'avess'a gistiunà\n\nSi ll'installazione vosta MySQL suppuorta InnoDB, è autamente raccummandato ca si scigliesse a 'o posto suo.\nSi 'a installazione MySQL nun suppurtasse InnoDB, forse è 'o mumento 'e ll'agghiurnà.",
        "config-mysql-only-myisam-dep": "<strong>Attenziò:</strong> MyISAM è l'uneco mutore p'astipà date ca se trova mo' a disposizione p' 'o MySQL dint'a sta macchina, e nun fosse raccumandato 'e s'ausà cu MediaWiki, pecché:\n* suppurtasse minimamente concorrenza pe' bbìa 'e bluccà tabbelle\n* è cchiù facile ca jesse a se scassà cchiù 'e l'ati mutore\n* 'o codece MediaWiki nun maniasse sempe MyISAM comme l'avesse 'e manià\n\nL'installazione MySQL nun suppurtasse InnoDB, può darse ca chist'è 'o mumento pe' ve ll'agghiurnà.",
        "config-subscribe": "Mettiteve dint' 'a [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce mailing list 'e ll'annunciazione 'e verziune d' 'o software rilassate].",
        "config-subscribe-help": "Chest'è na mailing list a basso traffeco ca se dedicasse a se ffà annunzie 'e verziune nove, piglianno pure mpurtante nutarelle ca riguardassero 'a sicurezza.\nFosse cunzigliato 'e se nzegnà e s'agghiurnà l'installazione 'e MediaWiki quanno na verziona nova fosse pubbreca.",
        "config-subscribe-noemail": "Vuje avite tentato 'e ve trasì dint' 'a mailing list addedecata a se fà annunzie ncopp' 'e verziune nove senza ve dà n'indirizzo email.\nNzertanno n'indirizzo email se vulite affettuà l'iscrizione dint'a mailing list.",
+       "config-pingback": "Sparte 'e date 'e st'installazione ch' 'e sviluppature 'e MediaWiki.",
+       "config-pingback-help": "Si vuje sciglite st'opzione, MediaWiki cuntattasse spisso https://www.mediawiki.org ch' 'e date 'e base e st'istanza MediaWiki. Dint' 'a sta categoria 'e date, tràseno, p'esempie, 'o tipo 'e sistema, 'a virziona 'e PHP e database 'e backend scigliuto. 'A Wikimedia Foundation spartisse sti date ch' 'e sviluppature Mediawiki p' 'a puté aiutà a guidà 'e fatiche 'e sviluppo future. P' 'o sistema d' 'o vuosto 'e date se mannan'accussì:\n<pre>$1</pre>",
        "config-almost-done": "Avite quase fernuto!\nMo' putite zumpà 'a parta r' 'a configurazione e sempricemente installà 'a wiki.",
        "config-optional-continue": "Spiate cchiù dimanne.",
        "config-optional-skip": "Me so' scucciato già, installa surtanto 'o wiki.",
        "config-cache-options": "Mpustaziune p' 'a cache d'oggette:",
        "config-cache-help": "'O caching 'uggette s'ausa pe' puté migliurà 'a velocità 'e MediaWiki a fforza 'e ffà caching d' 'e date cchiù spisso ausàte.\nE Mezze a gruosse site se songo ncuraggiate a ll'appiccià chiste, e site piccerilli vedarranno migliuramente pure.",
        "config-cache-none": "Nisciuna memorizzazione n cache (nisciuna funziunalità è luvata, ma 'a velocità se putesse ffà a meno dint' 'e wiki cchiù gruosse)",
-       "config-cache-accel": "Mettere 'n cache oggette PHP (APC, XCache o WinCache)",
+       "config-cache-accel": "Mettere 'n cache oggette PHP (APC, APCu o WinCache)",
        "config-cache-memcached": "Aúsa 'o Memcached (richiede cchiù mpustaziune 'installazione e configuraziona)",
        "config-memcached-servers": "Server memcached:",
        "config-memcached-help": "Elenco 'e ll'indirizzi IP p' 'e putè ausà p' 'o Memcached.\nS'avess'a specificà uno pe' riga e scrivere 'a porta 'e trasuta. P'esempio:\n 127.0.0.1:11211\n 192.168.1.25:1234",
        "config-install-subscribe-fail": "Nun se pò sottoscrivere mediawiki-announce: $1",
        "config-install-subscribe-notpossible": "cURL nun è installato e <code>allow_url_fopen</code> nun è disponibbele.",
        "config-install-mainpage": "Crianno 'a paggena prencepale ch' 'e cuntenute predefinite",
+       "config-install-mainpage-exists": "'A paggena principale esiste già, è zumpata",
        "config-install-extension-tables": "Crianno tabelle pe' estenziune appicciate",
        "config-install-mainpage-failed": "Nun se pò nzertà 'a paggena prencepale: $1",
-       "config-install-done": "<strong>Cumplimente!</strong>\nAvite installato MediaWiki apposto.\n\n'O prugramma 'installazione ha generato nu file <code>LocalSettings.php</code> ca cuntene tuttuquante 'e mpustaziune.\n\nAvit'a scarrecà chisto e 'o nzertà dint' 'a cartella bbase d' 'o wiki vuosto ('a stessa addò fosse prisente l' index.php). 'A scarreca avess'a partì automaticamente.\n\nSi nu download nun s'avviasse, o si è stato annullato, putite riavvià cliccanno ncopp' 'o cullegamento 'e seguito:\n\n$3\n\n<strong>Nota:</strong> si ascite mò 'a ll'installazione senza manco scarrecà 'o file 'e configurazione che s'è criato, po chesto nun sarrà cchiù dispunibbele.\n\nQuanno fosse tutto fernuto allora <strong>[$2 trasite dint' 'o wiki vuosto]</strong>.",
+       "config-install-done": "<strong>Cumplimente!</strong>\nAvite installato MediaWiki.\n\n'O prugramma 'installazione ha generato nu file <code>LocalSettings.php</code> ca cuntene tuttuquante 'e mpustaziune.\n\nAvit'a scarrecà chisto e 'o nzertà dint' 'a cartella bbase d' 'o wiki vuosto ('a stessa addò fosse prisente l' index.php). 'A scarreca avess'a partì automaticamente.\n\nSi nu download nun s'avviasse, o si è stato annullato, putite riavvià cliccanno ncopp' &#