Merge "Use pseudo elements to style changelist-separators on Contributions"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Tue, 2 Oct 2018 12:24:58 +0000 (12:24 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Tue, 2 Oct 2018 12:24:58 +0000 (12:24 +0000)
670 files changed:
.eslintrc.json
.gitattributes
.phpcs.xml
CODE_OF_CONDUCT.md
HISTORY
RELEASE-NOTES-1.32
autoload.php
composer.json
docs/design.txt [deleted file]
docs/distributors.txt
docs/extension.schema.v1.json
docs/extension.schema.v2.json
docs/hooks.txt
docs/pageupdater.txt
includes/AutoLoader.php
includes/CommentStore.php
includes/DefaultSettings.php
includes/EditPage.php
includes/EventRelayerGroup.php
includes/GlobalFunctions.php
includes/MWTimestamp.php
includes/MimeMagic.php [deleted file]
includes/OrderedStreamingForkController.php
includes/OutputPage.php
includes/Revision.php
includes/Revision/RenderedRevision.php
includes/Revision/RevisionRenderer.php
includes/Revision/SlotRenderingProvider.php [new file with mode: 0644]
includes/ServiceWiring.php
includes/SiteStats.php
includes/Storage/DerivedPageDataUpdater.php
includes/Storage/NameTableStore.php
includes/Storage/PageUpdater.php
includes/Storage/RevisionStore.php
includes/Storage/SlotRecord.php
includes/Title.php
includes/WebRequest.php
includes/actions/McrRestoreAction.php [new file with mode: 0644]
includes/actions/McrUndoAction.php
includes/actions/RawAction.php
includes/actions/RollbackAction.php
includes/api/ApiComparePages.php
includes/api/ApiFeedContributions.php
includes/api/ApiLogin.php
includes/api/ApiOptions.php
includes/api/ApiParse.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryInfo.php
includes/api/ApiQueryRevisionsBase.php
includes/api/ApiStashEdit.php
includes/api/i18n/ar.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/nb.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hant.json
includes/auth/LocalPasswordPrimaryAuthenticationProvider.php
includes/cache/MessageCache.php
includes/cache/localisation/LocalisationCache.php
includes/changes/ChangesListBooleanFilter.php
includes/changes/OldChangesList.php
includes/changetags/ChangeTags.php
includes/content/Content.php
includes/content/ContentHandler.php
includes/content/WikiTextStructure.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/monolog/LegacyFormatter.php
includes/debug/logger/monolog/LegacyHandler.php
includes/deferred/LinksUpdate.php
includes/diff/DifferenceEngine.php
includes/exception/MWException.php
includes/exception/MWExceptionHandler.php
includes/exception/MWExceptionRenderer.php
includes/export/WikiExporter.php
includes/filerepo/FileRepo.php
includes/filerepo/file/File.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/gallery/PackedImageGallery.php
includes/htmlform/fields/HTMLInfoField.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/htmlform/fields/HTMLTitleTextField.php
includes/installer/Installer.php
includes/installer/MysqlUpdater.php
includes/installer/WebInstallerDocument.php
includes/installer/WebInstallerOutput.php
includes/installer/WebInstallerWelcome.php
includes/installer/i18n/bg.json
includes/installer/i18n/en.json
includes/installer/i18n/nap.json
includes/installer/i18n/qqq.json
includes/installer/i18n/roa-tara.json
includes/installer/i18n/yue.json
includes/interwiki/ClassicInterwikiLookup.php
includes/jobqueue/JobQueueDB.php
includes/jobqueue/JobRunner.php
includes/jobqueue/utils/PurgeJobUtils.php
includes/libs/rdbms/database/Database.php
includes/libs/rdbms/database/DatabaseMysqlBase.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/libs/rdbms/database/DatabaseSqlite.php
includes/libs/rdbms/lbfactory/LBFactory.php
includes/libs/rdbms/loadbalancer/LoadBalancer.php
includes/libs/virtualrest/ParsoidVirtualRESTService.php
includes/mail/MailAddress.php
includes/media/JpegHandler.php
includes/page/Article.php
includes/page/ImageHistoryList.php
includes/page/ImageHistoryPseudoPager.php
includes/page/WikiPage.php
includes/pager/IndexPager.php
includes/parser/MWTidy.php
includes/parser/Parser.php
includes/parser/Preprocessor_Hash.php
includes/parser/RemexStripTagHandler.php
includes/parser/Sanitizer.php
includes/poolcounter/PoolWorkArticleView.php
includes/preferences/DefaultPreferencesFactory.php
includes/registration/ExtensionDependencyError.php
includes/registration/ExtensionRegistry.php
includes/registration/VersionChecker.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/skins/BaseTemplate.php
includes/skins/QuickTemplate.php
includes/skins/Skin.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/PageQueryPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialAncientpages.php
includes/specials/SpecialExpandTemplates.php
includes/specials/SpecialExport.php
includes/specials/SpecialFewestrevisions.php
includes/specials/SpecialFileDuplicateSearch.php
includes/specials/SpecialFilepath.php
includes/specials/SpecialImport.php
includes/specials/SpecialLog.php
includes/specials/SpecialMIMEsearch.php
includes/specials/SpecialMostlinkedcategories.php
includes/specials/SpecialNewimages.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRedirect.php
includes/specials/SpecialSearch.php
includes/specials/SpecialUnwatchedpages.php
includes/specials/SpecialWantedcategories.php
includes/specials/SpecialWatchlist.php
includes/specials/forms/PreferencesFormOOUI.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/utils/MWFileProps.php
includes/watcheditem/WatchedItemStore.php
includes/widget/search/FullSearchResultWidget.php
languages/Language.php
languages/classes/LanguageKk.php
languages/classes/LanguageKu.php
languages/data/CrhExceptions.php
languages/i18n/an.json
languages/i18n/ar.json
languages/i18n/arz.json
languages/i18n/ast.json
languages/i18n/be-tarask.json
languages/i18n/be.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/diq.json
languages/i18n/dsb.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/eu.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/ga.json
languages/i18n/gcr.json
languages/i18n/gl.json
languages/i18n/gsw.json
languages/i18n/he.json
languages/i18n/hif-latn.json
languages/i18n/hr.json
languages/i18n/hsb.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ilo.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/lb.json
languages/i18n/lez.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mk.json
languages/i18n/ml.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/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/or.json
languages/i18n/pfl.json
languages/i18n/pl.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/scn.json
languages/i18n/sd.json
languages/i18n/sh.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/uz.json
languages/i18n/wa.json
languages/i18n/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/i18n/zh-hk.json
languages/messages/MessagesAr.php
languages/messages/MessagesAs.php
languages/messages/MessagesBho.php
languages/messages/MessagesBi.php [new file with mode: 0644]
languages/messages/MessagesBo.php
languages/messages/MessagesCkb.php
languages/messages/MessagesDz.php
languages/messages/MessagesEn_ca.php [new file with mode: 0644]
languages/messages/MessagesEn_gb.php
languages/messages/MessagesFa.php
languages/messages/MessagesGu.php
languages/messages/MessagesHi.php
languages/messages/MessagesJam.php [new file with mode: 0644]
languages/messages/MessagesKk_arab.php
languages/messages/MessagesKm.php
languages/messages/MessagesKn.php
languages/messages/MessagesKs_arab.php
languages/messages/MessagesKs_deva.php
languages/messages/MessagesKu_arab.php
languages/messages/MessagesLo.php
languages/messages/MessagesMr.php
languages/messages/MessagesNe.php
languages/messages/MessagesNew.php
languages/messages/MessagesOr.php
languages/messages/MessagesPi.php
languages/messages/MessagesPih.php [new file with mode: 0644]
languages/messages/MessagesPs.php
languages/messages/MessagesSa.php
languages/messages/MessagesSco.php [new file with mode: 0644]
languages/messages/MessagesSkr_arab.php
maintenance/Maintenance.php
maintenance/archives/patch-parsercache.sql
maintenance/benchmarks/benchmarkTidy.php
maintenance/cleanupInvalidDbKeys.php
maintenance/compareParsers.php
maintenance/createCommonPasswordCdb.php
maintenance/dictionary/mediawiki.dic
maintenance/dumpIterator.php
maintenance/edit.php
maintenance/emptyUserGroup.php [new file with mode: 0644]
maintenance/includes/BackupDumper.php
maintenance/includes/DeleteLocalPasswords.php
maintenance/parse.php
maintenance/populateArchiveRevId.php
maintenance/populateContentTables.php
maintenance/resources/foreign-resources.yaml
maintenance/storage/dumpRev.php
mw-config/config.js
package.json
resources/Resources.php
resources/lib/jquery.cookie.js [deleted file]
resources/lib/jquery.cookie/CHANGELOG.md [new file with mode: 0644]
resources/lib/jquery.cookie/MIT-LICENSE.txt [new file with mode: 0644]
resources/lib/jquery.cookie/jquery.cookie.js [new file with mode: 0644]
resources/lib/mustache/mustache.js
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/mediawiki.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/ActorMigrationTest.php
tests/phpunit/includes/CommentStoreTest.php
tests/phpunit/includes/ExtraParserTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/Revision/RenderedRevisionTest.php
tests/phpunit/includes/Revision/RevisionRendererTest.php
tests/phpunit/includes/RevisionDbTestBase.php
tests/phpunit/includes/RevisionMcrDbTest.php
tests/phpunit/includes/RevisionMcrReadNewDbTest.php
tests/phpunit/includes/RevisionTest.php
tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php
tests/phpunit/includes/Storage/MutableRevisionRecordTest.php
tests/phpunit/includes/Storage/MutableRevisionSlotsTest.php
tests/phpunit/includes/Storage/NoContentModelRevisionStoreDbTest.php
tests/phpunit/includes/Storage/PageUpdaterTest.php
tests/phpunit/includes/Storage/RevisionArchiveRecordTest.php
tests/phpunit/includes/Storage/RevisionQueryInfoTest.php
tests/phpunit/includes/Storage/RevisionRecordTests.php
tests/phpunit/includes/Storage/RevisionSlotsTest.php
tests/phpunit/includes/Storage/RevisionSlotsUpdateTest.php
tests/phpunit/includes/Storage/RevisionStoreDbTestBase.php
tests/phpunit/includes/Storage/RevisionStoreRecordTest.php
tests/phpunit/includes/Storage/RevisionStoreTest.php
tests/phpunit/includes/Storage/SlotRecordTest.php
tests/phpunit/includes/api/ApiErrorFormatterTest.php
tests/phpunit/includes/api/ApiOptionsTest.php
tests/phpunit/includes/api/ApiParseTest.php
tests/phpunit/includes/api/ApiQueryPrefixSearchTest.php
tests/phpunit/includes/api/ApiQuerySiteinfoTest.php
tests/phpunit/includes/api/ApiQueryWatchlistIntegrationTest.php
tests/phpunit/includes/changetags/ChangeTagsTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/content/WikitextStructureTest.php
tests/phpunit/includes/db/DatabasePostgresTest.php
tests/phpunit/includes/db/LBFactoryTest.php
tests/phpunit/includes/debug/DeprecationHelperTest.php
tests/phpunit/includes/diff/DifferenceEngineTest.php
tests/phpunit/includes/libs/composer/ComposerLockTest.php
tests/phpunit/includes/linker/LinkRendererTest.php
tests/phpunit/includes/media/BitmapMetadataHandlerTest.php
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/page/ArticleViewTest.php
tests/phpunit/includes/page/PageArchivePreMcrTest.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/page/WikiPageMcrReadNewDbTest.php
tests/phpunit/includes/page/WikiPageNoContentModelDbTest.php
tests/phpunit/includes/parser/ParserMethodsTest.php
tests/phpunit/includes/parser/SanitizerTest.php
tests/phpunit/includes/poolcounter/PoolWorkArticleViewTest.php
tests/phpunit/includes/registration/ExtensionProcessorTest.php
tests/phpunit/includes/registration/VersionCheckerTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderWikiModuleTest.php
tests/phpunit/includes/sparql/SparqlClientTest.php
tests/phpunit/includes/specialpage/AbstractChangesListSpecialPageTestCase.php
tests/phpunit/includes/specialpage/ChangesListSpecialPageTest.php
tests/phpunit/includes/specials/SpecialLogTest.php [new file with mode: 0644]
tests/phpunit/includes/specials/SpecialRecentchangesTest.php
tests/phpunit/includes/specials/SpecialRedirectTest.php [new file with mode: 0644]
tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php
tests/phpunit/structure/StructureTest.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
tests/selenium/specs/specialrecentchanges.js
tests/selenium/wdio-mediawiki/BlankPage.js
tests/selenium/wdio-mediawiki/LoginPage.js
tests/selenium/wdio-mediawiki/RunJobs.js [new file with mode: 0644]
tests/selenium/wdio-mediawiki/specs/BlankPage.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" />
index d8e5d08..498acf7 100644 (file)
@@ -1 +1 @@
-The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Code_of_Conduct).
+The development of this software is covered by a [Code of Conduct](https://www.mediawiki.org/wiki/Special:MyLanguage/Code_of_Conduct).
diff --git a/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 041b3d7..6c200d9 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,
@@ -89,6 +93,9 @@ production.
   This action should be considered deprecated and should not be used directly.
 * Extensions overriding ContentHandler::getUndoContent() will need to be
   updated for the changed method signature.
+* Added a new hook, 'UserGetRightsRemove', which can be used to remove rights
+  from user. Unlike the 'UserGetRights' it will ensure that removed rights
+  will not be reinserted.
 
 === External library changes in 1.32 ===
 
@@ -104,7 +111,7 @@ production.
 * Updated mediawiki/mediawiki-codesniffer from v20.0.0 to v21.0.0.
 * Updated composer/spdx-licenses from 1.3.0 to 1.4.0.
 * Updated jquery.i18n from 1.0.4 to 1.0.5.
-* Updated wikimedia/timestamp from 1.0.0 to 2.0.0.
+* Updated wikimedia/timestamp from 1.0.0 to 2.2.0.
 * Updated wikimedia/remex-html from 1.0.3 to 2.0.0.
 * Updated jquery from v3.2.1 to v3.3.1.
 
@@ -115,6 +122,7 @@ production.
 * SpecialPage::execute() will now only call checkLoginSecurityLevel() if
   getLoginSecurityLevel() returns non-false.
 * (T43720, T46197) Improved page display title handling for category pages
+* (T65080) Fixed resetting options of some types via API action=options.
 
 === Action API changes in 1.32 ===
 * Added templated parameters.
@@ -163,13 +171,15 @@ production.
     content is not being preserved. 'fromsection-{slot}' and 'tosection-{slot}'
     instead expand the given text as if for a section edit. This effectively
     declines T183823 in favor of T185723.
+* (T198214) The 'disabletidy' parameter to action=parse has been
+  deprecated; untidy output will not be supported by future wikitext
+  parsers.
 
 === Action API internal changes in 1.32 ===
 * Added 'ApiParseMakeOutputPage' hook.
 * Parameter names may no longer contain '{' or '}', as these are now used for
   templated parameters.
 * (T194950) Added 'ApiMaxLagInfo' hook.
-* Added 'ApiParseMakeOutputPage' hook.
 * The following methods now take a RevisionRecord rather than a Revision. No
   external callers are known.
   * ApiFeedContributions::feedItemAuthor()
@@ -290,11 +300,35 @@ 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.
+* LBFactory, deprecated since 1.28, has been removed. Instead, use
+  Wikimedia\Rdbms\LBFactory.
+* The MimeMagic class, deprecated since 1.28 has been removed. Get a
+  MimeAnalyzer instance from MediaWikiServices instead.
+* The '--tidy' option to maintenance/parse.php has been removed.  Tidying
+  the output is now the default.  Use '--no-tidy' to bypass the tidy
+  phase.
+* The global function wfErrorLog, deprecated since 1.25, has now been removed.
+  Use MWLoggerLegacyLogger::emit or UDPTransport.
 
 === Deprecations in 1.32 ===
 * HTMLForm::setSubmitProgressive() is deprecated. No need to call it. Submit
@@ -417,6 +451,30 @@ 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 hard deprecated;
+  future parsers will not emit compatible output for these configurations.
+* QuickTemplate::msgHtml() and BaseTemplate::msgHtml() have been deprecated
+  as they promote bad practises. I18n messages should always be properly
+  escaped.
+* Skin::getDynamicStylesheetQuery() has been deprecated. It always
+  returns action=raw&ctype=text/css which callers should use directly.
+* Class LegacyFormatter is deprecated.
 
 === Other changes in 1.32 ===
 * (T198811) The following tables have had their UNIQUE indexes turned into
@@ -427,6 +485,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 b52dfb7..33ee128 100644 (file)
@@ -449,6 +449,7 @@ $wgAutoloadLocalClasses = [
        'EmailNotification' => __DIR__ . '/includes/mail/EmailNotification.php',
        'EmaillingJob' => __DIR__ . '/includes/jobqueue/jobs/EmaillingJob.php',
        'EmptyBagOStuff' => __DIR__ . '/includes/libs/objectcache/EmptyBagOStuff.php',
+       'EmptyUserGroup' => __DIR__ . '/maintenance/emptyUserGroup.php',
        'EnConverter' => __DIR__ . '/languages/classes/LanguageEn.php',
        'EncryptedPassword' => __DIR__ . '/includes/password/EncryptedPassword.php',
        'EnhancedChangesList' => __DIR__ . '/includes/changes/EnhancedChangesList.php',
@@ -717,7 +718,6 @@ $wgAutoloadLocalClasses = [
        'JsonContentHandler' => __DIR__ . '/includes/content/JsonContentHandler.php',
        'KkConverter' => __DIR__ . '/languages/classes/LanguageKk.php',
        'KuConverter' => __DIR__ . '/languages/classes/LanguageKu.php',
-       'LBFactory' => __DIR__ . '/includes/libs/rdbms/lbfactory/LBFactory.php',
        'LCStore' => __DIR__ . '/includes/cache/localisation/LCStore.php',
        'LCStoreCDB' => __DIR__ . '/includes/cache/localisation/LCStoreCDB.php',
        'LCStoreDB' => __DIR__ . '/includes/cache/localisation/LCStoreDB.php',
@@ -850,6 +850,7 @@ $wgAutoloadLocalClasses = [
        'MappedIterator' => __DIR__ . '/includes/libs/MappedIterator.php',
        'MarkpatrolledAction' => __DIR__ . '/includes/actions/MarkpatrolledAction.php',
        'McTest' => __DIR__ . '/maintenance/mctest.php',
+       'McrRestoreAction' => __DIR__ . '/includes/actions/McrRestoreAction.php',
        'McrUndoAction' => __DIR__ . '/includes/actions/McrUndoAction.php',
        'MediaHandler' => __DIR__ . '/includes/media/MediaHandler.php',
        'MediaHandlerFactory' => __DIR__ . '/includes/media/MediaHandlerFactory.php',
@@ -897,6 +898,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',
@@ -950,7 +952,6 @@ $wgAutoloadLocalClasses = [
        'MigrateFileRepoLayout' => __DIR__ . '/maintenance/migrateFileRepoLayout.php',
        'MigrateUserGroup' => __DIR__ . '/maintenance/migrateUserGroup.php',
        'MimeAnalyzer' => __DIR__ . '/includes/libs/mime/MimeAnalyzer.php',
-       'MimeMagic' => __DIR__ . '/includes/MimeMagic.php',
        'MinifyScript' => __DIR__ . '/maintenance/minify.php',
        'MostcategoriesPage' => __DIR__ . '/includes/specials/SpecialMostcategories.php',
        'MostimagesPage' => __DIR__ . '/includes/specials/SpecialMostimages.php',
index bd3a696..0707f04 100644 (file)
@@ -48,7 +48,7 @@
                "wikimedia/running-stat": "1.2.1",
                "wikimedia/scoped-callback": "2.0.0",
                "wikimedia/utfnormal": "2.0.0",
-               "wikimedia/timestamp": "2.1.1",
+               "wikimedia/timestamp": "2.2.0",
                "wikimedia/wait-condition-loop": "1.0.1",
                "wikimedia/wrappedstring": "3.0.1",
                "wikimedia/xmp-reader": "0.6.0",
@@ -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",
@@ -74,7 +74,7 @@
                "wmde/hamcrest-html-matchers": "^0.1.0"
        },
        "suggest": {
-               "ext-apc": "Local data and opcode cache",
+               "ext-apcu": "Local data cache for greatly improved performance",
                "ext-curl": "Improved http communication abilities",
                "ext-fileinfo": "Improved mime magic detection",
                "ext-intl": "ICU integration",
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 0ff169c..e6ec971 100644 (file)
                },
                "requires": {
                        "type": "object",
-                       "description": "Indicates what versions of MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
+                       "description": "Indicates what versions of PHP, MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
                        "additionalProperties": false,
                        "properties": {
                                "MediaWiki": {
                                        "type": "string",
                                        "description": "Version constraint string against MediaWiki core."
                                },
+                               "platform": {
+                                       "type": "object",
+                                       "description": "Indicates version constraints against platform services.",
+                                       "additionalProperties": false,
+                                       "properties": {
+                                               "php": {
+                                                       "type": "string",
+                                                       "description": "Version constraint string against PHP."
+                                               }
+                                       }
+                               },
                                "extensions": {
                                        "type": "object",
                                        "description": "Set of version constraint strings against specific extensions."
index 7de5ed5..93bf0d9 100644 (file)
                },
                "requires": {
                        "type": "object",
-                       "description": "Indicates what versions of MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
+                       "description": "Indicates what versions of PHP, MediaWiki core or extensions are required. This syntax may be extended in the future, for example to check dependencies between other services.",
                        "additionalProperties": false,
                        "properties": {
                                "MediaWiki": {
                                        "type": "string",
                                        "description": "Version constraint string against MediaWiki core."
                                },
+                               "platform": {
+                                       "type": "object",
+                                       "description": "Indicates version constraints against platform services.",
+                                       "additionalProperties": false,
+                                       "properties": {
+                                               "php": {
+                                                       "type": "string",
+                                                       "description": "Version constraint string against PHP."
+                                               }
+                                       }
+                               },
                                "extensions": {
                                        "type": "object",
                                        "description": "Set of version constraint strings against specific extensions."
index cce50e0..d82f56e 100644 (file)
@@ -2353,7 +2353,7 @@ $title: title of the message (string)
 $code: code (string) denoting the language to try.
 
 'MimeMagicGuessFromContent': Allows MW extensions guess the MIME by content.
-$mimeMagic: Instance of MimeMagic.
+$mimeMagic: Instance of MimeAnalyzer.
 &$head: First 1024 bytes of the file in a string (in - Do not alter!).
 &$tail: More or equal than last 65558 bytes of the file in a string
   (in - Do not alter!).
@@ -2362,7 +2362,7 @@ $file: File path.
 
 'MimeMagicImproveFromExtension': Allows MW extensions to further improve the
 MIME type detected by considering the file extension.
-$mimeMagic: Instance of MimeMagic.
+$mimeMagic: Instance of MimeAnalyzer.
 $ext: File extension.
 &$mime: MIME type (in/out).
 
@@ -2370,7 +2370,7 @@ $ext: File extension.
 and the list mapping MIME types to file extensions.
 As an extension author, you are encouraged to submit patches to MediaWiki's
 core to add new MIME types to mime.types.
-$mimeMagic: Instance of MimeMagic.
+$mimeMagic: Instance of MimeAnalyzer.
   Use $mimeMagic->addExtraInfo( $stringOfInfo );
   for adding new MIME info to the list.
   Use $mimeMagic->addExtraTypes( $stringOfTypes );
@@ -2546,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
@@ -2919,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.
 
@@ -2978,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
@@ -3320,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
@@ -3442,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.
@@ -3786,6 +3783,13 @@ $context: IContextSource object
 $user: User to get rights for
 &$rights: Current rights
 
+'UserGetRightsRemove': Called in User::getRights(). This hook override
+the UserGetRights hook. It can be used to remove rights from user
+and ensure that will not be reinserted by the other hook callbacks
+therefore this hook should not be used to add any rights, use UserGetRights instead.
+$user: User to get rights for
+&$rights: Current rights
+
 'UserGroupsChanged': Called after user groups are changed.
 $user: User whose groups changed
 $added: Groups added
@@ -4054,10 +4058,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 4980c92..54eb91a 100644 (file)
@@ -61,7 +61,7 @@ Typical usage for programmatic revision creation (with $page being a WikiPage as
 replaced by a repository service later):
 
   $updater = $page->newPageUpdater( $user );
-  $updater->setContent( 'main', $content );
+  $updater->setContent( SlotRecord::MAIN, $content );
   $updater->setRcPatrolStatus( RecentChange::PRC_PATROLLED );
   $newRev = $updater->saveRevision( $comment );
 
@@ -69,8 +69,8 @@ Usage with content depending on the parent revision
 
   $updater = $page->newPageUpdater( $user );
   $parent = $updater->grabParentRevision();
-  $content = $parent->getContent( 'main' )->replaceSection( $section, $sectionContent );
-  $updater->setContent( 'main', $content );
+  $content = $parent->getContent( SlotRecord::MAIN )->replaceSection( $section, $sectionContent );
+  $updater->setContent( SlotRecord::MAIN, $content );
   $newRev = $updater->saveRevision( $comment, EDIT_UPDATE );
 
 In both cases, all secondary updates will be triggered automatically.
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 bf3e3d6..9969b78 100644 (file)
@@ -115,8 +115,7 @@ class CommentStore {
         */
        public static function newKey( $key ) {
                global $wgCommentTableSchemaMigrationStage;
-               // TODO uncomment once not used in extensions
-               // wfDeprecated( __METHOD__, '1.31' );
+               wfDeprecated( __METHOD__, '1.31' );
                $store = new CommentStore( MediaWikiServices::getInstance()->getContentLanguage(),
                        $wgCommentTableSchemaMigrationStage );
                $store->key = $key;
index 343e80d..9ea1a25 100644 (file)
@@ -1380,14 +1380,14 @@ $wgAntivirusRequired = true;
 $wgVerifyMimeType = true;
 
 /**
- * Sets the MIME type definition file to use by MimeMagic.php.
+ * Sets the MIME type definition file to use by includes/libs/mime/MimeAnalyzer.php.
  * Set to null, to use built-in defaults only.
  * example: $wgMimeTypeFile = '/etc/mime.types';
  */
 $wgMimeTypeFile = 'includes/mime.types';
 
 /**
- * Sets the MIME type info file to use by MimeMagic.php.
+ * Sets the MIME type info file to use by includes/libs/mime/MimeAnalyzer.php.
  * Set to null, to use built-in defaults only.
  */
 $wgMimeInfoFile = 'includes/mime.info';
@@ -1931,7 +1931,7 @@ $wgDBprefix = '';
 /**
  * MySQL table options to use during installation or update
  */
-$wgDBTableOptions = 'ENGINE=InnoDB';
+$wgDBTableOptions = 'ENGINE=InnoDB, DEFAULT CHARSET=binary';
 
 /**
  * SQL Mode - default is turning off all modes, including strict, if set.
@@ -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)
@@ -6919,34 +6929,6 @@ $wgRCWatchCategoryMembership = false;
  */
 $wgUseRCPatrol = true;
 
-/**
- * Whether a preference is displayed for structured change filters.
- * If false, no preference is displayed and structured change filters are disabled.
- * If true, structured change filters are *enabled* by default, and a preference is displayed
- * that lets users disable them.
- *
- * Temporary variable during development and will be removed.
- *
- * @since 1.30
- */
-$wgStructuredChangeFiltersShowPreference = false;
-
-/**
- * Whether a preference is displayed for structured change filters on watchlist.
- * Works just like $wgStructuredChangeFiltersShowPreference.
- *
- * Temporary variable during development and will be removed
- * @since 1.32
- */
-$wgStructuredChangeFiltersShowWatchlistPreference = false;
-
-/**
- * Whether to enable RCFilters app on Special:Watchlist
- *
- * Temporary variable during development and will be removed.
- */
-$wgStructuredChangeFiltersOnWatchlist = false;
-
 /**
  * Polling rate, in seconds, used by the 'live update' and 'view newest' features
  * of the RCFilters app on SpecialRecentChanges and Special:Watchlist.
@@ -8007,6 +7989,7 @@ $wgActions = [
        'info' => true,
        'markpatrolled' => true,
        'mcrundo' => McrUndoAction::class,
+       'mcrrestore' => McrRestoreAction::class,
        'protect' => true,
        'purge' => true,
        'raw' => true,
index 64b2f01..8c4b3c8 100644 (file)
@@ -1222,7 +1222,9 @@ class EditPage {
                                                !$undorev->isDeleted( Revision::DELETED_TEXT ) &&
                                                !$oldrev->isDeleted( Revision::DELETED_TEXT )
                                        ) {
-                                               if ( WikiPage::hasDifferencesOutsideMainSlot( $undorev, $oldrev ) ) {
+                                               if ( WikiPage::hasDifferencesOutsideMainSlot( $undorev, $oldrev )
+                                                       || !$this->isSupportedContentModel( $oldrev->getContentModel() )
+                                               ) {
                                                        // Hack for undo while EditPage can't handle multi-slot editing
                                                        $this->context->getOutput()->redirect( $this->mTitle->getFullURL( [
                                                                'action' => 'mcrundo',
@@ -1304,6 +1306,32 @@ class EditPage {
                                                $this->context->msg( 'undo-' . $undoMsg )->plain() . '</div>', true, /* interface */true );
                                }
 
+                               if ( $content === false ) {
+                                       // Hack for restoring old revisions while EditPage
+                                       // can't handle multi-slot editing.
+
+                                       $curRevision = $this->page->getRevision();
+                                       $oldRevision = $this->mArticle->getRevisionFetched();
+
+                                       if ( $curRevision
+                                               && $oldRevision
+                                               && $curRevision->getId() !== $oldRevision->getId()
+                                               && ( WikiPage::hasDifferencesOutsideMainSlot( $oldRevision, $curRevision )
+                                                       || !$this->isSupportedContentModel( $oldRevision->getContentModel() ) )
+                                       ) {
+                                               $this->context->getOutput()->redirect(
+                                                       $this->mTitle->getFullURL(
+                                                               [
+                                                                       'action' => 'mcrrestore',
+                                                                       'restore' => $oldRevision->getId(),
+                                                               ]
+                                                       )
+                                               );
+
+                                               return false;
+                                       }
+                               }
+
                                if ( $content === false ) {
                                        $content = $this->getOriginalContent( $user );
                                }
@@ -1689,7 +1717,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;
                }
@@ -2688,7 +2716,7 @@ ERROR;
         *
         * @param string|null|bool $text Text to unserialize
         * @return Content|bool|null The content object created from $text. If $text was false
-        *   or null, false resp. null will be  returned instead.
+        *   or null, then false or null will be returned instead.
         *
         * @throws MWException If unserializing the text results in a Content
         *   object that is not an instance of TextContent and
index 18b1cd3..95d11d9 100644 (file)
@@ -44,6 +44,7 @@ class EventRelayerGroup {
         * @return EventRelayerGroup
         */
        public static function singleton() {
+               wfDeprecated( __METHOD__, '1.27' );
                return MediaWikiServices::getInstance()->getEventRelayerGroup();
        }
 
index 4f12110..868fda3 100644 (file)
@@ -197,11 +197,10 @@ function wfAppendToArrayIfNotDefault( $key, $value, $default, &$changed ) {
  *       [ 'y' ]
  *     ]
  *
- * @param array $array1,...
+ * @param array ...$args
  * @return array
  */
-function wfMergeErrorArrays( /*...*/ ) {
-       $args = func_get_args();
+function wfMergeErrorArrays( ...$args ) {
        $out = [];
        foreach ( $args as $errors ) {
                foreach ( $errors as $params ) {
@@ -1147,26 +1146,6 @@ function wfLogWarning( $msg, $callerOffset = 1, $level = E_USER_WARNING ) {
        MWDebug::warning( $msg, $callerOffset + 1, $level, 'production' );
 }
 
-/**
- * Log to a file without getting "file size exceeded" signals.
- *
- * Can also log to TCP or UDP with the syntax udp://host:port/prefix. This will
- * send lines to the specified port, prefixed by the specified prefix and a space.
- * @since 1.25 support for additional context data
- *
- * @param string $text
- * @param string $file Filename
- * @param array $context Additional logging context data
- * @throws MWException
- * @deprecated since 1.25 Use \MediaWiki\Logger\LegacyLogger::emit or UDPTransport
- */
-function wfErrorLog( $text, $file, array $context = [] ) {
-       wfDeprecated( __METHOD__, '1.25' );
-       $logger = LoggerFactory::getInstance( 'wfErrorLog' );
-       $context['destination'] = $file;
-       $logger->info( trim( $text ), $context );
-}
-
 /**
  * @todo document
  * @todo Move logic to MediaWiki.php
@@ -2196,13 +2175,13 @@ function wfStringToBool( $val ) {
  * (https://bugs.php.net/bug.php?id=26285) and the locale problems on Linux in
  * PHP 5.2.6+ (bug backported to earlier distro releases of PHP).
  *
- * @param string $args,... strings to escape and glue together,
+ * @param string|string[] ...$args strings to escape and glue together,
  *  or a single array of strings parameter
  * @return string
  * @deprecated since 1.30 use MediaWiki\Shell::escape()
  */
-function wfEscapeShellArg( /*...*/ ) {
-       return Shell::escape( ...func_get_args() );
+function wfEscapeShellArg( ...$args ) {
+       return Shell::escape( ...$args );
 }
 
 /**
@@ -2503,38 +2482,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.
@@ -2677,11 +2624,11 @@ function wfGetPrecompiledData( $name ) {
  * Make a cache key for the local wiki.
  *
  * @deprecated since 1.30 Call makeKey on a BagOStuff instance
- * @param string $args,...
+ * @param string ...$args
  * @return string
  */
-function wfMemcKey( /*...*/ ) {
-       return ObjectCache::getLocalClusterInstance()->makeKey( ...func_get_args() );
+function wfMemcKey( ...$args ) {
+       return ObjectCache::getLocalClusterInstance()->makeKey( ...$args );
 }
 
 /**
@@ -2691,11 +2638,10 @@ function wfMemcKey( /*...*/ ) {
  *
  * @param string $db
  * @param string $prefix
- * @param string $args,...
+ * @param string ...$args
  * @return string
  */
-function wfForeignMemcKey( $db, $prefix /*...*/ ) {
-       $args = array_slice( func_get_args(), 2 );
+function wfForeignMemcKey( $db, $prefix, ...$args ) {
        $keyspace = $prefix ? "$db-$prefix" : $db;
        return ObjectCache::getLocalClusterInstance()->makeKeyInternal( $keyspace, $args );
 }
@@ -2709,11 +2655,11 @@ function wfForeignMemcKey( $db, $prefix /*...*/ ) {
  *
  * @deprecated since 1.30 Call makeGlobalKey on a BagOStuff instance
  * @since 1.26
- * @param string $args,...
+ * @param string ...$args
  * @return string
  */
-function wfGlobalCacheKey( /*...*/ ) {
-       return ObjectCache::getLocalClusterInstance()->makeGlobalKey( ...func_get_args() );
+function wfGlobalCacheKey( ...$args ) {
+       return ObjectCache::getLocalClusterInstance()->makeGlobalKey( ...$args );
 }
 
 /**
index d28169f..02a3d2c 100644 (file)
@@ -93,9 +93,9 @@ class MWTimestamp extends ConvertibleTimestamp {
                        if ( $tz ) {
                                $this->timestamp->setTimezone( $tz );
                                return new DateInterval( 'P0Y' );
-                       } else {
-                               $data[0] = 'Offset';
                        }
+
+                       $data[0] = 'Offset';
                }
 
                $diff = 0;
@@ -189,9 +189,9 @@ class MWTimestamp extends ConvertibleTimestamp {
                $msg = wfMessage( $key );
                if ( $msg->exists() ) {
                        return $msg;
-               } else {
-                       return new RawMessage( $tzMsg );
                }
+
+               return new RawMessage( $tzMsg );
        }
 
        /**
diff --git a/includes/MimeMagic.php b/includes/MimeMagic.php
deleted file mode 100644 (file)
index 6152d22..0000000
+++ /dev/null
@@ -1,43 +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
- */
-use MediaWiki\MediaWikiServices;
-use Wikimedia\Assert\Assert;
-
-/**
- * @deprecated since 1.29
- * MimeAnalyzer should be used instead of MimeMagic
- */
-class MimeMagic extends MimeAnalyzer {
-       /**
-        * Get an instance of this class
-        * @return MimeMagic
-        * @deprecated since 1.28 get a MimeAnalyzer instance from MediaWikiServices
-        */
-       public static function singleton() {
-               wfDeprecated( __METHOD__, '1.28' );
-               // XXX: We know that the MimeAnalyzer is currently an instance of MimeMagic
-               $instance = MediaWikiServices::getInstance()->getMimeAnalyzer();
-               Assert::postcondition(
-                       $instance instanceof MimeMagic,
-                       __METHOD__ . ' should return an instance of ' . self::class
-               );
-               return $instance;
-       }
-}
index ff29cb5..11abc81 100644 (file)
@@ -134,9 +134,12 @@ class OrderedStreamingForkController extends ForkController {
         */
        protected function consumeNoFork() {
                while ( !feof( $this->input ) ) {
-                       $line = trim( fgets( $this->input ) );
-                       if ( $line ) {
-                               $result = call_user_func( $this->workCallback, $line );
+                       $data = fgets( $this->input );
+                       if ( $data[ strlen( $data ) - 1 ] == "\n" ) {
+                               $data = substr( $data, 0, -1 );
+                       }
+                       if ( strlen( $data ) !== 0 ) {
+                               $result = call_user_func( $this->workCallback, $data );
                                fwrite( $this->output, "$result\n" );
                        }
                }
@@ -160,8 +163,12 @@ class OrderedStreamingForkController extends ForkController {
                                        $this->updateAvailableSockets( $sockets, $used, $sockets ? 0 : 5 );
                                } while ( !$sockets );
                        }
-                       $data = trim( $data );
-                       if ( !$data ) {
+                       // Strip the trailing \n. The last line of a file might not have a trailing
+                       // \n though
+                       if ( $data[ strlen( $data ) - 1 ] == "\n" ) {
+                               $data = substr( $data, 0, -1 );
+                       }
+                       if ( strlen( $data ) === 0 ) {
                                continue;
                        }
                        $socket = array_pop( $sockets );
index 99a4c2b..2bfccda 100644 (file)
@@ -1766,7 +1766,8 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Add wikitext with a custom Title object
+        * Add wikitext with a custom Title object.
+        * Output is unwrapped.
         *
         * @param string $text Wikitext
         * @param Title $title
@@ -1793,6 +1794,7 @@ class OutputPage extends ContextSource {
 
                $this->addParserOutput( $parserOutput, [
                        'enableSectionEditLinks' => false,
+                       'wrapperDivClass' => '',
                ] );
        }
 
index 1e35dda..a55b1c4 100644 (file)
@@ -691,7 +691,7 @@ class Revision implements IDBAccessObject {
         * @return SlotRecord
         */
        private function getMainSlotRaw() {
-               return $this->mRecord->getSlot( 'main', RevisionRecord::RAW );
+               return $this->mRecord->getSlot( SlotRecord::MAIN, RevisionRecord::RAW );
        }
 
        /**
@@ -926,7 +926,7 @@ class Revision implements IDBAccessObject {
                }
 
                try {
-                       return $this->mRecord->getContent( 'main', $audience, $user );
+                       return $this->mRecord->getContent( SlotRecord::MAIN, $audience, $user );
                }
                catch ( RevisionAccessException $e ) {
                        return null;
index ba40a81..fa16c61 100644 (file)
@@ -42,7 +42,7 @@ use Wikimedia\Assert\Assert;
  *
  * @since 1.32
  */
-class RenderedRevision {
+class RenderedRevision implements SlotRenderingProvider {
 
        /**
         * @var Title
index f71f9e7..c937376 100644 (file)
@@ -25,6 +25,7 @@ namespace MediaWiki\Revision;
 use Html;
 use InvalidArgumentException;
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 use ParserOptions;
 use ParserOutput;
 use Psr\Log\LoggerInterface;
@@ -165,15 +166,15 @@ class RevisionRenderer {
                $withHtml = $hints['generate-html'] ?? true;
 
                // short circuit if there is only the main slot
-               if ( array_keys( $slots ) === [ 'main' ] ) {
-                       return $rrev->getSlotParserOutput( 'main' );
+               if ( array_keys( $slots ) === [ SlotRecord::MAIN ] ) {
+                       return $rrev->getSlotParserOutput( SlotRecord::MAIN );
                }
 
                // TODO: put fancy layout logic here, see T200915.
 
                // move main slot to front
-               if ( isset( $slots['main'] ) ) {
-                       $slots = [ 'main' => $slots['main'] ] + $slots;
+               if ( isset( $slots[SlotRecord::MAIN] ) ) {
+                       $slots = [ SlotRecord::MAIN => $slots[SlotRecord::MAIN] ] + $slots;
                }
 
                $combinedOutput = new ParserOutput( null );
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 b8bd5d2..dac3de6 100644 (file)
@@ -278,7 +278,7 @@ return [
                                        // Also test DjVu
                                        $deja = new DjVuImage( $file );
                                        if ( $deja->isValid() ) {
-                                               $logger->info( __METHOD__ . ": detected $file as image/vnd.djvu\n" );
+                                               $logger->info( "Detected $file as image/vnd.djvu\n" );
                                                $mime = 'image/vnd.djvu';
 
                                                return;
@@ -321,8 +321,7 @@ return [
                        };
                }
 
-               // XXX: MimeMagic::singleton currently requires this service to return an instance of MimeMagic
-               return new MimeMagic( $params );
+               return new MimeAnalyzer( $params );
        },
 
        'NameTableStoreFactory' => function ( MediaWikiServices $services ) : NameTableStoreFactory {
index 745c891..e3cb617 100644 (file)
@@ -149,11 +149,12 @@ class SiteStats {
         */
        public static function numberingroup( $group ) {
                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               $fname = __METHOD__;
 
                return $cache->getWithSetCallback(
                        $cache->makeKey( 'SiteStats', 'groupcounts', $group ),
                        $cache::TTL_HOUR,
-                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $group ) {
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $group, $fname ) {
                                $dbr = self::getLB()->getConnection( DB_REPLICA );
                                $setOpts += Database::getCacheSetOptions( $dbr );
 
@@ -164,7 +165,7 @@ class SiteStats {
                                                'ug_group' => $group,
                                                'ug_expiry IS NULL OR ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() )
                                        ],
-                                       __METHOD__
+                                       $fname
                                );
                        },
                        [ 'pcTTL' => $cache::TTL_PROC_LONG ]
@@ -199,11 +200,12 @@ class SiteStats {
         */
        public static function pagesInNs( $ns ) {
                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               $fname = __METHOD__;
 
                return $cache->getWithSetCallback(
                        $cache->makeKey( 'SiteStats', 'page-in-namespace', $ns ),
                        $cache::TTL_HOUR,
-                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $ns ) {
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $ns, $fname ) {
                                $dbr = self::getLB()->getConnection( DB_REPLICA );
                                $setOpts += Database::getCacheSetOptions( $dbr );
 
@@ -211,7 +213,7 @@ class SiteStats {
                                        'page',
                                        'COUNT(*)',
                                        [ 'page_namespace' => $ns ],
-                                       __METHOD__
+                                       $fname
                                );
                        },
                        [ 'pcTTL' => $cache::TTL_PROC_LONG ]
index 99c31b2..3f3b0cf 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.
@@ -648,7 +659,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                }
 
                // TODO: MCR: ask all slots if they have links [SlotHandler/PageTypeHandler]
-               $mainContent = $this->getRawContent( 'main' );
+               $mainContent = $this->getRawContent( SlotRecord::MAIN );
                return $mainContent->isCountable( $hasLinks );
        }
 
@@ -657,7 +668,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         */
        public function isRedirect() {
                // NOTE: main slot determines redirect status
-               $mainContent = $this->getRawContent( 'main' );
+               $mainContent = $this->getRawContent( SlotRecord::MAIN );
 
                return $mainContent->isRedirect();
        }
@@ -669,7 +680,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         */
        private function revisionIsRedirect( RevisionRecord $rev ) {
                // NOTE: main slot determines redirect status
-               $mainContent = $rev->getContent( 'main', RevisionRecord::RAW );
+               $mainContent = $rev->getContent( SlotRecord::MAIN, RevisionRecord::RAW );
 
                return $mainContent->isRedirect();
        }
@@ -740,8 +751,8 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                $stashedEdit = false;
 
                // TODO: MCR: allow output for all slots to be stashed.
-               if ( $useStash && $slotsUpdate->isModifiedSlot( 'main' ) ) {
-                       $mainContent = $slotsUpdate->getModifiedSlot( 'main' )->getContent();
+               if ( $useStash && $slotsUpdate->isModifiedSlot( SlotRecord::MAIN ) ) {
+                       $mainContent = $slotsUpdate->getModifiedSlot( SlotRecord::MAIN )->getContent();
                        $legacyUser = User::newFromIdentity( $user );
                        $stashedEdit = ApiStashEdit::checkCache( $title, $mainContent, $legacyUser );
                }
@@ -796,7 +807,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                                // No PST for inherited slots! Note that "modified" slots may still be inherited
                                // from an earlier version, e.g. for rollbacks.
                                $pstSlot = $slot;
-                       } elseif ( $role === 'main' && $stashedEdit ) {
+                       } elseif ( $role === SlotRecord::MAIN && $stashedEdit ) {
                                // TODO: MCR: allow PST content for all slots to be stashed.
                                $pstSlot = SlotRecord::newUnsaved( $role, $stashedEdit->pstContent );
                        } else {
@@ -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()
                                );
@@ -1210,11 +1223,11 @@ class DerivedPageDataUpdater implements IDBAccessObject {
 
                $preparedEdit->popts = $this->getCanonicalParserOptions();
                $preparedEdit->output = $this->getCanonicalParserOutput();
-               $preparedEdit->pstContent = $this->revision->getContent( 'main' );
+               $preparedEdit->pstContent = $this->revision->getContent( SlotRecord::MAIN );
                $preparedEdit->newContent =
-                       $slotsUpdate->isModifiedSlot( 'main' )
-                       ? $slotsUpdate->getModifiedSlot( 'main' )->getContent()
-                       : $this->revision->getContent( 'main' ); // XXX: can we just remove this?
+                       $slotsUpdate->isModifiedSlot( SlotRecord::MAIN )
+                       ? $slotsUpdate->getModifiedSlot( SlotRecord::MAIN )->getContent()
+                       : $this->revision->getContent( SlotRecord::MAIN ); // XXX: can we just remove this?
                $preparedEdit->oldContent = null; // unused. // XXX: could get this from the parent revision
                $preparedEdit->revid = $this->revision ? $this->revision->getId() : null;
                $preparedEdit->timestamp = $preparedEdit->output->getCacheTime();
@@ -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;
        }
 
        /**
@@ -1312,7 +1394,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
 
                // TODO: MCR: check if *any* changed slot supports categories!
                if ( $this->rcWatchCategoryMembership
-                       && $this->getContentHandler( 'main' )->supportsCategories() === true
+                       && $this->getContentHandler( SlotRecord::MAIN )->supportsCategories() === true
                        && ( $this->options['changed'] || $this->options['created'] )
                        && !$this->options['restored']
                ) {
@@ -1377,7 +1459,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                ) );
 
                // TODO: make search infrastructure aware of slots!
-               $mainSlot = $this->revision->getSlot( 'main' );
+               $mainSlot = $this->revision->getSlot( SlotRecord::MAIN );
                if ( !$mainSlot->isInherited() && !$this->isContentDeleted() ) {
                        DeferredUpdates::addUpdate( new SearchUpdate( $id, $dbKey, $mainSlot->getContent() ) );
                }
@@ -1411,9 +1493,9 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                }
 
                if ( $title->getNamespace() == NS_MEDIAWIKI
-                       && $this->getRevisionSlotsUpdate()->isModifiedSlot( 'main' )
+                       && $this->getRevisionSlotsUpdate()->isModifiedSlot( SlotRecord::MAIN )
                ) {
-                       $mainContent = $this->isContentDeleted() ? null : $this->getRawContent( 'main' );
+                       $mainContent = $this->isContentDeleted() ? null : $this->getRawContent( SlotRecord::MAIN );
 
                        $this->messageCache->updateMessageOverride( $title, $mainContent );
                }
@@ -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 6c7919d..c1dd09d 100644 (file)
@@ -262,11 +262,12 @@ class NameTableStore {
                if ( array_key_exists( $id, $table ) ) {
                        return $table[$id];
                }
+               $fname = __METHOD__;
 
                $table = $this->cache->getWithSetCallback(
                        $this->getCacheKey(),
                        $this->cacheTTL,
-                       function ( $oldValue, &$ttl, &$setOpts ) use ( $id ) {
+                       function ( $oldValue, &$ttl, &$setOpts ) use ( $id, $fname ) {
                                // Check if cached value is up-to-date enough to have $id
                                if ( is_array( $oldValue ) && array_key_exists( $id, $oldValue ) ) {
                                        // Completely leave the cache key alone
@@ -279,7 +280,7 @@ class NameTableStore {
                                        // Log a fallback to master
                                        if ( $source === DB_MASTER ) {
                                                $this->logger->info(
-                                                       __METHOD__ . 'falling back to master select from ' .
+                                                       $fname . ' falling back to master select from ' .
                                                        $this->table . ' with id ' . $id
                                                );
                                        }
index 1621213..29ce710 100644 (file)
@@ -388,7 +388,7 @@ class PageUpdater {
         * @param string $role A slot role name (but not "main")
         */
        public function removeSlot( $role ) {
-               if ( $role === 'main' ) {
+               if ( $role === SlotRecord::MAIN ) {
                        throw new InvalidArgumentException( 'Cannot remove the main slot!' );
                }
 
@@ -635,7 +635,7 @@ class PageUpdater {
 
                // Make sure the given content type is allowed for this page
                // TODO: decide: Extend check to other slots? Consider the role in check? [PageType]
-               $mainContentHandler = $this->getContentHandler( 'main' );
+               $mainContentHandler = $this->getContentHandler( SlotRecord::MAIN );
                if ( !$mainContentHandler->canBeUsedOn( $this->getTitle() ) ) {
                        $this->status = Status::newFatal( 'content-not-allowed-here',
                                ContentHandler::getLocalizedName( $mainContentHandler->getModelID() ),
@@ -701,7 +701,7 @@ class PageUpdater {
                 */
                $this->derivedDataUpdater->getCanonicalParserOutput();
 
-               $mainContent = $this->derivedDataUpdater->getSlots()->getContent( 'main' );
+               $mainContent = $this->derivedDataUpdater->getSlots()->getContent( SlotRecord::MAIN );
 
                // Trigger pre-save hook (using provided edit summary)
                $hookStatus = Status::newGood( [] );
@@ -1049,7 +1049,7 @@ class PageUpdater {
        private function doCreate( CommentStoreComment $summary, User $user, $flags ) {
                $wikiPage = $this->getWikiPage(); // TODO: use for legacy hooks only!
 
-               if ( !$this->derivedDataUpdater->getSlots()->hasSlot( 'main' ) ) {
+               if ( !$this->derivedDataUpdater->getSlots()->hasSlot( SlotRecord::MAIN ) ) {
                        throw new PageUpdateException( 'Must provide a main slot when creating a page!' );
                }
 
@@ -1186,7 +1186,7 @@ class PageUpdater {
                                $hints['causeAgent'] = $user->getName();
 
                                $newLegacyRevision = new Revision( $newRevisionRecord );
-                               $mainContent = $newRevisionRecord->getContent( 'main', RevisionRecord::RAW );
+                               $mainContent = $newRevisionRecord->getContent( SlotRecord::MAIN, RevisionRecord::RAW );
 
                                // Update links tables, site stats, etc.
                                $this->derivedDataUpdater->prepareUpdate( $newRevisionRecord, $hints );
index 8e66906..bab1b5e 100644 (file)
@@ -437,21 +437,25 @@ class RevisionStore
                $slotRoles = $rev->getSlotRoles();
 
                // Make sure the main slot is always provided throughout migration
-               if ( !in_array( 'main', $slotRoles ) ) {
+               if ( !in_array( SlotRecord::MAIN, $slotRoles ) ) {
                        throw new InvalidArgumentException(
                                'main slot must be provided'
                        );
                }
 
                // If we are not writing into the new schema, we can't support extra slots.
-               if ( !$this->hasMcrSchemaFlags( SCHEMA_COMPAT_WRITE_NEW ) && $slotRoles !== [ 'main' ] ) {
+               if ( !$this->hasMcrSchemaFlags( SCHEMA_COMPAT_WRITE_NEW )
+                       && $slotRoles !== [ SlotRecord::MAIN ]
+               ) {
                        throw new InvalidArgumentException(
                                'Only the main slot is supported when not writing to the MCR enabled schema!'
                        );
                }
 
                // As long as we are not reading from the new schema, we don't want to write extra slots.
-               if ( !$this->hasMcrSchemaFlags( SCHEMA_COMPAT_READ_NEW ) && $slotRoles !== [ 'main' ] ) {
+               if ( !$this->hasMcrSchemaFlags( SCHEMA_COMPAT_READ_NEW )
+                       && $slotRoles !== [ SlotRecord::MAIN ]
+               ) {
                        throw new InvalidArgumentException(
                                'Only the main slot is supported when not reading from the MCR enabled schema!'
                        );
@@ -519,17 +523,17 @@ class RevisionStore
                // Technically, this could go away after MCR migration: while
                // calling code may require a main slot to exist, RevisionStore
                // really should not know or care about that requirement.
-               $rev->getSlot( 'main', RevisionRecord::RAW );
+               $rev->getSlot( SlotRecord::MAIN, RevisionRecord::RAW );
 
                foreach ( $slotRoles as $role ) {
                        $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'
                        );
                }
 
@@ -594,7 +598,7 @@ class RevisionStore
                                $newSlots[$role] = $slot;
 
                                // Write the main slot's text ID to the revision table for backwards compatibility
-                               if ( $slot->getRole() === 'main'
+                               if ( $slot->getRole() === SlotRecord::MAIN
                                        && $this->hasMcrSchemaFlags( SCHEMA_COMPAT_WRITE_OLD )
                                ) {
                                        $blobAddress = $slot->getAddress();
@@ -672,7 +676,7 @@ class RevisionStore
                $contentId = null;
 
                // Write the main slot's text ID to the revision table for backwards compatibility
-               if ( $protoSlot->getRole() === 'main'
+               if ( $protoSlot->getRole() === SlotRecord::MAIN
                        && $this->hasMcrSchemaFlags( SCHEMA_COMPAT_WRITE_OLD )
                ) {
                        // If SCHEMA_COMPAT_WRITE_NEW is also set, the fake content ID is overwritten
@@ -876,7 +880,7 @@ class RevisionStore
 
                if ( $this->hasMcrSchemaFlags( SCHEMA_COMPAT_WRITE_OLD ) ) {
                        // In non MCR mode this IF section will relate to the main slot
-                       $mainSlot = $rev->getSlot( 'main' );
+                       $mainSlot = $rev->getSlot( SlotRecord::MAIN );
                        $model = $mainSlot->getModel();
                        $format = $mainSlot->getFormat();
 
@@ -1209,7 +1213,7 @@ class RevisionStore
         */
        private function emulateMainSlot_1_29( $row, $queryFlags, Title $title ) {
                $mainSlotRow = new stdClass();
-               $mainSlotRow->role_name = 'main';
+               $mainSlotRow->role_name = SlotRecord::MAIN;
                $mainSlotRow->model_name = null;
                $mainSlotRow->slot_revision_id = null;
                $mainSlotRow->slot_content_id = null;
@@ -1358,7 +1362,7 @@ class RevisionStore
                        $mainSlotRow->slot_content_id =
                                function ( SlotRecord $slot ) use ( $queryFlags, $mainSlotRow ) {
                                        $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
-                                       return $this->findSlotContentId( $db, $mainSlotRow->slot_revision_id, 'main' );
+                                       return $this->findSlotContentId( $db, $mainSlotRow->slot_revision_id, SlotRecord::MAIN );
                                };
                }
 
@@ -1609,7 +1613,7 @@ class RevisionStore
                        $slots[$row->role_name] = new SlotRecord( $row, $contentCallback );
                }
 
-               if ( !isset( $slots['main'] ) ) {
+               if ( !isset( $slots[SlotRecord::MAIN] ) ) {
                        throw new RevisionAccessException(
                                'Main slot of revision ' . $revId . ' not found in database!'
                        );
@@ -1640,7 +1644,7 @@ class RevisionStore
        ) {
                if ( !$this->hasMcrSchemaFlags( SCHEMA_COMPAT_READ_NEW ) ) {
                        $mainSlot = $this->emulateMainSlot_1_29( $revisionRow, $queryFlags, $title );
-                       $slots = new RevisionSlots( [ 'main' => $mainSlot ] );
+                       $slots = new RevisionSlots( [ SlotRecord::MAIN => $mainSlot ] );
                } else {
                        // XXX: do we need the same kind of caching here
                        // that getKnownCurrentRevision uses (if $revId == page_latest?)
@@ -1711,8 +1715,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 );
@@ -1759,8 +1763,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 );
@@ -2346,7 +2350,7 @@ class RevisionStore
                        $ret['fields']['slot_revision_id'] = 'slots.rev_id';
                        $ret['fields']['slot_content_id'] = 'NULL';
                        $ret['fields']['slot_origin'] = 'slots.rev_id';
-                       $ret['fields']['role_name'] = $db->addQuotes( 'main' );
+                       $ret['fields']['role_name'] = $db->addQuotes( SlotRecord::MAIN );
 
                        if ( in_array( 'content', $options, true ) ) {
                                $ret['fields']['content_size'] = 'slots.rev_len';
index c7eb735..ee36d44 100644 (file)
@@ -37,6 +37,8 @@ use Wikimedia\Assert\Assert;
  */
 class SlotRecord {
 
+       const MAIN = 'main';
+
        /**
         * @var object database result row, as a raw object. Callbacks are supported for field values,
         *      to enable on-demand emulation of these values. This is primarily intended for use
index ca62e0e..5b0c3bc 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 . ':';
@@ -3354,11 +3354,12 @@ class Title implements LinkTarget {
                $id = $this->getArticleID();
                if ( $id ) {
                        $cache = ObjectCache::getMainWANInstance();
+                       $fname = __METHOD__;
                        $rows = $cache->getWithSetCallback(
                                // Page protections always leave a new null revision
                                $cache->makeKey( 'page-restrictions', $id, $this->getLatestRevID() ),
                                $cache::TTL_DAY,
-                               function ( $curValue, &$ttl, array &$setOpts ) {
+                               function ( $curValue, &$ttl, array &$setOpts ) use ( $fname ) {
                                        $dbr = wfGetDB( DB_REPLICA );
 
                                        $setOpts += Database::getCacheSetOptions( $dbr );
@@ -3368,7 +3369,7 @@ class Title implements LinkTarget {
                                                        'page_restrictions',
                                                        [ 'pr_type', 'pr_expiry', 'pr_level', 'pr_cascade' ],
                                                        [ 'pr_page' => $this->getArticleID() ],
-                                                       __METHOD__
+                                                       $fname
                                                )
                                        );
                                }
@@ -4427,7 +4428,7 @@ class Title implements LinkTarget {
                                $revQuery['joins']
                        );
                        if ( $row ) {
-                               return new Revision( $row );
+                               return new Revision( $row, 0, $this );
                        }
                }
                return null;
@@ -4777,7 +4778,39 @@ class Title implements LinkTarget {
        }
 
        /**
-        * Get the default message text or false if the message doesn't exist
+        * Get the default (plain) message contents for an page that overrides an
+        * interface message key.
+        *
+        * Primary use cases:
+        *
+        * - Article:
+        *    - Show default when viewing the page. The Article::getSubstituteContent
+        *      method displays the default message content, instead of the
+        *      'noarticletext' placeholder message normally used.
+        *
+        * - EditPage:
+        *    - Title of edit page. When creating an interface message override,
+        *      the editor is told they are "Editing the page", instead of
+        *      "Creating the page". (EditPage::setHeaders)
+        *    - Edit notice. The 'translateinterface' edit notice is shown when creating
+        *      or editing a an interface message override. (EditPage::showIntro)
+        *    - Opening the editor. The contents of the localisation message are used
+        *      as contents of the editor when creating a new page in the MediaWiki
+        *      namespace. This simplifies the process for editors when "changing"
+        *      an interface message by creating an override. (EditPage::getContentObject)
+        *    - Showing a diff. The left-hand side of a diff when an editor is
+        *      previewing their changes before saving the creation of a page in the
+        *      MediaWiki namespace. (EditPage::showDiff)
+        *    - Disallowing a save. When attempting to create a a MediaWiki-namespace
+        *      page with the proposed content matching the interface message default,
+        *      the save is rejected, the same way we disallow blank pages from being
+        *      created. (EditPage::internalAttemptSave)
+        *
+        * - ApiEditPage:
+        *    - Default content, when using the 'prepend' or 'append' feature.
+        *
+        * - SkinTemplate:
+        *    - Label the create action as "Edit", if the page can be an override.
         *
         * @return string|bool
         */
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();
        }
 
        /**
diff --git a/includes/actions/McrRestoreAction.php b/includes/actions/McrRestoreAction.php
new file mode 100644 (file)
index 0000000..fbc39d7
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+/**
+ * Temporary action for restoring multi-content revisions
+ * @file
+ * @ingroup Actions
+ */
+
+/**
+ * Temporary action for restoring multi-content revisions.
+ *
+ * This is intended to go away when real MCR support is added to EditPage and
+ * the standard revert-by-edit behavior can be implemented there instead.
+ *
+ * @ingroup Actions
+ * @since 1.32
+ * @deprecated since 1.32
+ */
+class McrRestoreAction extends McrUndoAction {
+
+       public function getName() {
+               return 'mcrrestore';
+       }
+
+       public function getDescription() {
+               return '';
+       }
+
+       protected function initFromParameters() {
+               $curRev = $this->page->getRevision();
+               if ( !$curRev ) {
+                       throw new ErrorPageError( 'mcrundofailed', 'nopagetext' );
+               }
+               $this->curRev = $curRev->getRevisionRecord();
+               $this->cur = $this->getRequest()->getInt( 'cur', $this->curRev->getId() );
+
+               $this->undo = $this->cur;
+               $this->undoafter = $this->getRequest()->getInt( 'restore' );
+
+               if ( $this->undo == 0 || $this->undoafter == 0 ) {
+                       throw new ErrorPageError( 'mcrundofailed', 'mcrundo-missingparam' );
+               }
+       }
+
+       protected function addStatePropagationFields( HTMLForm $form ) {
+               $form->addHiddenField( 'restore', $this->undoafter );
+               $form->addHiddenField( 'cur', $this->curRev->getId() );
+       }
+
+       protected function alterForm( HTMLForm $form ) {
+               parent::alterForm( $form );
+
+               $form->setWrapperLegendMsg( 'confirm-mcrrestore-title' );
+       }
+
+}
index 90d1f68..6309362 100644 (file)
@@ -28,10 +28,10 @@ use MediaWiki\Storage\SlotRecord;
  */
 class McrUndoAction extends FormAction {
 
-       private $undo = 0, $undoafter = 0, $cur = 0;
+       protected $undo = 0, $undoafter = 0, $cur = 0;
 
        /** @param RevisionRecord|null */
-       private $curRev = null;
+       protected $curRev = null;
 
        public function getName() {
                return 'mcrundo';
@@ -90,9 +90,7 @@ class McrUndoAction extends FormAction {
                parent::show();
        }
 
-       protected function checkCanExecute( User $user ) {
-               parent::checkCanExecute( $user );
-
+       protected function initFromParameters() {
                $this->undoafter = $this->getRequest()->getInt( 'undoafter' );
                $this->undo = $this->getRequest()->getInt( 'undo' );
 
@@ -106,6 +104,12 @@ class McrUndoAction extends FormAction {
                }
                $this->curRev = $curRev->getRevisionRecord();
                $this->cur = $this->getRequest()->getInt( 'cur', $this->curRev->getId() );
+       }
+
+       protected function checkCanExecute( User $user ) {
+               parent::checkCanExecute( $user );
+
+               $this->initFromParameters();
 
                $revisionLookup = MediaWikiServices::getInstance()->getRevisionLookup();
 
@@ -219,7 +223,7 @@ class McrUndoAction extends FormAction {
                return $newRev;
        }
 
-       private function generateDiff() {
+       private function generateDiffOrPreview() {
                $newRev = $this->getNewRevision();
                if ( $newRev->hasSameContent( $this->curRev ) ) {
                        throw new ErrorPageError( 'mcrundofailed', 'undo-nochange' );
@@ -232,7 +236,7 @@ class McrUndoAction extends FormAction {
                $newtitle = $this->context->msg( 'yourtext' )->parse();
 
                if ( $this->getRequest()->getCheck( 'wpPreview' ) ) {
-                       $diffEngine->renderNewRevision();
+                       $this->showPreview( $newRev );
                        return '';
                } else {
                        $diffText = $diffEngine->getDiff( $oldtitle, $newtitle );
@@ -241,6 +245,56 @@ class McrUndoAction extends FormAction {
                }
        }
 
+       private function showPreview( RevisionRecord $rev ) {
+               // Mostly copied from EditPage::getPreviewText()
+               $out = $this->getOutput();
+
+               try {
+                       $previewHTML = '';
+
+                       # provide a anchor link to the form
+                       $continueEditing = '<span class="mw-continue-editing">' .
+                               '[[#mw-mcrundo-form|' .
+                               $this->context->getLanguage()->getArrow() . ' ' .
+                               $this->context->msg( 'continue-editing' )->text() . ']]</span>';
+
+                       $note = $this->context->msg( 'previewnote' )->plain() . ' ' . $continueEditing;
+
+                       $parserOptions = $this->page->makeParserOptions( $this->context );
+                       $parserOptions->setIsPreview( true );
+                       $parserOptions->setIsSectionPreview( false );
+                       $parserOptions->enableLimitReport();
+
+                       $parserOutput = MediaWikiServices::getInstance()->getRevisionRenderer()
+                               ->getRenderedRevision( $rev, $parserOptions, $this->context->getUser() )
+                               ->getRevisionParserOutput();
+                       $previewHTML = $parserOutput->getText( [ 'enableSectionEditLinks' => false ] );
+
+                       $out->addParserOutputMetadata( $parserOutput );
+                       if ( count( $parserOutput->getWarnings() ) ) {
+                               $note .= "\n\n" . implode( "\n\n", $parserOutput->getWarnings() );
+                       }
+               } catch ( MWContentSerializationException $ex ) {
+                       $m = $this->context->msg(
+                               'content-failed-to-parse',
+                               $ex->getMessage()
+                       );
+                       $note .= "\n\n" . $m->parse();
+                       $previewHTML = '';
+               }
+
+               $previewhead = "<div class='previewnote'>\n" .
+                       '<h2 id="mw-previewheader">' . $this->context->msg( 'preview' )->escaped() . "</h2>" .
+                       $out->parse( $note, true, /* interface */true ) . "<hr /></div>\n";
+
+               $pageViewLang = $this->getTitle()->getPageViewLanguage();
+               $attribs = [ 'lang' => $pageViewLang->getHtmlCode(), 'dir' => $pageViewLang->getDir(),
+                       'class' => 'mw-content-' . $pageViewLang->getDir() ];
+               $previewHTML = Html::rawElement( 'div', $attribs, $previewHTML );
+
+               $out->addHtml( $previewhead . $previewHTML );
+       }
+
        public function onSubmit( $data ) {
                global $wgUseRCPatrol;
 
@@ -306,7 +360,7 @@ class McrUndoAction extends FormAction {
                                'vertical-label' => true,
                                'raw' => true,
                                'default' => function () {
-                                       return $this->generateDiff();
+                                       return $this->generateDiffOrPreview();
                                }
                        ],
                        'summary' => [
@@ -343,6 +397,7 @@ class McrUndoAction extends FormAction {
 
                $labelAsPublish = $this->context->getConfig()->get( 'EditSubmitButtonLabelPublish' );
 
+               $form->setId( 'mw-mcrundo-form' );
                $form->setSubmitName( 'wpSave' );
                $form->setSubmitTooltip( $labelAsPublish ? 'publish' : 'save' );
                $form->setSubmitTextMsg( $labelAsPublish ? 'publishchanges' : 'savechanges' );
@@ -361,6 +416,10 @@ class McrUndoAction extends FormAction {
                        'attribs' => Linker::tooltipAndAccesskeyAttribs( 'diff' ),
                ] );
 
+               $this->addStatePropagationFields( $form );
+       }
+
+       protected function addStatePropagationFields( HTMLForm $form ) {
                $form->addHiddenField( 'undo', $this->undo );
                $form->addHiddenField( 'undoafter', $this->undoafter );
                $form->addHiddenField( 'cur', $this->curRev->getId() );
index 50eb28a..b5a6d3a 100644 (file)
@@ -47,6 +47,9 @@ class RawAction extends FormlessAction {
                return false;
        }
 
+       /**
+        * @suppress SecurityCheck-XSS Non html mime type
+        */
        function onView() {
                $this->getOutput()->disable();
                $request = $this->getRequest();
@@ -160,47 +163,35 @@ class RawAction extends FormlessAction {
                $title = $this->getTitle();
                $request = $this->getRequest();
 
-               // If it's a MediaWiki message we can just hit the message cache
-               if ( $request->getBool( 'usemsgcache' ) && $title->getNamespace() == NS_MEDIAWIKI ) {
-                       // The first "true" is to use the database, the second is to use
-                       // the content langue and the last one is to specify the message
-                       // key already contains the language in it ("/de", etc.).
-                       $text = MessageCache::singleton()->get( $title->getDBkey(), true, true, true );
-                       // If the message doesn't exist, return a blank
-                       if ( $text === false ) {
-                               $text = '';
-                       }
-               } else {
-                       // Get it from the DB
-                       $rev = Revision::newFromTitle( $title, $this->getOldId() );
-                       if ( $rev ) {
-                               $lastmod = wfTimestamp( TS_RFC2822, $rev->getTimestamp() );
-                               $request->response()->header( "Last-modified: $lastmod" );
+               // Get it from the DB
+               $rev = Revision::newFromTitle( $title, $this->getOldId() );
+               if ( $rev ) {
+                       $lastmod = wfTimestamp( TS_RFC2822, $rev->getTimestamp() );
+                       $request->response()->header( "Last-modified: $lastmod" );
 
-                               // Public-only due to cache headers
-                               $content = $rev->getContent();
+                       // Public-only due to cache headers
+                       $content = $rev->getContent();
 
-                               if ( $content === null ) {
-                                       // revision not found (or suppressed)
+                       if ( $content === null ) {
+                               // revision not found (or suppressed)
+                               $text = false;
+                       } elseif ( !$content instanceof TextContent ) {
+                               // non-text content
+                               wfHttpError( 415, "Unsupported Media Type", "The requested page uses the content model `"
+                                       . $content->getModel() . "` which is not supported via this interface." );
+                               die();
+                       } else {
+                               // want a section?
+                               $section = $request->getIntOrNull( 'section' );
+                               if ( $section !== null ) {
+                                       $content = $content->getSection( $section );
+                               }
+
+                               if ( $content === null || $content === false ) {
+                                       // section not found (or section not supported, e.g. for JS, JSON, and CSS)
                                        $text = false;
-                               } elseif ( !$content instanceof TextContent ) {
-                                       // non-text content
-                                       wfHttpError( 415, "Unsupported Media Type", "The requested page uses the content model `"
-                                               . $content->getModel() . "` which is not supported via this interface." );
-                                       die();
                                } else {
-                                       // want a section?
-                                       $section = $request->getIntOrNull( 'section' );
-                                       if ( $section !== null ) {
-                                               $content = $content->getSection( $section );
-                                       }
-
-                                       if ( $content === null || $content === false ) {
-                                               // section not found (or section not supported, e.g. for JS, JSON, and CSS)
-                                               $text = false;
-                                       } else {
-                                               $text = $content->getNativeData();
-                                       }
+                                       $text = $content->getNativeData();
                                }
                        }
                }
index 9d336e4..dc7b00e 100644 (file)
@@ -151,7 +151,6 @@ class RollbackAction extends FormlessAction {
                        );
                        $de->showDiff( '', '' );
                }
-               return;
        }
 
        protected function getDescription() {
index 02cadbd..c5a2234 100644 (file)
@@ -23,6 +23,7 @@ use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SlotRecord;
 
 class ApiComparePages extends ApiBase {
 
@@ -271,7 +272,7 @@ class ApiComparePages extends ApiBase {
                }
 
                $guessedTitle = $this->guessTitle();
-               if ( $guessedTitle && $role === 'main' ) {
+               if ( $guessedTitle && $role === SlotRecord::MAIN ) {
                        // @todo: Use SlotRoleRegistry and do this for all slots
                        return $guessedTitle->getContentModel();
                }
@@ -283,7 +284,7 @@ class ApiComparePages extends ApiBase {
                        return $params["tocontentmodel-$role"];
                }
 
-               if ( $role === 'main' ) {
+               if ( $role === SlotRecord::MAIN ) {
                        if ( isset( $params['fromcontentmodel'] ) ) {
                                return $params['fromcontentmodel'];
                        }
@@ -315,7 +316,7 @@ class ApiComparePages extends ApiBase {
                $this->requireMaxOneParameter( $params, "{$prefix}text", "{$prefix}slots" );
                $this->requireMaxOneParameter( $params, "{$prefix}section", "{$prefix}slots" );
                if ( $params["{$prefix}text"] !== null ) {
-                       $params["{$prefix}slots"] = [ 'main' ];
+                       $params["{$prefix}slots"] = [ SlotRecord::MAIN ];
                        $params["{$prefix}text-main"] = $params["{$prefix}text"];
                        $params["{$prefix}section-main"] = null;
                        $params["{$prefix}contentmodel-main"] = $params["{$prefix}contentmodel"];
@@ -378,10 +379,11 @@ class ApiComparePages extends ApiBase {
                                if ( isset( $params["{$prefix}section"] ) ) {
                                        $section = $params["{$prefix}section"];
                                        $newRev = MutableRevisionRecord::newFromParentRevision( $rev );
-                                       $content = $rev->getContent( 'main', RevisionRecord::FOR_THIS_USER, $this->getUser() );
+                                       $content = $rev->getContent( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER,
+                                               $this->getUser() );
                                        if ( !$content ) {
                                                $this->dieWithError(
-                                                       [ 'apierror-missingcontent-revid-role', $rev->getId(), 'main' ], 'missingcontent'
+                                                       [ 'apierror-missingcontent-revid-role', $rev->getId(), SlotRecord::MAIN ], 'missingcontent'
                                                );
                                        }
                                        $content = $content ? $content->getSection( $section ) : null;
@@ -391,7 +393,7 @@ class ApiComparePages extends ApiBase {
                                                        "nosuch{$prefix}section"
                                                );
                                        }
-                                       $newRev->setContent( 'main', $content );
+                                       $newRev->setContent( SlotRecord::MAIN, $content );
                                }
 
                                return [ $newRev, $rev, $rev ];
@@ -412,8 +414,8 @@ class ApiComparePages extends ApiBase {
                foreach ( $params["{$prefix}slots"] as $role ) {
                        $text = $params["{$prefix}text-{$role}"];
                        if ( $text === null ) {
-                               // The 'main' role can't be deleted
-                               if ( $role === 'main' ) {
+                               // The SlotRecord::MAIN role can't be deleted
+                               if ( $role === SlotRecord::MAIN ) {
                                        $this->dieWithError( [ 'apierror-compare-maintextrequired', $prefix ] );
                                }
 
@@ -439,7 +441,7 @@ class ApiComparePages extends ApiBase {
                        if ( !$model && $rev && $rev->hasSlot( $role ) ) {
                                $model = $rev->getSlot( $role, RevisionRecord::RAW )->getModel();
                        }
-                       if ( !$model && $title && $role === 'main' ) {
+                       if ( !$model && $title && $role === SlotRecord::MAIN ) {
                                // @todo: Use SlotRoleRegistry and do this for all slots
                                $model = $title->getContentModel();
                        }
@@ -494,7 +496,7 @@ class ApiComparePages extends ApiBase {
                        }
 
                        // Deprecated 'fromsection'/'tosection'
-                       if ( $role === 'main' && isset( $params["{$prefix}section"] ) ) {
+                       if ( $role === SlotRecord::MAIN && isset( $params["{$prefix}section"] ) ) {
                                $section = $params["{$prefix}section"];
                                $content = $content->getSection( $section );
                                if ( !$content ) {
@@ -581,8 +583,8 @@ class ApiComparePages extends ApiBase {
 
        public function getAllowedParams() {
                $slotRoles = MediaWikiServices::getInstance()->getSlotRoleStore()->getMap();
-               if ( !in_array( 'main', $slotRoles, true ) ) {
-                       $slotRoles[] = 'main';
+               if ( !in_array( SlotRecord::MAIN, $slotRoles, true ) ) {
+                       $slotRoles[] = SlotRecord::MAIN;
                }
                sort( $slotRoles, SORT_STRING );
 
index 92d504e..2b2b32c 100644 (file)
@@ -24,6 +24,7 @@ use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\RevisionAccessException;
 use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SlotRecord;
 
 /**
  * @ingroup API
@@ -174,7 +175,7 @@ class ApiFeedContributions extends ApiBase {
                if ( $revision ) {
                        $msg = wfMessage( 'colon-separator' )->inContentLanguage()->text();
                        try {
-                               $content = $revision->getContent( 'main' );
+                               $content = $revision->getContent( SlotRecord::MAIN );
                        } catch ( RevisionAccessException $e ) {
                                $content = null;
                        }
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 fe7d10d..3ea827c 100644 (file)
@@ -80,12 +80,18 @@ class ApiOptions extends ApiBase {
                        switch ( $prefsKinds[$key] ) {
                                case 'registered':
                                        // Regular option.
-                                       if ( $htmlForm === null ) {
-                                               // We need a dummy HTMLForm for the validate callback...
-                                               $htmlForm = new HTMLForm( [], $this );
+                                       if ( $value === null ) {
+                                               // Reset it
+                                               $validation = true;
+                                       } else {
+                                               // Validate
+                                               if ( $htmlForm === null ) {
+                                                       // We need a dummy HTMLForm for the validate callback...
+                                                       $htmlForm = new HTMLForm( [], $this );
+                                               }
+                                               $field = HTMLForm::loadInputFromParameters( $key, $prefs[$key], $htmlForm );
+                                               $validation = $field->validate( $value, $user->getOptions() );
                                        }
-                                       $field = HTMLForm::loadInputFromParameters( $key, $prefs[$key], $htmlForm );
-                                       $validation = $field->validate( $value, $user->getOptions() );
                                        break;
                                case 'registered-multiselect':
                                case 'registered-checkmatrix':
index 5c25b5a..a78cb7f 100644 (file)
@@ -868,7 +868,10 @@ class ApiParse extends ApiBase {
                        ],
                        'disablelimitreport' => false,
                        'disableeditsection' => false,
-                       'disabletidy' => false,
+                       'disabletidy' => [
+                               ApiBase::PARAM_DFLT => false,
+                               ApiBase::PARAM_DEPRECATED => true, // Since 1.32
+                       ],
                        'disablestylededuplication' => false,
                        'generatexml' => [
                                ApiBase::PARAM_DFLT => false,
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 600c89e..e5d7748 100644 (file)
@@ -307,7 +307,7 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
                        }
                        if ( $this->slotRoles === null ) {
                                try {
-                                       $slot = $revision->getSlot( 'main', RevisionRecord::RAW );
+                                       $slot = $revision->getSlot( SlotRecord::MAIN, RevisionRecord::RAW );
                                } catch ( RevisionAccessException $e ) {
                                        // Back compat: If there's no slot, there's no content, so set 'textmissing'
                                        // @todo: Gergő says to mention T198099 as a "todo" here.
@@ -621,8 +621,8 @@ abstract class ApiQueryRevisionsBase extends ApiQueryGeneratorBase {
 
        public function getAllowedParams() {
                $slotRoles = MediaWikiServices::getInstance()->getSlotRoleStore()->getMap();
-               if ( !in_array( 'main', $slotRoles, true ) ) {
-                       $slotRoles[] = 'main';
+               if ( !in_array( SlotRecord::MAIN, $slotRoles, true ) ) {
+                       $slotRoles[] = SlotRecord::MAIN;
                }
                sort( $slotRoles, SORT_STRING );
 
index ab9ae8e..17c8040 100644 (file)
@@ -174,6 +174,7 @@ class ApiStashEdit extends ApiBase {
 
                $title = $page->getTitle();
                $key = self::getStashKey( $title, self::getContentHash( $content ), $user );
+               $fname = __METHOD__;
 
                // Use the master DB to allow for fast blocking locks on the "save path" where this
                // value might actually be used to complete a page edit. If the edit submission request
@@ -182,13 +183,13 @@ class ApiStashEdit extends ApiBase {
                // need to duplicate parsing of the same content/user/summary bundle, so try to avoid
                // blocking at all here.
                $dbw = wfGetDB( DB_MASTER );
-               if ( !$dbw->lock( $key, __METHOD__, 0 ) ) {
+               if ( !$dbw->lock( $key, $fname, 0 ) ) {
                        // De-duplicate requests on the same key
                        return self::ERROR_BUSY;
                }
                /** @noinspection PhpUnusedLocalVariableInspection */
-               $unlocker = new ScopedCallback( function () use ( $dbw, $key ) {
-                       $dbw->unlock( $key, __METHOD__ );
+               $unlocker = new ScopedCallback( function () use ( $dbw, $key, $fname ) {
+                       $dbw->unlock( $key, $fname );
                } );
 
                $cutoffTime = time() - self::PRESUME_FRESH_TTL_SEC;
index f9f8435..d6af2f1 100644 (file)
        "apihelp-compare-param-fromid": "رقم الصفحة الأول للمقارنة.",
        "apihelp-compare-param-fromrev": "أول مراجعة للمقارنة.",
        "apihelp-compare-param-frompst": "قم بإجراء تحويل ما قبل الحفظ على <var>fromtext-&#x7B;slot}</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-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 3f31f9c..631e681 100644 (file)
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "적절한 곳에 로그 정보를 추가합니다.",
        "apihelp-query+watchlistraw-summary": "현재 사용자의 주시문서 목록의 모든 문서를 가져옵니다.",
        "apihelp-removeauthenticationdata-summary": "현재 사용자의 인증 데이터를 제거합니다.",
+       "apihelp-removeauthenticationdata-example-simple": "<kbd>FooAuthenticationRequest</kbd>에 대한 현재 사용자의 데이터의 제거를 시도합니다.",
        "apihelp-resetpassword-summary": "비밀번호 재설정 이메일을 사용자에게 보냅니다.",
        "apihelp-resetpassword-param-user": "재설정할 사용자입니다.",
        "apihelp-resetpassword-param-email": "재설정할 사용자의 이메일 주소입니다.",
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 c9eb3b4..4bff7ef 100644 (file)
        "apihelp-compare-param-fromid": "Перший ID сторінки для порівняння.",
        "apihelp-compare-param-fromrev": "Перша версія для порівняння.",
        "apihelp-compare-param-frompst": "Зробити трансформацію перед збереженням на <var>fromtext-&#x7B;slot}</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-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": "Використовувати лише вказану секцію із заданого вмісту «from».",
        "apihelp-compare-param-totitle": "Другий заголовок для порівняння.",
        "apihelp-compare-param-toid": "Другий ID сторінки для порівняння.",
        "apihelp-compare-param-torev": "Друга версія для порівняння.",
        "apihelp-compare-param-torelative": "Використати версію, яка стосується версії, визначеної через <var>fromtitle</var>, <var>fromid</var> або <var>fromrev</var>. Усі інші опції 'to' буде проігноровано.",
        "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": "Використовувати лише вказану секцію із заданого вмісту «to».",
        "apihelp-compare-param-prop": "Які уривки інформації отримати.",
        "apihelp-compare-paramvalue-prop-diff": "HTML різниці версій.",
        "apihelp-compare-paramvalue-prop-comment": "Опис редагування версій 'from' і 'to'.",
        "apihelp-compare-paramvalue-prop-parsedcomment": "Опрацьований опис редагування версій 'from' і 'to'.",
        "apihelp-compare-paramvalue-prop-size": "Розмір версій 'from' і 'to'.",
+       "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+filerepoinfo-paramvalue-prop-articlepath": "<var>[[mw:Special:MyLanguage/Manual:$wgArticlePath|$wgArticlePath]]</var> вікі-сайту репозиторію, або еквівалент.",
        "apihelp-query+filerepoinfo-paramvalue-prop-canUpload": "Чи можна завантажувати файли в цей репозиторій, напр., через CORS та спільну автентифікацію.",
        "apihelp-query+filerepoinfo-paramvalue-prop-displayname": "Назва вікі-сайту репозиторію, читабельна для людини.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-favicon": "URL-адреса значка вікіпроекту репозиторію, із <var>[[mw:Special:MyLanguage/Manual:$wgFavicon|$wgFavicon]]</var>.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-fetchDescription": "Чи сторінки опису беруться з цього репозиторію при перегляді локальних сторінок опису файлів.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-initialCapital": "Чи назви файлів неявно починаються з великої літери.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-local": "Чи той репозиторій є локальним, чи ні.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-name": "Ключ репозиторію — використовується, наприклад, у повернутих значеннях <var>[[mw:Special:MyLanguage/Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> та[[Special:ApiHelp/query+imageinfo|imageinfo]].",
+       "apihelp-query+filerepoinfo-paramvalue-prop-rootUrl": "Кореневий URL-шлях для шляхів до зображень.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-scriptDirUrl": "Кореневий URL-шлях для інсталяції MediaWiki у вікіпроекті репозиторію.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-server": "<var>[[mw:Special:MyLanguage/Manual:$wgServer|$wgServer]]</var> (чи його еквівалент) вікіпроекту репозиторію.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-thumbUrl": "Кореневий URL-шлях для шляхів до мініатюр.",
+       "apihelp-query+filerepoinfo-paramvalue-prop-url": "URL-шлях публічної зони.",
        "apihelp-query+filerepoinfo-example-simple": "Отримати інформацію про репозиторії файлів.",
        "apihelp-query+fileusage-summary": "Знайти всі сторінки, що використовують дані файли.",
        "apihelp-query+fileusage-param-prop": "Які властивості отримати:",
        "apihelp-query+info-paramvalue-prop-readable": "Чи користувач може редагувати цю сторінку.",
        "apihelp-query+info-paramvalue-prop-preload": "Дає текст, виданий EditFormPreloadText.",
        "apihelp-query+info-paramvalue-prop-displaytitle": "Дає спосіб, у який відображається назва сторінки.",
+       "apihelp-query+info-paramvalue-prop-varianttitles": "Видає вигляд заголовка всіма варіантами мов контенту цього сайту.",
        "apihelp-query+info-param-testactions": "Перевірити, чи поточний користувач може виконувати певні дії на сторінці.",
        "apihelp-query+info-param-token": "Використати натомість [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-query+info-example-simple": "Отримати інформацію про сторінку <kbd>Main Page</kbd>.",
        "apihelp-query+prefixsearch-summary": "Виконати пошук назв сторінок за префіксом.",
        "apihelp-query+prefixsearch-extended-description": "Незважаючи на подібність назв, цей модуль не призначений для того, аби бути еквівалентом [[Special:PrefixIndex]]; щодо цього, перегляньте <kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd> із параметром <kbd>apprefix</kbd>. Мета цього модуля така ж, як і <kbd>[[Special:ApiHelp/opensearch|action=opensearch]]</kbd>: взяти текст, введений користувачем, і вивести найбільш відповідні назви. Залежно від програмної підоснови пошукової системи, сюди можуть також входити виправлення орфографії, уникнення перенаправлень чи інша евристика.",
        "apihelp-query+prefixsearch-param-search": "Рядок пошуку.",
-       "apihelp-query+prefixsearch-param-namespace": "Простори назв, у яких шукати.",
+       "apihelp-query+prefixsearch-param-namespace": "Простори назв, у яких шукати. Ігнорується, якщо <var>$1search</var> починається з коректного префіксу простору назв.",
        "apihelp-query+prefixsearch-param-limit": "Максимальна кількість результатів для виведення.",
        "apihelp-query+prefixsearch-param-offset": "Кількість результатів, які пропустити.",
        "apihelp-query+prefixsearch-example-simple": "Шукати назви сторінок, які починаються з <kbd>meaning</kbd>.",
        "apihelp-query+recentchanges-paramvalue-prop-sizes": "Додає нову і стару довжину сторінки в байтах.",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "Помічає редагування, якщо сторінка є перенаправленням.",
        "apihelp-query+recentchanges-paramvalue-prop-patrolled": "Помічає редагування як відпатрульвані чи невідпатрульовані.",
+       "apihelp-query+recentchanges-paramvalue-prop-autopatrolled": "Позначає доступні до патрулювання редагування або як автопатрульовані, або як невідпатрульовані.",
        "apihelp-query+recentchanges-paramvalue-prop-loginfo": "Додає інформацію журналу (ID журналу, тип журналу тощо) до записів журналу.",
        "apihelp-query+recentchanges-paramvalue-prop-tags": "Виводить мітки запису.",
        "apihelp-query+recentchanges-paramvalue-prop-sha1": "Додає контрольну суму вмісту для записів, пов'язаних з версією.",
index ae46595..f559711 100644 (file)
@@ -68,6 +68,7 @@
        "apihelp-compare-param-toid": "要比對的第二個頁面 ID。",
        "apihelp-compare-param-torev": "要比對的第二個修訂。",
        "apihelp-compare-param-topst": "在 <var>totext</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-expandtemplates-summary": "展開所有於 wikitext 中模板。",
        "apihelp-expandtemplates-param-title": "頁面標題。",
        "apihelp-expandtemplates-param-text": "要轉換的 Wikitext。",
+       "apihelp-expandtemplates-param-revid": "修訂 ID,用於 <code><nowiki>{{REVISIONID}}</nowiki></code> 和相似變數。",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "展開的 wiki 文字。",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "指定頁面的 JavaScript 設置變量。",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "指定頁面的 JavaScript 設置變量為 JSON 字串。",
        "apihelp-feedwatchlist-summary": "返回監視清單 feed。",
        "apihelp-feedwatchlist-param-feedformat": "Feed 的格式。",
        "apihelp-feedwatchlist-param-linktosections": "若可以的話,直接連結至更改過的段落。",
+       "apihelp-feedwatchlist-example-all6hrs": "顯示過去 6 小時在監視頁面的所有更改。",
        "apihelp-filerevert-summary": "回退檔案至舊的版本。",
        "apihelp-filerevert-param-filename": "目標檔案名稱,不需包含「File:」這樣的前綴字元。",
        "apihelp-filerevert-param-comment": "上載意見。",
+       "apihelp-filerevert-example-revert": "回退 <kbd>Wiki.png</kbd> 至 <kbd>2011-03-05T15:27:40Z</kbd> 的版本。",
        "apihelp-help-summary": "顯示指定模組的說明。",
        "apihelp-help-example-main": "主模組使用說明",
        "apihelp-help-example-recursive": "一個頁面中的所有說明。",
        "apihelp-managetags-param-ignorewarnings": "是否在處理期間發生問題時忽略任何警告。",
        "apihelp-managetags-param-tags": "在標籤管理日誌裡更改套用到項目的標籤。",
        "apihelp-mergehistory-summary": "合併頁面歷史",
+       "apihelp-mergehistory-param-to": "要合併歷史的頁面標題。不能與 <var>$1toid</var> 一起使用。",
+       "apihelp-mergehistory-param-toid": "要合併歷史的頁面之頁面 ID。不能與 <var>$1to</var> 一起使用。",
        "apihelp-mergehistory-param-reason": "合併歷史的原因。",
        "apihelp-mergehistory-example-merge": "將<kbd>Oldpage</kbd>的整個歷史合併至<kbd>Newpage</kbd>。",
        "apihelp-mergehistory-example-merge-timestamp": "將<kbd>Oldpage</kbd>直至<kbd>2015-12-31T04:37:41Z</kbd>的頁面修訂版本合併至<kbd>Newpage</kbd>。",
        "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-parse-param-text": "要解析的文字。使用 <var>$1title</var> 或 <var>$1contentmodel</var> 來控制內容模組。",
+       "apihelp-parse-param-revid": "修訂 ID,用於 <code><nowiki>{{REVISIONID}}</nowiki></code> 和相似變數。",
        "apihelp-parse-param-summary": "解析摘要。",
+       "apihelp-parse-param-page": "解析此頁面的內容。不能與 <var>$1text</var> 和 <var>$1title</var> 一起使用。",
        "apihelp-parse-param-pageid": "解析此頁面的內容。覆蓋 <var>$1page</var>。",
        "apihelp-parse-param-redirects": "若 <var>$1page</var> 或者 <var>$1pageid</var> 被設定成重新導向,則解析它。",
+       "apihelp-parse-param-oldid": "解析此修訂的內容。覆蓋 <var>$1page</var> 與 <var>$1pageid</var>。",
        "apihelp-parse-param-prop": "要取得的資訊部份:",
        "apihelp-parse-paramvalue-prop-text": "提供 wiki 文字的解析文字。",
        "apihelp-parse-paramvalue-prop-langlinks": "在已解析的 wiki 文字提供語言連結。",
        "apihelp-parse-paramvalue-prop-displaytitle": "添加已解析 wiki 文字的標題。",
        "apihelp-parse-paramvalue-prop-headitems": "提供放置頁面裡的 <code>&lt;head&gt;</code> 之項目。",
        "apihelp-parse-paramvalue-prop-headhtml": "取得頁面已解析的 <code>&lt;head&gt;</code>。",
+       "apihelp-parse-paramvalue-prop-encodedjsconfigvars": "指定頁面的 JavaScript 設置變量為 JSON 字串。",
        "apihelp-parse-paramvalue-prop-iwlinks": "在已解析的 wiki 文字提供跨 wiki 連結。",
+       "apihelp-parse-paramvalue-prop-wikitext": "指定被解析的原始 wiki 文字。",
+       "apihelp-parse-paramvalue-prop-properties": "指定多項定義在已解析原始 wiki 文字的屬性。",
        "apihelp-parse-param-disablepp": "請改用<var>$1disablelimitreport</var>。",
+       "apihelp-parse-param-disabletidy": "不要在解析輸出裡執行 HTML 內容清理(例如使用 tidy 軟體工具)",
        "apihelp-parse-param-preview": "在預覽模式下解析。",
        "apihelp-parse-example-page": "解析頁面。",
        "apihelp-parse-example-text": "解析 wikitext。",
        "apihelp-query+allcategories-param-limit": "要回傳的分類數量。",
        "apihelp-query+allcategories-param-prop": "要取得的屬性。",
        "apihelp-query+allcategories-paramvalue-prop-size": "在分類裡添加頁面數。",
+       "apihelp-query+allcategories-paramvalue-prop-hidden": "標記由 <code>_&#95;HIDDENCAT_&#95;</code> 隱藏的分類。",
        "apihelp-query+alldeletedrevisions-summary": "依使用者或所在命名空間來列出所有已刪除的修訂。",
        "apihelp-query+alldeletedrevisions-paraminfo-useronly": "僅與 <var>$3user</var> 一同使用。",
        "apihelp-query+alldeletedrevisions-paraminfo-nonuseronly": "不能與 <var>$3user</var> 一同使用。",
        "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+alllinks-example-unique-generator": "取得所有已連結標題,標記為遺失。",
        "apihelp-query+alllinks-example-generator": "取得包含連結的頁面。",
        "apihelp-query+allmessages-summary": "返回來自該網站的訊息。",
+       "apihelp-query+allmessages-param-messages": "要輸出的訊息。<kbd>*</kbd>(預設)代表著所有訊息。",
        "apihelp-query+allmessages-param-prop": "要取得的屬性。",
        "apihelp-query+allmessages-param-nocontent": "若有設定,請不要包含在輸出裡的訊息內容。",
        "apihelp-query+allmessages-param-args": "要替代訊息的引數。",
        "apihelp-query+allrevisions-param-user": "此列出由該使用者作出的修訂。",
        "apihelp-query+allrevisions-param-excludeuser": "不要列出由該使用者作出的修訂。",
        "apihelp-query+allrevisions-param-namespace": "僅列出此命名空間的頁面。",
+       "apihelp-query+allrevisions-param-generatetitles": "當作為產生器時使用,產生標題而非修訂 ID。",
        "apihelp-query+allrevisions-example-user": "列出由使用者 <kbd>Example</kbd> 做出的最近 50 個貢獻。",
        "apihelp-query+allrevisions-example-ns-main": "列出在主命名空間的前 50 個修訂。",
        "apihelp-query+mystashedfiles-param-prop": "要索取的檔案屬性。",
        "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+categoryinfo-summary": "回傳有關指定分類的資訊。",
        "apihelp-query+categoryinfo-example-simple": "取得有關 <kbd>Category:Foo</kbd> 與 <kbd>Category:Bar</kbd> 的資訊。",
        "apihelp-query+categorymembers-summary": "在指定的分類中列出所有頁面。",
+       "apihelp-query+categorymembers-param-title": "所要列舉的分類(必要)。必須包含 <kbd>{{ns:category}}:</kbd> 前綴。不可與 <var>$1pageid</var> 一同使用。",
+       "apihelp-query+categorymembers-param-pageid": "要列舉的分類之頁面 ID。不能與 <var>$1title</var> 同時使用。",
        "apihelp-query+categorymembers-param-prop": "要包含的資訊部份:",
        "apihelp-query+categorymembers-paramvalue-prop-ids": "添加頁面 ID。",
        "apihelp-query+categorymembers-paramvalue-prop-title": "添加標題與頁面的命名空間 ID。",
        "apihelp-query+categorymembers-paramvalue-prop-timestamp": "添加在頁面有被包含時的時間戳記。",
        "apihelp-query+categorymembers-param-limit": "回傳的頁面數量上限。",
        "apihelp-query+categorymembers-param-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+embeddedin-param-dir": "列出時所採用的方向。",
        "apihelp-query+embeddedin-param-filterredir": "如何過濾重新導向。",
        "apihelp-query+embeddedin-param-limit": "要回傳的頁面總數。",
+       "apihelp-query+embeddedin-example-simple": "顯示嵌入 <kbd>Template:Stub</kbd> 的頁面。",
+       "apihelp-query+embeddedin-example-generator": "取得有關嵌入 <kbd>Template:Stub</kbd> 的頁面之資訊。",
        "apihelp-query+extlinks-summary": "回傳所有指定頁面的外部 URL (非 interwiki)。",
        "apihelp-query+extlinks-param-limit": "要回傳的連結數量。",
        "apihelp-query+extlinks-example-simple": "取得 <kbd>Main Page</kbd> 的外部連結清單。",
        "apihelp-query+info-summary": "取得基本頁面訊息。",
        "apihelp-query+info-param-prop": "要取得的額外屬性:",
        "apihelp-query+info-paramvalue-prop-protection": "列出各頁面的保護層級。",
+       "apihelp-query+info-paramvalue-prop-talkid": "各非對話頁的對話頁頁面 ID。",
        "apihelp-query+info-paramvalue-prop-watched": "列出各頁面的監視狀態。",
        "apihelp-query+info-paramvalue-prop-watchers": "監視者的數目,如有允許的話。",
        "apihelp-query+info-paramvalue-prop-visitingwatchers": "有訪問頁面近期編輯數的各頁面監視者數目,如有允許的話。",
+       "apihelp-query+info-paramvalue-prop-notificationtimestamp": "各頁面的監視清單通知時間戳記。",
+       "apihelp-query+info-paramvalue-prop-subjectid": "各對話頁的父頁面頁面 ID。",
        "apihelp-query+info-paramvalue-prop-readable": "使用者是否可閱讀此頁面。",
        "apihelp-query+info-param-testactions": "測試目前使用者是否可執行頁面上的某項操作。",
        "apihelp-query+info-param-token": "請改用 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]。",
        "apihelp-query+info-example-simple": "取得有關頁面 <kbd>Main Page</kbd> 的資訊。",
        "apihelp-query+iwbacklinks-summary": "找出連結至指定跨 wiki 連結的所有頁面。",
        "apihelp-query+iwbacklinks-param-prefix": "跨 wiki 前綴。",
+       "apihelp-query+iwbacklinks-param-title": "要搜尋的跨 wiki 連結。必須與 <var>$1blprefix</var> 一起使用。",
        "apihelp-query+iwbacklinks-param-limit": "要回傳的頁面總數。",
        "apihelp-query+iwbacklinks-param-prop": "要取得的屬性。",
        "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "添加跨 wiki 前綴。",
        "apihelp-query+iwbacklinks-example-generator": "取得連結至 [[wikibooks:Test]] 的頁面相關資訊。",
        "apihelp-query+iwlinks-summary": "回傳指定頁面的所有 interwiki 連結。",
        "apihelp-query+iwlinks-param-url": "是否取得完整的 URL(不能與 $1prop 一同使用)。",
+       "apihelp-query+iwlinks-param-prop": "為各跨語言連結所要取得的額外屬性:",
        "apihelp-query+iwlinks-paramvalue-prop-url": "添加完整的 URL。",
        "apihelp-query+iwlinks-param-limit": "要回傳的跨 Wiki 連結數量。",
        "apihelp-query+iwlinks-param-prefix": "僅回傳帶有此前綴的跨 wiki 連結。",
        "apihelp-query+langlinks-paramvalue-prop-url": "添加完整的 URL。",
        "apihelp-query+langlinks-paramvalue-prop-autonym": "添加本地語言名稱。",
        "apihelp-query+langlinks-param-lang": "僅回傳帶有此語言代碼的語言連結。",
+       "apihelp-query+langlinks-param-title": "要搜尋的連結。必須與 <var>$1lang</var> 一起使用。",
        "apihelp-query+langlinks-param-dir": "列出時所採用的方向。",
        "apihelp-query+langlinks-param-inlanguagecode": "用於本地化語言名稱的語言代碼。",
        "apihelp-query+langlinks-example-simple": "從頁面 <kbd>Main Page</kbd> 取得跨語言連結。",
        "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-limit": "限制所回傳的隨機頁面數量。",
        "apihelp-query+random-param-redirect": "請改用 <kbd>$1filterredir=redirects</kbd>。",
        "apihelp-query+random-param-filterredir": "如何過濾重新導向。",
        "apihelp-query+random-example-simple": "從主命名空間回傳兩個隨機頁面。",
        "apihelp-query+recentchanges-param-excludeuser": "不要列出由該使用者作出的更改。",
        "apihelp-query+recentchanges-param-tag": "僅列出以此標籤所標記的更改。",
        "apihelp-query+recentchanges-param-prop": "包含的額外資訊部份:",
+       "apihelp-query+recentchanges-paramvalue-prop-userid": "添加承擔編輯的使用者。",
+       "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+recentchanges-paramvalue-prop-ids": "添加頁面 ID、最近更改 ID 以及新舊修訂 ID。",
+       "apihelp-query+recentchanges-paramvalue-prop-sizes": "添加新舊頁面長度(位元組)。",
        "apihelp-query+recentchanges-paramvalue-prop-redirect": "若頁面為重新導向則標記編輯。",
        "apihelp-query+recentchanges-paramvalue-prop-tags": "列出項目的標籤。",
        "apihelp-query+recentchanges-param-token": "請改用 <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "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-hasmsg": "若目前使用者有等待訊息,添加 <samp>messages</samp> 標籤。",
        "apihelp-query+userinfo-paramvalue-prop-groups": "列出目前使用者所隸屬的所有群組。",
        "apihelp-query+userinfo-paramvalue-prop-rights": "列出目前使用者所擁有的權限。",
        "apihelp-query+userinfo-paramvalue-prop-options": "列出目前使用者已設定過的所有偏好設定。",
        "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+users-example-simple": "返回使用者 <kbd>Example</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-query+watchlistraw-example-simple": "列出在目前使用者的監視清單裡頭頁面。",
        "apihelp-removeauthenticationdata-summary": "為目前使用者移除身分核對資料。",
        "apihelp-resetpassword-summary": "寄送重新設定密碼的電子郵件給使用者。",
+       "apihelp-resetpassword-param-email": "正被重新設定使用者的電子郵件地址。",
        "apihelp-resetpassword-example-user": "向使用者 <kbd>Example</kbd> 寄送重新設定密碼用的電子郵件。",
        "apihelp-revisiondelete-summary": "刪除和取消刪除修訂。",
        "apihelp-revisiondelete-param-hide": "各修訂所要隱藏的內容。",
        "apihelp-revisiondelete-param-show": "各修訂所要取消隱藏的內容。",
        "apihelp-revisiondelete-param-reason": "刪除或取消刪除的原因。",
+       "apihelp-revisiondelete-param-tags": "在刪除日誌裡套用到項目的標籤。",
        "apihelp-rollback-summary": "撤修頁面的最後一次編輯。",
+       "apihelp-rollback-param-title": "要回退的頁面標題。不可與 <var>$1pageid</var> 同時使用。",
+       "apihelp-rollback-param-pageid": "要回退的頁面 ID。不可與 <var>$1title</var> 同時使用。",
+       "apihelp-rollback-param-tags": "套用到回退的標籤。",
+       "apihelp-rollback-param-summary": "自定義編輯摘要。若為空,則使用預設摘要。",
+       "apihelp-rollback-param-watchlist": "無條件使用設置將頁面加入或移除目前使用者的監視清單或者是不更改監視清單。",
+       "apihelp-setnotificationtimestamp-summary": "更新監視頁面的通知時間戳記。",
        "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 86a6aae..c538ee7 100644 (file)
@@ -136,7 +136,8 @@ class LocalPasswordPrimaryAuthenticationProvider
                // @codeCoverageIgnoreStart
                if ( $this->getPasswordFactory()->needsUpdate( $pwhash ) ) {
                        $newHash = $this->getPasswordFactory()->newFromPlaintext( $req->password );
-                       \DeferredUpdates::addCallableUpdate( function () use ( $newHash, $oldRow ) {
+                       $fname = __METHOD__;
+                       \DeferredUpdates::addCallableUpdate( function () use ( $newHash, $oldRow, $fname ) {
                                $dbw = wfGetDB( DB_MASTER );
                                $dbw->update(
                                        'user',
@@ -145,7 +146,7 @@ class LocalPasswordPrimaryAuthenticationProvider
                                                'user_id' => $oldRow->user_id,
                                                'user_password' => $oldRow->user_password
                                        ],
-                                       __METHOD__
+                                       $fname
                                );
                        } );
                }
index 7a1b988..aa929bc 100644 (file)
@@ -582,10 +582,11 @@ class MessageCache {
                        // Ignore $wgMaxMsgCacheEntrySize so the process cache is up to date
                        $this->cache->setField( $code, $title, ' ' . $text );
                }
+               $fname = __METHOD__;
 
                // (b) Update the shared caches in a deferred update with a fresh DB snapshot
                DeferredUpdates::addCallableUpdate(
-                       function () use ( $title, $msg, $code ) {
+                       function () use ( $title, $msg, $code, $fname ) {
                                global $wgMaxMsgCacheEntrySize;
                                // Allow one caller at a time to avoid race conditions
                                $scopedLock = $this->getReentrantScopedLock(
@@ -593,7 +594,7 @@ class MessageCache {
                                );
                                if ( !$scopedLock ) {
                                        LoggerFactory::getInstance( 'MessageCache' )->error(
-                                               __METHOD__ . ': could not acquire lock to update {title} ({code})',
+                                               $fname . ': could not acquire lock to update {title} ({code})',
                                                [ 'title' => $title, 'code' => $code ] );
                                        return;
                                }
@@ -1029,14 +1030,15 @@ class MessageCache {
         * @return string Either " <MESSAGE>" or "!NONEXISTANT"
         */
        private function loadCachedMessagePageEntry( $dbKey, $code, $hash ) {
+               $fname = __METHOD__;
                return $this->srvCache->getWithSetCallback(
                        $this->srvCache->makeKey( 'messages-big', $hash, $dbKey ),
                        IExpiringStore::TTL_MINUTE,
-                       function () use ( $code, $dbKey, $hash ) {
+                       function () use ( $code, $dbKey, $hash, $fname ) {
                                return $this->wanCache->getWithSetCallback(
                                        $this->bigMessageCacheKey( $hash, $dbKey ),
                                        $this->mExpiry,
-                                       function ( $oldValue, &$ttl, &$setOpts ) use ( $dbKey, $code ) {
+                                       function ( $oldValue, &$ttl, &$setOpts ) use ( $dbKey, $code, $fname ) {
                                                // Try loading the message from the database
                                                $dbr = wfGetDB( DB_REPLICA );
                                                $setOpts += Database::getCacheSetOptions( $dbr );
@@ -1053,7 +1055,7 @@ class MessageCache {
                                                        $message = $this->getMessageTextFromContent( $content );
                                                } else {
                                                        LoggerFactory::getInstance( 'MessageCache' )->warning(
-                                                               __METHOD__ . ': failed to load page text for \'{titleKey}\'',
+                                                               $fname . ': failed to load page text for \'{titleKey}\'',
                                                                [ 'titleKey' => $dbKey, 'code' => $code ]
                                                        );
                                                        $message = null;
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 a2af01c..a26f5b6 100644 (file)
@@ -60,7 +60,10 @@ class OldChangesList extends ChangesList {
                ) {
                        return false;
                }
-               $attribs = wfArrayFilterByKey( $attribs, [ Sanitizer::class, 'isReservedDataAttribute' ] );
+               $attribs = array_filter( $attribs,
+                       [ Sanitizer::class, 'isReservedDataAttribute' ],
+                       ARRAY_FILTER_USE_KEY
+               );
 
                $dateheader = ''; // $html now contains only <li>...</li>, for hooks' convenience.
                $this->insertDateHeader( $dateheader, $rc->mAttribs['rc_timestamp'] );
index 008a2f6..8dc63e5 100644 (file)
@@ -88,6 +88,7 @@ class ChangeTags {
         * @return array Array with two items: (html, classes)
         *   - html: String: HTML for displaying the tags (empty string when param $tags is empty)
         *   - classes: Array of strings: CSS classes used in the generated html, one class for each tag
+        * @return-taint onlysafefor_htmlnoent
         */
        public static function formatSummaryRow( $tags, $page, IContextSource $context = null ) {
                if ( !$tags ) {
@@ -927,13 +928,14 @@ class ChangeTags {
                        );
                }
 
-               $dbw->replace(
-                       'valid_tag',
-                       [ 'vt_tag' ],
-                       [ 'vt_tag' => $tag ],
-                       __METHOD__
-               );
-
+               if ( $wgChangeTagsSchemaMigrationStage < MIGRATION_NEW ) {
+                       $dbw->replace(
+                               'valid_tag',
+                               [ 'vt_tag' ],
+                               [ 'vt_tag' => $tag ],
+                               __METHOD__
+                       );
+               }
                // clear the memcache of defined tags
                self::purgeTagCacheAll();
        }
@@ -966,7 +968,9 @@ class ChangeTags {
                        );
                }
 
-               $dbw->delete( 'valid_tag', [ 'vt_tag' => $tag ], __METHOD__ );
+               if ( $wgChangeTagsSchemaMigrationStage < MIGRATION_NEW ) {
+                       $dbw->delete( 'valid_tag', [ 'vt_tag' => $tag ], __METHOD__ );
+               }
 
                // clear the memcache of defined tags
                self::purgeTagCacheAll();
@@ -1457,7 +1461,7 @@ class ChangeTags {
        /**
         * Lists tags explicitly defined in the `valid_tag` table of the database.
         * Tags in table 'change_tag' which are not in table 'valid_tag' are not
-        * included.
+        * included. In case of new backend loads the data from `change_tag_def` table.
         *
         * Tries memcached first.
         *
@@ -1472,11 +1476,16 @@ class ChangeTags {
                        $cache->makeKey( 'valid-tags-db' ),
                        WANObjectCache::TTL_MINUTE * 5,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $fname ) {
+                               global $wgChangeTagsSchemaMigrationStage;
                                $dbr = wfGetDB( DB_REPLICA );
 
                                $setOpts += Database::getCacheSetOptions( $dbr );
 
-                               $tags = $dbr->selectFieldValues( 'valid_tag', 'vt_tag', [], $fname );
+                               if ( $wgChangeTagsSchemaMigrationStage > MIGRATION_WRITE_BOTH ) {
+                                       $tags = self::listExplicitlyDefinedTagsNewBackend();
+                               } else {
+                                       $tags = $dbr->selectFieldValues( 'valid_tag', 'vt_tag', [], $fname );
+                               }
 
                                return array_filter( array_unique( $tags ) );
                        },
@@ -1488,6 +1497,22 @@ class ChangeTags {
                );
        }
 
+       /**
+        * Lists tags explicitly user defined tags. When ctd_user_defined is true.
+        *
+        * @return string[] Array of strings: tags
+        * @since 1.25
+        */
+       private static function listExplicitlyDefinedTagsNewBackend() {
+               $dbr = wfGetDB( DB_REPLICA );
+               return $dbr->selectFieldValues(
+                       'change_tag_def',
+                       'ctd_name',
+                       [ 'ctd_user_defined' => 1 ],
+                       __METHOD__
+               );
+       }
+
        /**
         * Lists tags defined by core or extensions using the ListDefinedTags hook.
         * Extensions need only define those tags they deem to be in active use.
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 7a378b3..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;
 
 /**
@@ -1410,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 1128d7b..a82ffa1 100644 (file)
@@ -161,10 +161,6 @@ class WikiTextStructure {
 
                $this->openingText = $this->extractHeadingBeforeFirstHeading( $text );
 
-               // Add extra spacing around break tags so text crammed together like<br>this
-               // doesn't make one word.
-               $text = str_replace( '<br', "\n<br", $text );
-
                $formatter = new HtmlFormatter( $text );
 
                // Strip elements from the page that we never want in the search text.
index d4a79d9..9d0789c 100644 (file)
@@ -29,7 +29,7 @@ use Psr\Log\LogLevel;
 use UDPTransport;
 
 /**
- * PSR-3 logger that mimics the historic implementation of MediaWiki's
+ * PSR-3 logger that mimics the historic implementation of MediaWiki's former
  * wfErrorLog logging implementation.
  *
  * This logger is configured by the following global configuration variables:
@@ -145,10 +145,6 @@ class LegacyLogger extends AbstractLogger {
                        // specfied.
                        $shouldEmit = (bool)$wgDBerrorLog;
 
-               } elseif ( $channel === 'wfErrorLog' ) {
-                       // All messages on the wfErrorLog channel should be emitted.
-                       $shouldEmit = true;
-
                } elseif ( $channel === 'wfDebug' ) {
                        // wfDebug messages are emitted if a catch all logging file has
                        // been specified. Checked explicitly so that 'private' flagged
@@ -192,10 +188,9 @@ class LegacyLogger extends AbstractLogger {
        /**
         * Format a message.
         *
-        * Messages to the 'wfDebug', 'wfLogDBError' and 'wfErrorLog' channels
-        * receive special formatting to mimic the historic output of the functions
-        * of the same name. All other channel values are formatted based on the
-        * historic output of the `wfDebugLog()` global function.
+        * Messages to the 'wfDebug' and 'wfLogDBError' channels receive special formatting to mimic the
+        * historic output of the functions of the same name. All other channel values are formatted
+        * based on the historic output of the `wfDebugLog()` global function.
         *
         * @param string $channel
         * @param string $message
@@ -211,9 +206,6 @@ class LegacyLogger extends AbstractLogger {
                } elseif ( $channel === 'wfLogDBError' ) {
                        $text = self::formatAsWfLogDBError( $channel, $message, $context );
 
-               } elseif ( $channel === 'wfErrorLog' ) {
-                       $text = "{$message}\n";
-
                } elseif ( $channel === 'profileoutput' ) {
                        // Legacy wfLogProfilingData formatitng
                        $forward = '';
index 92624a0..e16dd4c 100644 (file)
@@ -24,10 +24,11 @@ use MediaWiki\Logger\LegacyLogger;
 use Monolog\Formatter\NormalizerFormatter;
 
 /**
- * Log message formatter that mimics the legacy log message formatting of
- * `wfDebug`, `wfDebugLog`, `wfLogDBError` and `wfErrorLog` global functions by
- * delegating the formatting to \MediaWiki\Logger\LegacyLogger.
+ * Log message formatter that mimics the legacy log message formatting of `wfDebug`, `wfDebugLog`,
+ * `wfLogDBError` and the former `wfErrorLog` global functions by delegating the formatting to
+ * \MediaWiki\Logger\LegacyLogger.
  *
+ * @deprecated since 1.32
  * @since 1.25
  * @copyright © 2013 Wikimedia Foundation and contributors
  * @see \MediaWiki\Logger\LegacyLogger
index dbeb136..258a9a8 100644 (file)
@@ -27,7 +27,7 @@ use Monolog\Logger;
 use UnexpectedValueException;
 
 /**
- * Log handler that replicates the behavior of MediaWiki's wfErrorLog()
+ * Log handler that replicates the behavior of MediaWiki's former wfErrorLog()
  * logging service. Log output can be directed to a local file, a PHP stream,
  * or a udp2log server.
  *
index dbe387b..577a272 100644 (file)
@@ -405,7 +405,7 @@ class LinksUpdate extends DataUpdate implements EnqueueableDataUpdate {
        /**
         * @param array $images
         */
-       private function invalidateImageDescriptions( $images ) {
+       private function invalidateImageDescriptions( array $images ) {
                PurgeJobUtils::invalidatePages( $this->getDB(), NS_FILE, array_keys( $images ) );
        }
 
index 387e9e3..936f6bf 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 
 /**
  * DifferenceEngine is responsible for rendering the difference between two revisions as HTML.
@@ -273,7 +274,7 @@ class DifferenceEngine extends ContextSource {
        protected function getSlotContents() {
                if ( $this->isContentOverridden ) {
                        return [
-                               'main' => [
+                               SlotRecord::MAIN => [
                                        'old' => $this->mOldContent,
                                        'new' => $this->mNewContent,
                                ]
@@ -302,8 +303,8 @@ class DifferenceEngine extends ContextSource {
                        ];
                }
                // move main slot to front
-               if ( isset( $slots['main'] ) ) {
-                       $slots = [ 'main' => $slots['main'] ] + $slots;
+               if ( isset( $slots[SlotRecord::MAIN] ) ) {
+                       $slots = [ SlotRecord::MAIN => $slots[SlotRecord::MAIN] ] + $slots;
                }
                return $slots;
        }
@@ -848,6 +849,7 @@ class DifferenceEngine extends ContextSource {
                                // New revision is unsaved; bail out.
                                // TODO in theory rendering the new revision is a meaningful thing to do
                                // even if it's unsaved, but a lot of untangling is required to do it safely.
+                               return;
                        }
 
                        $out->setRevisionId( $this->mNewid );
@@ -1052,7 +1054,7 @@ class DifferenceEngine extends ContextSource {
                foreach ( $this->getSlotDiffRenderers() as $role => $slotDiffRenderer ) {
                        $slotDiff = $slotDiffRenderer->getDiff( $slotContents[$role]['old'],
                                $slotContents[$role]['new'] );
-                       if ( $slotDiff && $role !== 'main' ) {
+                       if ( $slotDiff && $role !== SlotRecord::MAIN ) {
                                // TODO use human-readable role name at least
                                $slotTitle = $role;
                                $difftext .= $this->getSlotHeader( $slotTitle );
@@ -1099,7 +1101,7 @@ class DifferenceEngine extends ContextSource {
                        return false;
                }
 
-               if ( $role !== 'main' ) {
+               if ( $role !== SlotRecord::MAIN ) {
                        // TODO use human-readable role name at least
                        $slotTitle = $role;
                        $slotDiff = $this->getSlotHeader( $slotTitle ) . $slotDiff;
@@ -1639,7 +1641,7 @@ class DifferenceEngine extends ContextSource {
                        $this->mOldPage = Title::newFromLinkTarget( $oldRevision->getPageAsLinkTarget() );
                        // This method is meant for edit diffs and such so there is no reason to provide a
                        // revision that's not readable to the user, but check it just in case.
-                       $this->mOldContent = $oldRevision ? $oldRevision->getContent( 'main',
+                       $this->mOldContent = $oldRevision ? $oldRevision->getContent( SlotRecord::MAIN,
                                RevisionRecord::FOR_THIS_USER, $this->getUser() ) : null;
                } else {
                        $this->mOldPage = null;
@@ -1648,7 +1650,7 @@ class DifferenceEngine extends ContextSource {
                $this->mNewRev = new Revision( $newRevision );
                $this->mNewid = $newRevision->getId();
                $this->mNewPage = Title::newFromLinkTarget( $newRevision->getPageAsLinkTarget() );
-               $this->mNewContent = $newRevision->getContent( 'main',
+               $this->mNewContent = $newRevision->getContent( SlotRecord::MAIN,
                        RevisionRecord::FOR_THIS_USER, $this->getUser() );
 
                $this->mRevisionsIdsLoaded = $this->mRevisionsLoaded = true;
index b3e9422..af835e4 100644 (file)
@@ -73,15 +73,26 @@ 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 );
 
+               // FIXME: Keep logic in sync with MWExceptionRenderer::msg.
+               $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 = strtr( $res, [
+                               '{{SITENAME}}' => $wgSitename,
+                       ] );
+               }
+               return $res;
        }
 
        /**
@@ -154,6 +165,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 bd823b5..0e81a43 100644 (file)
@@ -35,12 +35,35 @@ class MWExceptionHandler {
         * @var string $reservedMemory
         */
        protected static $reservedMemory;
+
        /**
+        * Error types that, if unhandled, are fatal to the request.
+        *
+        * On PHP 7, these error types may be thrown as Error objects, which
+        * implement Throwable (but not Exception).
+        *
+        * On HHVM, these invoke the set_error_handler callback, similar to how
+        * (non-fatal) warnings and notices are reported, except that after this
+        * handler runs for fatal error tpyes, script execution stops!
+        *
+        * The user will be shown an HTTP 500 Internal Server Error.
+        * As such, these should be sent to MediaWiki's "fatal" or "exception"
+        * channel. Normally, the error handler logs them to the "error" channel.
+        *
         * @var array $fatalErrorTypes
         */
        protected static $fatalErrorTypes = [
-               E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR, E_USER_ERROR,
-               /* HHVM's FATAL_ERROR level */ 16777217,
+               E_ERROR,
+               E_PARSE,
+               E_CORE_ERROR,
+               E_COMPILE_ERROR,
+               E_USER_ERROR,
+
+               // E.g. "Catchable fatal error: Argument X must be Y, null given"
+               E_RECOVERABLE_ERROR,
+
+               // HHVM's FATAL_ERROR constant
+               16777217,
        ];
        /**
         * @var bool $handledFatalCallback
@@ -192,10 +215,6 @@ class MWExceptionHandler {
                // behaviour given the null was not part of the code and is likely not
                // accounted for.
                switch ( $level ) {
-                       case E_RECOVERABLE_ERROR:
-                               $levelName = 'Error';
-                               $severity = LogLevel::ERROR;
-                               break;
                        case E_WARNING:
                        case E_CORE_WARNING:
                        case E_COMPILE_WARNING:
@@ -231,9 +250,9 @@ class MWExceptionHandler {
                self::logError( $e, 'error', $severity );
 
                // If $wgPropagateErrors is true return false so PHP shows/logs the error normally.
-               // Ignore $wgPropagateErrors if the error should break execution, or track_errors is set
+               // Ignore $wgPropagateErrors if track_errors is set
                // (which means someone is counting on regular PHP error handling behavior).
-               return !( $wgPropagateErrors || $level == E_RECOVERABLE_ERROR || ini_get( 'track_errors' ) );
+               return !( $wgPropagateErrors || ini_get( 'track_errors' ) );
        }
 
        /**
index 49cf71e..de2af6b 100644 (file)
@@ -197,12 +197,21 @@ class MWExceptionRenderer {
         * @return string Message with arguments replaced
         */
        private static function msg( $key, $fallback /*[, params...] */ ) {
+               global $wgSitename;
                $args = array_slice( func_get_args(), 2 );
+
+               // FIXME: Keep logic in sync with MWException::msg.
                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 = strtr( $res, [
+                               '{{SITENAME}}' => $wgSitename,
+                       ] );
                }
+               return $res;
        }
 
        /**
index b018584..1f2b81d 100644 (file)
@@ -52,14 +52,10 @@ class WikiExporter {
        const LOGS = 8;
        const RANGE = 16;
 
-       const BUFFER = 0;
-       const STREAM = 1;
-
        const TEXT = 0;
        const STUB = 1;
 
-       /** @var int */
-       public $buffer;
+       const BATCH_SIZE = 1000;
 
        /** @var int */
        public $text;
@@ -76,26 +72,17 @@ class WikiExporter {
        }
 
        /**
-        * If using WikiExporter::STREAM to stream a large amount of data,
-        * provide a database connection which is not managed by
-        * LoadBalancer to read from: some history blob types will
-        * make additional queries to pull source data while the
-        * main query is still running.
-        *
         * @param IDatabase $db
         * @param int|array $history One of WikiExporter::FULL, WikiExporter::CURRENT,
         *   WikiExporter::RANGE or WikiExporter::STABLE, or an associative array:
         *   - offset: non-inclusive offset at which to start the query
         *   - limit: maximum number of rows to return
         *   - dir: "asc" or "desc" timestamp order
-        * @param int $buffer One of WikiExporter::BUFFER or WikiExporter::STREAM
         * @param int $text One of WikiExporter::TEXT or WikiExporter::STUB
         */
-       function __construct( $db, $history = self::CURRENT,
-                       $buffer = self::BUFFER, $text = self::TEXT ) {
+       function __construct( $db, $history = self::CURRENT, $text = self::TEXT ) {
                $this->db = $db;
                $this->history = $history;
-               $this->buffer = $buffer;
                $this->writer = new XmlDumpWriter();
                $this->sink = new DumpOutput();
                $this->text = $text;
@@ -263,206 +250,191 @@ class WikiExporter {
         * @throws Exception
         */
        protected function dumpFrom( $cond = '', $orderRevs = false ) {
-               global $wgMultiContentRevisionSchemaMigrationStage;
-
-               # For logging dumps...
                if ( $this->history & self::LOGS ) {
-                       $where = [];
-                       # Hide private logs
-                       $hideLogs = LogEventsList::getExcludeClause( $this->db );
-                       if ( $hideLogs ) {
-                               $where[] = $hideLogs;
-                       }
-                       # Add on any caller specified conditions
-                       if ( $cond ) {
-                               $where[] = $cond;
-                       }
-                       # Get logging table name for logging.* clause
-                       $logging = $this->db->tableName( 'logging' );
+                       $this->dumpLogs( $cond );
+               } else {
+                       $this->dumpPages( $cond, $orderRevs );
+               }
+       }
 
-                       if ( $this->buffer == self::STREAM ) {
-                               $prev = $this->db->bufferResults( false );
+       /**
+        * @param string $cond
+        * @throws Exception
+        */
+       protected function dumpLogs( $cond ) {
+               $where = [];
+               # Hide private logs
+               $hideLogs = LogEventsList::getExcludeClause( $this->db );
+               if ( $hideLogs ) {
+                       $where[] = $hideLogs;
+               }
+               # Add on any caller specified conditions
+               if ( $cond ) {
+                       $where[] = $cond;
+               }
+               # Get logging table name for logging.* clause
+               $logging = $this->db->tableName( 'logging' );
+
+               $result = null; // Assuring $result is not undefined, if exception occurs early
+
+               $commentQuery = CommentStore::getStore()->getJoin( 'log_comment' );
+               $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
+
+               $lastLogId = 0;
+               while ( true ) {
+                       $result = $this->db->select(
+                               array_merge( [ 'logging' ], $commentQuery['tables'], $actorQuery['tables'], [ 'user' ] ),
+                               [ "{$logging}.*", 'user_name' ] + $commentQuery['fields'] + $actorQuery['fields'],
+                               array_merge( $where, [ 'log_id > ' . intval( $lastLogId ) ] ),
+                               __METHOD__,
+                               [
+                                       'ORDER BY' => 'log_id',
+                                       'USE INDEX' => [ 'logging' => 'PRIMARY' ],
+                                       'LIMIT' => self::BATCH_SIZE,
+                               ],
+                               [
+                                       'user' => [ 'JOIN', 'user_id = ' . $actorQuery['fields']['log_user'] ]
+                               ] + $commentQuery['joins'] + $actorQuery['joins']
+                       );
+
+                       if ( !$result->numRows() ) {
+                               break;
                        }
-                       $result = null; // Assuring $result is not undefined, if exception occurs early
-
-                       $commentQuery = CommentStore::getStore()->getJoin( 'log_comment' );
-                       $actorQuery = ActorMigration::newMigration()->getJoin( 'log_user' );
-
-                       try {
-                               $result = $this->db->select(
-                                       array_merge( [ 'logging' ], $commentQuery['tables'], $actorQuery['tables'], [ 'user' ] ),
-                                       [ "{$logging}.*", 'user_name' ] + $commentQuery['fields'] + $actorQuery['fields'],
-                                       $where,
-                                       __METHOD__,
-                                       [ 'ORDER BY' => 'log_id', 'USE INDEX' => [ 'logging' => 'PRIMARY' ] ],
-                                       [
-                                               'user' => [ 'JOIN', 'user_id = ' . $actorQuery['fields']['log_user'] ]
-                                       ] + $commentQuery['joins'] + $actorQuery['joins']
-                               );
-                               $this->outputLogStream( $result );
-                               if ( $this->buffer == self::STREAM ) {
-                                       $this->db->bufferResults( $prev );
-                               }
-                       } catch ( Exception $e ) {
-                               // Throwing the exception does not reliably free the resultset, and
-                               // would also leave the connection in unbuffered mode.
-
-                               // Freeing result
-                               try {
-                                       if ( $result ) {
-                                               $result->free();
-                                       }
-                               } catch ( Exception $e2 ) {
-                                       // Already in panic mode -> ignoring $e2 as $e has
-                                       // higher priority
-                               }
 
-                               // Putting database back in previous buffer mode
-                               try {
-                                       if ( $this->buffer == self::STREAM ) {
-                                               $this->db->bufferResults( $prev );
-                                       }
-                               } catch ( Exception $e2 ) {
-                                       // Already in panic mode -> ignoring $e2 as $e has
-                                       // higher priority
-                               }
+                       $lastLogId = $this->outputLogStream( $result );
+               };
+       }
 
-                               // Inform caller about problem
-                               throw $e;
-                       }
-               # For page dumps...
-               } else {
-                       if ( !( $wgMultiContentRevisionSchemaMigrationStage & SCHEMA_COMPAT_WRITE_OLD ) ) {
-                               // TODO: Make XmlDumpWriter use a RevisionStore! (see T198706 and T174031)
-                               throw new MWException(
-                                       'Cannot use WikiExporter with SCHEMA_COMPAT_WRITE_OLD mode disabled!'
-                                       . ' Support for dumping from the new schema is not implemented yet!'
-                               );
-                       }
+       /**
+        * @param string $cond
+        * @param bool $orderRevs
+        * @throws MWException
+        * @throws Exception
+        */
+       protected function dumpPages( $cond, $orderRevs ) {
+               global $wgMultiContentRevisionSchemaMigrationStage;
+               if ( !( $wgMultiContentRevisionSchemaMigrationStage & SCHEMA_COMPAT_WRITE_OLD ) ) {
+                       // TODO: Make XmlDumpWriter use a RevisionStore! (see T198706 and T174031)
+                       throw new MWException(
+                               'Cannot use WikiExporter with SCHEMA_COMPAT_WRITE_OLD mode disabled!'
+                               . ' Support for dumping from the new schema is not implemented yet!'
+                       );
+               }
 
-                       $revOpts = [ 'page' ];
-                       if ( $this->text != self::STUB ) {
-                               // TODO: remove the text and make XmlDumpWriter use a RevisionStore instead! (T198706)
-                               $revOpts[] = 'text';
-                       }
-                       $revQuery = Revision::getQueryInfo( $revOpts );
+               $revOpts = [ 'page' ];
+               if ( $this->text != self::STUB ) {
+                       // TODO: remove the text and make XmlDumpWriter use a RevisionStore instead! (T198706)
+                       $revOpts[] = 'text';
+               }
+               $revQuery = Revision::getQueryInfo( $revOpts );
 
-                       // We want page primary rather than revision
-                       $tables = array_merge( [ 'page' ], array_diff( $revQuery['tables'], [ 'page' ] ) );
-                       $join = $revQuery['joins'] + [
+               // We want page primary rather than revision
+               $tables = array_merge( [ 'page' ], array_diff( $revQuery['tables'], [ 'page' ] ) );
+               $join = $revQuery['joins'] + [
                                'revision' => $revQuery['joins']['page']
                        ];
-                       unset( $join['page'] );
+               unset( $join['page'] );
 
-                       // TODO: remove rev_text_id and make XmlDumpWriter use a RevisionStore instead! (T198706)
-                       $fields = array_merge( $revQuery['fields'], [ 'page_restrictions, rev_text_id' ] );
+               // TODO: remove rev_text_id and make XmlDumpWriter use a RevisionStore instead! (T198706)
+               $fields = array_merge( $revQuery['fields'], [ 'page_restrictions, rev_text_id' ] );
 
-                       $conds = [];
-                       if ( $cond !== '' ) {
-                               $conds[] = $cond;
-                       }
-                       $opts = [ 'ORDER BY' => 'page_id ASC' ];
-                       $opts['USE INDEX'] = [];
-                       if ( is_array( $this->history ) ) {
-                               # Time offset/limit for all pages/history...
-                               # Set time order
-                               if ( $this->history['dir'] == 'asc' ) {
-                                       $op = '>';
-                                       $opts['ORDER BY'] = 'rev_timestamp ASC';
-                               } else {
-                                       $op = '<';
-                                       $opts['ORDER BY'] = 'rev_timestamp DESC';
-                               }
-                               # Set offset
-                               if ( !empty( $this->history['offset'] ) ) {
-                                       $conds[] = "rev_timestamp $op " .
-                                               $this->db->addQuotes( $this->db->timestamp( $this->history['offset'] ) );
-                               }
-                               # Set query limit
-                               if ( !empty( $this->history['limit'] ) ) {
-                                       $opts['LIMIT'] = intval( $this->history['limit'] );
-                               }
-                       } elseif ( $this->history & self::FULL ) {
-                               # Full history dumps...
-                               # query optimization for history stub dumps
-                               if ( $this->text == self::STUB && $orderRevs ) {
-                                       $tables = $revQuery['tables'];
-                                       $opts['ORDER BY'] = [ 'rev_page ASC', 'rev_id ASC' ];
-                                       $opts['USE INDEX']['revision'] = 'rev_page_id';
-                                       unset( $join['revision'] );
-                                       $join['page'] = [ 'INNER JOIN', 'rev_page=page_id' ];
-                               }
-                       } elseif ( $this->history & self::CURRENT ) {
-                               # Latest revision dumps...
-                               if ( $this->list_authors && $cond != '' ) { // List authors, if so desired
-                                       $this->do_list_authors( $cond );
-                               }
-                               $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' ];
-                       } elseif ( $this->history & self::STABLE ) {
-                               # "Stable" revision dumps...
-                               # Default JOIN, to be overridden...
-                               $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' ];
-                               # One, and only one hook should set this, and return false
-                               if ( Hooks::run( 'WikiExporter::dumpStableQuery', [ &$tables, &$opts, &$join ] ) ) {
-                                       throw new MWException( __METHOD__ . " given invalid history dump type." );
-                               }
-                       } elseif ( $this->history & self::RANGE ) {
-                               # Dump of revisions within a specified range
-                               $opts['ORDER BY'] = [ 'rev_page ASC', 'rev_id ASC' ];
+               $conds = [];
+               if ( $cond !== '' ) {
+                       $conds[] = $cond;
+               }
+               $opts = [ 'ORDER BY' => [ 'rev_page ASC', 'rev_id ASC' ] ];
+               $opts['USE INDEX'] = [];
+
+               $op = '>';
+               if ( is_array( $this->history ) ) {
+                       # Time offset/limit for all pages/history...
+                       # Set time order
+                       if ( $this->history['dir'] == 'asc' ) {
+                               $opts['ORDER BY'] = 'rev_timestamp ASC';
                        } else {
-                               # Unknown history specification parameter?
+                               $op = '<';
+                               $opts['ORDER BY'] = 'rev_timestamp DESC';
+                       }
+                       # Set offset
+                       if ( !empty( $this->history['offset'] ) ) {
+                               $conds[] = "rev_timestamp $op " .
+                                       $this->db->addQuotes( $this->db->timestamp( $this->history['offset'] ) );
+                       }
+                       # Set query limit
+                       if ( !empty( $this->history['limit'] ) ) {
+                               $maxRowCount = intval( $this->history['limit'] );
+                       }
+               } elseif ( $this->history & self::FULL ) {
+                       # Full history dumps...
+                       # query optimization for history stub dumps
+                       if ( $this->text == self::STUB && $orderRevs ) {
+                               $tables = $revQuery['tables'];
+                               $opts['USE INDEX']['revision'] = 'rev_page_id';
+                               unset( $join['revision'] );
+                               $join['page'] = [ 'INNER JOIN', 'rev_page=page_id' ];
+                       }
+               } elseif ( $this->history & self::CURRENT ) {
+                       # Latest revision dumps...
+                       if ( $this->list_authors && $cond != '' ) { // List authors, if so desired
+                               $this->do_list_authors( $cond );
+                       }
+                       $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' ];
+               } elseif ( $this->history & self::STABLE ) {
+                       # "Stable" revision dumps...
+                       # Default JOIN, to be overridden...
+                       $join['revision'] = [ 'INNER JOIN', 'page_id=rev_page AND page_latest=rev_id' ];
+                       # One, and only one hook should set this, and return false
+                       if ( Hooks::run( 'WikiExporter::dumpStableQuery', [ &$tables, &$opts, &$join ] ) ) {
                                throw new MWException( __METHOD__ . " given invalid history dump type." );
                        }
+               } elseif ( $this->history & self::RANGE ) {
+                       # Dump of revisions within a specified range.  Condition already set in revsByRange().
+               } else {
+                       # Unknown history specification parameter?
+                       throw new MWException( __METHOD__ . " given invalid history dump type." );
+               }
 
-                       if ( $this->buffer == self::STREAM ) {
-                               $prev = $this->db->bufferResults( false );
-                       }
-                       $result = null; // Assuring $result is not undefined, if exception occurs early
-                       try {
-                               Hooks::run( 'ModifyExportQuery',
-                                               [ $this->db, &$tables, &$cond, &$opts, &$join ] );
-
-                               # Do the query!
-                               $result = $this->db->select(
-                                       $tables,
-                                       $fields,
-                                       $conds,
-                                       __METHOD__,
-                                       $opts,
-                                       $join
-                               );
-                               # Output dump results
-                               $this->outputPageStream( $result );
-
-                               if ( $this->buffer == self::STREAM ) {
-                                       $this->db->bufferResults( $prev );
-                               }
-                       } catch ( Exception $e ) {
-                               // Throwing the exception does not reliably free the resultset, and
-                               // would also leave the connection in unbuffered mode.
-
-                               // Freeing result
-                               try {
-                                       if ( $result ) {
-                                               $result->free();
-                                       }
-                               } catch ( Exception $e2 ) {
-                                       // Already in panic mode -> ignoring $e2 as $e has
-                                       // higher priority
-                               }
+               $result = null; // Assuring $result is not undefined, if exception occurs early
+               $done = false;
+               $lastRow = null;
+               $revPage = 0;
+               $revId = 0;
+               $rowCount = 0;
 
-                               // Putting database back in previous buffer mode
-                               try {
-                                       if ( $this->buffer == self::STREAM ) {
-                                               $this->db->bufferResults( $prev );
-                                       }
-                               } catch ( Exception $e2 ) {
-                                       // Already in panic mode -> ignoring $e2 as $e has
-                                       // higher priority
-                               }
+               $opts['LIMIT'] = self::BATCH_SIZE;
 
-                               // Inform caller about problem
-                               throw $e;
+               Hooks::run( 'ModifyExportQuery',
+                       [ $this->db, &$tables, &$cond, &$opts, &$join ] );
+
+               while ( !$done ) {
+                       // If necessary, impose the overall maximum and stop looping after this iteration.
+                       if ( !empty( $maxRowCount ) && $rowCount + self::BATCH_SIZE > $maxRowCount ) {
+                               $opts['LIMIT'] = $maxRowCount - $rowCount;
+                               $done = true;
+                       }
+
+                       $queryConds = $conds;
+                       $queryConds[] = 'rev_page>' . intval( $revPage ) . ' OR (rev_page=' .
+                               intval( $revPage ) . ' AND rev_id' . $op . intval( $revId ) . ')';
+
+                       # Do the query!
+                       $result = $this->db->select(
+                               $tables,
+                               $fields,
+                               $queryConds,
+                               __METHOD__,
+                               $opts,
+                               $join
+                       );
+                       # Output dump results, get new max ids.
+                       $lastRow = $this->outputPageStream( $result, $lastRow );
+
+                       if ( !$result->numRows() || !$lastRow ) {
+                               $done = true;
+                       } else {
+                               $rowCount += $result->numRows();
+                               $revPage = $lastRow->rev_page;
+                               $revId = $lastRow->rev_id;
                        }
                }
        }
@@ -472,52 +444,55 @@ class WikiExporter {
         * The result set should be sorted/grouped by page to avoid duplicate
         * page records in the output.
         *
-        * Should be safe for
-        * streaming (non-buffered) queries, as long as it was made on a
-        * separate database connection not managed by LoadBalancer; some
-        * blob storage types will make queries to pull source data.
-        *
         * @param ResultWrapper $resultset
+        * @param object $lastRow the last row output from the previous call (or null if none)
+        * @return object the last row processed
         */
-       protected function outputPageStream( $resultset ) {
-               $last = null;
-               foreach ( $resultset as $row ) {
-                       if ( $last === null ||
-                               $last->page_namespace != $row->page_namespace ||
-                               $last->page_title != $row->page_title ) {
-                               if ( $last !== null ) {
-                                       $output = '';
-                                       if ( $this->dumpUploads ) {
-                                               $output .= $this->writer->writeUploads( $last, $this->dumpUploadFileContents );
+       protected function outputPageStream( $resultset, $lastRow ) {
+               if ( $resultset->numRows() ) {
+                       foreach ( $resultset as $row ) {
+                               if ( $lastRow === null ||
+                                       $lastRow->page_namespace != $row->page_namespace ||
+                                       $lastRow->page_title != $row->page_title ) {
+                                       if ( $lastRow !== null ) {
+                                               $output = '';
+                                               if ( $this->dumpUploads ) {
+                                                       $output .= $this->writer->writeUploads( $lastRow, $this->dumpUploadFileContents );
+                                               }
+                                               $output .= $this->writer->closePage();
+                                               $this->sink->writeClosePage( $output );
                                        }
-                                       $output .= $this->writer->closePage();
-                                       $this->sink->writeClosePage( $output );
+                                       $output = $this->writer->openPage( $row );
+                                       $this->sink->writeOpenPage( $row, $output );
                                }
-                               $output = $this->writer->openPage( $row );
-                               $this->sink->writeOpenPage( $row, $output );
-                               $last = $row;
+                               $output = $this->writer->writeRevision( $row );
+                               $this->sink->writeRevision( $row, $output );
+                               $lastRow = $row;
                        }
-                       $output = $this->writer->writeRevision( $row );
-                       $this->sink->writeRevision( $row, $output );
-               }
-               if ( $last !== null ) {
+               } elseif ( $lastRow !== null ) {
+                       // Empty resultset means done with all batches  Close off final page element (if any).
                        $output = '';
                        if ( $this->dumpUploads ) {
-                               $output .= $this->writer->writeUploads( $last, $this->dumpUploadFileContents );
+                               $output .= $this->writer->writeUploads( $lastRow, $this->dumpUploadFileContents );
                        }
                        $output .= $this->author_list;
                        $output .= $this->writer->closePage();
                        $this->sink->writeClosePage( $output );
+                       $lastRow = null;
                }
+
+               return $lastRow;
        }
 
        /**
         * @param ResultWrapper $resultset
+        * @return int the log_id value of the last item output, or null if none
         */
        protected function outputLogStream( $resultset ) {
                foreach ( $resultset as $row ) {
                        $output = $this->writer->writeLogItem( $row );
                        $this->sink->writeLogItem( $row, $output );
                }
+               return isset( $row ) ? $row->log_id : null;
        }
 }
index 858e124..455d38f 100644 (file)
@@ -810,8 +810,9 @@ class FileRepo {
         */
        public function getDescriptionStylesheetUrl() {
                if ( isset( $this->scriptDirUrl ) ) {
-                       return $this->makeUrl( 'title=MediaWiki:Filepage.css&' .
-                               wfArrayToCgi( Skin::getDynamicStylesheetQuery() ) );
+                       // Must match canonical query parameter order for optimum caching
+                       // See Title::getCdnUrls
+                       return $this->makeUrl( 'title=MediaWiki:Filepage.css&action=raw&ctype=text/css' );
                }
 
                return false;
index 5a0cf6a..a30d213 100644 (file)
@@ -2071,13 +2071,14 @@ abstract class File implements IDBAccessObject {
                                $lang->getCode(),
                                md5( $this->getName() )
                        );
+                       $fname = __METHOD__;
 
                        return $cache->getWithSetCallback(
                                $key,
                                $this->repo->descriptionCacheExpiry ?: $cache::TTL_UNCACHEABLE,
-                               function ( $oldValue, &$ttl, array &$setOpts ) use ( $renderUrl ) {
+                               function ( $oldValue, &$ttl, array &$setOpts ) use ( $renderUrl, $fname ) {
                                        wfDebug( "Fetching shared description from $renderUrl\n" );
-                                       $res = Http::get( $renderUrl, [], __METHOD__ );
+                                       $res = Http::get( $renderUrl, [], $fname );
                                        if ( !$res ) {
                                                $ttl = WANObjectCache::TTL_UNCACHEABLE;
                                        }
index ee4df1d..1869967 100644 (file)
@@ -152,6 +152,7 @@ class ForeignDBFile extends LocalFile {
                }
 
                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
+               $fname = __METHOD__;
 
                return $cache->getWithSetCallback(
                        $this->repo->getLocalCacheKey(
@@ -161,9 +162,9 @@ class ForeignDBFile extends LocalFile {
                                $touched
                        ),
                        $this->repo->descriptionCacheExpiry ?: $cache::TTL_UNCACHEABLE,
-                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $renderUrl ) {
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $renderUrl, $fname ) {
                                wfDebug( "Fetching shared description from $renderUrl\n" );
-                               $res = Http::get( $renderUrl, [], __METHOD__ );
+                               $res = Http::get( $renderUrl, [], $fname );
                                if ( !$res ) {
                                        $ttl = WANObjectCache::TTL_UNCACHEABLE;
                                }
index fa6e180..36a44dc 100644 (file)
@@ -63,7 +63,7 @@ class LocalFile extends File {
        /** @var string MEDIATYPE_xxx (bitmap, drawing, audio...) */
        protected $media_type;
 
-       /** @var string MIME type, determined by MimeMagic::guessMimeType */
+       /** @var string MIME type, determined by MimeAnalyzer::guessMimeType */
        protected $mime;
 
        /** @var int Size in bytes (loadFromXxx) */
@@ -1696,6 +1696,7 @@ class LocalFile extends File {
                # Defer purges, page creation, and link updates in case they error out.
                # The most important thing is that files and the DB registry stay synced.
                $dbw->endAtomic( __METHOD__ );
+               $fname = __METHOD__;
 
                # Do some cache purges after final commit so that:
                # a) Changes are more likely to be seen post-purge
@@ -1706,7 +1707,7 @@ class LocalFile extends File {
                                __METHOD__,
                                function () use (
                                        $reupload, $wikiPage, $newPageContent, $comment, $user,
-                                       $logEntry, $logId, $descId, $tags
+                                       $logEntry, $logId, $descId, $tags, $fname
                                ) {
                                        # Update memcache after the commit
                                        $this->invalidateCache();
@@ -1758,7 +1759,7 @@ class LocalFile extends File {
                                                'logging',
                                                $update,
                                                [ 'log_id' => $logId ],
-                                               __METHOD__
+                                               $fname
                                        );
                                        $this->getRepo()->getMasterDB()->insert(
                                                'log_search',
@@ -1767,7 +1768,7 @@ class LocalFile extends File {
                                                        'ls_value' => $logEntry->getAssociatedRevId(),
                                                        'ls_log_id' => $logId,
                                                ],
-                                               __METHOD__
+                                               $fname
                                        );
 
                                        # Add change tags, if any
index d1c9455..7aa8c78 100644 (file)
@@ -107,6 +107,5 @@ class PackedImageGallery extends TraditionalImageGallery {
         * @param int $num
         */
        public function setPerRow( $num ) {
-               return;
        }
 }
index 1376d0c..a98f112 100644 (file)
@@ -75,6 +75,22 @@ class HTMLInfoField extends HTMLFormField {
                return parent::getRaw( $value );
        }
 
+       /**
+        * @param mixed $value
+        * @return OOUI\FieldLayout
+        * @since 1.32
+        */
+       public function getOOUI( $value ) {
+               if ( !empty( $this->mParams['rawrow'] ) ) {
+                       if ( !( $value instanceof OOUI\FieldLayout ) ) {
+                               throw new Exception( "'default' must be a FieldLayout or subclass when using 'rawrow'" );
+                       }
+                       return $value;
+               }
+
+               return parent::getOOUI( $value );
+       }
+
        protected function needsLabel() {
                return false;
        }
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 93d09e7..dd9f793 100644 (file)
@@ -1,6 +1,5 @@
 <?php
 
-use MediaWiki\MediaWikiServices;
 use MediaWiki\Widget\TitleInputWidget;
 
 /**
@@ -57,17 +56,10 @@ class HTMLTitleTextField extends HTMLTextField {
                                $title = Title::newFromTextThrow( $value );
                        } else {
                                // Can't use Title::makeTitleSafe(), because it doesn't throw useful exceptions
-                               $namespaceName = MediaWikiServices::getInstance()->getContentLanguage()->
-                                       getNsText( $this->mParams['namespace'] );
-                               $title = Title::newFromTextThrow( $namespaceName . ':' . $value );
+                               $title = Title::newFromTextThrow( Title::makeName( $this->mParams['namespace'], $value ) );
                        }
                } catch ( MalformedTitleException $e ) {
-                       $msg = $this->msg( $e->getErrorMessage() );
-                       $params = $e->getErrorMessageParameters();
-                       if ( $params ) {
-                               $msg->params( $params );
-                       }
-                       return $msg;
+                       return $this->msg( $e->getErrorMessage(), $e->getErrorMessageParameters() );
                }
 
                $text = $title->getPrefixedText();
index 367149d..0f8a5b0 100644 (file)
@@ -454,6 +454,7 @@ abstract class Installer {
 
                $this->parserTitle = Title::newFromText( 'Installer' );
                $this->parserOptions = new ParserOptions( $wgUser ); // language will be wrong :(
+               $this->parserOptions->setTidy( true );
                // Don't try to access DB before user language is initialised
                $this->setParserLanguage( Language::factory( 'en' ) );
        }
index 2423634..6430ece 100644 (file)
@@ -601,7 +601,7 @@ class MysqlUpdater extends DatabaseUpdater {
 
                        foreach ( $rows as $row ) {
                                if ( $prev_title == $row->cur_title && $prev_namespace == $row->cur_namespace ) {
-                                       $deleteId[] = $row->cur_id;
+                                       $deleteId[] = (int)$row->cur_id;
                                }
                                $prev_title = $row->cur_title;
                                $prev_namespace = $row->cur_namespace;
index fc1c33f..43fe748 100644 (file)
@@ -29,7 +29,7 @@ abstract class WebInstallerDocument extends WebInstallerPage {
        public function execute() {
                $text = $this->getFileContents();
                $text = InstallDocFormatter::format( $text );
-               $this->parent->output->addWikiText( $text );
+               $this->parent->output->addWikiTextInterface( $text );
                $this->startForm();
                $this->endForm( false );
        }
index cb0092d..dd76ce9 100644 (file)
@@ -89,8 +89,17 @@ class WebInstallerOutput {
 
        /**
         * @param string $text
+        * @deprecated since 1.32; use addWikiTextInterface instead
         */
        public function addWikiText( $text ) {
+               wfDeprecated( __METHOD__, '1.32' );
+               $this->addWikiTextInterface( $text );
+       }
+
+       /**
+        * @param string $text
+        */
+       public function addWikiTextInterface( $text ) {
                $this->addHTML( $this->parent->parse( $text ) );
        }
 
index 44ff0bb..0d79484 100644 (file)
@@ -30,12 +30,12 @@ class WebInstallerWelcome extends WebInstallerPage {
                                return 'continue';
                        }
                }
-               $this->parent->output->addWikiText( wfMessage( 'config-welcome' )->plain() );
+               $this->parent->output->addWikiTextInterface( wfMessage( 'config-welcome' )->plain() );
                $status = $this->parent->doEnvironmentChecks();
                if ( $status->isGood() ) {
                        $this->parent->output->addHTML( '<span class="success-message">' .
                                wfMessage( 'config-env-good' )->escaped() . '</span>' );
-                       $this->parent->output->addWikiText( wfMessage( 'config-copyright',
+                       $this->parent->output->addWikiTextInterface( wfMessage( 'config-copyright',
                                SpecialVersion::getCopyrightAndAuthorList() )->plain() );
                        $this->startForm();
                        $this->endForm();
index 8f0bdd5..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-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-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-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 87bf792..c89be17 100644 (file)
        "config-install-mainpage-failed": "Could not insert main page: $1",
        "config-install-done": "<strong>Congratulations!</strong>\nYou have installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it in the base of your wiki installation (the same directory as index.php). The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
        "config-install-done-path": "<strong>Congratulations!</strong>\nYou have installed MediaWiki.\n\nThe installer has generated a <code>LocalSettings.php</code> file.\nIt contains all your configuration.\n\nYou will need to download it and put it at <code>$4</code>. The download should have started automatically.\n\nIf the download was not offered, or if you cancelled it, you can restart the download by clicking the link below:\n\n$3\n\n<strong>Note:</strong> If you do not do this now, this generated configuration file will not be available to you later if you exit the installation without downloading it.\n\nWhen that has been done, you can <strong>[$2 enter your wiki]</strong>.",
-       "config-install-success": "MediaWiki has been successfully installed. You can now\nvisit <$1$2> to view your wiki.\nIf you have questions, check out our frequently asked questions list:\n<https://www.mediawiki.org/wiki/Manual:FAQ> or use one of the\nsupport forums linked on that page.",
+       "config-install-success": "MediaWiki has been successfully installed. You can now visit <$1$2> to view your wiki.\nIf you have questions, check out our frequently asked questions list:\n<https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ> or use one of the\nsupport forums linked on that page.",
        "config-download-localsettings": "Download <code>LocalSettings.php</code>",
        "config-help": "help",
        "config-help-tooltip": "click to expand",
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' '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-path": "<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 l'avit'azzeccà dint' 'o <code>$4</code>. '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-success": "Avite installato MediaWiki apposto. Mo' putite vedé ncopp'a <$1$2> 'o wiki vuosto.\nSi avite cocche dubbio, vedite 'e trasí dint' 'a l'elenco 'e quistione FAQ:\n<https://www.mediawiki.org/wiki/Manual:FAQ> o vedite 'e cuntattà cocche forum 'e suppuorto dint' 'a chilla paggena.",
        "config-download-localsettings": "Scarreca <code>LocalSettings.php</code>",
        "config-help": "ajùto",
        "config-help-tooltip": "cliccà pe' 'o spannere",
        "config-nofile": "'O file \"$1\" nun se trova. Forse è stato scancellato?",
        "config-extension-link": "'O sapevate ch' 'o wiki vuosto suppurtasse 'e [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions estensiune]?\n\nPutite navigà nfra chiste [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category estensiune pe' categurìa].",
-       "mainpagetext": "<strong>MediaWiki è stato nstallato.</strong>",
-       "mainpagedocfooter": "Iate a cunzultà [https://meta.wikimedia.org/wiki/Help:Contents User's Guide] pe' n'avé nfurmaziune ncopp' 'o modo aùso d' 'o software wiki.\n\n== P'accummincià ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Elenco 'e mpustaziune pe' sta configuraziona]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ 'e Mediawiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenco 'e nutizie 'e Mediawiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione 'e MediaWiki p' 'a lengua vuosta]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Mparate a cumbattere 'o spammo dint' 'a wiki d' 'a vosta]"
+       "config-skins-screenshots": "$1 (screenshots: $2)",
+       "config-extensions-requires": "$1 (vuless' 'o $2)",
+       "config-screenshot": "screenshot",
+       "mainpagetext": "<strong>MediaWiki è stato installato.</strong>",
+       "mainpagedocfooter": "Iate a cunzultà [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents User's Guide] pe' n'avé nfurmaziune ncopp' 'o modo aùso d' 'o software wiki.\n\n== P'accummincià ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Elenco 'e mpustaziune pe' sta configuraziona]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ FAQ 'e Mediawiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Elenco 'e nutizie 'e Mediawiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Localizzazzione 'e MediaWiki p' 'a lengua vuosta]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Mparate a cumbattere 'o spammo dint' 'a wiki d' 'a vosta]"
 }
index c868169..e423bcd 100644 (file)
@@ -20,7 +20,8 @@
                        "Jdforrester",
                        "Liuxinyu970226",
                        "Metalhead64",
-                       "Tacsipacsi"
+                       "Tacsipacsi",
+                       "Zoranzoki21"
                ]
        },
        "config-desc": "Short description of the installer.",
        "config-unknown-collation": "Warning messages in the MediaWiki installer for the database type MySQL when an unrecognised collation is used.",
        "config-db-web-account": "Fieldset legend in MediaWiki installer",
        "config-db-web-help": "Help text in MediaWiki installer.",
-       "config-db-web-account-same": "checkbox label",
-       "config-db-web-create": "checkbox label",
+       "config-db-web-account-same": "Checkbox label about setting of database account for web access.",
+       "config-db-web-create": "Checkbox label about creating of new database account.",
        "config-db-web-no-create-privs": "Error message in the MediaWiki installer.",
        "config-mysql-engine": "Field label for MySQL storage engine in the MediaWiki installer.",
        "config-mysql-innodb": "Option for the MySQL storage engine in the MediaWiki installer.",
index fcdaf00..0a59f10 100644 (file)
        "config-db-password": "Password d'u database:",
        "config-db-port": "Porte d'u database:",
        "config-db-schema": "Scheme pe MediaUicchi:",
-       "config-type-mysql": "MySQL (o combatibbile)",
+       "config-type-mysql": "MariaDFB, MySQL, o combatibbile",
        "config-type-postgres": "PostgreSQL",
        "config-type-sqlite": "SQLite",
        "config-type-oracle": "Oracle",
        "config-type-mssql": "Microsoft SQL Server",
-       "config-header-mysql": "'Mbostaziune de MySQL",
+       "config-header-mysql": "'Mbostaziune de MariaDB/MySQL",
        "config-header-postgres": "'Mbostaziune de PostgreSQL",
        "config-header-sqlite": "'Mbostaziune de SQLite",
        "config-header-oracle": "'Mbostaziune de Oracle",
        "config-header-mssql": "'Mbostaziune de Microsoft SQL Server",
        "config-invalid-db-type": "Tipe de database invalide.",
-       "config-mysql-innodb": "InnoDB",
+       "config-mysql-innodb": "InnoDB (conzigliate)",
        "config-mysql-myisam": "MyISAM",
        "config-ns-generic": "Proggette",
        "config-admin-email": "Indirizze e-mail:",
index 44bcb0e..49d534a 100644 (file)
@@ -1,5 +1,49 @@
 {
-       "@metadata": [],
-       "mainpagetext": "'''MediaWiki已經裝好。'''",
-       "mainpagedocfooter": "參閱[https://meta.wikimedia.org/wiki/Help:Contents 用戶指引](英),裏面有資料講點用wiki軟件。\n\n==開始使用==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings 配置設定清單](英)\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 常見問題](英)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件名單](英)"
+       "@metadata": {
+               "authors": [
+                       "Hello903hello"
+               ]
+       },
+       "config-desc": "MediaWiki安裝程式",
+       "config-title": "安裝MediaWiki$1",
+       "config-information": "資訊",
+       "config-your-language": "你嘅語言",
+       "config-your-language-help": "揀安裝程序入面用嘅語言。",
+       "config-wiki-language": "Wiki語言:",
+       "config-wiki-language-help": "揀將要安裝嘅wiki多數情況主要用嘅語言。",
+       "config-back": "← 返去",
+       "config-continue": "繼續 →",
+       "config-page-language": "語言",
+       "config-page-welcome": "歡迎使用MediaWiki!",
+       "config-page-dbconnect": "連線到資料庫",
+       "config-page-upgrade": "升級安裝咗嘅版本",
+       "config-page-dbsettings": "資料庫設定",
+       "config-page-name": "名",
+       "config-page-options": "選項",
+       "config-page-install": "安裝",
+       "config-page-complete": "搞掂!",
+       "config-page-restart": "重新開始安裝",
+       "config-page-readme": "讀我",
+       "config-page-releasenotes": "發行解",
+       "config-page-copying": "複製緊",
+       "config-page-upgradedoc": "升級緊",
+       "config-page-existingwiki": "現有wiki",
+       "config-restart": "係,重新開始",
+       "config-env-php": "安裝咗PHP$1",
+       "config-env-hhvm": "安裝咗HHVM$1",
+       "config-outdated-sqlite": "<strong>警告:</strong>你安裝咗SQLite $1,但係佢嘅版本低過最低要求版本 $2。你將會用毋到SQLite。",
+       "config-apc": "[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-diff3-bad": "搵毋到GNU diff3。",
+       "config-db-type": "資料庫類型:",
+       "config-install-mainpage-exists": "頭版已經存在,跳緊",
+       "config-install-success": "MediaWiki已經成功安裝咗。你而家可以去 <$1$2> 去睇你嘅wiki。\n如果你有任何問題,請去常見問題一覽:\n<https://www.mediawiki.org/wiki/Manual:FAQ> 或者去嗰版上面任何一個論壇搵幫手。",
+       "config-download-localsettings": "下載<code>LocalSettings.php</code>",
+       "config-help": "幫手",
+       "config-nofile": "搵毋到檔案「$1」。佢係毋係俾人刪咗?",
+       "config-skins-screenshots": "$1(螢幕截圖: $2)",
+       "config-screenshot": "螢幕截圖",
+       "mainpagetext": "<strong>MediaWiki已經裝好。</strong>",
+       "mainpagedocfooter": "請睇[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 用戶指引](英文),裏面有資料講點用wiki軟件。\n\n==開始使用==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings 配置設定清單](英文)\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki 常見問題](英文)\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki 發佈郵件名單](英文)\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources 用你講嘅文來本地化MediaWiki]\t\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam 學下點樣喺你嘅wiki度對付破壞]"
 }
index 05cf933..cdf4cde 100644 (file)
@@ -279,10 +279,11 @@ class ClassicInterwikiLookup implements InterwikiLookup {
                        }
                }
 
+               $fname = __METHOD__;
                $iwData = $this->objectCache->getWithSetCallback(
                        $this->objectCache->makeKey( 'interwiki', $prefix ),
                        $this->objectCacheExpiry,
-                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $prefix ) {
+                       function ( $oldValue, &$ttl, array &$setOpts ) use ( $prefix, $fname ) {
                                $dbr = wfGetDB( DB_REPLICA ); // TODO: inject LoadBalancer
 
                                $setOpts += Database::getCacheSetOptions( $dbr );
@@ -291,7 +292,7 @@ class ClassicInterwikiLookup implements InterwikiLookup {
                                        'interwiki',
                                        self::selectFields(),
                                        [ 'iw_prefix' => $prefix ],
-                                       __METHOD__
+                                       $fname
                                );
 
                                return $row ? (array)$row : '!NONEXISTENT';
index 689326e..0b85fbe 100644 (file)
@@ -264,8 +264,6 @@ class JobQueueDB extends JobQueue {
                if ( $flags & self::QOS_ATOMIC ) {
                        $dbw->endAtomic( $method );
                }
-
-               return;
        }
 
        /**
index dab9b14..1e83167 100644 (file)
@@ -576,12 +576,12 @@ class JobRunner implements LoggerAwareInterface {
                $this->debugCallback( $msg );
 
                // Wait for an exclusive lock to commit
-               if ( !$dbwSerial->lock( 'jobrunner-serial-commit', __METHOD__, 30 ) ) {
+               if ( !$dbwSerial->lock( 'jobrunner-serial-commit', $fnameTrxOwner, 30 ) ) {
                        // This will trigger a rollback in the main loop
                        throw new DBError( $dbwSerial, "Timed out waiting on commit queue." );
                }
-               $unlocker = new ScopedCallback( function () use ( $dbwSerial ) {
-                       $dbwSerial->unlock( 'jobrunner-serial-commit', __METHOD__ );
+               $unlocker = new ScopedCallback( function () use ( $dbwSerial, $fnameTrxOwner ) {
+                       $dbwSerial->unlock( 'jobrunner-serial-commit', $fnameTrxOwner );
                } );
 
                // Wait for the replica DBs to catch up
index 5d8a6cf..ef364b5 100644 (file)
@@ -36,11 +36,12 @@ class PurgeJobUtils {
                if ( $dbkeys === [] ) {
                        return;
                }
+               $fname = __METHOD__;
 
                DeferredUpdates::addUpdate( new AutoCommitUpdate(
                        $dbw,
                        __METHOD__,
-                       function () use ( $dbw, $namespace, $dbkeys ) {
+                       function () use ( $dbw, $namespace, $dbkeys, $fname ) {
                                $services = MediaWikiServices::getInstance();
                                $lbFactory = $services->getDBLoadBalancerFactory();
                                // Determine which pages need to be updated.
@@ -55,7 +56,7 @@ class PurgeJobUtils {
                                                'page_title' => $dbkeys,
                                                'page_touched < ' . $dbw->addQuotes( $now )
                                        ],
-                                       __METHOD__
+                                       $fname
                                );
 
                                if ( !$ids ) {
@@ -63,7 +64,7 @@ class PurgeJobUtils {
                                }
 
                                $batchSize = $services->getMainConfig()->get( 'UpdateRowsPerQuery' );
-                               $ticket = $lbFactory->getEmptyTransactionTicket( __METHOD__ );
+                               $ticket = $lbFactory->getEmptyTransactionTicket( $fname );
                                foreach ( array_chunk( $ids, $batchSize ) as $idBatch ) {
                                        $dbw->update(
                                                'page',
@@ -72,9 +73,9 @@ class PurgeJobUtils {
                                                        'page_id' => $idBatch,
                                                        'page_touched < ' . $dbw->addQuotes( $now ) // handle races
                                                ],
-                                               __METHOD__
+                                               $fname
                                        );
-                                       $lbFactory->commitAndWaitForReplication( __METHOD__, $ticket );
+                                       $lbFactory->commitAndWaitForReplication( $fname, $ticket );
                                }
                        }
                ) );
index e276d09..f37364f 100644 (file)
@@ -1020,13 +1020,35 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
        abstract protected function doQuery( $sql );
 
        /**
-        * Determine whether a query writes to the DB.
-        * Should return true if unsure.
+        * Determine whether a query writes to the DB. When in doubt, this returns true.
+        *
+        * Main use cases:
+        *
+        * - Subsequent web requests should not need to wait for replication from
+        *   the master position seen by this web request, unless this request made
+        *   changes to the master. This is handled by ChronologyProtector by checking
+        *   doneWrites() at the end of the request. doneWrites() returns true if any
+        *   query set lastWriteTime; which query() does based on isWriteQuery().
+        *
+        * - Reject write queries to replica DBs, in query().
         *
         * @param string $sql
         * @return bool
         */
        protected function isWriteQuery( $sql ) {
+               // BEGIN and COMMIT queries are considered read queries here.
+               // Database backends and drivers (MySQL, MariaDB, php-mysqli) generally
+               // treat these as write queries, in that their results have "affected rows"
+               // as meta data as from writes, instead of "num rows" as from reads.
+               // But, we treat them as read queries because when reading data (from
+               // either replica or master) we use transactions to enable repeatable-read
+               // snapshots, which ensures we get consistent results from the same snapshot
+               // for all queries within a request. Use cases:
+               // - Treating these as writes would trigger ChronologyProtector (see method doc).
+               // - We use this method to reject writes to replicas, but we need to allow
+               //   use of transactions on replicas for read snapshots. This fine given
+               //   that transactions by themselves don't make changes, only actual writes
+               //   within the transaction matter, which we still detect.
                return !preg_match(
                        '/^(?:SELECT|BEGIN|ROLLBACK|COMMIT|SET|SHOW|EXPLAIN|\(SELECT)\b/i', $sql );
        }
@@ -1041,17 +1063,21 @@ abstract class Database implements IDatabase, IMaintainableDatabase, LoggerAware
 
        /**
         * Determine whether a SQL statement is sensitive to isolation level.
+        *
         * A SQL statement is considered transactable if its result could vary
         * depending on the transaction isolation level. Operational commands
         * such as 'SET' and 'SHOW' are not considered to be transactable.
         *
+        * Main purpose: Used by query() to decide whether to begin a transaction
+        * before the current query (in DBO_TRX mode, on by default).
+        *
         * @param string $sql
         * @return bool
         */
        protected function isTransactableQuery( $sql ) {
                return !in_array(
                        $this->getQueryVerb( $sql ),
-                       [ 'BEGIN', 'COMMIT', 'ROLLBACK', 'SHOW', 'SET', 'CREATE', 'ALTER' ],
+                       [ 'BEGIN', 'ROLLBACK', 'COMMIT', 'SET', 'SHOW', 'CREATE', 'ALTER' ],
                        true
                );
        }
index 0f57551..8d82965 100644 (file)
@@ -824,11 +824,12 @@ abstract class DatabaseMysqlBase extends Database {
                        // Using one key for all cluster replica DBs is preferable
                        $this->getLBInfo( 'clusterMasterHost' ) ?: $this->getServer()
                );
+               $fname = __METHOD__;
 
                return $cache->getWithSetCallback(
                        $key,
                        $cache::TTL_INDEFINITE,
-                       function () use ( $cache, $key ) {
+                       function () use ( $cache, $key, $fname ) {
                                // Get and leave a lock key in place for a short period
                                if ( !$cache->lock( $key, 0, 10 ) ) {
                                        return false; // avoid master connection spike slams
@@ -841,7 +842,7 @@ abstract class DatabaseMysqlBase extends Database {
 
                                // Connect to and query the master; catch errors to avoid outages
                                try {
-                                       $res = $conn->query( 'SELECT @@server_id AS id', __METHOD__ );
+                                       $res = $conn->query( 'SELECT @@server_id AS id', $fname );
                                        $row = $res ? $res->fetchObject() : false;
                                        $id = $row ? (int)$row->id : 0;
                                } catch ( DBError $e ) {
@@ -1043,11 +1044,12 @@ abstract class DatabaseMysqlBase extends Database {
         * @throws DBQueryError If the variable doesn't exist for some reason
         */
        protected function getServerId() {
+               $fname = __METHOD__;
                return $this->srvCache->getWithSetCallback(
                        $this->srvCache->makeGlobalKey( 'mysql-server-id', $this->getServer() ),
                        self::SERVER_ID_CACHE_TTL,
-                       function () {
-                               $res = $this->query( "SELECT @@server_id AS id", __METHOD__ );
+                       function () use ( $fname ) {
+                               $res = $this->query( "SELECT @@server_id AS id", $fname );
                                return intval( $this->fetchObject( $res )->id );
                        }
                );
index 3c2f145..691a4b7 100644 (file)
@@ -861,6 +861,9 @@ __INDEXATTR__;
                return false;
        }
 
+       /**
+        * @suppress SecurityCheck-SQLInjection array_map not recognized T204911
+        */
        public function listTables( $prefix = null, $fname = __METHOD__ ) {
                $eschemas = implode( ',', array_map( [ $this, 'addQuotes' ], $this->getCoreSchemas() ) );
                $result = $this->query(
index c8edc39..9d5eca6 100644 (file)
@@ -297,7 +297,7 @@ class DatabaseSqlite extends Database {
                return $this->query( "ATTACH DATABASE $file AS $name", $fname );
        }
 
-       function isWriteQuery( $sql ) {
+       protected function isWriteQuery( $sql ) {
                return parent::isWriteQuery( $sql ) && !preg_match( '/^(ATTACH|PRAGMA)\b/i', $sql );
        }
 
index e736ab9..1612f41 100644 (file)
@@ -728,8 +728,3 @@ abstract class LBFactory implements ILBFactory {
                $this->destroy();
        }
 }
-
-/**
- * @deprecated since 1.29
- */
-class_alias( LBFactory::class, 'LBFactory' );
index 00b4130..f36d98e 100644 (file)
@@ -1256,10 +1256,11 @@ class LoadBalancer implements ILoadBalancer {
        }
 
        public function closeAll() {
-               $this->forEachOpenConnection( function ( IDatabase $conn ) {
+               $fname = __METHOD__;
+               $this->forEachOpenConnection( function ( IDatabase $conn ) use ( $fname ) {
                        $host = $conn->getServer();
                        $this->connLogger->debug(
-                               __METHOD__ . ": closing connection to database '$host'." );
+                               $fname . ": closing connection to database '$host'." );
                        $conn->close();
                } );
 
@@ -1447,6 +1448,7 @@ class LoadBalancer implements ILoadBalancer {
                } );
 
                $e = null; // first exception
+               $fname = __METHOD__;
                // Loop until callbacks stop adding callbacks on other connections
                do {
                        // Run any pending callbacks for each connection...
@@ -1464,13 +1466,13 @@ class LoadBalancer implements ILoadBalancer {
                                }
                        );
                        // Clear out any active transactions left over from callbacks...
-                       $this->forEachOpenMasterConnection( function ( Database $conn ) use ( &$e ) {
+                       $this->forEachOpenMasterConnection( function ( Database $conn ) use ( &$e, $fname ) {
                                if ( $conn->writesPending() ) {
                                        // A callback from another handle wrote to this one and DBO_TRX is set
-                                       $this->queryLogger->warning( __METHOD__ . ": found writes pending." );
+                                       $this->queryLogger->warning( $fname . ": found writes pending." );
                                        $fnames = implode( ', ', $conn->pendingWriteAndCallbackCallers() );
                                        $this->queryLogger->warning(
-                                               __METHOD__ . ": found writes pending ($fnames).",
+                                               $fname . ": found writes pending ($fnames).",
                                                [
                                                        'db_server' => $conn->getServer(),
                                                        'db_name' => $conn->getDBname()
@@ -1479,10 +1481,10 @@ class LoadBalancer implements ILoadBalancer {
                                } elseif ( $conn->trxLevel() ) {
                                        // A callback from another handle read from this one and DBO_TRX is set,
                                        // which can easily happen if there is only one DB (no replicas)
-                                       $this->queryLogger->debug( __METHOD__ . ": found empty transaction." );
+                                       $this->queryLogger->debug( $fname . ": found empty transaction." );
                                }
                                try {
-                                       $conn->commit( __METHOD__, $conn::FLUSHING_ALL_PEERS );
+                                       $conn->commit( $fname, $conn::FLUSHING_ALL_PEERS );
                                } catch ( Exception $ex ) {
                                        $e = $e ?: $ex;
                                }
index 73ecc9d..3f8a11b 100644 (file)
@@ -181,7 +181,7 @@ class ParsoidVirtualRESTService extends VirtualRESTService {
                                unset( $req['query']['oldid'] );
                        }
                } elseif ( $reqType === 'transform' ) {
-                       $req['url'] .= 'transform/'. $parts[3] . '/to/' . $parts[5];
+                       $req['url'] .= 'transform/' . $parts[3] . '/to/' . $parts[5];
                        // the title
                        if ( isset( $parts[6] ) ) {
                                $req['url'] .= '/' . $parts[6];
index 1b66c38..000bbe3 100644 (file)
@@ -46,22 +46,14 @@ class MailAddress {
        public $address;
 
        /**
-        * @param string $address String with an email address, or a User object
+        * @param string $address String with an email address
         * @param string|null $name Human-readable name if a string address is given
         * @param string|null $realName Human-readable real name if a string address is given
         */
        function __construct( $address, $name = null, $realName = null ) {
-               if ( is_object( $address ) && $address instanceof User ) {
-                       // Old calling format, now deprecated
-                       wfDeprecated( __METHOD__ . ' with a User object', '1.24' );
-                       $this->address = $address->getEmail();
-                       $this->name = $address->getName();
-                       $this->realName = $address->getRealName();
-               } else {
-                       $this->address = strval( $address );
-                       $this->name = strval( $name );
-                       $this->realName = strval( $realName );
-               }
+               $this->address = strval( $address );
+               $this->name = strval( $name );
+               $this->realName = strval( $realName );
        }
 
        /**
index 287c198..91bed4a 100644 (file)
@@ -259,13 +259,13 @@ class JpegHandler extends ExifBitmapHandler {
 
                // Make a regex out of the source data to match it to an array of color
                // spaces in a case-insensitive way
-               $colorSpaceRegex = '/'.preg_quote( $data[0], '/' ).'/i';
+               $colorSpaceRegex = '/' . preg_quote( $data[0], '/' ) . '/i';
                if ( empty( preg_grep( $colorSpaceRegex, $colorSpaces ) ) ) {
                        // We can't establish that this file matches the color space, don't process it
                        return false;
                }
 
-               $profileRegex = '/'.preg_quote( $data[1], '/' ).'/i';
+               $profileRegex = '/' . preg_quote( $data[1], '/' ) . '/i';
                if ( empty( preg_grep( $profileRegex, $oldProfileStrings ) ) ) {
                        // We can't establish that this file has the expected ICC profile, don't process it
                        return false;
index 7404f83..b6f5dce 100644 (file)
@@ -22,6 +22,7 @@
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 
 /**
  * Class for viewing MediaWiki article and history.
@@ -355,7 +356,7 @@ class Article implements Page {
                                if ( $this->mRevision !== null ) {
                                        // Revision title doesn't match the page title given?
                                        if ( $this->mPage->getId() != $this->mRevision->getPage() ) {
-                                               $function = get_class( $this->mPage ). '::newFromID';
+                                               $function = get_class( $this->mPage ) . '::newFromID';
                                                $this->mPage = $function( $this->mRevision->getPage() );
                                        }
                                }
@@ -524,7 +525,7 @@ class Article implements Page {
        private function applyContentOverride( Content $override ) {
                // Construct a fake revision
                $rev = new MutableRevisionRecord( $this->getTitle() );
-               $rev->setContent( 'main', $override );
+               $rev->setContent( SlotRecord::MAIN, $override );
 
                $this->mRevision = new Revision( $rev );
 
@@ -817,6 +818,7 @@ class Article implements Page {
                // Note that the ArticleViewHeader hook is allowed to set $outputDone to a
                // ParserOutput instance.
                $pOutput = ( $outputDone instanceof ParserOutput )
+                       // phpcs:ignore MediaWiki.Usage.NestedInlineTernary.UnparenthesizedTernary -- FIXME T203805
                        ? $outputDone // object fetched by hook
                        : $this->mParserOutput ?: null; // ParserOutput or null, avoid false
 
@@ -869,7 +871,7 @@ class Article implements Page {
                // TODO: find a *good* place for the code that determines the redirect target for
                // a given revision!
                // NOTE: Use main slot content. Compare code in DerivedPageDataUpdater::revisionIsRedirect.
-               $content = $revision->getContent( 'main' );
+               $content = $revision->getContent( SlotRecord::MAIN );
                return $content ? $content->getRedirectTarget() : null;
        }
 
@@ -2155,7 +2157,7 @@ class Article implements Page {
 
        /**
         * Lightweight method to get the parser output for a page, checking the parser cache
-        * and so on. Doesn't consider most of the stuff that WikiPage::view is forced to
+        * and so on. Doesn't consider most of the stuff that Article::view() is forced to
         * consider, so it's not appropriate to use there.
         *
         * @since 1.16 (r52326) for LiquidThreads
@@ -2304,8 +2306,13 @@ class Article implements Page {
         * Call to WikiPage function for backwards compatibility.
         * @see WikiPage::doDeleteUpdates
         */
-       public function doDeleteUpdates( $id, Content $content = null ) {
-               return $this->mPage->doDeleteUpdates( $id, $content );
+       public function doDeleteUpdates(
+               $id,
+               Content $content = null,
+               $revision = null,
+               User $user = null
+       ) {
+               $this->mPage->doDeleteUpdates( $id, $content, $revision, $user );
        }
 
        /**
index 1f87d93..0a07c68 100644 (file)
@@ -266,7 +266,7 @@ class ImageHistoryList extends ContextSource {
                } else {
                        $row .=
                                '<td dir="' . MediaWikiServices::getInstance()->getContentLanguage()->getDir() .
-                               '">' .  Linker::formatComment( $description, $this->title ) . '</td>';
+                               '">' . Linker::formatComment( $description, $this->title ) . '</td>';
                }
 
                $rowClass = null;
index 20bc614..799c33a 100644 (file)
@@ -18,6 +18,8 @@
  * @file
  */
 
+use Wikimedia\Timestamp\TimestampException;
+
 class ImageHistoryPseudoPager extends ReverseChronologicalPager {
        protected $preventClickjacking = false;
 
@@ -138,6 +140,14 @@ class ImageHistoryPseudoPager extends ReverseChronologicalPager {
                if ( !$this->mImg->exists() ) {
                        return;
                }
+               // Make sure the date (probably from user input) is valid; if not, drop it.
+               if ( $this->mOffset !== null ) {
+                       try {
+                               $sadlyWeCannotPassThisTimestampDownTheStack = $this->mDb->timestamp( $this->mOffset );
+                       } catch ( TimestampException $e ) {
+                               $this->mOffset = null;
+                       }
+               }
                $queryLimit = $this->mLimit + 1; // limit plus extra row
                if ( $this->mIsBackwards ) {
                        // Fetch the file history
index bf21a56..7c97465 100644 (file)
@@ -29,6 +29,7 @@ use MediaWiki\Storage\PageUpdater;
 use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionSlotsUpdate;
 use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SlotRecord;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\FakeResultWrapper;
 use Wikimedia\Rdbms\IDatabase;
@@ -1493,7 +1494,7 @@ class WikiPage implements Page, IDBAccessObject {
                $bSlots = $b->getRevisionRecord()->getSlots();
                $changedRoles = $aSlots->getRolesWithDifferentContent( $bSlots );
 
-               return ( $changedRoles !== [ 'main' ] && $changedRoles !== [] );
+               return ( $changedRoles !== [ SlotRecord::MAIN ] && $changedRoles !== [] );
        }
 
        /**
@@ -1852,13 +1853,13 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                $slotsUpdate = new RevisionSlotsUpdate();
-               $slotsUpdate->modifyContent( 'main', $content );
+               $slotsUpdate->modifyContent( SlotRecord::MAIN, $content );
 
                // NOTE: while doEditContent() executes, callbacks to getDerivedDataUpdater and
                // prepareContentForEdit will generally use the DerivedPageDataUpdater that is also
                // used by this PageUpdater. However, there is no guarantee for this.
                $updater = $this->newPageUpdater( $user, $slotsUpdate );
-               $updater->setContent( 'main', $content );
+               $updater->setContent( SlotRecord::MAIN, $content );
                $updater->setOriginalRevisionId( $originalRevId );
                $updater->setUndidRevisionId( $undidRevId );
 
@@ -1965,7 +1966,7 @@ class WikiPage implements Page, IDBAccessObject {
                        $revision = $revision->getRevisionRecord();
                }
 
-               $slots = RevisionSlotsUpdate::newFromContent( [ 'main' => $content ] );
+               $slots = RevisionSlotsUpdate::newFromContent( [ SlotRecord::MAIN => $content ] );
                $updater = $this->getDerivedDataUpdater( $user, $revision, $slots );
 
                if ( !$updater->isUpdatePrepared() ) {
@@ -2820,15 +2821,21 @@ class WikiPage implements Page, IDBAccessObject {
         * Do some database updates after deletion
         *
         * @param int $id The page_id value of the page being deleted
-        * @param Content|null $content Optional page content to be used when determining
+        * @param Content|null $content Page content to be used when determining
         *   the required updates. This may be needed because $this->getContent()
         *   may already return null when the page proper was deleted.
-        * @param Revision|null $revision The latest page revision
+        * @param RevisionRecord|Revision|null $revision The current page revision at the time of
+        *   deletion, used when determining the required updates. This may be needed because
+        *   $this->getRevision() may already return null when the page proper was deleted.
         * @param User|null $user The user that caused the deletion
         */
        public function doDeleteUpdates(
                $id, Content $content = null, Revision $revision = null, User $user = null
        ) {
+               if ( $id !== $this->getId() ) {
+                       throw new InvalidArgumentException( 'Mismatching page ID' );
+               }
+
                try {
                        $countable = $this->isCountable();
                } catch ( Exception $ex ) {
@@ -2843,7 +2850,9 @@ class WikiPage implements Page, IDBAccessObject {
                ) );
 
                // Delete pagelinks, update secondary indexes, etc
-               $updates = $this->getDeletionUpdates( $content );
+               $updates = $this->getDeletionUpdates(
+                       $revision ? $revision->getRevisionRecord() : $content
+               );
                foreach ( $updates as $update ) {
                        DeferredUpdates::addUpdate( $update );
                }
@@ -3060,8 +3069,8 @@ class WikiPage implements Page, IDBAccessObject {
                }
 
                // TODO: MCR: also log model changes in other slots, in case that becomes possible!
-               $currentContent = $current->getContent( 'main' );
-               $targetContent = $target->getContent( 'main' );
+               $currentContent = $current->getContent( SlotRecord::MAIN );
+               $targetContent = $target->getContent( SlotRecord::MAIN );
                $changingContentModel = $targetContent->getModel() !== $currentContent->getModel();
 
                if ( in_array( 'mw-rollback', ChangeTags::getSoftwareTags() ) ) {
@@ -3281,7 +3290,7 @@ class WikiPage implements Page, IDBAccessObject {
        ) {
                // TODO: move this into a PageEventEmitter service
 
-               if ( $slotsChanged === null || in_array( 'main',  $slotsChanged ) ) {
+               if ( $slotsChanged === null || in_array( SlotRecord::MAIN,  $slotsChanged ) ) {
                        // Invalidate caches of articles which include this page.
                        // Only for the main slot, because only the main slot is transcluded.
                        // TODO: MCR: not true for TemplateStyles! [SlotHandler]
@@ -3545,32 +3554,68 @@ class WikiPage implements Page, IDBAccessObject {
         * updates should remove any information about this page from secondary data
         * stores such as links tables.
         *
-        * @param Content|null $content Optional Content object for determining the
-        *   necessary updates.
+        * @param RevisionRecord|Content|null $rev The revision being deleted. Also accepts a Content
+        *       object for backwards compatibility.
         * @return DeferrableUpdate[]
         */
-       public function getDeletionUpdates( Content $content = null ) {
-               if ( !$content ) {
-                       // load content object, which may be used to determine the necessary updates.
-                       // XXX: the content may not be needed to determine the updates.
+       public function getDeletionUpdates( $rev = null ) {
+               if ( !$rev ) {
+                       wfDeprecated( __METHOD__ . ' without a RevisionRecord', '1.32' );
+
                        try {
-                               $content = $this->getContent( Revision::RAW );
+                               $rev = $this->getRevisionRecord();
                        } catch ( Exception $ex ) {
                                // If we can't load the content, something is wrong. Perhaps that's why
                                // the user is trying to delete the page, so let's not fail in that case.
                                // Note that doDeleteArticleReal() will already have logged an issue with
                                // loading the content.
+                               wfDebug( __METHOD__ . ' failed to load current revision of page ' . $this->getId() );
                        }
                }
 
-               if ( !$content ) {
-                       $updates = [];
+               if ( !$rev ) {
+                       $slotContent = [];
+               } elseif ( $rev instanceof Content ) {
+                       wfDeprecated( __METHOD__ . ' with a Content object instead of a RevisionRecord', '1.32' );
+
+                       $slotContent = [ SlotRecord::MAIN => $rev ];
                } else {
-                       $updates = $content->getDeletionUpdates( $this );
+                       $slotContent = array_map( function ( SlotRecord $slot ) {
+                               return $slot->getContent( Revision::RAW );
+                       }, $rev->getSlots()->getSlots() );
                }
 
-               Hooks::run( 'WikiPageDeletionUpdates', [ $this, $content, &$updates ] );
-               return $updates;
+               $allUpdates = [ new LinksDeletionUpdate( $this ) ];
+
+               // NOTE: once Content::getDeletionUpdates() is removed, we only need to content
+               // model here, not the content object!
+               // TODO: consolidate with similar logic in DerivedPageDataUpdater::getSecondaryDataUpdates()
+               /** @var Content $content */
+               foreach ( $slotContent as $role => $content ) {
+                       $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( $this );
+
+                       // HACK: filter out redundant and incomplete LinksDeletionUpdate
+                       $legacyUpdates = array_filter( $legacyUpdates, function ( $update ) {
+                               return !( $update instanceof LinksDeletionUpdate );
+                       } );
+
+                       $allUpdates = array_merge( $allUpdates, $legacyUpdates );
+               }
+
+               Hooks::run( 'PageDeletionDataUpdates', [ $this->getTitle(), $rev, &$allUpdates ] );
+
+               // TODO: hard deprecate old hook in 1.33
+               Hooks::run( 'WikiPageDeletionUpdates', [ $this, $content, &$allUpdates ] );
+               return $allUpdates;
        }
 
        /**
index 7ce125d..05af4fd 100644 (file)
@@ -80,6 +80,7 @@ abstract class IndexPager extends ContextSource implements Pager {
        public $mDefaultLimit = 50;
        public $mOffset, $mLimit;
        public $mQueryDone = false;
+       /** @var IDatabase */
        public $mDb;
        public $mPastTheEndRow;
 
index 5788986..a73c28c 100644 (file)
@@ -71,6 +71,7 @@ class MWTidy {
                                $config = $wgTidyConfig;
                        } elseif ( $wgUseTidy ) {
                                // b/c configuration
+                               wfDeprecated( '$wgUseTidy', '1.26' );
                                $config = [
                                        'tidyConfigFile' => $wgTidyConf,
                                        'debugComment' => $wgDebugTidy,
@@ -86,6 +87,7 @@ class MWTidy {
                                        $config['driver'] = 'RaggettExternal';
                                }
                        } else {
+                               wfDeprecated( '$wgTidyConfig = null and $wgUseTidy = false', '1.26' );
                                return false;
                        }
                        self::$instance = self::factory( $config );
index 7d5a362..90ef335 100644 (file)
@@ -292,8 +292,8 @@ class Parser {
                        self::EXT_LINK_URL_CLASS . '*)\p{Zs}*([^\]\\x00-\\x08\\x0a-\\x1F\\x{FFFD}]*?)\]/Su';
                if ( isset( $conf['preprocessorClass'] ) ) {
                        $this->mPreprocessorClass = $conf['preprocessorClass'];
-               } elseif ( defined( 'HPHP_VERSION' ) ) {
-                       # Preprocessor_Hash is much faster than Preprocessor_DOM under HipHop
+               } elseif ( wfIsHHVM() ) {
+                       # Under HHVM Preprocessor_Hash is much faster than Preprocessor_DOM
                        $this->mPreprocessorClass = Preprocessor_Hash::class;
                } elseif ( extension_loaded( 'domxml' ) ) {
                        # PECL extension that conflicts with the core DOM extension (T15770)
@@ -5143,24 +5143,18 @@ class Parser {
                                                                break;
                                                        case 'gallery-internal-link':
                                                                $linkValue = strip_tags( $this->replaceLinkHoldersText( $match ) );
-                                                               $chars = self::EXT_LINK_URL_CLASS;
-                                                               $addr = self::EXT_LINK_ADDR;
-                                                               $prots = $this->mUrlProtocols;
-                                                               // check to see if link matches an absolute url, if not then it must be a wiki link.
                                                                if ( preg_match( '/^-{R|(.*)}-$/', $linkValue ) ) {
                                                                        // Result of LanguageConverter::markNoConversion
                                                                        // invoked on an external link.
                                                                        $linkValue = substr( $linkValue, 4, -2 );
                                                                }
-                                                               if ( preg_match( "/^($prots)$addr$chars*$/u", $linkValue ) ) {
-                                                                       $link = $linkValue;
-                                                                       $this->mOutput->addExternalLink( $link );
-                                                               } else {
-                                                                       $localLinkTitle = Title::newFromText( $linkValue );
-                                                                       if ( $localLinkTitle !== null ) {
-                                                                               $this->mOutput->addLink( $localLinkTitle );
-                                                                               $link = $localLinkTitle->getLinkURL();
-                                                                       }
+                                                               list( $type, $target ) = $this->parseLinkParameter( $linkValue );
+                                                               if ( $type === 'link-url' ) {
+                                                                       $link = $target;
+                                                                       $this->mOutput->addExternalLink( $target );
+                                                               } elseif ( $type === 'link-title' ) {
+                                                                       $link = $target->getLinkURL();
+                                                                       $this->mOutput->addLink( $target );
                                                                }
                                                                break;
                                                        default:
@@ -5342,29 +5336,16 @@ class Parser {
                                                                $value = $this->stripAltText( $value, $holders );
                                                                break;
                                                        case 'link':
-                                                               $chars = self::EXT_LINK_URL_CLASS;
-                                                               $addr = self::EXT_LINK_ADDR;
-                                                               $prots = $this->mUrlProtocols;
-                                                               if ( $value === '' ) {
-                                                                       $paramName = 'no-link';
-                                                                       $value = true;
+                                                               list( $paramName, $value ) = $this->parseLinkParameter( $value );
+                                                               if ( $paramName ) {
                                                                        $validated = true;
-                                                               } elseif ( preg_match( "/^((?i)$prots)/", $value ) ) {
-                                                                       if ( preg_match( "/^((?i)$prots)$addr$chars*$/u", $value, $m ) ) {
-                                                                               $paramName = 'link-url';
-                                                                               $this->mOutput->addExternalLink( $value );
+                                                                       if ( $paramName === 'no-link' ) {
+                                                                               $value = true;
+                                                                       }
+                                                                       if ( $paramName === 'link-url' ) {
                                                                                if ( $this->mOptions->getExternalLinkTarget() ) {
                                                                                        $params[$type]['link-target'] = $this->mOptions->getExternalLinkTarget();
                                                                                }
-                                                                               $validated = true;
-                                                                       }
-                                                               } else {
-                                                                       $linkTitle = Title::newFromText( $value );
-                                                                       if ( $linkTitle ) {
-                                                                               $paramName = 'link-title';
-                                                                               $value = $linkTitle;
-                                                                               $this->mOutput->addLink( $linkTitle );
-                                                                               $validated = true;
                                                                        }
                                                                }
                                                                break;
@@ -5459,6 +5440,48 @@ class Parser {
                return $ret;
        }
 
+       /**
+        * Parse the value of 'link' parameter in image syntax (`[[File:Foo.jpg|link=<value>]]`).
+        *
+        * Adds an entry to appropriate link tables.
+        *
+        * @since 1.32
+        * @return array of `[ type, target ]`, where:
+        *   - `type` is one of:
+        *     - `null`: Given value is not a valid link target, use default
+        *     - `'no-link'`: Given value is empty, do not generate a link
+        *     - `'link-url'`: Given value is a valid external link
+        *     - `'link-title'`: Given value is a valid internal link
+        *   - `target` is:
+        *     - When `type` is `null` or `'no-link'`: `false`
+        *     - When `type` is `'link-url'`: URL string corresponding to given value
+        *     - When `type` is `'link-title'`: Title object corresponding to given value
+        */
+       public function parseLinkParameter( $value ) {
+               $chars = self::EXT_LINK_URL_CLASS;
+               $addr = self::EXT_LINK_ADDR;
+               $prots = $this->mUrlProtocols;
+               $type = null;
+               $target = false;
+               if ( $value === '' ) {
+                       $type = 'no-link';
+               } elseif ( preg_match( "/^((?i)$prots)/", $value ) ) {
+                       if ( preg_match( "/^((?i)$prots)$addr$chars*$/u", $value, $m ) ) {
+                               $this->mOutput->addExternalLink( $value );
+                               $type = 'link-url';
+                               $target = $value;
+                       }
+               } else {
+                       $linkTitle = Title::newFromText( $value );
+                       if ( $linkTitle ) {
+                               $this->mOutput->addLink( $linkTitle );
+                               $type = 'link-title';
+                               $target = $linkTitle;
+                       }
+               }
+               return [ $type, $target ];
+       }
+
        /**
         * @param string $caption
         * @param LinkHolderArray|bool $holders
index 0326499..6d6dd89 100644 (file)
@@ -1088,7 +1088,7 @@ class PPFrame_Hash implements PPFrame {
                        } elseif ( is_array( $contextNode ) ) {
                                // Node descriptor array
                                if ( count( $contextNode ) !== 2 ) {
-                                       throw new MWException( __METHOD__.
+                                       throw new MWException( __METHOD__ .
                                                ': found an array where a node descriptor should be' );
                                }
                                list( $contextName, $contextChildren ) = $contextNode;
@@ -1786,7 +1786,7 @@ class PPNode_Hash_Tree implements PPNode {
                                $class = self::class;
                        }
                } else {
-                       throw new MWException( __METHOD__.': invalid node descriptor' );
+                       throw new MWException( __METHOD__ . ': invalid node descriptor' );
                }
                return new $class( $store, $index );
        }
@@ -2206,7 +2206,7 @@ class PPNode_Hash_Attr implements PPNode {
        public function __construct( array $store, $index ) {
                $descriptor = $store[$index];
                if ( $descriptor[PPNode_Hash_Tree::NAME][0] !== '@' ) {
-                       throw new MWException( __METHOD__.': invalid name in attribute descriptor' );
+                       throw new MWException( __METHOD__ . ': invalid name in attribute descriptor' );
                }
                $this->name = substr( $descriptor[PPNode_Hash_Tree::NAME], 1 );
                $this->value = $descriptor[PPNode_Hash_Tree::CHILDREN][0];
index 2839147..41c6bf4 100644 (file)
@@ -26,10 +26,18 @@ class RemexStripTagHandler implements TokenHandler {
                $this->text .= substr( $text, $start, $length );
        }
        function startTag( $name, Attributes $attrs, $selfClose, $sourceStart, $sourceLength ) {
-               // Do nothing.
+               // Inject whitespace for typical block-level tags to
+               // prevent merging unrelated<br>words.
+               if ( $this->isBlockLevelTag( $name ) ) {
+                       $this->text .= ' ';
+               }
        }
        function endTag( $name, $sourceStart, $sourceLength ) {
-               // Do nothing.
+               // Inject whitespace for typical block-level tags to
+               // prevent merging unrelated<br>words.
+               if ( $this->isBlockLevelTag( $name ) ) {
+                       $this->text .= ' ';
+               }
        }
        function doctype( $name, $public, $system, $quirks, $sourceStart, $sourceLength ) {
                // Do nothing.
@@ -37,4 +45,63 @@ class RemexStripTagHandler implements TokenHandler {
        function comment( $text, $sourceStart, $sourceLength ) {
                // Do nothing.
        }
+
+       // Per https://developer.mozilla.org/en-US/docs/Web/HTML/Block-level_elements
+       // retrieved on sept 12, 2018. <br> is not block level but was added anyways.
+       // The following is a complete list of all HTML block level elements
+       // (although "block-level" is not technically defined for elements that are
+       // new in HTML5).
+       // Structured as tag => true to allow O(1) membership test.
+       static private $BLOCK_LEVEL_TAGS = [
+               'address' => true,
+               'article' => true,
+               'aside' => true,
+               'blockquote' => true,
+               'br' => true,
+               'canvas' => true,
+               'dd' => true,
+               'div' => true,
+               'dl' => true,
+               'dt' => true,
+               'fieldset' => true,
+               'figcaption' => true,
+               'figure' => true,
+               'figcaption' => true,
+               'footer' => true,
+               'form' => true,
+               'h1' => true,
+               'h2' => true,
+               'h3' => true,
+               'h4' => true,
+               'h5' => true,
+               'h6' => true,
+               'header' => true,
+               'hgroup' => true,
+               'hr' => true,
+               'li' => true,
+               'main' => true,
+               'nav' => true,
+               'noscript' => true,
+               'ol' => true,
+               'output' => true,
+               'p' => true,
+               'pre' => true,
+               'section' => true,
+               'table' => true,
+               'tfoot' => true,
+               'ul' => true,
+               'video' => true,
+       ];
+
+       /**
+        * Detect block level tags. Of course css can make anything a block
+        * level tag, but this is still better than nothing.
+        *
+        * @param string $tagName HTML tag name
+        * @return bool True when tag is an html block level element
+        */
+       private function isBlockLevelTag( $tagName ) {
+               $key = strtolower( trim( $tagName ) );
+               return isset( self::$BLOCK_LEVEL_TAGS[$key] );
+       }
 }
index d885e24..85c71ee 100644 (file)
@@ -1508,10 +1508,10 @@ class Sanitizer {
         * @return string
         */
        private static function normalizeWhitespace( $text ) {
-               return preg_replace(
-                       '/\r\n|[\x20\x0d\x0a\x09]/',
+               return trim( preg_replace(
+                       '/(?:\r\n|[\x20\x0d\x0a\x09])+/',
                        ' ',
-                       $text );
+                       $text ) );
        }
 
        /**
index 286494e..157b508 100644 (file)
@@ -23,6 +23,7 @@ use MediaWiki\Revision\RevisionRenderer;
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SlotRecord;
 
 class PoolWorkArticleView extends PoolCounterWork {
        /** @var WikiPage */
@@ -81,7 +82,7 @@ class PoolWorkArticleView extends PoolCounterWork {
                        $revision = new MutableRevisionRecord( $page->getTitle() );
                        $revision->setId( $revid );
                        $revision->setPageId( $page->getId() );
-                       $revision->setContent( 'main', $content );
+                       $revision->setContent( SlotRecord::MAIN, $content );
                }
 
                if ( $revision ) {
index ec85556..880da60 100644 (file)
@@ -338,7 +338,7 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                                        $lang->userTimeAndDate( $userRegistration, $displayUser ),
                                        $lang->userDate( $userRegistration, $displayUser ),
                                        $lang->userTime( $userRegistration, $displayUser )
-                               )->parse(),
+                               )->text(),
                                'section' => 'personal/info',
                        ];
                }
@@ -981,14 +981,14 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        'type' => 'float',
                        'label-message' => 'recentchangesdays',
                        'section' => 'rc/displayrc',
-                       'min' => 1,
+                       'min' => 1 / 24,
                        'max' => ceil( $rcMaxAge / ( 3600 * 24 ) ),
                        'help' => $l10n->msg( 'recentchangesdays-max' )->numParams(
                                ceil( $rcMaxAge / ( 3600 * 24 ) ) )->escaped()
                ];
                $defaultPreferences['rclimit'] = [
                        'type' => 'int',
-                       'min' => 0,
+                       'min' => 1,
                        'max' => 1000,
                        'label-message' => 'recentchangescount',
                        'help-message' => 'prefs-help-recentchangescount',
@@ -1060,14 +1060,12 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        ];
                }
 
-               if ( $this->config->get( 'StructuredChangeFiltersShowPreference' ) ) {
-                       $defaultPreferences['rcenhancedfilters-disable'] = [
-                               'type' => 'toggle',
-                               'section' => 'rc/optoutrc',
-                               'label-message' => 'rcfilters-preference-label',
-                               'help-message' => 'rcfilters-preference-help',
-                       ];
-               }
+               $defaultPreferences['rcenhancedfilters-disable'] = [
+                       'type' => 'toggle',
+                       'section' => 'rc/optoutrc',
+                       'label-message' => 'rcfilters-preference-label',
+                       'help-message' => 'rcfilters-preference-help',
+               ];
        }
 
        /**
@@ -1264,14 +1262,12 @@ class DefaultPreferencesFactory implements PreferencesFactory {
                        ];
                }
 
-               if ( $this->config->get( 'StructuredChangeFiltersShowWatchlistPreference' ) ) {
-                       $defaultPreferences['wlenhancedfilters-disable'] = [
-                               'type' => 'toggle',
-                               'section' => 'watchlist/optoutwatchlist',
-                               'label-message' => 'rcfilters-watchlist-preference-label',
-                               'help-message' => 'rcfilters-watchlist-preference-help',
-                       ];
-               }
+               $defaultPreferences['wlenhancedfilters-disable'] = [
+                       'type' => 'toggle',
+                       'section' => 'watchlist/optoutwatchlist',
+                       'label-message' => 'rcfilters-watchlist-preference-label',
+                       'help-message' => 'rcfilters-watchlist-preference-help',
+               ];
        }
 
        /**
index d380d07..dfd5985 100644 (file)
@@ -48,6 +48,11 @@ class ExtensionDependencyError extends Exception {
         */
        public $incompatibleCore = false;
 
+       /**
+        * @var bool
+        */
+       public $incompatiblePhp = false;
+
        /**
         * @param array $errors Each error has a 'msg' and 'type' key at minimum
         */
@@ -59,6 +64,9 @@ class ExtensionDependencyError extends Exception {
                                case 'incompatible-core':
                                        $this->incompatibleCore = true;
                                        break;
+                               case 'incompatible-php':
+                                       $this->incompatiblePhp = true;
+                                       break;
                                case 'missing-skins':
                                        $this->missingSkins[] = $info['missing'];
                                        break;
index 1f8a27e..3138b37 100644 (file)
@@ -213,7 +213,8 @@ class ExtensionRegistry {
                $autoloadNamespaces = [];
                $autoloaderPaths = [];
                $processor = new ExtensionProcessor();
-               $versionChecker = new VersionChecker( $wgVersion );
+               $phpVersion = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION . '.' . PHP_RELEASE_VERSION;
+               $versionChecker = new VersionChecker( $wgVersion, $phpVersion );
                $extDependencies = [];
                $incompatible = [];
                $warnings = false;
index 1569e08..93b4a14 100644 (file)
@@ -35,6 +35,11 @@ class VersionChecker {
         */
        private $coreVersion = false;
 
+       /**
+        * @var Constraint|bool representing PHP version
+        */
+       private $phpVersion = false;
+
        /**
         * @var array Loaded extensions
         */
@@ -48,9 +53,10 @@ class VersionChecker {
        /**
         * @param string $coreVersion Current version of core
         */
-       public function __construct( $coreVersion ) {
+       public function __construct( $coreVersion, $phpVersion ) {
                $this->versionParser = new VersionParser();
                $this->setCoreVersion( $coreVersion );
+               $this->setPhpVersion( $phpVersion );
        }
 
        /**
@@ -82,6 +88,21 @@ class VersionChecker {
                }
        }
 
+       /**
+        * Set PHP version.
+        *
+        * @param string $phpVersion Current PHP version. Must be well-formed.
+        * @throws UnexpectedValueException
+        */
+       private function setPhpVersion( $phpVersion ) {
+               // normalize to make this throw an exception if the version is invalid
+               $this->phpVersion = new Constraint(
+                       '==',
+                       $this->versionParser->normalize( $phpVersion )
+               );
+               $this->phpVersion->setPrettyString( $phpVersion );
+       }
+
        /**
         * Check all given dependencies if they are compatible with the named
         * installed extensions in the $credits array.
@@ -90,6 +111,9 @@ class VersionChecker {
         *     {
         *       'FooBar' => {
         *         'MediaWiki' => '>= 1.25.0',
+        *         'platform': {
+        *           'php': '>= 7.0.0'
+        *         },
         *         'extensions' => {
         *           'FooBaz' => '>= 1.25.0'
         *         },
@@ -108,14 +132,47 @@ class VersionChecker {
                        foreach ( $dependencies as $dependencyType => $values ) {
                                switch ( $dependencyType ) {
                                        case ExtensionRegistry::MEDIAWIKI_CORE:
-                                               $mwError = $this->handleMediaWikiDependency( $values, $extension );
+                                               $mwError = $this->handleDependency(
+                                                       $this->coreVersion,
+                                                       $values,
+                                                       $extension
+                                               );
                                                if ( $mwError !== false ) {
                                                        $errors[] = [
-                                                               'msg' => $mwError,
+                                                               'msg' =>
+                                                                       "{$extension} is not compatible with the current MediaWiki "
+                                                                       . "core (version {$this->coreVersion->getPrettyString()}), "
+                                                                       . "it requires: $values."
+                                                               ,
                                                                'type' => 'incompatible-core',
                                                        ];
                                                }
                                                break;
+                                       case 'platform':
+                                               foreach ( $values as $dependency => $constraint ) {
+                                                       if ( $dependency === 'php' ) {
+                                                               $phpError = $this->handleDependency(
+                                                                       $this->phpVersion,
+                                                                       $constraint,
+                                                                       $extension
+                                                               );
+                                                               if ( $phpError !== false ) {
+                                                                       $errors[] = [
+                                                                               'msg' =>
+                                                                                       "{$extension} is not compatible with the current PHP "
+                                                                                       . "version {$this->phpVersion->getPrettyString()}), "
+                                                                                       . "it requires: $constraint."
+                                                                               ,
+                                                                               'type' => 'incompatible-php',
+                                                                       ];
+                                                               }
+                                                       } else {
+                                                               // add other platform dependencies here
+                                                               throw new UnexpectedValueException( 'Dependency type ' . $dependency .
+                                                                       ' unknown in ' . $extension );
+                                                       }
+                                               }
+                                               break;
                                        case 'extensions':
                                        case 'skins':
                                                foreach ( $values as $dependency => $constraint ) {
@@ -138,29 +195,27 @@ class VersionChecker {
        }
 
        /**
-        * Handle a dependency to MediaWiki core. It will check, if a MediaWiki version constraint was
-        * set with self::setCoreVersion before this call (if not, it will return an empty array) and
-        * checks the version constraint given against it.
+        * Handle a simple dependency to MediaWiki core or PHP. See handleMediaWikiDependency and
+        * handlePhpDependency for details.
         *
+        * @param Constraint|bool $version The version installed
         * @param string $constraint The required version constraint for this dependency
         * @param string $checkedExt The Extension, which depends on this dependency
-        * @return bool|string false if no error, or a string with the message
+        * @return bool false if no error, true else
         */
-       private function handleMediaWikiDependency( $constraint, $checkedExt ) {
-               if ( $this->coreVersion === false ) {
-                       // Couldn't parse the core version, so we can't check anything
+       private function handleDependency( $version, $constraint, $checkedExt ) {
+               if ( $version === false ) {
+                       // Couldn't parse the version, so we can't check anything
                        return false;
                }
 
                // if the installed and required version are compatible, return an empty array
                if ( $this->versionParser->parseConstraints( $constraint )
-                       ->matches( $this->coreVersion ) ) {
+                       ->matches( $version ) ) {
                        return false;
                }
-               // otherwise mark this as incompatible.
-               return "{$checkedExt} is not compatible with the current "
-                       . "MediaWiki core (version {$this->coreVersion->getPrettyString()}), it requires: "
-                       . "$constraint.";
+
+               return true;
        }
 
        /**
index 9764549..fe9ba74 100644 (file)
@@ -37,7 +37,7 @@ use Wikimedia\WrappedString;
  */
 class ResourceLoader implements LoggerAwareInterface {
        /** @var int */
-       protected static $filterCacheVersion = 8;
+       const CACHE_VERSION = 8;
 
        /** @var bool */
        protected static $debugMode = null;
@@ -199,7 +199,8 @@ class ResourceLoader implements LoggerAwareInterface {
                        'resourceloader',
                        'filter',
                        $filter,
-                       self::$filterCacheVersion, md5( $data )
+                       self::CACHE_VERSION,
+                       md5( $data )
                );
 
                $result = $cache->get( $key );
@@ -1162,8 +1163,8 @@ MESSAGE;
                        }
                } else {
                        if ( $states ) {
-                               // Keep default escaping of slashes (e.g. "</script>") for ResourceLoaderClientHtml.
-                               $this->errors[] = 'Problematic modules: ' . json_encode( $states, JSON_PRETTY_PRINT );
+                               $this->errors[] = 'Problematic modules: '
+                                       . self::encodeJsonForScript( $states );
                        }
                }
 
@@ -1223,7 +1224,7 @@ MESSAGE;
                        if ( self::inDebugMode() ) {
                                $scripts = new XmlJsCode( "function ( $, jQuery, require, module ) {\n{$scripts->value}\n}" );
                        } else {
-                               $scripts = new XmlJsCode( 'function($,jQuery,require,module){'. $scripts->value . '}' );
+                               $scripts = new XmlJsCode( 'function($,jQuery,require,module){' . $scripts->value . '}' );
                        }
                } elseif ( !is_string( $scripts ) && !is_array( $scripts ) ) {
                        throw new MWException( 'Invalid scripts error. Array of URLs or string of code expected.' );
@@ -1292,6 +1293,35 @@ MESSAGE;
                return $out;
        }
 
+       /**
+        * Wrapper around json_encode that avoids needless escapes,
+        * and pretty-prints in debug mode.
+        *
+        * @internal
+        * @since 1.32
+        * @param bool|string|array $data
+        * @return string JSON
+        */
+       public static function encodeJsonForScript( $data ) {
+               // Keep output as small as possible by disabling needless escape modes
+               // that PHP uses by default.
+               // However, while most module scripts are only served on HTTP responses
+               // for JavaScript, some modules can also be embedded in the HTML as inline
+               // scripts. This, and the fact that we sometimes need to export strings
+               // containing user-generated content and labels that may genuinely contain
+               // a sequences like "</script>", we need to encode either '/' or '<'.
+               // By default PHP escapes '/'. Let's escape '<' instead which is less common
+               // and allows URLs to mostly remain readable.
+               $jsonFlags = JSON_UNESCAPED_SLASHES |
+                       JSON_UNESCAPED_UNICODE |
+                       JSON_HEX_TAG |
+                       JSON_HEX_AMP;
+               if ( self::inDebugMode() ) {
+                       $jsonFlags |= JSON_PRETTY_PRINT;
+               }
+               return json_encode( $data, $jsonFlags );
+       }
+
        /**
         * Returns a JS call to mw.loader.state, which sets the state of one
         * ore more modules to a given value. Has two calling conventions:
@@ -1317,31 +1347,6 @@ MESSAGE;
                );
        }
 
-       /**
-        * Returns JS code which calls the script given by $script. The script will
-        * be called with local variables name, version, dependencies and group,
-        * which will have values corresponding to $name, $version, $dependencies
-        * and $group as supplied.
-        *
-        * @param string $name Module name
-        * @param string $version Module version hash
-        * @param array $dependencies List of module names on which this module depends
-        * @param string $group Group which the module is in.
-        * @param string $source Source of the module, or 'local' if not foreign.
-        * @param string $script JavaScript code
-        * @return string JavaScript code
-        */
-       public static function makeCustomLoaderScript( $name, $version, $dependencies,
-               $group, $source, $script
-       ) {
-               $script = str_replace( "\n", "\n\t", trim( $script ) );
-               return Xml::encodeJsCall(
-                       "( function ( name, version, dependencies, group, source ) {\n\t$script\n} )",
-                       [ $name, $version, $dependencies, $group, $source ],
-                       self::inDebugMode()
-               );
-       }
-
        private static function isEmptyObject( stdClass $obj ) {
                foreach ( $obj as $key => $value ) {
                        return false;
@@ -1378,69 +1383,56 @@ MESSAGE;
 
        /**
         * Returns JS code which calls mw.loader.register with the given
-        * parameters. Has three calling conventions:
-        *
-        *   - ResourceLoader::makeLoaderRegisterScript( $name, $version,
-        *        $dependencies, $group, $source, $skip
-        *     ):
-        *        Register a single module.
+        * parameter.
         *
-        *   - ResourceLoader::makeLoaderRegisterScript( [ $name1, $name2 ] ):
-        *        Register modules with the given names.
+        * @par Example
+        * @code
         *
-        *   - ResourceLoader::makeLoaderRegisterScript( [
+        *     ResourceLoader::makeLoaderRegisterScript( [
         *        [ $name1, $version1, $dependencies1, $group1, $source1, $skip1 ],
         *        [ $name2, $version2, $dependencies1, $group2, $source2, $skip2 ],
         *        ...
         *     ] ):
-        *        Registers modules with the given names and parameters.
+        * @endcode
         *
-        * @param string $name Module name
-        * @param string|null $version Module version hash
-        * @param array|null $dependencies List of module names on which this module depends
-        * @param string|null $group Group which the module is in
-        * @param string|null $source Source of the module, or 'local' if not foreign
-        * @param string|null $skip Script body of the skip function
+        * @internal
+        * @since 1.32
+        * @param array $modules Array of module registration arrays, each containing
+        *  - string: module name
+        *  - string: module version
+        *  - array|null: List of dependencies (optional)
+        *  - string|null: Module group (optional)
+        *  - string|null: Name of foreign module source, or 'local' (optional)
+        *  - string|null: Script body of a skip function (optional)
         * @return string JavaScript code
         */
-       public static function makeLoaderRegisterScript( $name, $version = null,
-               $dependencies = null, $group = null, $source = null, $skip = null
-       ) {
-               if ( is_array( $name ) ) {
+       public static function makeLoaderRegisterScript( array $modules ) {
+               // Optimisation: Transform dependency names into indexes when possible
+               // to produce smaller output. They are expanded by mw.loader.register on
+               // the other end using resolveIndexedDependencies().
+               $index = [];
+               foreach ( $modules as $i => &$module ) {
                        // Build module name index
-                       $index = [];
-                       foreach ( $name as $i => &$module ) {
-                               $index[$module[0]] = $i;
-                       }
-
-                       // Transform dependency names into indexes when possible, they will be resolved by
-                       // mw.loader.register on the other end
-                       foreach ( $name as &$module ) {
-                               if ( isset( $module[2] ) ) {
-                                       foreach ( $module[2] as &$dependency ) {
-                                               if ( isset( $index[$dependency] ) ) {
-                                                       $dependency = $index[$dependency];
-                                               }
+                       $index[$module[0]] = $i;
+               }
+               foreach ( $modules as &$module ) {
+                       if ( isset( $module[2] ) ) {
+                               foreach ( $module[2] as &$dependency ) {
+                                       if ( isset( $index[$dependency] ) ) {
+                                               // Replace module name in dependency list with index
+                                               $dependency = $index[$dependency];
                                        }
                                }
                        }
+               }
 
-                       array_walk( $name, [ 'self', 'trimArray' ] );
+               array_walk( $modules, [ 'self', 'trimArray' ] );
 
-                       return Xml::encodeJsCall(
-                               'mw.loader.register',
-                               [ $name ],
-                               self::inDebugMode()
-                       );
-               } else {
-                       $registration = [ $name, $version, $dependencies, $group, $source, $skip ];
-                       self::trimArray( $registration );
-                       return Xml::encodeJsCall(
-                               'mw.loader.register',
-                               $registration,
-                               self::inDebugMode()
-                       );
-               }
+               return Xml::encodeJsCall(
+                       'mw.loader.register',
+                       [ $modules ],
+                       self::inDebugMode()
+               );
        }
 
        /**
@@ -1491,7 +1483,7 @@ MESSAGE;
        public static function makeInlineCodeWithModule( $modules, $script ) {
                // Adds an array to lazy-created RLQ
                return '(window.RLQ=window.RLQ||[]).push(['
-                       . json_encode( $modules ) . ','
+                       . self::encodeJsonForScript( $modules ) . ','
                        . 'function(){' . trim( $script ) . '}'
                        . ']);';
        }
@@ -1592,6 +1584,9 @@ MESSAGE;
         * Global state and $wgRequest are evil, but we're using it right
         * now and sometimes we need to be able to force ResourceLoader to
         * re-evaluate the context because it has changed (e.g. in the test suite).
+        *
+        * @internal For use by unit tests
+        * @codeCoverageIgnore
         */
        public static function clearCache() {
                self::$debugMode = null;
index 8d08366..5c072bf 100644 (file)
@@ -304,7 +304,10 @@ class ResourceLoaderClientHtml {
                // Inline RLQ: Load general modules
                if ( $data['general'] ) {
                        $chunks[] = ResourceLoader::makeInlineScript(
-                               Xml::encodeJsCall( 'mw.loader.load', [ $data['general'] ] ),
+                               'RLPAGEMODULES='
+                                       . ResourceLoader::encodeJsonForScript( $data['general'] )
+                                       . ';'
+                                       . 'mw.loader.load(RLPAGEMODULES);',
                                $nonce
                        );
                }
index 0adbd0c..d9c369d 100644 (file)
@@ -140,13 +140,9 @@ class ResourceLoaderImage {
                        if ( isset( $desc['lang'][$contextLang] ) ) {
                                return $this->basePath . '/' . $desc['lang'][$contextLang];
                        }
-                       $fallbacks = Language::getFallbacksFor( $contextLang );
+                       $fallbacks = Language::getFallbacksFor( $contextLang, Language::STRICT_FALLBACKS );
                        foreach ( $fallbacks as $lang ) {
-                               // Images will fallback to 'default' instead of 'en', except for 'en-*' variants
-                               if (
-                                       ( $lang !== 'en' || substr( $contextLang, 0, 3 ) === 'en-' ) &&
-                                       isset( $desc['lang'][$lang] )
-                               ) {
+                               if ( isset( $desc['lang'][$lang] ) ) {
                                        return $this->basePath . '/' . $desc['lang'][$lang];
                                }
                        }
index a507ad3..30b2aa7 100644 (file)
@@ -813,7 +813,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
                        } else {
                                // Infer changes based on definition and other metrics
                                $summary = $this->getDefinitionSummary( $context );
-                               if ( !isset( $summary['_cacheEpoch'] ) ) {
+                               if ( !isset( $summary['_class'] ) ) {
                                        throw new LogicException( 'getDefinitionSummary must call parent method' );
                                }
                                $str = json_encode( $summary );
@@ -883,7 +883,9 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
        public function getDefinitionSummary( ResourceLoaderContext $context ) {
                return [
                        '_class' => static::class,
-                       '_cacheEpoch' => $this->getConfig()->get( 'CacheEpoch' ),
+                       // Make sure that when filter cache for minification is invalidated,
+                       // we also change the HTTP urls and mw.loader.store keys (T176884).
+                       '_cacheVersion' => ResourceLoader::CACHE_VERSION,
                ];
        }
 
index 2455596..e0fbeee 100644 (file)
@@ -117,7 +117,7 @@ class ResourceLoaderSkinModule extends ResourceLoaderFileModule {
                }
 
                // Because PHP can't have floats as array keys
-               uksort( $logosPerDppx, function ( $a , $b ) {
+               uksort( $logosPerDppx, function ( $a, $b ) {
                        $a = floatval( $a );
                        $b = floatval( $b );
                        // Sort from smallest to largest (e.g. 1x, 1.5x, 2x)
index 8140c2c..e4a753f 100644 (file)
@@ -404,16 +404,9 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
                        $mwLoaderCode .= file_get_contents( "$IP/resources/src/startup/profiler.js" );
                }
 
-               // Keep output as small as possible by disabling needless escapes that PHP uses by default.
-               // This is not HTML output, only used in a JS response.
-               $jsonFlags = JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE;
-               if ( ResourceLoader::inDebugMode() ) {
-                       $jsonFlags |= JSON_PRETTY_PRINT;
-               }
-
                // Perform replacements for mediawiki.js
                $mwLoaderPairs = [
-                       '$VARS.baseModules' => json_encode( $this->getBaseModules(), $jsonFlags ),
+                       '$VARS.baseModules' => ResourceLoader::encodeJsonForScript( $this->getBaseModules() ),
                ];
                $profilerStubs = [
                        '$CODE.profileExecuteStart();' => 'mw.loader.profiler.onExecuteStart( module );',
@@ -432,13 +425,11 @@ class ResourceLoaderStartUpModule extends ResourceLoaderModule {
 
                // Perform string replacements for startup.js
                $pairs = [
-                       '$VARS.wgLegacyJavaScriptGlobals' => json_encode(
-                               $this->getConfig()->get( 'LegacyJavaScriptGlobals' ),
-                               $jsonFlags
+                       '$VARS.wgLegacyJavaScriptGlobals' => ResourceLoader::encodeJsonForScript(
+                               $this->getConfig()->get( 'LegacyJavaScriptGlobals' )
                        ),
-                       '$VARS.configuration' => json_encode(
-                               $this->getConfigSettings( $context ),
-                               $jsonFlags
+                       '$VARS.configuration' => ResourceLoader::encodeJsonForScript(
+                               $this->getConfigSettings( $context )
                        ),
                        // Raw JavaScript code (not JSON)
                        '$CODE.registrations();' => trim( $this->getModuleRegistrations( $context ) ),
index 5c4d812..64145ad 100644 (file)
@@ -43,7 +43,15 @@ abstract class BaseTemplate extends QuickTemplate {
                echo $this->getMsg( $str )->escaped();
        }
 
+       /**
+        * @param string $str
+        * @warning You should never use this method. I18n messages should be escaped
+        * @deprecated 1.32 Use ->msg() or ->msgWiki() instead.
+        * @suppress SecurityCheck-XSS
+        * @return-taint exec_html
+        */
        function msgHtml( $str ) {
+               wfDeprecated( __METHOD__, '1.32' );
                echo $this->getMsg( $str )->text();
        }
 
index 969ac51..e4a2476 100644 (file)
@@ -75,6 +75,7 @@ abstract class QuickTemplate {
         * @param string $name Key for the data
         * @param mixed|null $default Optional default (or null)
         * @return mixed The value of the data requested or the deafult
+        * @return-taint onlysafefor_htmlnoent
         */
        public function get( $name, $default = null ) {
                return $this->data[$name] ?? $default;
@@ -101,6 +102,7 @@ abstract class QuickTemplate {
        /**
         * @private
         * @param string $str
+        * @suppress SecurityCheck-DoubleEscaped $this->data can be either
         */
        function text( $str ) {
                echo htmlspecialchars( $this->data[$str] );
@@ -109,6 +111,7 @@ abstract class QuickTemplate {
        /**
         * @private
         * @param string $str
+        * @suppress SecurityCheck-XSS phan-taint-check cannot tell if $str is pre-escaped
         */
        function html( $str ) {
                echo $this->data[$str];
@@ -125,8 +128,13 @@ abstract class QuickTemplate {
        /**
         * @private
         * @param string $msgKey
+        * @warning You should never use this method. I18n messages should be escaped
+        * @deprecated 1.32 Use ->msg() or ->msgWiki() instead.
+        * @suppress SecurityCheck-XSS
+        * @return-taint exec_html
         */
        function msgHtml( $msgKey ) {
+               wfDeprecated( __METHOD__, '1.32' );
                echo wfMessage( $msgKey )->text();
        }
 
index 2f5e0c8..ed4045d 100644 (file)
@@ -414,17 +414,13 @@ abstract class Skin extends ContextSource {
        /**
         * Get the query to generate a dynamic stylesheet
         *
+        * @deprecated since 1.32 Use action=raw&ctype=text/css directly.
         * @return array
         */
        public static function getDynamicStylesheetQuery() {
-               global $wgSquidMaxage;
-
                return [
                                'action' => 'raw',
-                               'maxage' => $wgSquidMaxage,
-                               'usemsgcache' => 'yes',
                                'ctype' => 'text/css',
-                               'smaxage' => $wgSquidMaxage,
                        ];
        }
 
@@ -1608,6 +1604,7 @@ abstract class Skin extends ContextSource {
        /**
         * Create a section edit link.
         *
+        * @suppress SecurityCheck-XSS $links has keys of different taint types
         * @param Title $nt The title being linked to (may not be the same as
         *   the current page, if the section is included from a template)
         * @param string $section The designation of the section being pointed to,
index caa039b..36d3eef 100644 (file)
@@ -69,9 +69,6 @@ abstract class ChangesListSpecialPage extends SpecialPage {
        /** @var FormOptions */
        protected $rcOptions;
 
-       /** @var array */
-       protected $customFilters;
-
        // Order of both groups and filters is significant; first is top-most priority,
        // descending from there.
        // 'showHideSuffix' is a shortcut to and avoid spelling out
@@ -84,8 +81,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         *
         * Groups are displayed to the user in the structured UI.  However, if necessary,
         * all of the filters in a group can be configured to only display on the
-        * unstuctured UI, in which case you don't need a group title.  This is done in
-        * getFilterGroupDefinitionFromLegacyCustomFilters, for example.
+        * unstuctured UI, in which case you don't need a group title.
         *
         * @var array $filterGroupDefinitions
         */
@@ -987,11 +983,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
 
                Hooks::run( 'ChangesListSpecialPageStructuredFilters', [ $this ] );
 
-               $unstructuredGroupDefinition =
-                       $this->getFilterGroupDefinitionFromLegacyCustomFilters(
-                               $this->getCustomFilters()
-                       );
-               $this->registerFiltersFromDefinitions( [ $unstructuredGroupDefinition ] );
+               $this->registerFiltersFromDefinitions( [] );
 
                $userExperienceLevel = $this->getFilterGroup( 'userExpLevel' );
                $registered = $userExperienceLevel->getFilter( 'registered' );
@@ -1074,32 +1066,6 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                }
        }
 
-       /**
-        * Get filter group definition from legacy custom filters
-        *
-        * @param array $customFilters Custom filters from legacy hooks
-        * @return array Group definition
-        */
-       protected function getFilterGroupDefinitionFromLegacyCustomFilters( array $customFilters ) {
-               // Special internal unstructured group
-               $unstructuredGroupDefinition = [
-                       'name' => 'unstructured',
-                       'class' => ChangesListBooleanFilterGroup::class,
-                       'priority' => -1, // Won't display in structured
-                       'filters' => [],
-               ];
-
-               foreach ( $customFilters as $name => $params ) {
-                       $unstructuredGroupDefinition['filters'][] = [
-                               'name' => $name,
-                               'showHide' => $params['msg'],
-                               'default' => $params['default'],
-                       ];
-               }
-
-               return $unstructuredGroupDefinition;
-       }
-
        /**
         * @return array The legacy show/hide toggle filters
         */
@@ -1245,21 +1211,6 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                return $output;
        }
 
-       /**
-        * Get custom show/hide filters using deprecated ChangesListSpecialPageFilters
-        * hook.
-        *
-        * @return array Map of filter URL param names to properties (msg/default)
-        */
-       protected function getCustomFilters() {
-               if ( $this->customFilters === null ) {
-                       $this->customFilters = [];
-                       Hooks::run( 'ChangesListSpecialPageFilters', [ $this, &$this->customFilters ], '1.29' );
-               }
-
-               return $this->customFilters;
-       }
-
        /**
         * Fetch values for a FormOptions object from the WebRequest associated with this instance.
         *
@@ -1895,11 +1846,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @return bool
         */
        public function isStructuredFilterUiEnabledByDefault() {
-               if ( $this->getConfig()->get( 'StructuredChangeFiltersShowPreference' ) ) {
-                       return !$this->getUser()->getDefaultOption( 'rcenhancedfilters-disable' );
-               } else {
-                       return $this->getUser()->getDefaultOption( 'rcenhancedfilters' );
-               }
+               return true;
        }
 
        /**
@@ -1911,11 +1858,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
         * @return bool
         */
        public static function checkStructuredFilterUiEnabled( Config $config, User $user ) {
-               if ( $config->get( 'StructuredChangeFiltersShowPreference' ) ) {
-                       return !$user->getOption( 'rcenhancedfilters-disable' );
-               } else {
-                       return $user->getOption( 'rcenhancedfilters' );
-               }
+               return !$user->getOption( 'rcenhancedfilters-disable' );
        }
 
        /**
index e94f3db..e39ec58 100644 (file)
@@ -611,7 +611,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                        $benefitList = '';
                        for ( $benefitIdx = 1; $benefitIdx <= $benefitCount; $benefitIdx++ ) {
                                $headUnescaped = $this->msg( "createacct-benefit-head$benefitIdx" )->text();
-                               $iconClass = $this->msg( "createacct-benefit-icon$benefitIdx" )->escaped();
+                               $iconClass = $this->msg( "createacct-benefit-icon$benefitIdx" )->text();
                                $benefitList .= Html::rawElement( 'div', [ 'class' => "mw-number-text $iconClass" ],
                                        Html::rawElement( 'h3', [],
                                                $this->msg( "createacct-benefit-head$benefitIdx" )->escaped()
@@ -1127,7 +1127,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                        if ( !$signupendMsg->isDisabled() ) {
                                $usingHTTPS = $this->getRequest()->getProtocol() === 'https';
                                $signupendText = ( $usingHTTPS && !$signupendHttpsMsg->isBlank() )
-                                       ? $signupendHttpsMsg ->parse() : $signupendMsg->parse();
+                                       ? $signupendHttpsMsg->parse() : $signupendMsg->parse();
                                $fieldDefinitions['signupend'] = [
                                        'type' => 'info',
                                        'raw' => true,
index ad66e31..2f15800 100644 (file)
@@ -55,8 +55,8 @@ abstract class PageQueryPage extends QueryPage {
 
                if ( $title instanceof Title ) {
                        $text = MediaWikiServices::getInstance()->getContentLanguage()->
-                               convert( $title->getPrefixedText() );
-                       return $this->getLinkRenderer()->makeLink( $title, $text );
+                               convert( htmlspecialchars( $title->getPrefixedText() ) );
+                       return $this->getLinkRenderer()->makeLink( $title, new HtmlArmor( $text ) );
                } else {
                        return Html::element( 'span', [ 'class' => 'mw-invalidtitle' ],
                                Linker::getInvalidTitleDescription( $this->getContext(), $row->namespace, $row->title ) );
index c6ffbe4..013ceb2 100644 (file)
@@ -34,7 +34,6 @@ use RequestContext;
 use SpecialPage;
 use Title;
 use User;
-use Wikimedia\ObjectFactory;
 
 /**
  * Factory for handling the special page list and generating SpecialPage objects.
@@ -401,16 +400,6 @@ class SpecialPageFactory {
                        } elseif ( is_string( $rec ) ) {
                                $className = $rec;
                                $page = new $className;
-                       } elseif ( is_array( $rec ) ) {
-                               $className = array_shift( $rec );
-                               // @deprecated, officially since 1.18, unofficially since forever
-                               wfDeprecated( "Array syntax for \$wgSpecialPages is deprecated ($className), " .
-                                       "define a subclass of SpecialPage instead.", '1.18' );
-                               $page = ObjectFactory::getObjectFromSpec( [
-                                       'class' => $className,
-                                       'args' => $rec,
-                                       'closure_expansion' => false,
-                               ] );
                        } elseif ( $rec instanceof SpecialPage ) {
                                $page = $rec; // XXX: we should deep clone here
                        } else {
@@ -419,16 +408,14 @@ class SpecialPageFactory {
 
                        if ( $page instanceof SpecialPage ) {
                                return $page;
-                       } else {
-                               // It's not a classname, nor a callback, nor a legacy constructor array,
-                               // nor a special page object. Give up.
-                               wfLogWarning( "Cannot instantiate special page $realName: bad spec!" );
-                               return null;
                        }
 
-               } else {
-                       return null;
+                       // It's not a classname, nor a callback, nor a legacy constructor array,
+                       // nor a special page object. Give up.
+                       wfLogWarning( "Cannot instantiate special page $realName: bad spec!" );
                }
+
+               return null;
        }
 
        /**
@@ -565,9 +552,9 @@ class SpecialPageFactory {
                                $context->getOutput()->redirect( $url );
 
                                return $title;
-                       } else {
-                               $context->setTitle( $page->getPageTitle( $par ) );
                        }
+
+                       $context->setTitle( $page->getPageTitle( $par ) );
                } elseif ( !$page->isIncludable() ) {
                        return false;
                }
@@ -714,8 +701,8 @@ class SpecialPageFactory {
                list( $name, $subpage ) = $this->resolveAlias( $alias );
                if ( $name != null ) {
                        return SpecialPage::getTitleFor( $name, $subpage );
-               } else {
-                       return null;
                }
+
+               return null;
        }
 }
index 088b060..4f691cb 100644 (file)
@@ -94,8 +94,8 @@ class AncientPagesPage extends QueryPage {
                $linkRenderer = $this->getLinkRenderer();
                $link = $linkRenderer->makeKnownLink(
                        $title,
-                       MediaWikiServices::getInstance()->getContentLanguage()->
-                               convert( $title->getPrefixedText() )
+                       new HtmlArmor( MediaWikiServices::getInstance()->getContentLanguage()->
+                               convert( htmlspecialchars( $title->getPrefixedText() ) ) )
                );
 
                return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
index 73ca76b..4587d40 100644 (file)
@@ -115,7 +115,7 @@ class SpecialExpandTemplates extends SpecialPage {
                        }
 
                        $config = $this->getConfig();
-                       if ( $config->get( 'UseTidy' ) && $options->getTidy() ) {
+                       if ( MWTidy::isEnabled() && $options->getTidy() ) {
                                $tmp = MWTidy::tidy( $tmp );
                        }
 
index be79cae..513e7a9 100644 (file)
@@ -23,7 +23,7 @@
  * @ingroup SpecialPage
  */
 
-use MediaWiki\MediaWikiServices;
+use MediaWiki\Logger\LoggerFactory;
 
 /**
  * A special page that allows users to export pages in a XML file
@@ -98,6 +98,15 @@ class SpecialExport extends SpecialPage {
                        $page = '';
                        $history = '';
                } elseif ( $request->wasPosted() && $par == '' ) {
+                       // Log to see if certain parameters are actually used.
+                       // If not, we could deprecate them and do some cleanup, here and in WikiExporter.
+                       LoggerFactory::getInstance( 'export' )->debug(
+                               'Special:Export POST, dir: [{dir}], offset: [{offset}], limit: [{limit}]', [
+                               'dir' => $request->getRawVal( 'dir' ),
+                               'offset' => $request->getRawVal( 'offset' ),
+                               'limit' => $request->getRawVal( 'limit' ),
+                       ] );
+
                        $page = $request->getText( 'pages' );
                        $this->curonly = $request->getCheck( 'curonly' );
                        $rawOffset = $request->getVal( 'offset' );
@@ -369,23 +378,10 @@ class SpecialExport extends SpecialPage {
                }
 
                /* Ok, let's get to it... */
-               if ( $history == WikiExporter::CURRENT ) {
-                       $lb = false;
-                       $db = wfGetDB( DB_REPLICA );
-                       $buffer = WikiExporter::BUFFER;
-               } else {
-                       // Use an unbuffered query; histories may be very long!
-                       $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->newMainLB();
-                       $db = $lb->getConnection( DB_REPLICA );
-                       $buffer = WikiExporter::STREAM;
-
-                       // This might take a while... :D
-                       Wikimedia\suppressWarnings();
-                       set_time_limit( 0 );
-                       Wikimedia\restoreWarnings();
-               }
+               $lb = false;
+               $db = wfGetDB( DB_REPLICA );
 
-               $exporter = new WikiExporter( $db, $history, $buffer );
+               $exporter = new WikiExporter( $db, $history );
                $exporter->list_authors = $list_authors;
                $exporter->openStream();
 
index 4a57c95..84454e2 100644 (file)
@@ -84,8 +84,8 @@ class FewestrevisionsPage extends QueryPage {
                }
                $linkRenderer = $this->getLinkRenderer();
                $text = MediaWikiServices::getInstance()->getContentLanguage()->
-                       convert( $nt->getPrefixedText() );
-               $plink = $linkRenderer->makeLink( $nt, $text );
+                       convert( htmlspecialchars( $nt->getPrefixedText() ) );
+               $plink = $linkRenderer->makeLink( $nt, new HtmlArmor( $text ) );
 
                $nl = $this->msg( 'nrevisions' )->numParams( $result->value )->text();
                $redirect = isset( $result->redirect ) && $result->redirect ?
index 3115adc..98f6072 100644 (file)
@@ -209,10 +209,12 @@ class FileDuplicateSearchPage extends QueryPage {
        function formatResult( $skin, $result ) {
                $linkRenderer = $this->getLinkRenderer();
                $nt = $result->getTitle();
-               $text = MediaWikiServices::getInstance()->getContentLanguage()->convert( $nt->getText() );
+               $text = MediaWikiServices::getInstance()->getContentLanguage()->convert(
+                       htmlspecialchars( $nt->getText() )
+               );
                $plink = $linkRenderer->makeLink(
                        $nt,
-                       $text
+                       new HtmlArmor( $text )
                );
 
                $userText = $result->getUser( 'text' );
index c18faa1..618fd1d 100644 (file)
@@ -41,12 +41,17 @@ class SpecialFilepath extends RedirectSpecialPage {
        public function getRedirect( $par ) {
                $file = $par ?: $this->getRequest()->getText( 'file' );
 
+               $redirect = null;
                if ( $file ) {
-                       $argument = "file/$file";
-               } else {
-                       $argument = 'file';
+                       $redirect = SpecialPage::getSafeTitleFor( 'Redirect', "file/$file" );
                }
-               return SpecialPage::getSafeTitleFor( 'Redirect', $argument );
+               if ( $redirect === null ) {
+                       // The user input is empty or an invalid title,
+                       // redirect to form of Special:Redirect with the invalid value prefilled
+                       $this->mAddedRedirectParams['wpvalue'] = $file;
+                       $redirect = SpecialPage::getSafeTitleFor( 'Redirect', 'file' );
+               }
+               return $redirect;
        }
 
        protected function getGroupName() {
index 3ef64f8..153b7d1 100644 (file)
@@ -179,8 +179,8 @@ class SpecialImport extends SpecialPage {
 
                $out = $this->getOutput();
                if ( !$source->isGood() ) {
-                       $out->addWikiText( "<p class=\"error\">\n" .
-                               $this->msg( 'importfailed', $source->getWikiText() )->parse() . "\n</p>" );
+                       $out->addWikiText( "<div class=\"error\">\n" .
+                               $this->msg( 'importfailed', $source->getWikiText() )->parse() . "\n</div>" );
                } else {
                        $importer = new WikiImporter( $source->value, $this->getConfig() );
                        if ( !is_null( $this->namespace ) ) {
@@ -189,7 +189,7 @@ class SpecialImport extends SpecialPage {
                                $statusRootPage = $importer->setTargetRootPage( $this->rootpage );
                                if ( !$statusRootPage->isGood() ) {
                                        $out->wrapWikiMsg(
-                                               "<p class=\"error\">\n$1\n</p>",
+                                               "<div class=\"error\">\n$1\n</div>",
                                                [
                                                        'import-options-wrong',
                                                        $statusRootPage->getWikiText(),
@@ -224,13 +224,13 @@ class SpecialImport extends SpecialPage {
                        if ( $exception ) {
                                # No source or XML parse error
                                $out->wrapWikiMsg(
-                                       "<p class=\"error\">\n$1\n</p>",
+                                       "<div class=\"error\">\n$1\n</div>",
                                        [ 'importfailed', $exception->getMessage() ]
                                );
                        } elseif ( !$result->isGood() ) {
                                # Zero revisions
                                $out->wrapWikiMsg(
-                                       "<p class=\"error\">\n$1\n</p>",
+                                       "<div class=\"error\">\n$1\n</div>",
                                        [ 'importfailed', $result->getWikiText() ]
                                );
                        } else {
index d700c39..54afde1 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Timestamp\TimestampException;
+
 /**
  * A special page that lists log entries
  *
@@ -63,10 +65,18 @@ class SpecialLog extends SpecialPage {
                // Set date values
                $dateString = $this->getRequest()->getVal( 'wpdate' );
                if ( !empty( $dateString ) ) {
-                       $dateStamp = MWTimestamp::getInstance( $dateString . ' 00:00:00' );
-                       $opts->setValue( 'year', (int)$dateStamp->format( 'Y' ) );
-                       $opts->setValue( 'month', (int)$dateStamp->format( 'm' ) );
-                       $opts->setValue( 'day', (int)$dateStamp->format( 'd' ) );
+                       try {
+                               $dateStamp = MWTimestamp::getInstance( $dateString . ' 00:00:00' );
+                       } catch ( TimestampException $e ) {
+                               // If users provide an invalid date, silently ignore it
+                               // instead of letting an exception bubble up (T201411)
+                               $dateStamp = false;
+                       }
+                       if ( $dateStamp ) {
+                               $opts->setValue( 'year', (int)$dateStamp->format( 'Y' ) );
+                               $opts->setValue( 'month', (int)$dateStamp->format( 'm' ) );
+                               $opts->setValue( 'day', (int)$dateStamp->format( 'd' ) );
+                       }
                }
 
                # Don't let the user get stuck with a certain date
index 18c163e..2599b16 100644 (file)
@@ -186,10 +186,11 @@ class MIMEsearchPage extends QueryPage {
        function formatResult( $skin, $result ) {
                $linkRenderer = $this->getLinkRenderer();
                $nt = Title::makeTitle( $result->namespace, $result->title );
-               $text = MediaWikiServices::getInstance()->getContentLanguage()->convert( $nt->getText() );
+               $text = MediaWikiServices::getInstance()->getContentLanguage()
+                       ->convert( htmlspecialchars( $nt->getText() ) );
                $plink = $linkRenderer->makeLink(
                        Title::newFromText( $nt->getPrefixedText() ),
-                       $text
+                       new HtmlArmor( $text )
                );
 
                $download = Linker::makeMediaLinkObj( $nt, $this->msg( 'download' )->escaped() );
index b80e518..56a701a 100644 (file)
@@ -84,8 +84,9 @@ class MostlinkedCategoriesPage extends QueryPage {
                        );
                }
 
-               $text = MediaWikiServices::getInstance()->getContentLanguage()->convert( $nt->getText() );
-               $plink = $this->getLinkRenderer()->makeLink( $nt, $text );
+               $text = MediaWikiServices::getInstance()->getContentLanguage()
+                       ->convert( htmlspecialchars( $nt->getText() ) );
+               $plink = $this->getLinkRenderer()->makeLink( $nt, new HtmlArmor( $text ) );
                $nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
 
                return $this->getLanguage()->specialList( $plink, $nlinks );
index 7526c3e..e88162e 100644 (file)
@@ -218,16 +218,15 @@ class SpecialNewFiles extends IncludableSpecialPage {
                $message = $this->msg( 'newimagestext' )->inContentLanguage();
                if ( !$message->isDisabled() ) {
                        $contLang = MediaWikiServices::getInstance()->getContentLanguage();
-                       $this->getOutput()->addWikiText(
-                               Html::rawElement( 'p',
+                       $this->getOutput()->addWikiTextTidy(
+                               Html::rawElement( 'div',
                                        [
+
                                                'lang' => $contLang->getHtmlCode(),
                                                'dir' => $contLang->getDir()
                                        ],
                                        "\n" . $message->plain() . "\n"
-                               ),
-                               /* $lineStart */ false,
-                               /* $interface */ false
+                               )
                        );
                }
        }
index 983f74c..3e8bf12 100644 (file)
@@ -225,20 +225,6 @@ class SpecialRecentChanges extends ChangesListSpecialPage {
                }
        }
 
-       /**
-        * Get all custom filters
-        *
-        * @return array Map of filter URL param names to properties (msg/default)
-        */
-       protected function getCustomFilters() {
-               if ( $this->customFilters === null ) {
-                       $this->customFilters = parent::getCustomFilters();
-                       Hooks::run( 'SpecialRecentChangesFilters', [ $this, &$this->customFilters ], '1.23' );
-               }
-
-               return $this->customFilters;
-       }
-
        /**
         * Process $par and put options found in $opts. Used when including the page.
         *
index e827911..1b2bda9 100644 (file)
@@ -68,37 +68,44 @@ class SpecialRedirect extends FormSpecialPage {
        /**
         * Handle Special:Redirect/user/xxxx (by redirecting to User:YYYY)
         *
-        * @return string|null Url to redirect to, or null if $mValue is invalid.
+        * @return Status A good status contains the url to redirect to
         */
        function dispatchUser() {
                if ( !ctype_digit( $this->mValue ) ) {
-                       return null;
+                       // Message: redirect-not-numeric
+                       return Status::newFatal( $this->getMessagePrefix() . '-not-numeric' );
                }
                $user = User::newFromId( (int)$this->mValue );
                $username = $user->getName(); // load User as side-effect
                if ( $user->isAnon() ) {
-                       return null;
+                       // Message: redirect-not-exists
+                       return Status::newFatal( $this->getMessagePrefix() . '-not-exists' );
                }
                $userpage = Title::makeTitle( NS_USER, $username );
 
-               return $userpage->getFullURL( '', false, PROTO_CURRENT );
+               return Status::newGood( $userpage->getFullURL( '', false, PROTO_CURRENT ) );
        }
 
        /**
         * Handle Special:Redirect/file/xxxx
         *
-        * @return string|null Url to redirect to, or null if $mValue is not found.
+        * @return Status A good status contains the url to redirect to
         */
        function dispatchFile() {
-               $title = Title::makeTitleSafe( NS_FILE, $this->mValue );
-
-               if ( !$title instanceof Title ) {
-                       return null;
+               try {
+                       $title = Title::newFromTextThrow( $this->mValue, NS_FILE );
+                       if ( $title && !$title->inNamespace( NS_FILE ) ) {
+                               // If the given value contains a namespace enforce file namespace
+                               $title = Title::newFromTextThrow( Title::makeName( NS_FILE, $this->mValue ) );
+                       }
+               } catch ( MalformedTitleException $e ) {
+                       return Status::newFatal( $e->getMessageObject() );
                }
                $file = wfFindFile( $title );
 
                if ( !$file || !$file->exists() ) {
-                       return null;
+                       // Message: redirect-not-exists
+                       return Status::newFatal( $this->getMessagePrefix() . '-not-exists' );
                }
                // Default behavior: Use the direct link to the file.
                $url = $file->getUrl();
@@ -116,48 +123,52 @@ class SpecialRedirect extends FormSpecialPage {
                        }
                }
 
-               return $url;
+               return Status::newGood( $url );
        }
 
        /**
         * Handle Special:Redirect/revision/xxx
         * (by redirecting to index.php?oldid=xxx)
         *
-        * @return string|null Url to redirect to, or null if $mValue is invalid.
+        * @return Status A good status contains the url to redirect to
         */
        function dispatchRevision() {
                $oldid = $this->mValue;
                if ( !ctype_digit( $oldid ) ) {
-                       return null;
+                       // Message: redirect-not-numeric
+                       return Status::newFatal( $this->getMessagePrefix() . '-not-numeric' );
                }
                $oldid = (int)$oldid;
                if ( $oldid === 0 ) {
-                       return null;
+                       // Message: redirect-not-exists
+                       return Status::newFatal( $this->getMessagePrefix() . '-not-exists' );
                }
 
-               return wfAppendQuery( wfScript( 'index' ), [
+               return Status::newGood( wfAppendQuery( wfScript( 'index' ), [
                        'oldid' => $oldid
-               ] );
+               ] ) );
        }
 
        /**
         * Handle Special:Redirect/page/xxx (by redirecting to index.php?curid=xxx)
         *
-        * @return string|null Url to redirect to, or null if $mValue is invalid.
+        * @return Status A good status contains the url to redirect to
         */
        function dispatchPage() {
                $curid = $this->mValue;
                if ( !ctype_digit( $curid ) ) {
-                       return null;
+                       // Message: redirect-not-numeric
+                       return Status::newFatal( $this->getMessagePrefix() . '-not-numeric' );
                }
                $curid = (int)$curid;
                if ( $curid === 0 ) {
-                       return null;
+                       // Message: redirect-not-exists
+                       return Status::newFatal( $this->getMessagePrefix() . '-not-exists' );
                }
 
-               return wfAppendQuery( wfScript( 'index' ), [
+               return Status::newGood( wfAppendQuery( wfScript( 'index' ), [
                        'curid' => $curid
-               ] );
+               ] ) );
        }
 
        /**
@@ -165,19 +176,21 @@ class SpecialRedirect extends FormSpecialPage {
         * (by redirecting to index.php?title=Special:Log&logid=xxx)
         *
         * @since 1.27
-        * @return string|null Url to redirect to, or null if $mValue is invalid.
+        * @return Status A good status contains the url to redirect to
         */
        function dispatchLog() {
                $logid = $this->mValue;
                if ( !ctype_digit( $logid ) ) {
-                       return null;
+                       // Message: redirect-not-numeric
+                       return Status::newFatal( $this->getMessagePrefix() . '-not-numeric' );
                }
                $logid = (int)$logid;
                if ( $logid === 0 ) {
-                       return null;
+                       // Message: redirect-not-exists
+                       return Status::newFatal( $this->getMessagePrefix() . '-not-exists' );
                }
                $query = [ 'title' => 'Special:Log', 'logid' => $logid ];
-               return wfAppendQuery( wfScript( 'index' ), $query );
+               return Status::newGood( wfAppendQuery( wfScript( 'index' ), $query ) );
        }
 
        /**
@@ -186,41 +199,39 @@ class SpecialRedirect extends FormSpecialPage {
         * or do nothing (if $mValue wasn't set) allowing the form to be
         * displayed.
         *
-        * @return bool True if a redirect was successfully handled.
+        * @return Status|bool True if a redirect was successfully handled.
         */
        function dispatch() {
                // the various namespaces supported by Special:Redirect
                switch ( $this->mType ) {
                        case 'user':
-                               $url = $this->dispatchUser();
+                               $status = $this->dispatchUser();
                                break;
                        case 'file':
-                               $url = $this->dispatchFile();
+                               $status = $this->dispatchFile();
                                break;
                        case 'revision':
-                               $url = $this->dispatchRevision();
+                               $status = $this->dispatchRevision();
                                break;
                        case 'page':
-                               $url = $this->dispatchPage();
+                               $status = $this->dispatchPage();
                                break;
                        case 'logid':
-                               $url = $this->dispatchLog();
+                               $status = $this->dispatchLog();
                                break;
                        default:
-                               $url = null;
+                               $status = null;
                                break;
                }
-               if ( $url ) {
-                       $this->getOutput()->redirect( $url );
+               if ( $status && $status->isGood() ) {
+                       $this->getOutput()->redirect( $status->getValue() );
 
                        return true;
                }
                if ( !is_null( $this->mValue ) ) {
                        $this->getOutput()->setStatusCode( 404 );
-                       // Message: redirect-not-exists
-                       $msg = $this->getMessagePrefix() . '-not-exists';
 
-                       return Status::newFatal( $msg );
+                       return $status;
                }
 
                return false;
index 86dcb72..d904ad1 100644 (file)
@@ -568,9 +568,9 @@ class SpecialSearch extends SpecialPage {
                                'a',
                                [
                                        'href' => $this->getPageTitle()->getLocalURL( $params ),
-                                       'title' => $this->msg( 'search-filter-title-prefix-reset' ),
+                                       'title' => $this->msg( 'search-filter-title-prefix-reset' )->text(),
                                ],
-                               $this->msg( 'search-filter-title-prefix-reset' )
+                               $this->msg( 'search-filter-title-prefix-reset' )->text()
                        );
                        $subtitle .= ')';
                        $out->setSubtitle( $subtitle );
index a3a9bc6..2cd74b7 100644 (file)
@@ -117,11 +117,11 @@ class UnwatchedpagesPage extends QueryPage {
                }
 
                $text = MediaWikiServices::getInstance()->getContentLanguage()->
-                       convert( $nt->getPrefixedText() );
+                       convert( htmlspecialchars( $nt->getPrefixedText() ) );
 
                $linkRenderer = $this->getLinkRenderer();
 
-               $plink = $linkRenderer->makeKnownLink( $nt, $text );
+               $plink = $linkRenderer->makeKnownLink( $nt, new HtmlArmor( $text ) );
                $wlink = $linkRenderer->makeKnownLink(
                        $nt,
                        $this->msg( 'watch' )->text(),
index 2accef6..5c62298 100644 (file)
@@ -91,7 +91,8 @@ class WantedCategoriesPage extends WantedQueryPage {
         */
        function formatResult( $skin, $result ) {
                $nt = Title::makeTitle( $result->namespace, $result->title );
-               $text = MediaWikiServices::getInstance()->getContentLanguage()->convert( $nt->getText() );
+               $text = new HtmlArmor( MediaWikiServices::getInstance()->getContentLanguage()
+                       ->convert( htmlspecialchars( $nt->getText() ) ) );
 
                if ( !$this->isCached() ) {
                        // We can assume the freshest data
index 908183d..2445c10 100644 (file)
@@ -111,15 +111,7 @@ class SpecialWatchlist extends ChangesListSpecialPage {
        }
 
        public static function checkStructuredFilterUiEnabled( Config $config, User $user ) {
-               if ( !$config->get( 'StructuredChangeFiltersOnWatchlist' ) ) {
-                       return false;
-               }
-
-               if ( $config->get( 'StructuredChangeFiltersShowWatchlistPreference' ) ) {
-                       return !$user->getOption( 'wlenhancedfilters-disable' );
-               } else {
-                       return $user->getOption( 'rcenhancedfilters' );
-               }
+               return !$user->getOption( 'wlenhancedfilters-disable' );
        }
 
        /**
@@ -289,20 +281,6 @@ class SpecialWatchlist extends ChangesListSpecialPage {
                }
        }
 
-       /**
-        * Get all custom filters
-        *
-        * @return array Map of filter URL param names to properties (msg/default)
-        */
-       protected function getCustomFilters() {
-               if ( $this->customFilters === null ) {
-                       $this->customFilters = parent::getCustomFilters();
-                       Hooks::run( 'SpecialWatchlistFilters', [ $this, &$this->customFilters ], '1.23' );
-               }
-
-               return $this->customFilters;
-       }
-
        /**
         * Fetch values for a FormOptions object from the WebRequest associated with this instance.
         *
index a5171e3..bf4d9af 100644 (file)
@@ -172,7 +172,7 @@ class PreferencesFormOOUI extends OOUIHTMLForm {
                                        'div',
                                        [
                                                'class' =>
-                                                       'oo-ui-widget oo-ui-widget-enabled oo-ui-optionWidget '.
+                                                       'oo-ui-widget oo-ui-widget-enabled oo-ui-optionWidget ' .
                                                        'oo-ui-tabOptionWidget oo-ui-labelElement' .
                                                        ( $i === 0 ? ' oo-ui-optionWidget-selected' : '' )
                                        ],
@@ -193,7 +193,7 @@ class PreferencesFormOOUI extends OOUIHTMLForm {
                        [ 'class' => 'oo-ui-layout oo-ui-panelLayout oo-ui-indexLayout-tabPanel' ],
                        Html::rawElement(
                                'div',
-                               [ 'class' => 'oo-ui-widget oo-ui-widget-enabled oo-ui-selectWidget '.
+                               [ 'class' => 'oo-ui-widget oo-ui-widget-enabled oo-ui-selectWidget ' .
                                        'oo-ui-selectWidget-depressed oo-ui-tabSelectWidget' ],
                                implode( $fakeTabs )
                        )
index ccef56b..878099f 100644 (file)
@@ -4,7 +4,18 @@ namespace MediaWiki\Tidy;
 
 use MWException;
 
+/**
+ * @deprecated since 1.32, use RemexDriver
+ */
 abstract class RaggettBase extends TidyDriverBase {
+
+       function __construct( $config ) {
+               parent::__construct( $config );
+
+               // All tidy modes other than remex are deprecated.
+               wfDeprecated( __METHOD__, '1.32' );
+       }
+
        /**
         * Generic interface for wrapping and unwrapping HTML for Dave Raggett's tidy.
         *
index 2809ea4..0b485c7 100644 (file)
@@ -2,6 +2,9 @@
 
 namespace MediaWiki\Tidy;
 
+/**
+ * @deprecated since 1.32, use RemexDriver
+ */
 class RaggettExternal extends RaggettBase {
        /**
         * Spawn an external HTML tidy process and get corrected markup back from it.
index 65d37f4..1681dc4 100644 (file)
@@ -2,6 +2,9 @@
 
 namespace MediaWiki\Tidy;
 
+/**
+ * @deprecated since 1.32, use RemexDriver
+ */
 class RaggettInternalHHVM extends RaggettBase {
        /**
         * Use the HTML tidy extension to use the tidy library in-process,
index e7724b0..c1050cc 100644 (file)
@@ -2,6 +2,9 @@
 
 namespace MediaWiki\Tidy;
 
+/**
+ * @deprecated since 1.32, use RemexDriver
+ */
 class RaggettInternalPHP extends RaggettBase {
        /**
         * Use the HTML tidy extension to use the tidy library in-process,
index b793a58..855282d 100644 (file)
@@ -15,6 +15,7 @@ use Parser;
  * duplicated. Perhaps we should create an abstract marker hiding class.
  *
  * @ingroup Parser
+ * @deprecated since 1.32
  */
 class RaggettWrapper {
 
index 2228feb..5762120 100644 (file)
@@ -470,6 +470,10 @@ class BotPassword implements IDBAccessObject {
                        return Status::newFatal( 'nosuchuser', $name );
                }
 
+               if ( $user->isLocked() ) {
+                       return Status::newFatal( 'botpasswords-locked' );
+               }
+
                // Throttle
                $throttle = null;
                if ( !empty( $wgPasswordAttemptThrottle ) ) {
index 7bebe80..12623e8 100644 (file)
@@ -27,6 +27,7 @@ use MediaWiki\Auth\AuthManager;
 use MediaWiki\Auth\AuthenticationResponse;
 use MediaWiki\Auth\AuthenticationRequest;
 use MediaWiki\User\UserIdentity;
+use MediaWiki\Logger\LoggerFactory;
 use Wikimedia\IPSet;
 use Wikimedia\ScopedCallback;
 use Wikimedia\Rdbms\Database;
@@ -1010,10 +1011,10 @@ class User implements IDBAccessObject, UserIdentity {
                // Should these be merged into the title char list?
                $unicodeBlacklist = '/[' .
                        '\x{0080}-\x{009f}' . # iso-8859-1 control chars
-                       '\x{00a0}' .          # non-breaking space
+                       '\x{00a0}' . # non-breaking space
                        '\x{2000}-\x{200f}' . # various whitespace
                        '\x{2028}-\x{202f}' . # breaks and control chars
-                       '\x{3000}' .          # ideographic space
+                       '\x{3000}' . # ideographic space
                        '\x{e000}-\x{f8ff}' . # private use
                        ']/u';
                if ( preg_match( $unicodeBlacklist, $name ) ) {
@@ -1050,7 +1051,7 @@ class User implements IDBAccessObject, UserIdentity {
                // Certain names may be reserved for batch processes.
                foreach ( $reservedUsernames as $reserved ) {
                        if ( substr( $reserved, 0, 4 ) == 'msg:' ) {
-                               $reserved = wfMessage( substr( $reserved, 4 ) )->inContentLanguage()->text();
+                               $reserved = wfMessage( substr( $reserved, 4 ) )->inContentLanguage()->plain();
                        }
                        if ( $reserved == $name ) {
                                return false;
@@ -2165,10 +2166,6 @@ class User implements IDBAccessObject, UserIdentity {
                        if ( isset( $limits['user'] ) ) {
                                $userLimit = $limits['user'];
                        }
-                       // limits for newbie logged-in users
-                       if ( $isNewbie && isset( $limits['newbie'] ) ) {
-                               $keys[$cache->makeKey( 'limiter', $action, 'user', $id )] = $limits['newbie'];
-                       }
                }
 
                // limits for anons and for newbie logged-in users
@@ -2200,6 +2197,11 @@ class User implements IDBAccessObject, UserIdentity {
                        }
                }
 
+               // limits for newbie logged-in users (override all the normal user limits)
+               if ( $id !== 0 && $isNewbie && isset( $limits['newbie'] ) ) {
+                       $userLimit = $limits['newbie'];
+               }
+
                // Set the user limit key
                if ( $userLimit !== false ) {
                        list( $max, $period ) = $userLimit;
@@ -2874,6 +2876,7 @@ class User implements IDBAccessObject, UserIdentity {
         * @return bool
         */
        public function setPassword( $str ) {
+               wfDeprecated( __METHOD__, '1.27' );
                return $this->setPasswordInternal( $str );
        }
 
@@ -2886,6 +2889,7 @@ class User implements IDBAccessObject, UserIdentity {
         *  through the web interface.
         */
        public function setInternalPassword( $str ) {
+               wfDeprecated( __METHOD__, '1.27' );
                $this->setPasswordInternal( $str );
        }
 
@@ -3538,6 +3542,7 @@ class User implements IDBAccessObject, UserIdentity {
                                }
                        }
 
+                       Hooks::run( 'UserGetRightsRemove', [ $this, &$this->mRights ] );
                        // Force reindexation of rights when a hook has unset one of them
                        $this->mRights = array_values( array_unique( $this->mRights ) );
 
@@ -4208,9 +4213,12 @@ class User implements IDBAccessObject, UserIdentity {
                                $this->clearSharedCache( 'refresh' );
                                // User was changed in the meantime or loaded with stale data
                                $from = ( $this->queryFlagsUsed & self::READ_LATEST ) ? 'master' : 'replica';
-                               throw new MWException(
-                                       "CAS update failed on user_touched for user ID '{$this->mId}' (read from $from);" .
-                                       " the version of the user to be saved is older than the current version."
+                               LoggerFactory::getInstance( 'preferences' )->warning(
+                                       "CAS update failed on user_touched for user ID '{user_id}' ({db_flag} read)",
+                                       [ 'user_id' => $this->mId, 'db_flag' => $from ]
+                               );
+                               throw new MWException( "CAS update failed on user_touched. " .
+                                       "The version of the user to be saved is older than the current version."
                                );
                        }
 
@@ -4384,7 +4392,7 @@ class User implements IDBAccessObject, UserIdentity {
                                        'user',
                                        'user_id',
                                        [ 'user_name' => $this->mName ],
-                                       __METHOD__,
+                                       $fname,
                                        [ 'LOCK IN SHARE MODE' ]
                                );
                                $loaded = false;
@@ -4394,7 +4402,7 @@ class User implements IDBAccessObject, UserIdentity {
                                        }
                                }
                                if ( !$loaded ) {
-                                       throw new MWException( __METHOD__ . ": hit a key conflict attempting " .
+                                       throw new MWException( $fname . ": hit a key conflict attempting " .
                                                "to insert user '{$this->mName}' row, but it was not present in select!" );
                                }
                                return Status::newFatal( 'userexists' );
@@ -4540,6 +4548,8 @@ class User implements IDBAccessObject, UserIdentity {
         * @return bool True if the given password is correct, otherwise False
         */
        public function checkPassword( $password ) {
+               wfDeprecated( __METHOD__, '1.27' );
+
                $manager = AuthManager::singleton();
                $reqs = AuthenticationRequest::loadRequestsFromSubmission(
                        $manager->getAuthenticationRequests( AuthManager::ACTION_LOGIN ),
@@ -4573,6 +4583,7 @@ class User implements IDBAccessObject, UserIdentity {
         * @return bool True if matches, false otherwise
         */
        public function checkTemporaryPassword( $plaintext ) {
+               wfDeprecated( __METHOD__, '1.27' );
                // Can't check the temporary password individually.
                return $this->checkPassword( $plaintext );
        }
index 9d05c6a..a20435e 100644 (file)
@@ -26,7 +26,7 @@
  * @since 1.28
  */
 class MWFileProps {
-       /** @var MimeMagic */
+       /** @var MimeAnalyzer */
        private $magic;
 
        /**
index 6e907de..1b92f51 100644 (file)
@@ -407,6 +407,11 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac
                array $targetsWithVisitThresholds,
                $minimumWatchers = null
        ) {
+               if ( $targetsWithVisitThresholds === [] ) {
+                       // No titles requested => no results returned
+                       return [];
+               }
+
                $dbr = $this->getConnectionRef( DB_REPLICA );
 
                $conds = $this->getVisitingWatchersCondition( $dbr, $targetsWithVisitThresholds );
@@ -818,7 +823,7 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac
 
                                        $dbw = $this->getConnectionRef( DB_MASTER );
                                        $factory = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
-                                       $ticket = $factory->getEmptyTransactionTicket( __METHOD__ );
+                                       $ticket = $factory->getEmptyTransactionTicket( $fname );
 
                                        $watchersChunks = array_chunk( $watchers, $wgUpdateRowsPerQuery );
                                        foreach ( $watchersChunks as $watchersChunk ) {
@@ -833,7 +838,7 @@ class WatchedItemStore implements WatchedItemStoreInterface, StatsdAwareInterfac
                                                );
                                                if ( count( $watchersChunks ) > 1 ) {
                                                        $factory->commitAndWaitForReplication(
-                                                               __METHOD__, $ticket, [ 'domain' => $dbw->getDomainID() ]
+                                                               $fname, $ticket, [ 'domain' => $dbw->getDomainID() ]
                                                        );
                                                }
                                        }
index af1e027..66fc030 100644 (file)
@@ -107,7 +107,7 @@ class FullSearchResultWidget implements SearchResultWidget {
                                "</table>";
                }
 
-               return "<li>{$html}</li>";
+               return "<li class='mw-search-result'>{$html}</li>";
        }
 
        /**
index 85daa14..5897241 100644 (file)
@@ -33,6 +33,25 @@ use CLDRPluralRuleParser\Evaluator;
  * @ingroup Language
  */
 class Language {
+       /**
+        * Return autonyms in fetchLanguageName(s).
+        * @since 1.32
+        */
+       const AS_AUTONYMS = null;
+
+       /**
+        * Return all known languages in fetchLanguageName(s).
+        * @since 1.32
+        */
+       const ALL = 'all';
+
+       /**
+        * Return in fetchLanguageName(s) only the languages for which we have at
+        * least some localisation.
+        * @since 1.32
+        */
+       const SUPPORTED = 'mwfile';
+
        /**
         * @var LanguageConverter
         */
@@ -61,6 +80,18 @@ class Language {
 
        static public $mLangObjCache = [];
 
+       /**
+        * Return a fallback chain for messages in getFallbacksFor
+        * @since 1.32
+        */
+       const MESSAGES_FALLBACKS = 0;
+
+       /**
+        * Return a strict fallback chain in getFallbacksFor
+        * @since 1.32
+        */
+       const STRICT_FALLBACKS = 1;
+
        static public $mWeekdayMsgs = [
                'sunday', 'monday', 'tuesday', 'wednesday', 'thursday',
                'friday', 'saturday'
@@ -809,16 +840,16 @@ class Language {
        /**
         * Get an array of language names, indexed by code.
         * @param null|string $inLanguage Code of language in which to return the names
-        *              Use null for autonyms (native names)
+        *              Use self::AS_AUTONYMS for autonyms (native names)
         * @param string $include One of:
-        *              'all' all available languages
+        *              self::ALL all available languages
         *              'mw' only if the language is defined in MediaWiki or wgExtraLanguageNames (default)
-        *              'mwfile' only if the language is in 'mw' *and* has a message file
+        *              self::SUPPORTED only if the language is in 'mw' *and* has a message file
         * @return array Language code => language name (sorted by key)
         * @since 1.20
         */
-       public static function fetchLanguageNames( $inLanguage = null, $include = 'mw' ) {
-               $cacheKey = $inLanguage === null ? 'null' : $inLanguage;
+       public static function fetchLanguageNames( $inLanguage = self::AS_AUTONYMS, $include = 'mw' ) {
+               $cacheKey = $inLanguage === self::AS_AUTONYMS ? 'null' : $inLanguage;
                $cacheKey .= ":$include";
                if ( self::$languageNameCache === null ) {
                        self::$languageNameCache = new HashBagOStuff( [ 'maxKeys' => 20 ] );
@@ -835,18 +866,21 @@ class Language {
        /**
         * Uncached helper for fetchLanguageNames
         * @param null|string $inLanguage Code of language in which to return the names
-        *              Use null for autonyms (native names)
+        *              Use self::AS_AUTONYMS for autonyms (native names)
         * @param string $include One of:
-        *              'all' all available languages
+        *              self::ALL all available languages
         *              'mw' only if the language is defined in MediaWiki or wgExtraLanguageNames (default)
-        *              'mwfile' only if the language is in 'mw' *and* has a message file
+        *              self::SUPPORTED only if the language is in 'mw' *and* has a message file
         * @return array Language code => language name (sorted by key)
         */
-       private static function fetchLanguageNamesUncached( $inLanguage = null, $include = 'mw' ) {
+       private static function fetchLanguageNamesUncached(
+               $inLanguage = self::AS_AUTONYMS,
+               $include = 'mw'
+       ) {
                global $wgExtraLanguageNames, $wgUsePigLatinVariant;
 
                // If passed an invalid language code to use, fallback to en
-               if ( $inLanguage !== null && !self::isValidCode( $inLanguage ) ) {
+               if ( $inLanguage !== self::AS_AUTONYMS && !self::isValidCode( $inLanguage ) ) {
                        $inLanguage = 'en';
                }
 
@@ -871,7 +905,7 @@ class Language {
                        }
                }
 
-               if ( $include === 'all' ) {
+               if ( $include === self::ALL ) {
                        ksort( $names );
                        return $names;
                }
@@ -882,7 +916,7 @@ class Language {
                        $returnMw[$coreCode] = $names[$coreCode];
                }
 
-               if ( $include === 'mwfile' ) {
+               if ( $include === self::SUPPORTED ) {
                        $namesMwFile = [];
                        # We do this using a foreach over the codes instead of a directory
                        # loop so that messages files in extensions will work correctly.
@@ -905,12 +939,17 @@ class Language {
 
        /**
         * @param string $code The code of the language for which to get the name
-        * @param null|string $inLanguage Code of language in which to return the name (null for autonyms)
-        * @param string $include 'all', 'mw' or 'mwfile'; see fetchLanguageNames()
+        * @param null|string $inLanguage Code of language in which to return the name
+        *   (SELF::AS_AUTONYMS for autonyms)
+        * @param string $include See fetchLanguageNames()
         * @return string Language name or empty
         * @since 1.20
         */
-       public static function fetchLanguageName( $code, $inLanguage = null, $include = 'all' ) {
+       public static function fetchLanguageName(
+               $code,
+               $inLanguage = self::AS_AUTONYMS,
+               $include = self::ALL
+       ) {
                $code = strtolower( $code );
                $array = self::fetchLanguageNames( $inLanguage, $include );
                return !array_key_exists( $code, $array ) ? '' : $array[$code];
@@ -4561,15 +4600,29 @@ class Language {
         *
         * @since 1.19
         * @param string $code Language code
-        * @return array Non-empty array, ending in "en"
+        * @param int $mode Fallback mode, either MESSAGES_FALLBACKS (which always falls back to 'en'),
+        * or STRICT_FALLBACKS (whic honly falls back to 'en' when explicitly defined)
+        * @throws MWException
+        * @return array List of language codes
         */
-       public static function getFallbacksFor( $code ) {
+       public static function getFallbacksFor( $code, $mode = self::MESSAGES_FALLBACKS ) {
                if ( $code === 'en' || !self::isValidBuiltInCode( $code ) ) {
                        return [];
                }
-               // For unknown languages, fallbackSequence returns an empty array,
-               // hardcode fallback to 'en' in that case.
-               return self::getLocalisationCache()->getItem( $code, 'fallbackSequence' ) ?: [ 'en' ];
+               switch ( $mode ) {
+                       case self::MESSAGES_FALLBACKS:
+                               // For unknown languages, fallbackSequence returns an empty array,
+                               // hardcode fallback to 'en' in that case as English messages are
+                               // always defined.
+                               return self::getLocalisationCache()->getItem( $code, 'fallbackSequence' ) ?: [ 'en' ];
+                       case self::STRICT_FALLBACKS:
+                               // Use this mode when you don't want to fallback to English unless
+                               // explicitly defined, for example when you have language-variant icons
+                               // and an international language-independent fallback.
+                               return self::getLocalisationCache()->getItem( $code, 'originalFallbackSequence' );
+                       default:
+                               throw new MWException( "Invalid fallback mode \"$mode\"" );
+               }
        }
 
        /**
index dc8a9f8..ea35ac8 100644 (file)
@@ -166,23 +166,23 @@ class KkConverter extends LanguageConverter {
 
                $this->mCyLa2Arab = [
                        # # Punctuation -> Arabic
-                       '/#|№|No\./u' => '؀', # &#x0600;
-                       '/\,/' => '،', # &#x060C;
-                       '/;/' => '؛', # &#x061B;
-                       '/\?/' => '؟', # &#x061F;
-                       '/%/' => '٪', # &#x066A;
-                       '/\*/' => '٭', # &#x066D;
+                       '/#|№|No\./u' => '؀', # U+0600
+                       '/\,/' => '،', # U+060C
+                       '/;/' => '؛', # U+061B
+                       '/\?/' => '؟', # U+061F
+                       '/%/' => '٪', # U+066A
+                       '/\*/' => '٭', # U+066D
                        # # Digits -> Arabic
-                       '/0/' => '۰', # &#x06F0;
-                       '/1/' => '۱', # &#x06F1;
-                       '/2/' => '۲', # &#x06F2;
-                       '/3/' => '۳', # &#x06F3;
-                       '/4/' => '۴', # &#x06F4;
-                       '/5/' => '۵', # &#x06F5;
-                       '/6/' => '۶', # &#x06F6;
-                       '/7/' => '۷', # &#x06F7;
-                       '/8/' => '۸', # &#x06F8;
-                       '/9/' => '۹', # &#x06F9;
+                       '/0/' => '۰', # U+06F0
+                       '/1/' => '۱', # U+06F1
+                       '/2/' => '۲', # U+06F2
+                       '/3/' => '۳', # U+06F3
+                       '/4/' => '۴', # U+06F4
+                       '/5/' => '۵', # U+06F5
+                       '/6/' => '۶', # U+06F6
+                       '/7/' => '۷', # U+06F7
+                       '/8/' => '۸', # U+06F8
+                       '/9/' => '۹', # U+06F9
                        # # Cyrillic -> Arabic
                        '/Аллаһ/ui' => 'ﷲ',
                        '/([АӘЕЁИОӨҰҮЭЮЯЪЬ])е/ui' => '$1يە',
@@ -329,21 +329,18 @@ class KkConverter extends LanguageConverter {
                                        $text = preg_replace( $pat, $rep, $text );
                                }
                                return $text;
-                               break;
                        case 'kk-latn':
                        case 'kk-tr':
                                foreach ( $this->mCyrl2Latn as $pat => $rep ) {
                                        $text = preg_replace( $pat, $rep, $text );
                                }
                                return $text;
-                               break;
                        case 'kk-cyrl':
                        case 'kk-kz':
                                foreach ( $this->mLatn2Cyrl as $pat => $rep ) {
                                        $text = preg_replace( $pat, $rep, $text );
                                }
                                return $text;
-                               break;
                        default:
                                return $text;
                }
index b90ca41..580f64a 100644 (file)
@@ -57,16 +57,16 @@ class KuConverter extends LanguageConverter {
                '؟' => '?',
 
                # digits
-               '٠' => '0', # &#x0660;
-               '١' => '1', # &#x0661;
-               '٢' => '2', # &#x0662;
-               '٣' => '3', # &#x0663;
-               '٤' => '4', # &#x0664;
-               '٥' => '5', # &#x0665;
-               '٦' => '6', # &#x0666;
-               '٧' => '7', # &#x0667;
-               '٨' => '8', # &#x0668;
-               '٩' => '9', # &#x0669;
+               '٠' => '0', # U+0660
+               '١' => '1', # U+0661
+               '٢' => '2', # U+0662
+               '٣' => '3', # U+0663
+               '٤' => '4', # U+0664
+               '٥' => '5', # U+0665
+               '٦' => '6', # U+0666
+               '٧' => '7', # U+0667
+               '٨' => '8', # U+0668
+               '٩' => '9', # U+0669
        ];
 
        public $mLatinToArabic = [
@@ -130,16 +130,16 @@ class KuConverter extends LanguageConverter {
 
 /*             # deactivated for now, breaks links i.e. in header of Special:Recentchanges :-(
                # digits
-               '0' => '٠', # &#x0660;
-               '1' => '١', # &#x0661;
-               '2' => '٢', # &#x0662;
-               '3' => '٣', # &#x0663;
-               '4' => '٤', # &#x0664;
-               '5' => '٥', # &#x0665;
-               '6' => '٦', # &#x0666;
-               '7' => '٧', # &#x0667;
-               '8' => '٨', # &#x0668;
-               '9' => '٩', # &#x0669;
+               '0' => '٠', # U+0660
+               '1' => '١', # U+0661
+               '2' => '٢', # U+0662
+               '3' => '٣', # U+0663
+               '4' => '٤', # U+0664
+               '5' => '٥', # U+0665
+               '6' => '٦', # U+0666
+               '7' => '٧', # U+0667
+               '8' => '٨', # U+0668
+               '9' => '٩', # U+0669
 */
                ];
 
index fcba6dc..92c1f86 100644 (file)
@@ -104,9 +104,9 @@ class CrhExceptions {
 
                # load C2L and L2C bidirectional affix mappings
                $this->addMappings( $this->prefixMapping,
-                       $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns, false, '/'.self::WB, '/u' );
+                       $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns, false, '/' . self::WB, '/u' );
                $this->addMappings( $this->suffixMapping,
-                       $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns, false, '/', self::WB.'/u' );
+                       $this->Cyrl2LatnPatterns, $this->Latn2CyrlPatterns, false, '/', self::WB . '/u' );
 
                # tack on one-way mappings to the ends of the prefix and suffix patterns
                $this->Cyrl2LatnPatterns += $this->Cyrl2LatnRegexes;
@@ -388,8 +388,8 @@ class CrhExceptions {
                'му([иэИЭ])' => 'mü$1',
 
                # originally L2C, here swapped
-               'роль$1' => 'rol([^ü]|'.self::WB.')',
-               'усть$1' => 'üst([^ü]|'.self::WB.')',
+               'роль$1' => 'rol([^ü]|' . self::WB . ')',
+               'усть$1' => 'üst([^ü]|' . self::WB . ')',
 
                # more prefixes
                'ком-кок' => 'köm-kök',
@@ -410,80 +410,80 @@ class CrhExceptions {
                        // TODO: refactor upper/lower/first capital whole words without
                        // regexes into simpler list
 
-                       '/'.self::WB.'КъЮШ'.self::WB.'/u' => 'QYŞ',
-                       '/'.self::WB.'ЮШ'.self::WB.'/u' => 'YŞ',
-
-                       '/'.self::WB.'кок'.self::WB.'/u' => 'kök',
-                       '/'.self::WB.'Кок'.self::WB.'/u' => 'Kök',
-                       '/'.self::WB.'КОК'.self::WB.'/u' => 'KÖK',
-                       '/'.self::WB.'ком-кок'.self::WB.'/u' => 'köm-kök',
-                       '/'.self::WB.'Ком-кок'.self::WB.'/u' => 'Köm-kök',
-                       '/'.self::WB.'КОМ-КОК'.self::WB.'/u' => 'KÖM-KÖK',
-
-                       '/'.self::WB.'коп'.self::WB.'/u' => 'köp',
-                       '/'.self::WB.'Коп'.self::WB.'/u' => 'Köp',
-                       '/'.self::WB.'КОП'.self::WB.'/u' => 'KÖP',
-
-                       '/'.self::WB.'курк'.self::WB.'/u' => 'kürk',
-                       '/'.self::WB.'Курк'.self::WB.'/u' => 'Kürk',
-                       '/'.self::WB.'КУРК'.self::WB.'/u' => 'KÜRK',
-
-                       '/'.self::WB.'ог'.self::WB.'/u' => 'ög',
-                       '/'.self::WB.'Ог'.self::WB.'/u' => 'Ög',
-                       '/'.self::WB.'ОГ'.self::WB.'/u' => 'ÖG',
-
-                       '/'.self::WB.'юрип'.self::WB.'/u' => 'yürip',
-                       '/'.self::WB.'Юрип'.self::WB.'/u' => 'Yürip',
-                       '/'.self::WB.'ЮРИП'.self::WB.'/u' => 'YÜRİP',
-
-                       '/'.self::WB.'юз'.self::WB.'/u' => 'yüz',
-                       '/'.self::WB.'Юз'.self::WB.'/u' => 'Yüz',
-                       '/'.self::WB.'ЮЗ'.self::WB.'/u' => 'YÜZ',
-
-                       '/'.self::WB.'юк'.self::WB.'/u' => 'yük',
-                       '/'.self::WB.'Юк'.self::WB.'/u' => 'Yük',
-                       '/'.self::WB.'ЮК'.self::WB.'/u' => 'YÜK',
-
-                       '/'.self::WB.'буюп'.self::WB.'/u' => 'büyüp',
-                       '/'.self::WB.'Буюп'.self::WB.'/u' => 'Büyüp',
-                       '/'.self::WB.'БУЮП'.self::WB.'/u' => 'BÜYÜP',
-
-                       '/'.self::WB.'буюк'.self::WB.'/u' => 'büyük',
-                       '/'.self::WB.'Буюк'.self::WB.'/u' => 'Büyük',
-                       '/'.self::WB.'БУЮК'.self::WB.'/u' => 'BÜYÜK',
-
-                       '/'.self::WB.'джонк'.self::WB.'/u' => 'cönk',
-                       '/'.self::WB.'Джонк'.self::WB.'/u' => 'Cönk',
-                       '/'.self::WB.'ДЖОНК'.self::WB.'/u' => 'CÖNK',
-                       '/'.self::WB.'джонкю'.self::WB.'/u' => 'cönkü',
-                       '/'.self::WB.'Джонкю'.self::WB.'/u' => 'Cönkü',
-                       '/'.self::WB.'ДЖОНКЮ'.self::WB.'/u' => 'CÖNKÜ',
-
-                       '/'.self::WB.'куркчи/u' => 'kürkçi',
-                       '/'.self::WB.'Куркчи/u' => 'Kürkçi',
-                       '/'.self::WB.'КУРКЧИ/u' => 'KÜRKÇI',
-
-                       '/'.self::WB.'устке'.self::WB.'/u' => 'üstke',
-                       '/'.self::WB.'Устке'.self::WB.'/u' => 'Üstke',
-                       '/'.self::WB.'УСТКЕ'.self::WB.'/u' => 'ÜSTKE',
-                       '/'.self::WB.'устте'.self::WB.'/u' => 'üstte',
-                       '/'.self::WB.'Устте'.self::WB.'/u' => 'Üstte',
-                       '/'.self::WB.'УСТТЕ'.self::WB.'/u' => 'ÜSTTE',
-                       '/'.self::WB.'усттен'.self::WB.'/u' => 'üstten',
-                       '/'.self::WB.'Усттен'.self::WB.'/u' => 'Üstten',
-                       '/'.self::WB.'УСТТЕН'.self::WB.'/u' => 'ÜSTTEN',
+                       '/' . self::WB . 'КъЮШ' . self::WB . '/u' => 'QYŞ',
+                       '/' . self::WB . 'ЮШ' . self::WB . '/u' => 'YŞ',
+
+                       '/' . self::WB . 'кок' . self::WB . '/u' => 'kök',
+                       '/' . self::WB . 'Кок' . self::WB . '/u' => 'Kök',
+                       '/' . self::WB . 'КОК' . self::WB . '/u' => 'KÖK',
+                       '/' . self::WB . 'ком-кок' . self::WB . '/u' => 'köm-kök',
+                       '/' . self::WB . 'Ком-кок' . self::WB . '/u' => 'Köm-kök',
+                       '/' . self::WB . 'КОМ-КОК' . self::WB . '/u' => 'KÖM-KÖK',
+
+                       '/' . self::WB . 'коп' . self::WB . '/u' => 'köp',
+                       '/' . self::WB . 'Коп' . self::WB . '/u' => 'Köp',
+                       '/' . self::WB . 'КОП' . self::WB . '/u' => 'KÖP',
+
+                       '/' . self::WB . 'курк' . self::WB . '/u' => 'kürk',
+                       '/' . self::WB . 'Курк' . self::WB . '/u' => 'Kürk',
+                       '/' . self::WB . 'КУРК' . self::WB . '/u' => 'KÜRK',
+
+                       '/' . self::WB . 'ог' . self::WB . '/u' => 'ög',
+                       '/' . self::WB . 'Ог' . self::WB . '/u' => 'Ög',
+                       '/' . self::WB . 'ОГ' . self::WB . '/u' => 'ÖG',
+
+                       '/' . self::WB . 'юрип' . self::WB . '/u' => 'yürip',
+                       '/' . self::WB . 'Юрип' . self::WB . '/u' => 'Yürip',
+                       '/' . self::WB . 'ЮРИП' . self::WB . '/u' => 'YÜRİP',
+
+                       '/' . self::WB . 'юз' . self::WB . '/u' => 'yüz',
+                       '/' . self::WB . 'Юз' . self::WB . '/u' => 'Yüz',
+                       '/' . self::WB . 'ЮЗ' . self::WB . '/u' => 'YÜZ',
+
+                       '/' . self::WB . 'юк' . self::WB . '/u' => 'yük',
+                       '/' . self::WB . 'Юк' . self::WB . '/u' => 'Yük',
+                       '/' . self::WB . 'ЮК' . self::WB . '/u' => 'YÜK',
+
+                       '/' . self::WB . 'буюп' . self::WB . '/u' => 'büyüp',
+                       '/' . self::WB . 'Буюп' . self::WB . '/u' => 'Büyüp',
+                       '/' . self::WB . 'БУЮП' . self::WB . '/u' => 'BÜYÜP',
+
+                       '/' . self::WB . 'буюк' . self::WB . '/u' => 'büyük',
+                       '/' . self::WB . 'Буюк' . self::WB . '/u' => 'Büyük',
+                       '/' . self::WB . 'БУЮК' . self::WB . '/u' => 'BÜYÜK',
+
+                       '/' . self::WB . 'джонк' . self::WB . '/u' => 'cönk',
+                       '/' . self::WB . 'Джонк' . self::WB . '/u' => 'Cönk',
+                       '/' . self::WB . 'ДЖОНК' . self::WB . '/u' => 'CÖNK',
+                       '/' . self::WB . 'джонкю' . self::WB . '/u' => 'cönkü',
+                       '/' . self::WB . 'Джонкю' . self::WB . '/u' => 'Cönkü',
+                       '/' . self::WB . 'ДЖОНКЮ' . self::WB . '/u' => 'CÖNKÜ',
+
+                       '/' . self::WB . 'куркчи/u' => 'kürkçi',
+                       '/' . self::WB . 'Куркчи/u' => 'Kürkçi',
+                       '/' . self::WB . 'КУРКЧИ/u' => 'KÜRKÇI',
+
+                       '/' . self::WB . 'устке' . self::WB . '/u' => 'üstke',
+                       '/' . self::WB . 'Устке' . self::WB . '/u' => 'Üstke',
+                       '/' . self::WB . 'УСТКЕ' . self::WB . '/u' => 'ÜSTKE',
+                       '/' . self::WB . 'устте' . self::WB . '/u' => 'üstte',
+                       '/' . self::WB . 'Устте' . self::WB . '/u' => 'Üstte',
+                       '/' . self::WB . 'УСТТЕ' . self::WB . '/u' => 'ÜSTTE',
+                       '/' . self::WB . 'усттен' . self::WB . '/u' => 'üstten',
+                       '/' . self::WB . 'Усттен' . self::WB . '/u' => 'Üstten',
+                       '/' . self::WB . 'УСТТЕН' . self::WB . '/u' => 'ÜSTTEN',
 
                        # отдельно стоящие Ё и Я
                        # stand-alone Ё and Я
-                       '/'.self::WB.'Я'.self::WB.'/u' => 'Ya',
-                       '/'.self::WB.'Ё'.self::WB.'/u' => 'Yo',
+                       '/' . self::WB . 'Я' . self::WB . '/u' => 'Ya',
+                       '/' . self::WB . 'Ё' . self::WB . '/u' => 'Yo',
 
                        ############################
                        # относятся к началу слова #
                        # word prefixes            #
                        ############################
-                       '/'.self::WB.'КъЮШн/u' => 'QYŞn',
-                       '/'.self::WB.'ЮШн/u' => 'YŞn',
+                       '/' . self::WB . 'КъЮШн/u' => 'QYŞn',
+                       '/' . self::WB . 'ЮШн/u' => 'YŞn',
 
                        # need to convert digraphs (гъ, къ, нъ, дж) now to match patterns
                        '/гъ/u' => 'ğ',
@@ -496,69 +496,73 @@ class CrhExceptions {
                        '/Д[жЖ]/u' => 'C',
 
                        # о => ö
-                       '/'.self::WB.'(['.Crh::C_M_CONS.'])о(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u'
-                               => '$1ö$2$3$4',
-                       '/'.self::WB.'о(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ö$1$2$3',
-                       '/'.self::WB.'(['.Crh::C_M_CONS.'])О(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u'
-                               => '$1Ö$2$3$4',
-                       '/'.self::WB.'О(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ö$1$2$3',
-
-                       '/'.self::WB.'(['.Crh::C_M_CONS.'])о(['.Crh::C_CONS.'])([еиэюьü])/u' => '$1ö$2$3',
-                       '/'.self::WB.'о(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ö$1$2',
-                       '/'.self::WB.'(['.Crh::C_M_CONS.'])О(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => '$1Ö$2$3',
-                       '/'.self::WB.'О(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ö$1$2',
+                       '/' . self::WB . '([' . Crh::C_M_CONS . '])о([' . Crh::C_CONS . '])([' . Crh::C_CONS .
+                               '])([еиэюьü])/u' => '$1ö$2$3$4',
+                       '/' . self::WB . 'о([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьü])/u' => 'ö$1$2$3',
+                       '/' . self::WB . '([' . Crh::C_M_CONS . '])О([' . Crh::C_CONS . '])([' . Crh::C_CONS .
+                               '])([еиэюьüЕИЭЮЬÜ])/u' => '$1Ö$2$3$4',
+                       '/' . self::WB . 'О([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьüЕИЭЮЬÜ])/u'
+                               => 'Ö$1$2$3',
+
+                       '/' . self::WB . '([' . Crh::C_M_CONS . '])о([' . Crh::C_CONS . '])([еиэюьü])/u' => '$1ö$2$3',
+                       '/' . self::WB . 'о([' . Crh::C_CONS . '])([еиэюьü])/u' => 'ö$1$2',
+                       '/' . self::WB . '([' . Crh::C_M_CONS . '])О([' . Crh::C_CONS . '])([еиэюьüЕИЭЮЬÜ])/u'
+                               => '$1Ö$2$3',
+                       '/' . self::WB . 'О([' . Crh::C_CONS . '])([еиэюьüЕИЭЮЬÜ])/u' => 'Ö$1$2',
 
                        # ё => yö
-                       '/'.self::WB.'ё(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([ьеюü])/u' => 'yö$1$2$3',
-                       '/'.self::WB.'Ё(['.Crh::C_CONS_LC.'])(['.Crh::C_CONS_LC.'])([ьеюü])/u' => 'Yö$1$2$3',
-                       '/'.self::WB.'Ё(['.Crh::C_CONS_UC.'])(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => 'YÖ$1$2$3',
-                       '/'.self::WB.'ё(['.Crh::C_CONS.'])([ьеюü])/u' => 'yö$1$2',
-                       '/'.self::WB.'Ё(['.Crh::C_CONS_LC.'])([ьеюü])/u' => 'Yö$1$2',
-                       '/'.self::WB.'Ё(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => 'YÖ$1$2',
+                       '/' . self::WB . 'ё([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([ьеюü])/u' => 'yö$1$2$3',
+                       '/' . self::WB . 'Ё([' . Crh::C_CONS_LC . '])([' . Crh::C_CONS_LC . '])([ьеюü])/u' => 'Yö$1$2$3',
+                       '/' . self::WB . 'Ё([' . Crh::C_CONS_UC . '])([' . Crh::C_CONS_UC . '])([ЬЕЮÜ])/u' => 'YÖ$1$2$3',
+                       '/' . self::WB . 'ё([' . Crh::C_CONS . '])([ьеюü])/u' => 'yö$1$2',
+                       '/' . self::WB . 'Ё([' . Crh::C_CONS_LC . '])([ьеюü])/u' => 'Yö$1$2',
+                       '/' . self::WB . 'Ё([' . Crh::C_CONS_UC . '])([ЬЕЮÜ])/u' => 'YÖ$1$2',
 
                        # у => ü, ую => üyü
-                       '/'.self::WB.'(['.Crh::C_M_CONS.'])у(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u'
-                               => '$1ü$2$3$4',
-                       '/'.self::WB.'у(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ü$1$2$3',
-                       '/'.self::WB.'ую(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'üyü$1$2$3',
-                       '/'.self::WB.'(['.Crh::C_M_CONS.'])У(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u'
-                               => '$1Ü$2$3$4',
-                       '/'.self::WB.'У(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ü$1$2$3',
-                       '/'.self::WB.'Ую(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'Üyü$1$2$3',
-                       '/'.self::WB.'УЮ(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ÜYÜ$1$2$3',
-
-                       '/'.self::WB.'(['.Crh::C_M_CONS.'])у(['.Crh::C_CONS.'])([еиэюьü])/u' => '$1ü$2$3',
-                       '/'.self::WB.'у(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ü$1$2',
-                       '/'.self::WB.'ую(['.Crh::C_CONS.'])([еиэюьü])/u' => 'üyü$1$2',
-                       '/'.self::WB.'(['.Crh::C_M_CONS.'])У(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => '$1Ü$2$3',
-                       '/'.self::WB.'У(['.Crh::C_CONS.'])([еиэюьüЕИЭЮЬÜ])/u' => 'Ü$1$2',
-                       '/'.self::WB.'Ую(['.Crh::C_CONS.'])([еиэюьü])/u' => 'Üyü$1$2',
-                       '/'.self::WB.'УЮ(['.Crh::C_CONS.'])([еиэюьü])/u' => 'ÜYÜ$1$2',
+                       '/' . self::WB . '([' . Crh::C_M_CONS . '])у([' . Crh::C_CONS . '])([' . Crh::C_CONS .
+                               '])([еиэюьü])/u' => '$1ü$2$3$4',
+                       '/' . self::WB . 'у([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьü])/u' => 'ü$1$2$3',
+                       '/' . self::WB . 'ую([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьü])/u' => 'üyü$1$2$3',
+                       '/' . self::WB . '([' . Crh::C_M_CONS . '])У([' . Crh::C_CONS . '])([' . Crh::C_CONS .
+                               '])([еиэюьüЕИЭЮЬÜ])/u' => '$1Ü$2$3$4',
+                       '/' . self::WB . 'У([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьüЕИЭЮЬÜ])/u'
+                               => 'Ü$1$2$3',
+                       '/' . self::WB . 'Ую([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьü])/u' => 'Üyü$1$2$3',
+                       '/' . self::WB . 'УЮ([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([еиэюьü])/u' => 'ÜYÜ$1$2$3',
+
+                       '/' . self::WB . '([' . Crh::C_M_CONS . '])у([' . Crh::C_CONS . '])([еиэюьü])/u' => '$1ü$2$3',
+                       '/' . self::WB . 'у([' . Crh::C_CONS . '])([еиэюьü])/u' => 'ü$1$2',
+                       '/' . self::WB . 'ую([' . Crh::C_CONS . '])([еиэюьü])/u' => 'üyü$1$2',
+                       '/' . self::WB . '([' . Crh::C_M_CONS . '])У([' . Crh::C_CONS . '])([еиэюьüЕИЭЮЬÜ])/u'
+                               => '$1Ü$2$3',
+                       '/' . self::WB . 'У([' . Crh::C_CONS . '])([еиэюьüЕИЭЮЬÜ])/u' => 'Ü$1$2',
+                       '/' . self::WB . 'Ую([' . Crh::C_CONS . '])([еиэюьü])/u' => 'Üyü$1$2',
+                       '/' . self::WB . 'УЮ([' . Crh::C_CONS . '])([еиэюьü])/u' => 'ÜYÜ$1$2',
 
                        # ю => yü
-                       '/'.self::WB.'([аыоуеиёюАЫОУЕИЁЮ]?)ю(['.Crh::C_CONS.'])(['.Crh::C_CONS.'])([ьеюü])/u'
+                       '/' . self::WB . '([аыоуеиёюАЫОУЕИЁЮ]?)ю([' . Crh::C_CONS . '])([' . Crh::C_CONS . '])([ьеюü])/u'
                                => '$1yü$2$3$4',
-                       '/'.self::WB.'([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_LC.'])(['.Crh::C_CONS_LC.'])([ьеюü])/u'
+                       '/' . self::WB . '([АЫОУЕИЁЮ]?)Ю([' . Crh::C_CONS_LC . '])([' . Crh::C_CONS_LC . '])([ьеюü])/u'
                                => '$1Yü$2$3$4',
-                       '/'.self::WB.'([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_UC.'])(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u'
+                       '/' . self::WB . '([АЫОУЕИЁЮ]?)Ю([' . Crh::C_CONS_UC . '])([' . Crh::C_CONS_UC . '])([ЬЕЮÜ])/u'
                                => '$1YÜ$2$3$4',
-                       '/'.self::WB.'([аыоуеиёюАЫОУЕИЁЮ]?)ю(['.Crh::C_CONS.'])([ьеюü])/u' => '$1yü$2$3',
-                       '/'.self::WB.'([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_LC.'])([ьеюü])/u' => '$1Yü$2$3',
-                       '/'.self::WB.'([АЫОУЕИЁЮ]?)Ю(['.Crh::C_CONS_UC.'])([ЬЕЮÜ])/u' => '$1YÜ$2$3',
+                       '/' . self::WB . '([аыоуеиёюАЫОУЕИЁЮ]?)ю([' . Crh::C_CONS . '])([ьеюü])/u' => '$1yü$2$3',
+                       '/' . self::WB . '([АЫОУЕИЁЮ]?)Ю([' . Crh::C_CONS_LC . '])([ьеюü])/u' => '$1Yü$2$3',
+                       '/' . self::WB . '([АЫОУЕИЁЮ]?)Ю([' . Crh::C_CONS_UC . '])([ЬЕЮÜ])/u' => '$1YÜ$2$3',
 
                        # e => ye, я => ya
-                       '/'.self::WB.'е/u' => 'ye',
-                       '/'.self::WB.'Е(['.Crh::C_LC.'cğñqöü])/u' => 'Ye$1',
-                       '/'.self::WB.'Е(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'YE$1',
-                       '/'.self::WB.'я/u' => 'ya',
-                       '/'.self::WB.'Я(['.Crh::C_LC.'cğñqöü])/u' => 'Ya$1',
-                       '/'.self::WB.'Я(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'YA$1',
+                       '/' . self::WB . 'е/u' => 'ye',
+                       '/' . self::WB . 'Е([' . Crh::C_LC . 'cğñqöü])/u' => 'Ye$1',
+                       '/' . self::WB . 'Е([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => 'YE$1',
+                       '/' . self::WB . 'я/u' => 'ya',
+                       '/' . self::WB . 'Я([' . Crh::C_LC . 'cğñqöü])/u' => 'Ya$1',
+                       '/' . self::WB . 'Я([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => 'YA$1',
                        '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])е/u' => '$1ye',
-                       '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е(['.Crh::C_LC.'cğñqöü])/u' => '$1Ye$2',
-                       '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е(['.Crh::C_UC.'CĞÑQÖÜ])/u' => '$1YE$2',
+                       '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е([' . Crh::C_LC . 'cğñqöü])/u' => '$1Ye$2',
+                       '/([аеёиоуыэюяйьъaeöüАЕЁИОУЫЭЮЯЙЬЪAEÖÜ])Е([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => '$1YE$2',
                        '/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])я/u' => '$1ya',
-                       '/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я(['.Crh::C_LC.'cğñqöü])/u' => '$1Ya$2',
-                       '/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я(['.Crh::C_UC.'CĞÑQÖÜ])/u' => '$1YA$2',
+                       '/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я([' . Crh::C_LC . 'cğñqöü])/u' => '$1Ya$2',
+                       '/([аеёиоуыэюяйьъaeöüğqАЕЁИОУЫЭЮЯЙЬЪAEÖÜĞQ])Я([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => '$1YA$2',
 
                        ###############################
                        # не зависят от места в слове #
@@ -576,19 +580,19 @@ class CrhExceptions {
 
                        # Ö, Ü 1-й заход: ё, ю после согласных > ö, ü
                        # Ö, Ü 1st instance: ё, ю after consonants > ö, ü
-                       '/(['.Crh::C_CONS.'])ю/u' => '$1ü',
-                       '/(['.Crh::C_CONS.'])Ю/u' => '$1Ü',
-                       '/(['.Crh::C_CONS.'])ё/u' => '$1ö',
-                       '/(['.Crh::C_CONS.'])Ё/u' => '$1Ö',
+                       '/([' . Crh::C_CONS . '])ю/u' => '$1ü',
+                       '/([' . Crh::C_CONS . '])Ю/u' => '$1Ü',
+                       '/([' . Crh::C_CONS . '])ё/u' => '$1ö',
+                       '/([' . Crh::C_CONS . '])Ё/u' => '$1Ö',
 
                        # остальные вхождения о, у, ё, ю
                        # other occurences of о, у, ё, ю
-                       '/Ё(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'YO$1',
-                       '/Ю(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'YU$1',
+                       '/Ё([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => 'YO$1',
+                       '/Ю([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => 'YU$1',
 
                        # Ц & Щ
-                       '/Ц(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'TS$1',
-                       '/Щ(['.Crh::C_UC.'CĞÑQÖÜ])/u' => 'ŞÇ$1',
+                       '/Ц([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => 'TS$1',
+                       '/Щ([' . Crh::C_UC . 'CĞÑQÖÜ])/u' => 'ŞÇ$1',
                ];
 
                $this->Latn2CyrlRegexes = [
@@ -596,31 +600,31 @@ class CrhExceptions {
                        // TODO: refactor upper/lower/first capital whole words without
                        // regexes into simpler list
 
-                       '/'.self::WB.'an'.self::WB.'/u' => 'ань',
-                       '/'.self::WB.'An'.self::WB.'/u' => 'Ань',
-                       '/'.self::WB.'AN'.self::WB.'/u' => 'АНЬ',
-                       '/'.self::WB.'ange'.self::WB.'/u' => 'аньге',
-                       '/'.self::WB.'Ange'.self::WB.'/u' => 'Аньге',
-                       '/'.self::WB.'ANGE'.self::WB.'/u' => 'АНЬГЕ',
-                       '/'.self::WB.'ande'.self::WB.'/u' => 'аньде',
-                       '/'.self::WB.'Ande'.self::WB.'/u' => 'Аньде',
-                       '/'.self::WB.'ANDE'.self::WB.'/u' => 'АНЬДЕ',
-                       '/'.self::WB.'anki'.self::WB.'/u' => 'аньки',
-                       '/'.self::WB.'Anki'.self::WB.'/u' => 'Аньки',
-                       '/'.self::WB.'ANKİ'.self::WB.'/u' => 'АНЬКИ',
-                       '/'.self::WB.'deral'.self::WB.'/u' => 'деръал',
-                       '/'.self::WB.'Deral'.self::WB.'/u' => 'Деръал',
-                       '/'.self::WB.'DERAL'.self::WB.'/u' => 'ДЕРЪАЛ',
-                       '/'.self::WB.'kör'.self::WB.'/u' => 'кёр',
-                       '/'.self::WB.'Kör'.self::WB.'/u' => 'Кёр',
-                       '/'.self::WB.'KÖR'.self::WB.'/u' => 'КЁР',
-                       '/'.self::WB.'mer'.self::WB.'/u' => 'мэр',
-                       '/'.self::WB.'Mer'.self::WB.'/u' => 'Мэр',
-                       '/'.self::WB.'MER'.self::WB.'/u' => 'МЭР',
-
-                       '/'.self::WB.'cönk/u' => 'джонк',
-                       '/'.self::WB.'Cönk/u' => 'Джонк',
-                       '/'.self::WB.'CÖNK/u' => 'ДЖОНК',
+                       '/' . self::WB . 'an' . self::WB . '/u' => 'ань',
+                       '/' . self::WB . 'An' . self::WB . '/u' => 'Ань',
+                       '/' . self::WB . 'AN' . self::WB . '/u' => 'АНЬ',
+                       '/' . self::WB . 'ange' . self::WB . '/u' => 'аньге',
+                       '/' . self::WB . 'Ange' . self::WB . '/u' => 'Аньге',
+                       '/' . self::WB . 'ANGE' . self::WB . '/u' => 'АНЬГЕ',
+                       '/' . self::WB . 'ande' . self::WB . '/u' => 'аньде',
+                       '/' . self::WB . 'Ande' . self::WB . '/u' => 'Аньде',
+                       '/' . self::WB . 'ANDE' . self::WB . '/u' => 'АНЬДЕ',
+                       '/' . self::WB . 'anki' . self::WB . '/u' => 'аньки',
+                       '/' . self::WB . 'Anki' . self::WB . '/u' => 'Аньки',
+                       '/' . self::WB . 'ANKİ' . self::WB . '/u' => 'АНЬКИ',
+                       '/' . self::WB . 'deral' . self::WB . '/u' => 'деръал',
+                       '/' . self::WB . 'Deral' . self::WB . '/u' => 'Деръал',
+                       '/' . self::WB . 'DERAL' . self::WB . '/u' => 'ДЕРЪАЛ',
+                       '/' . self::WB . 'kör' . self::WB . '/u' => 'кёр',
+                       '/' . self::WB . 'Kör' . self::WB . '/u' => 'Кёр',
+                       '/' . self::WB . 'KÖR' . self::WB . '/u' => 'КЁР',
+                       '/' . self::WB . 'mer' . self::WB . '/u' => 'мэр',
+                       '/' . self::WB . 'Mer' . self::WB . '/u' => 'Мэр',
+                       '/' . self::WB . 'MER' . self::WB . '/u' => 'МЭР',
+
+                       '/' . self::WB . 'cönk/u' => 'джонк',
+                       '/' . self::WB . 'Cönk/u' => 'Джонк',
+                       '/' . self::WB . 'CÖNK/u' => 'ДЖОНК',
 
                        # (y)etsin -> етсин/этсин
                        # note that target starts with CYRILLIC е/Е!
@@ -636,67 +640,77 @@ class CrhExceptions {
 
                        # буква Ё - первый заход
                        # расставляем Ь после согласных
-                       '/'.self::WB.'([yY])ö(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|'.self::WB.')/u' => '$1ö$2ь$3',
-                       '/'.self::WB.'([yY])Ö(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|'.self::WB.')/u' => '$1Ö$2Ь$3',
-                       '/'.self::WB.'AQŞ([^AEI]|'.self::WB.')/u' => 'АКъШ$1',
+                       '/' . self::WB . '([yY])ö([' . Crh::L_N_CONS . '])([aAuU' . Crh::L_CONS . ']|' . self::WB . ')/u'
+                               => '$1ö$2ь$3',
+                       '/' . self::WB . '([yY])Ö([' . Crh::L_N_CONS . '])([aAuU' . Crh::L_CONS . ']|' . self::WB . ')/u'
+                               => '$1Ö$2Ь$3',
+                       '/' . self::WB . 'AQŞ([^AEI]|' . self::WB . ')/u' => 'АКъШ$1',
 
                        # буква Ю - первый заход
                        # расставляем Ь после согласных
-                       '/'.self::WB.'([yY])ü(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|'.self::WB.')/u' => '$1ü$2ь$3',
-                       '/'.self::WB.'([yY])Ü(['.Crh::L_N_CONS.'])([aAuU'.Crh::L_CONS.']|'.self::WB.')/u' => '$1Ü$2Ь$3',
-
-                       '/'.self::WB.'([bcgkpşBCGKPŞ])ö(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
-                               => '$1ö$2ь$3',
-                       '/'.self::WB.'([bcgkpşBCGKPŞ])Ö(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
-                               => '$1Ö$2Ь$3',
-                       '/'.self::WB.'([bcgkpşBCGKPŞ])Ö(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
-                               => '$1Ö$2Ь$3',
-                       '/'.self::WB.'([bcgkpşBCGKPŞ])ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
+                       '/' . self::WB . '([yY])ü([' . Crh::L_N_CONS . '])([aAuU' . Crh::L_CONS . ']|' . self::WB . ')/u'
                                => '$1ü$2ь$3',
-                       '/'.self::WB.'([bcgkpşBCGKPŞ])Ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
-                               => '$1Ü$2Ь$3',
-                       '/'.self::WB.'([bcgkpşBCGKPŞ])Ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u'
+                       '/' . self::WB . '([yY])Ü([' . Crh::L_N_CONS . '])([aAuU' . Crh::L_CONS . ']|' . self::WB . ')/u'
                                => '$1Ü$2Ь$3',
 
+                       '/' . self::WB . '([bcgkpşBCGKPŞ])ö([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' .
+                               self::WB . ')/u' => '$1ö$2ь$3',
+                       '/' . self::WB . '([bcgkpşBCGKPŞ])Ö([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' .
+                               self::WB . ')/u' => '$1Ö$2Ь$3',
+                       '/' . self::WB . '([bcgkpşBCGKPŞ])Ö([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' .
+                               self::WB . ')/u' => '$1Ö$2Ь$3',
+                       '/' . self::WB . '([bcgkpşBCGKPŞ])ü([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' .
+                               self::WB . ')/u' => '$1ü$2ь$3',
+                       '/' . self::WB . '([bcgkpşBCGKPŞ])Ü([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' .
+                               self::WB . ')/u' => '$1Ü$2Ь$3',
+                       '/' . self::WB . '([bcgkpşBCGKPŞ])Ü([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' .
+                               self::WB . ')/u' => '$1Ü$2Ь$3',
+
                         # ö и ü в начале слова
                         # случаи, когда нужен Ь
-                       '/'.self::WB.'ö(['.Crh::L_N_CONS.'pP])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'ö$1ь$2',
-                       '/'.self::WB.'Ö(['.Crh::L_N_CONS_LC.'p])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'Ö$1ь$2',
-                       '/'.self::WB.'Ö(['.Crh::L_N_CONS_UC.'P])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'Ö$1Ь$2',
-                       '/'.self::WB.'ü(['.Crh::L_N_CONS.'])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'ü$1ь$2',
-                       '/'.self::WB.'Ü(['.Crh::L_N_CONS_LC.'])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'Ü$1ь$2',
-                       '/'.self::WB.'Ü(['.Crh::L_N_CONS_UC.'])(['.Crh::L_CONS.']|'.self::WB.')/u' => 'Ü$1Ь$2',
-
-                       '/ts'.self::WB.'/u' => 'ц',
-                       '/şç'.self::WB.'/u' => 'щ',
-                       '/Ş[çÇ]'.self::WB.'/u' => 'Щ',
-                       '/T[sS]'.self::WB.'/u' => 'Ц',
+                       '/' . self::WB . 'ö([' . Crh::L_N_CONS . 'pP])([' . Crh::L_CONS . ']|' . self::WB . ')/u'
+                               => 'ö$1ь$2',
+                       '/' . self::WB . 'Ö([' . Crh::L_N_CONS_LC . 'p])([' . Crh::L_CONS . ']|' . self::WB . ')/u'
+                               => 'Ö$1ь$2',
+                       '/' . self::WB . 'Ö([' . Crh::L_N_CONS_UC . 'P])([' . Crh::L_CONS . ']|' . self::WB . ')/u'
+                               => 'Ö$1Ь$2',
+                       '/' . self::WB . 'ü([' . Crh::L_N_CONS . '])([' . Crh::L_CONS . ']|' . self::WB . ')/u'
+                               => 'ü$1ь$2',
+                       '/' . self::WB . 'Ü([' . Crh::L_N_CONS_LC . '])([' . Crh::L_CONS . ']|' . self::WB . ')/u'
+                               => 'Ü$1ь$2',
+                       '/' . self::WB . 'Ü([' . Crh::L_N_CONS_UC . '])([' . Crh::L_CONS . ']|' . self::WB . ')/u'
+                               => 'Ü$1Ь$2',
+
+                       '/ts' . self::WB . '/u' => 'ц',
+                       '/şç' . self::WB . '/u' => 'щ',
+                       '/Ş[çÇ]' . self::WB . '/u' => 'Щ',
+                       '/T[sS]' . self::WB . '/u' => 'Ц',
 
                        # Ь после Л
                        # add Ь after Л
-                       '/(['.Crh::L_F.'])l(['.Crh::L_CONS_LC.']|'.self::WB.')/u' => '$1ль$2',
-                       '/(['.Crh::L_F_UC.'])L(['.Crh::L_CONS.']|'.self::WB.')/u' => '$1ЛЬ$2',
+                       '/([' . Crh::L_F . '])l([' . Crh::L_CONS_LC . ']|' . self::WB . ')/u' => '$1ль$2',
+                       '/([' . Crh::L_F_UC . '])L([' . Crh::L_CONS . ']|' . self::WB . ')/u' => '$1ЛЬ$2',
 
                        # относятся к началу слова
-                       '/'.self::WB.'ts/u' => 'ц',
-                       '/'.self::WB.'T[sS]/u' => 'Ц',
+                       '/' . self::WB . 'ts/u' => 'ц',
+                       '/' . self::WB . 'T[sS]/u' => 'Ц',
 
-                       '/'.self::WB.'şç/u' => 'щ',
-                       '/'.self::WB.'Ş[çÇ]/u' => 'Щ',
+                       '/' . self::WB . 'şç/u' => 'щ',
+                       '/' . self::WB . 'Ş[çÇ]/u' => 'Щ',
 
                        # Э
-                       '/('.self::WB.'|['.Crh::L_VOW.'аеэяАЕЭЯ])e/u' => '$1э',
-                       '/('.self::WB.'|['.Crh::L_VOW_UC.'АЕЭЯ])E/u' => '$1Э',
+                       '/(' . self::WB . '|[' . Crh::L_VOW . 'аеэяАЕЭЯ])e/u' => '$1э',
+                       '/(' . self::WB . '|[' . Crh::L_VOW_UC . 'АЕЭЯ])E/u' => '$1Э',
 
-                       '/'.self::WB.'(['.Crh::L_M_CONS.'])ö/u' => '$1о',
-                       '/'.self::WB.'(['.Crh::L_M_CONS.'])Ö/u' => '$1О',
-                       '/'.self::WB.'(['.Crh::L_M_CONS.'])ü/u' => '$1у',
-                       '/'.self::WB.'(['.Crh::L_M_CONS.'])Ü/u' => '$1У',
+                       '/' . self::WB . '([' . Crh::L_M_CONS . '])ö/u' => '$1о',
+                       '/' . self::WB . '([' . Crh::L_M_CONS . '])Ö/u' => '$1О',
+                       '/' . self::WB . '([' . Crh::L_M_CONS . '])ü/u' => '$1у',
+                       '/' . self::WB . '([' . Crh::L_M_CONS . '])Ü/u' => '$1У',
 
-                       '/'.self::WB.'ö/u' => 'о',
-                       '/'.self::WB.'Ö/u' => 'О',
-                       '/'.self::WB.'ü/u' => 'у',
-                       '/'.self::WB.'Ü/u' => 'У',
+                       '/' . self::WB . 'ö/u' => 'о',
+                       '/' . self::WB . 'Ö/u' => 'О',
+                       '/' . self::WB . 'ü/u' => 'у',
+                       '/' . self::WB . 'Ü/u' => 'У',
 
                        # некоторые исключения
                        # some exceptions
@@ -718,10 +732,10 @@ class CrhExceptions {
                        '/T[sS][iİ]([^zZñÑ])/u' => 'ЦИ$1',
                        '/ts([ou])/u' => 'ц$1',
                        '/T[sS]([oOuU])/u' => 'Ц$1',
-                       '/ts(['.Crh::L_CONS.'])/u' => 'ц$1',
-                       '/T[sS](['.Crh::L_CONS.'])/u' => 'Ц$1',
-                       '/(['.Crh::L_CONS.'])ts/u' => '$1ц',
-                       '/(['.Crh::L_CONS.'])T[sS]/u' => '$1Ц',
+                       '/ts([' . Crh::L_CONS . '])/u' => 'ц$1',
+                       '/T[sS]([' . Crh::L_CONS . '])/u' => 'Ц$1',
+                       '/([' . Crh::L_CONS . '])ts/u' => '$1ц',
+                       '/([' . Crh::L_CONS . '])T[sS]/u' => '$1Ц',
                        '/tsиал/u' => 'циал',
                        '/TSИАЛ/u' => 'ЦИАЛ',
 
@@ -730,15 +744,15 @@ class CrhExceptions {
                        '/[ьЬ]([iİ])/u' => '$1',
 
                        # ya & ye
-                       '/(['.Crh::L_CONS.'])ya/u' => '$1ья',
-                       '/(['.Crh::L_CONS.'])Y[aA]/u' => '$1ЬЯ',
-                       '/(['.Crh::L_CONS.'])ye/u' => '$1ье',
-                       '/(['.Crh::L_CONS.'])Y[eE]/u' => '$1ЬЕ',
+                       '/([' . Crh::L_CONS . '])ya/u' => '$1ья',
+                       '/([' . Crh::L_CONS . '])Y[aA]/u' => '$1ЬЯ',
+                       '/([' . Crh::L_CONS . '])ye/u' => '$1ье',
+                       '/([' . Crh::L_CONS . '])Y[eE]/u' => '$1ЬЕ',
 
                         # расставляем Ь перед Ё
                         # place Ь in front of Ё
-                       '/(['.Crh::L_CONS.'])y[oö]/u' => '$1ьё',
-                       '/(['.Crh::L_CONS.'])Y[oOöÖ]/u' => '$1ЬЁ',
+                       '/([' . Crh::L_CONS . '])y[oö]/u' => '$1ьё',
+                       '/([' . Crh::L_CONS . '])Y[oOöÖ]/u' => '$1ЬЁ',
                         # оставшиеся вхождения yo и yö
                         # remaining occurrences of yo and yö
                        '/y[oö]/u' => 'ё',
@@ -746,8 +760,8 @@ class CrhExceptions {
 
                         # расставляем Ь перед Ю
                         # place Ь in front of Ю
-                       '/(['.Crh::L_CONS.'])y[uü]/u' => '$1ью',
-                       '/(['.Crh::L_CONS.'])Y[uUüÜ]/u' => '$1ЬЮ',
+                       '/([' . Crh::L_CONS . '])y[uü]/u' => '$1ью',
+                       '/([' . Crh::L_CONS . '])Y[uUüÜ]/u' => '$1ЬЮ',
                         # оставшиеся вхождения yu и yü
                         # remaining occurrences of yu and yü
                        '/y[uü]/u' => 'ю',
@@ -758,18 +772,18 @@ class CrhExceptions {
                        '/[ьЬ]([aA])/u' => '$1',
 
                        # дж
-                       '/C(['.Crh::L_UC.Crh::C_UC.'АЕЁЙОУЭЮЯ])/u' => 'ДЖ$1',
-                       '/(['.Crh::L_UC.Crh::C_UC.'АЕЁЙОУЭЮЯ])C/u' => '$1ДЖ',
+                       '/C([' . Crh::L_UC . Crh::C_UC . 'АЕЁЙОУЭЮЯ])/u' => 'ДЖ$1',
+                       '/([' . Crh::L_UC . Crh::C_UC . 'АЕЁЙОУЭЮЯ])C/u' => '$1ДЖ',
 
                        # гъ, къ, нъ
-                       '/Ğ(['.Crh::L_UC.Crh::C_UC.'])/u' => 'ГЪ$1',
-                       '/(['.Crh::L_UC.Crh::C_UC.'Ъ])Ğ/u' => '$1ГЪ',
+                       '/Ğ([' . Crh::L_UC . Crh::C_UC . '])/u' => 'ГЪ$1',
+                       '/([' . Crh::L_UC . Crh::C_UC . 'Ъ])Ğ/u' => '$1ГЪ',
 
-                       '/Q(['.Crh::L_UC.Crh::C_UC.'])/u' => 'КЪ$1',
-                       '/(['.Crh::L_UC.Crh::C_UC.'Ъ])Q/u' => '$1КЪ',
+                       '/Q([' . Crh::L_UC . Crh::C_UC . '])/u' => 'КЪ$1',
+                       '/([' . Crh::L_UC . Crh::C_UC . 'Ъ])Q/u' => '$1КЪ',
 
-                       '/Ñ(['.Crh::L_UC.Crh::C_UC.'])/u' => 'НЪ$1',
-                       '/(['.Crh::L_UC.Crh::C_UC.'Ъ])Ñ/u' => '$1НЪ',
+                       '/Ñ([' . Crh::L_UC . Crh::C_UC . '])/u' => 'НЪ$1',
+                       '/([' . Crh::L_UC . Crh::C_UC . 'Ъ])Ñ/u' => '$1НЪ',
 
                ];
        }
index 6e2147d..528d128 100644 (file)
@@ -15,7 +15,8 @@
                        "Carlos Cristia",
                        "MarcoAurelio",
                        "Matma Rex",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Subrayar os vinclos:",
index 6c57d8a..00e5ab9 100644 (file)
@@ -75,7 +75,8 @@
                        "سامي الرحيلي",
                        "Azouz.anis",
                        "Elbasyouny",
-                       "Omar Ghrida"
+                       "Omar Ghrida",
+                       "AHmed Khaled"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "october-gen": "أكتوبر",
        "november-gen": "نوفمبر",
        "december-gen": "ديسمبر",
-       "jan": "Ù\83اÙ\86Ù\88Ù\86 Ø§Ù\84ثاÙ\86Ù\8a",
-       "feb": "شباط",
-       "mar": "آذار",
-       "apr": "نيسان",
-       "may": "أيار",
-       "jun": "حزيران",
-       "jul": "تموز",
-       "aug": "آب",
-       "sep": "Ø£Ù\8aÙ\84Ù\88Ù\84",
-       "oct": "تشرÙ\8aÙ\86 Ø§Ù\84Ø£Ù\88Ù\84",
-       "nov": "تشرين الثاني",
-       "dec": "كانون الأول",
+       "jan": "Ù\8aÙ\86اÙ\8aر",
+       "feb": "فبراير",
+       "mar": "مارس",
+       "apr": "أبريل",
+       "may": "مايو",
+       "jun": "يونيو",
+       "jul": "يوليو",
+       "aug": "أغسطس",
+       "sep": "سبتÙ\85بر",
+       "oct": "Ø£Ù\83تÙ\88بر",
+       "nov": "نوفمبر",
+       "dec": "ديسمبر",
        "january-date": "$1 يناير",
        "february-date": "$1 فبراير",
        "march-date": "$1 مارس",
        "pool-errorunknown": "خطأ غير معروف",
        "pool-servererror": "خدمة العداد غير متاحة ( $1 ).",
        "poolcounter-usage-error": "خطأ الاستخدام: $1",
-       "aboutsite": "عÙ\86 {{SITENAME}}",
+       "aboutsite": "Ø­Ù\88Ù\84 {{SITENAME}}",
        "aboutpage": "Project:عن",
        "copyright": "المحتوى منشور وفق $1 إن لم يرد خلاف ذلك.",
        "copyrightpage": "{{ns:project}}:حقوق التأليف والنشر",
        "botpasswords-invalid-name": "اسم المستخدم الموفر لا يحتوي على فاصل كلمة سر البوت (\"$1\").",
        "botpasswords-not-exist": "المستخدم \"$1\" لا يمتلك كلمة سر بوت بالاسم \"$2\".",
        "botpasswords-needs-reset": "يجب إعادة تعيين كلمة مرور البوت لاسم بوت \"$2\" {{GENDER:$1|المستخدم|المستخدم}}\".",
+       "botpasswords-locked": "لا يمكنك تسجيل الدخول بكلمة مرور بوت حيث تم منع حسابك.",
        "resetpass_forbidden": "كلمات السر لا يمكن تغييرها",
        "resetpass_forbidden-reason": "لا يمكن تغيير كلمة المرور: $1",
        "resetpass-no-info": "يجب أن تكون مسجل الدخول للوصول إلى هذه الصفحة مباشرة.",
        "exif-photometricinterpretation-4": "قناع الشفافية",
        "exif-photometricinterpretation-5": "مفصول (ربما CMYK)",
        "exif-photometricinterpretation-6": "واي سب سر",
+       "exif-photometricinterpretation-9": "CIE L*a*b* (تكويد ICC)",
+       "exif-photometricinterpretation-10": "CIE L*a*b* (تكويد ITU)",
        "exif-photometricinterpretation-32803": "مصفوفة فلترة الألوان",
        "exif-photometricinterpretation-34892": "خام خطي",
        "exif-unknowndate": "تاريخ غير معروف",
        "confirm-unwatch-top": "إزالة هذه الصفحة من قائمة مراقبتك؟",
        "confirm-rollback-button": "موافق",
        "confirm-rollback-top": "استرجاع التعديلات لهذه الصفحة؟",
+       "confirm-mcrrestore-title": "استرجاع مراجعة",
        "confirm-mcrundo-title": "الرجوع عن تغيير",
        "mcrundofailed": "الرجوع فشل",
        "mcrundo-missingparam": "وسائط مطلوبة مفقودة عند الطلب.",
        "mcrundo-changed": "لقد تم تغيير الصفحة منذ عرضت الفرق; يُرجَى مراجعة التغيير الجديد.",
+       "mcrundo-parse-failed": "فشل في تحليل المراجعة الجديدة: $1",
        "semicolon-separator": "؛&#32;",
        "comma-separator": "،&#32;",
        "quotation-marks": "«$1»",
        "redirect-file": "اسم ملف",
        "redirect-logid": "معرف السجل",
        "redirect-not-exists": "المطلوب غير موجود",
+       "redirect-not-numeric": "قيمة غير رقمية",
        "fileduplicatesearch": "بحث عن ملفات مكررة",
        "fileduplicatesearch-summary": "ابحث عن الملفات المكررة بناء على قيم الهاش.",
        "fileduplicatesearch-filename": "اسم الملف:",
index b1f5f84..2435640 100644 (file)
@@ -12,7 +12,8 @@
                        "Oldstoneage",
                        "Macofe",
                        "Abdelrhaman Eid",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "AHmed Khaled"
                ]
        },
        "tog-underline": "حط خط تحت اللينكات:",
        "rcshowhidemine": "$1 تعديلاتى",
        "rcshowhidemine-show": "اعرض",
        "rcshowhidemine-hide": "تخبية",
-       "rclinks": "بÙ\8aÙ\8aÙ\86 Ø§Ø®Ø± $1 ØªØ¹Ø¯Ù\8aÙ\84 Ù\81Ù\89 Ø§Ø®Ø± $2 Ù\8aÙ\88Ù\85Ø\8c $3",
+       "rclinks": "بÙ\8aÙ\86 Ø§Ø®Ø± $1 ØªØ¹Ø¯Ù\8aÙ\84 Ù\81Ù\89 Ø§Ø®Ø± $2 Ù\8aÙ\88Ù\85",
        "diff": "التغيير",
        "hist": "تاريخ",
        "hide": "تخبية",
        "ncategories": "$1 {{PLURAL:$1|تصنيف واحد|تصنيفين|تصنيفات|تصنيف}}",
        "nlinks": "{{PLURAL:$1|وصله واحده|وصلتين|$1 وصلات|$1 وصله}}",
        "nmembers": "$1 {{PLURAL:$1|عضو|اعضاء}}",
-       "nrevisions": "{{PLURAL:$1|تعديل وحيد|تعديلين|$1 تعديلات|$1 تعديل|$1}}",
+       "nrevisions": "{{PLURAL:$1|مفيش ولا مراجعه|مراجعه واحده|مراجعتين|$1 مراجعه}}",
        "specialpage-empty": "مافيش نتايج للتقرير دا.",
        "lonelypages": "صفحات يتيمه",
        "lonelypagestext": "الصفحات دى ماعندهاش لينكات أو تضمينات من الصفحات التانية فى {{SITENAME}}.",
        "whatlinkshere-hideredirs": "$1 التحويلات",
        "whatlinkshere-hidetrans": "$1 التضمينات",
        "whatlinkshere-hidelinks": "$1 لينكات",
-       "whatlinkshere-hideimages": "$1 وصلة صورة",
+       "whatlinkshere-hideimages": "$1 وصله فايل",
        "whatlinkshere-filters": "فلاتر",
        "blockip": "بلوك {{GENDER:$1|اليوزر|اليوزره}}",
        "blockiptext": "استخدم الاستمارة اللى تحت لمنع عنوان أيبى أو يوزر معين من الكتابة.\nدا لازم يحصل بس علشان تمنع التخريب ،و على حسب\n[[{{MediaWiki:Policy-url}}|السياسة]].\nاكتب سبب محدد تحت (يعنى مثلا، اكتب الصفحات المعينة اللى اتخربت بسببه).",
        "importlogpagetext": "استيرادات إدارية لصفحات ليها تاريخ تعديل من مواقع ويكى تانية.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|تعديل واحد|تعديل}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|تعديل واحد|تعديل}} من $2",
-       "tooltip-pt-userpage": "صفحة اليوزر بتاعتك",
+       "tooltip-pt-userpage": "صفحة اليوزر {{GENDER:|بتاعتك}}",
        "tooltip-pt-anonuserpage": "صفحة اليوزر للأيبى اللى انت بتعمل منه تحرير",
-       "tooltip-pt-mytalk": "صفحة المنقاشه بتاعتك",
+       "tooltip-pt-mytalk": "صفحة المناقشه {{GENDER:|بتاعتك}}",
        "tooltip-pt-anontalk": "نقاش حوالين التعديلات من عنوان الأيبى دا",
-       "tooltip-pt-preferences": "تفضيلاتى",
+       "tooltip-pt-preferences": "{{GENDER:|تفضيلاتك}}",
        "tooltip-pt-watchlist": "ليستة الصفح اللى بتراقب التعديلات فيها",
-       "tooltip-pt-mycontris": "ليستة تعديلاتك",
+       "tooltip-pt-mycontris": "ليستة {{GENDER:|تعديلاتك}}",
        "tooltip-pt-login": "يستحسن تسجل دخولك; لكن, ده مش اجبارى",
        "tooltip-pt-logout": "خروج",
        "tooltip-pt-createaccount": "نشجعك على عمل حساب وتسجيل دخولك; لكنه مش  ضروري",
        "tooltip-t-recentchangeslinked": "اخر التغييرات فى صفح معمول ليها لينك من الصفحه دى",
        "tooltip-feed-rss": "تلقيم أر إس إس للصفحة دي",
        "tooltip-feed-atom": "تلقيم أتوم للصفحة دي",
-       "tooltip-t-contributions": "عرض مساهمات اليوزر ده",
-       "tooltip-t-emailuser": "ابعت ايميل لليوزر ده",
+       "tooltip-t-contributions": "عرض مساهمات {{GENDER:$1|اليوزر ده|اليوزره دى}}",
+       "tooltip-t-emailuser": "ابعت ايميل {{GENDER:$1|لليوزر ده|لليوزره دى}}",
        "tooltip-t-upload": "ارفع فايلات (upload files)",
        "tooltip-t-specialpages": "ليستة كل الصفح المخصوصه",
        "tooltip-t-print": "نسخه تنفع تتطبع للصفحه دى",
        "compare-page1": "صفحه 1",
        "compare-page2": "صفحه 2",
        "compare-submit": "قارن",
-       "diff-form": "'''استمارة'''",
+       "diff-form": "فروقات",
        "dberr-problems": "متأسفين، السايت دا بيعانى من صعوبات فنيه",
        "dberr-again": "حاول تستنا كام دقيقه و بعدين اعمل تحميل من تانى",
        "dberr-info": "(مش قادرين نتصل بـ السيرفر بتاع قاعدة البيانات: $1)",
        "logentry-newusers-create": "تم فتح حساب {{GENDER:$2|اليوزر|اليوزره}} $1",
        "logentry-upload-upload": " {{GENDER:$2|رفع|اترفعت}} $1 $3",
        "rightsnone": "(فاضى)",
-       "searchsuggest-search": "تدوير",
+       "searchsuggest-search": "تدوير {{SITENAME}}",
        "searchsuggest-containing": "جوّاه...",
        "expandtemplates": "تكبير القوالب",
        "expand_templates_intro": "الصفحة المخصوصة دى بتاخد بعض النصوص و بتفرد كل القوالب اللى موجودة فيها.\nو كمان بتفرد دوال القوالب زي\n<nowiki>{{</nowiki>#language:…}}, و المتغيرات زي\n<nowiki>{{</nowiki>CURRENTDAY}}&mdash;فى الحقيقة كل حاجة بين قوسين مزدوجين.\nو بتعمل دا عن طريق استعداء المعالج المناسب من الميدياويكى نفسها..",
        "special-characters-group-telugu": "Telugu",
        "special-characters-group-sinhala": "Sinhala",
        "special-characters-group-gujarati": "Gujarati",
-       "randomrootpage": "صفحة جذر عشوائية"
+       "randomrootpage": "صفحه جذر عشوائيه"
 }
index b1977cf..70fb915 100644 (file)
        "customcssprotected": "Nun tienes permisu pa editar esta páxina CSS porque contien preferencies personales d'otru usuariu.",
        "customjsonprotected": "Nun tienes permisu pa editar esta páxina JSON porque contien preferencies personales d'otru usuariu.",
        "customjsprotected": "Nun tienes permisu pa editar esta páxina de JavaScript porque contien preferencies personales d'otru usuariu.",
-       "sitecssprotected": "Nun tienes permisu pa editar esta páxina de CSS porque puede afeutar a tolos visitantes",
-       "sitejsonprotected": "Nun tienes permisu pa editar esta páxina en JSON porque puede afeutar a tolos visitantes",
-       "sitejsprotected": "Nun tienes permisu para editar esta páxina de JavaScript porque puede afeutar a tolos visitantes",
+       "sitecssprotected": "Nun tienes permisu pa editar esta páxina de CSS porque puede afeutar a tolos visitantes.",
+       "sitejsonprotected": "Nun tienes permisu pa editar esta páxina en JSON porque puede afeutar a tolos visitantes.",
+       "sitejsprotected": "Nun tienes permisu para editar esta páxina de JavaScript porque puede afeutar a tolos visitantes.",
        "mycustomcssprotected": "Nun tien permisu pa editar esta páxina CSS.",
        "mycustomjsonprotected": "Nun tien permisu pa editar esta páxina JSON.",
        "mycustomjsprotected": "Nun tien permisu pa editar esta páxina JavaScript.",
        "botpasswords-invalid-name": "El nome d'usuariu especificáu nun contien el separador de contraseña de bot («$1»).",
        "botpasswords-not-exist": "L'usuariu «$1» nun tien una contraseña de bot llamada «$2».",
        "botpasswords-needs-reset": "Tien de reniciase la contraseña del robot «$2», propiedá {{GENDER:$1|del usuariu|de la usuaria}} «$1».",
+       "botpasswords-locked": "Nun puedes aniciar sesión con una contraseña de bot porque la to cuenta ta bloquiada.",
        "resetpass_forbidden": "Nun puen camudase les contraseñes",
        "resetpass_forbidden-reason": "Les contraseñes nun pueden camudase: $1",
        "resetpass-no-info": "Tienes d'aniciar sesión pa entrar direutamente a esta páxina.",
        "redirect-file": "Nome del ficheru",
        "redirect-logid": "ID del rexistru",
        "redirect-not-exists": "Nun s'alcontró'l valor",
+       "redirect-not-numeric": "El valor nun ye un númberu",
        "fileduplicatesearch": "Buscar archivos duplicaos",
        "fileduplicatesearch-summary": "Busca archivos duplicaos basándose nos sos valores fragmentarios.",
        "fileduplicatesearch-filename": "Nome del ficheru:",
        "edit-error-long": "Errores:\n\n$1",
        "revid": "revisión $1",
        "pageid": "ID de páxina $1",
-       "interfaceadmin-info": "$1\n\nLos permisos pa editar los ficheros  CSS, JS y JSON globales del sitiu fueron apocayá dixebraos del permisu <code>editinterface</code>. Si nun entiendes por qué recibes esti error, por favor llei [[mw:MediaWiki_1.32/interface-admin]].",
+       "interfaceadmin-info": "$1\n\nLos permisos pa editar los ficheros  CSS, JS y JSON globales del sitiu dixebráronse apocayá del permisu <code>editinterface</code>. Si nun entiendes por qué recibes esti error, llei [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "Les etiquetes &lt;html&gt; nun pueden usase fuera de les páxines normales.",
        "gotointerwiki": "Dexando {{SITENAME}}",
        "gotointerwiki-invalid": "El títulu especificáu nun ye válidu.",
index 3639335..350f733 100644 (file)
        "botpasswords-invalid-name": "Пададзенае імя ўдзельніка ня ўтрымлівае падзяляльнік для паролю робата («$1»).",
        "botpasswords-not-exist": "Удзельнік «$1» ня мае паролю для робата з назвай «$2».",
        "botpasswords-needs-reset": "Пароль для робата зь імем «$2» {{GENDER:$1|удзельніка|удзельніцы}} «$1» мусіць быць скінуты.",
+       "botpasswords-locked": "Вы ня можаце ўвайсьці з паролем робата, бо ваш рахунак замкнёны.",
        "resetpass_forbidden": "Пароль ня можа быць зьменены",
        "resetpass_forbidden-reason": "Паролі ня могуць быць зьмененыя: $1",
        "resetpass-no-info": "Для непасрэднага доступу да гэтай старонкі Вам неабходна ўвайсьці ў сыстэму.",
        "upload-form-label-own-work-message-generic-foreign": "Я разумею, што загружаю гэты файл у агульнае сховішча. Я пацьвярджаю, што раблю гэта ў адпаведнасьці з умовамі выкарыстаньня і ліцэнзійнай палітыкай.",
        "upload-form-label-not-own-work-message-generic-foreign": "Калі вы ня можаце загрузіць гэты файл паводле правілаў агульнага сховішча, калі ласка, закрыйце гэты дыялёг і паспрабуйце іншы мэтад.",
        "upload-form-label-not-own-work-local-generic-foreign": "Вы можаце паспрабаваць скарыстацца [[Special:Upload|старонкай загрузкі {{GRAMMAR:родны|{{SITENAME}}}}]], калі гэты файл можна туды загрузіць згодна з правіламі.",
-       "backend-fail-stream": "Немагчыма накіраваць файл $1.",
+       "backend-fail-stream": "Не атрымалася трансьляваць файл «$1».",
        "backend-fail-backup": "Немагчыма зрабіць рэзэрвовую копію файлу «$1».",
        "backend-fail-notexists": "Файл $1 не існуе.",
        "backend-fail-hashes": "Немагчыма атрымаць хэшы файлаў для параўнаньня.",
        "backend-fail-create": "Немагчыма запісаць файл «$1».",
        "backend-fail-maxsize": "Не атрымалася запісаць файл «$1», бо яго памер перавышае $2 {{PLURAL:$2|байт|байты|байтаў}}.",
        "backend-fail-readonly": "Сховішча «$1» знаходзіцца ў рэжыме толькі чытаньня. Прычына: <em>$2</em>",
-       "backend-fail-synced": "Стан файла «$1» адрозьніваецца ад стану на ўнутраным сэрвэры сховішча",
+       "backend-fail-synced": "Стан файлу «$1» адрозьніваецца ад стану на ўнутраным сэрвэры сховішча",
        "backend-fail-connect": "Немагчыма далучыцца да сэрвэра сховішча «$1».",
        "backend-fail-internal": "Узьнікла невядомая памылка на сэрвэры сховішча «$1».",
-       "backend-fail-contenttype": "Немагчыма вызначыць тып зьместу файла, які мусіць быць захаваны ў «$1».",
+       "backend-fail-contenttype": "Немагчыма вызначыць тып зьместу файлу, які павінен быць захаваны ў «$1».",
        "backend-fail-batchsize": "Cховішча атрымала блёк з $1 {{PLURAL:$1|файлавай апэрацыі|файлавых апэрацыяў|файлавых апэрацыяў}}; абмежаваньне складае $2 {{PLURAL:$2|апэрацыю|апэрацыі|апэрацыяў}}.",
-       "backend-fail-usable": "Ð\9dе Ð°Ñ\82Ñ\80Ñ\8bмалаÑ\81Ñ\8f Ð¿Ñ\80аÑ\87Ñ\8bÑ\82аÑ\86Ñ\8c Ñ\86Ñ\96 Ð·Ð°Ð¿Ñ\96Ñ\81аÑ\86Ñ\8c Ñ\84айл Â«$1» Ð·-за Ð½ÐµÐ´Ð°Ñ\81Ñ\82аÑ\87Ñ\8b Ð¿Ñ\80авоÑ\9e Ñ\86Ñ\96 Ð°Ð´Ñ\81Ñ\83Ñ\82наÑ\81Ñ\8cÑ\86Ñ\96 Ð´Ñ\8bÑ\80Ñ\8dкÑ\82оÑ\80Ñ\8bÑ\8fў або кантэйнэраў.",
+       "backend-fail-usable": "Ð\9dе Ð°Ñ\82Ñ\80Ñ\8bмалаÑ\81Ñ\8f Ð¿Ñ\80аÑ\87Ñ\8bÑ\82аÑ\86Ñ\8c Ñ\86Ñ\96 Ð·Ð°Ð¿Ñ\96Ñ\81аÑ\86Ñ\8c Ñ\84айл Â«$1» Ð¿Ñ\80азÑ\8c Ð½ÐµÐ´Ð°Ñ\85оп Ð¿Ñ\80авоÑ\9e Ñ\86Ñ\96 Ð°Ð´Ñ\81Ñ\83Ñ\82наÑ\81Ñ\8cÑ\86Ñ\96 ÐºÐ°Ñ\82алÑ\91гаў або кантэйнэраў.",
        "filejournal-fail-dbconnect": "Не атрымалася злучыцца з базай зьвестак журнала для сховішча «$1».",
        "filejournal-fail-dbquery": "Не атрымалася абнавіць базу зьвестак журнала для сховішча «$1».",
        "lockmanager-notlocked": "Немагчыма разблякаваць «$1», які не заблякаваны.",
        "uploadstash-nofiles": "Вы ня маеце схаваных файлаў.",
        "uploadstash-badtoken": "Не атрымалася выканаць гэтае дзеяньне. Верагодна, скончыўся тэрмін дзеяньня вашых уліковых зьвестак. Калі ласка, паспрабуйце зноў.",
        "uploadstash-errclear": "Не атрымалася ачысьціць файлы.",
-       "uploadstash-refresh": "Абнавіць сьпіс файлаў.",
+       "uploadstash-refresh": "Абнавіць сьпіс файлаў",
        "uploadstash-thumbnail": "прагляд мініятуры",
        "uploadstash-exception": "Не магу захаваць загрузку ў сховішчы ($1): «$2».",
        "uploadstash-bad-path": "Шлях не існуе.",
        "confirm-unwatch-top": "Выдаліць гэтую старонку з Вашага сьпісу назіраньня?",
        "confirm-rollback-button": "Так",
        "confirm-rollback-top": "Адкаціць праўкі на гэтай старонцы?",
+       "confirm-mcrrestore-title": "Аднавіць вэрсію",
        "confirm-mcrundo-title": "Адмяніць зьмену",
        "mcrundofailed": "Адмена не атрымалася",
        "mcrundo-missingparam": "Адсутнічаюць абавязковыя парамэтры для запыту.",
        "redirect-file": "Назва файлу",
        "redirect-logid": "ID журнала",
        "redirect-not-exists": "Значэньне ня знойдзена",
+       "redirect-not-numeric": "Значэньне ня лікавае",
        "fileduplicatesearch": "Пошук дублікатаў файлаў",
        "fileduplicatesearch-summary": "Пошук аднолькавых файлаў на падставе іх хэшаў.",
        "fileduplicatesearch-filename": "Назва файла:",
index b8c0bc5..63bb94d 100644 (file)
        "right-editinterface": "Правіць карыстальніцкі інтэрфейс",
        "right-editusercss": "Правіць файлы CSS іншых удзельнікаў",
        "right-edituserjson": "Правіць JSON-файлы іншых удзельнікаў",
-       "right-edituserjs": "Правіць файлы JS іншых удзельнікаў",
+       "right-edituserjs": "Правіць файлы JavaScript іншых удзельнікаў",
        "right-editmyusercss": "Правіць уласныя файлы CSS",
        "right-editmyuserjson": "Правіць уласныя JSON-файлы",
        "right-editmyuserjs": "Правіць уласныя файлы JavaScript",
index 3be24fb..1f87fc3 100644 (file)
@@ -80,7 +80,7 @@
        "tog-watchlisthideminor": "Скриване на малките промени в списъка ми за наблюдение",
        "tog-watchlisthideliu": "Скриване на редакциите от влезли потребители от списъка за наблюдение",
        "tog-watchlistreloadautomatically": "Обновяване на списъка за наблюдение всеки път, когато е сменен филтър (изисква се JavaScript)",
-       "tog-watchlistunwatchlinks": "Ð\94обавÑ\8fне Ð½Ð° Ð¿Ñ\80еки Ð²Ñ\80Ñ\8aзки Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение/Ñ\81пиÑ\80ане Ð½Ð° Ð½Ð°Ð±Ð»Ñ\8eдениеÑ\82о ÐºÑ\8aм Ð·Ð°Ð¿Ð¸Ñ\81иÑ\82е Ð² Ñ\81пиÑ\81Ñ\8aка Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение (нужен е JavaScript за да се включи функционалността)",
+       "tog-watchlistunwatchlinks": "Ð\94обавÑ\8fне Ð½Ð° Ð´Ð¸Ñ\80екÑ\82ни Ð¼Ð°Ñ\80кеÑ\80и ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) Ð·Ð° Ð½Ð°Ð±Ð»Ñ\8eдение/Ñ\81пиÑ\80ане Ð½Ð° Ð½Ð°Ð±Ð»Ñ\8eдениеÑ\82о ÐºÑ\8aм Ð½Ð°Ð±Ð»Ñ\8eдаваниÑ\82е Ñ\81Ñ\82Ñ\80аниÑ\86и Ñ\81 Ð¿Ñ\80омени (нужен е JavaScript за да се включи функционалността)",
        "tog-watchlisthideanons": "Скриване на редакциите от анонимни потребители в списъка за наблюдение",
        "tog-watchlisthidepatrolled": "Скриване на патрулираните редакции от списъка за наблюдение",
        "tog-watchlisthidecategorization": "Скриване на категоризацията на статии",
        "password-login-forbidden": "Използването на това потребителско име и парола е забранено.",
        "mailmypassword": "Възстановяване на парола",
        "passwordremindertitle": "Напомняне за парола от {{SITENAME}}",
-       "passwordremindertext": "Някой (най-вероятно вие, от IP-адрес $1) е пожелал нова парола за влизане в {{SITENAME}} ($4).\nЗа потребител „$2“ е създадена временната парола „$3“.\nСега би трябвало да влезете в системата и да си изберете нова парола.\nНовата временна парола ще бъде активна {{PLURAL:$5|един ден|$5 дни}}.\n\nАко заявката е направена от друг или пък сте си спомнили паролата и не искате да я променяте, можете да пренебрегнете това съобщение и да продължите да използвате старата си парола.",
+       "passwordremindertext": "Някой (най-вероятно вие, от IP-адрес $1) е пожелал нова\nпарола за влизане в {{SITENAME}} ($4). За потребител „$2“ е създадена временната парола\n„$3“. Ако това е било вашето\nнамерение, трябва да влезете в системата и да си изберете нова парола.\nНовата временна парола ще бъде активна {{PLURAL:$5|един ден|$5 дни}}.\n\nАко заявката е направена от друг или пък сте си спомнили паролата\nи не искате да я променяте, можете да пренебрегнете това съобщение и\nда продължите да използвате старата си парола.",
        "noemail": "Няма записана електронна поща за потребителя „$1“.",
        "noemailcreate": "Необходимо е да въведете валиден адрес за ел. поща",
        "passwordsent": "Нова парола беше изпратена на електронната поща на „$1“.\nСлед като я получите, влезте отново.",
        "subject-preview": "Предварителен преглед на заглавието:",
        "previewerrortext": "Възникна грешка при опита за преглед на промените.",
        "blockedtitle": "Потребителят е блокиран",
-       "blockedtext": "'''Вашето потребителско име (или IP-адрес) беше блокирано.'''\n\nБлокирането е извършено от $1. Посочената причина е: ''$2''\n\n*Начало на блокирането: $8\n*Край на блокирането: $6\n*Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „Пращане писмо на потребител“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nВашият IP адрес е $3, а номерът на блокирането е $5. Включвайте едно от двете или и двете във всяко запитване, което правите.",
-       "autoblockedtext": "IP-адресът ви беше блокиран автоматично, защото е бил използван от друг потребител, който е бил блокиран от $1.\nПосочената причина е:\n\n:''$2''\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „Пращане писмо на потребител“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nТекущият ви IP-адрес е $3, а номерът на блокирането ви е $5. Включвайте ги във всяко питане, което правите.",
+       "blockedtext": "'''Вашето потребителско име (или IP-адрес) беше блокирано.'''\n\nБлокирането е извършено от $1. Посочената причина е: ''$2''\n\n*Начало на блокирането: $8\n*Край на блокирането: $6\n*Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „{{int:emailuser}}“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nВашият IP адрес е $3, а номерът на блокирането е $5. Включвайте едно от двете или и двете във всяко запитване, което правите.",
+       "autoblockedtext": "IP-адресът ви беше блокиран автоматично, защото е бил използван от друг потребител, който е бил блокиран от $1.\nПосочената причина е:\n\n:<em>$2</em>\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „{{int:emailuser}}“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nТекущият Ви IP-адрес е $3, а номерът на блокирането ви е $5.\nВключвайте ги във всяка заявка, която правите.",
        "systemblockedtext": "Вашето потребителско име или IP адрес беше автоматично блокирано от Медия Уики.\nПосочената причина е:\n\n:<em>$2</em>\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nВашият текущ IP адрес е $3.\nМоля, включете всичките детайли по-горе, ако правите каквито и да е запитвания.",
        "blockednoreason": "не е указана причина",
        "whitelistedittext": "Редактирането на страници изисква $1 в системата.",
        "longpageerror": "<strong>Грешка: Изпратеният текст е с големина {{PLURAL:$1|един килобайт|$1 килобайта}}, което надвишава позволения максимум от {{PLURAL:$2|един килобайт|$2 килобайта}}.</strong>\nПоради тази причина той не може да бъде съхранен.",
        "readonlywarning": "<strong>Внимание: Базата данни беше затворена за поддръжка, затова в момента промените няма да могат да бъдат съхранени.</strong>\nАко желаете, можете да съхраните страницата като текстов файл и да се опитате да я публикувате по-късно.\n\nСистемният администратор, който е затворил базата данни, е посочил следната причина: $1",
        "protectedpagewarning": "<strong>Внимание: Страницата е защитена и само потребители със статут на администратори могат да я редактират.</strong>\nЗа справка по-долу е показан последният запис от дневниците.",
-       "semiprotectedpagewarning": "<strong>Забележка:</strong> Тази страница е защитена и само регистрирани потребители могат да я редактират.\nЗа справка по-долу е показан последният запис от дневниците.",
+       "semiprotectedpagewarning": "<strong>Забележка:</strong> Тази страница е защитена и само автоматично одобрени потребители могат да я редактират.\nЗа справка по-долу е показан последният запис от дневниците.",
        "cascadeprotectedwarning": "<strong>Внимание:</strong> Страницата е защитена, като само потребители със [[Special:ListGroupRights|нужните права]] могат да я редактират, тъй като е включена в {{PLURAL:$1|следната страница|следните страници}} с каскадна защита:",
        "titleprotectedwarning": "<strong>Внимание: Тази страница е защитена и са необходими [[Special:ListGroupRights|специални права]], за да бъде създадена.</strong>\nЗа справка по-долу е показан последният запис от дневниците.",
        "templatesused": "{{PLURAL:$1|Шаблон, използван|Шаблони, използвани}} на страницата:",
        "diff-multi-manyusers": "({{PLURAL:$1|Не е показана една междинна версия|Не са показани $1 междинни версии}} от повече от $2 {{PLURAL:$2|потребител|потребители}})",
        "difference-missing-revision": "{{PLURAL:$2|Не беше открита|Не бяха открити}} {{PLURAL:$2|една версия|$2 версии}} от тази разликова препратка ($1).\n\nТова обикновено се случва, когато е последвана остаряла разликова препратка на страница, която е била изтрита.\nПовече подробности могат да бъдат открити в [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневника на изтриванията].",
        "searchresults": "Резултати от търсенето",
+       "search-filter-title-prefix-reset": "Търсене във всички страници",
        "searchresults-title": "Резултати от търсенето за „$1“",
        "titlematches": "Съответствия в заглавията на страници",
        "textmatches": "Съответствия в текста на страници",
        "stub-threshold-disabled": "Изключено",
        "recentchangesdays": "Брой дни в последни промени:",
        "recentchangesdays-max": "(най-много $1 {{PLURAL:$1|ден|дни}})",
-       "recentchangescount": "Брой показвани редакции по подразбиране:",
-       "prefs-help-recentchangescount": "Това Ð²ÐºÐ»Ñ\8eÑ\87ва Ð¿Ð¾Ñ\81ледниÑ\82е Ð¿Ñ\80омени, Ð¸Ñ\81Ñ\82оÑ\80ииÑ\82е Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86иÑ\82е Ð¸ Ð´Ð½ÐµÐ²Ð½Ð¸Ñ\86иÑ\82е.",
+       "recentchangescount": "Ð\91Ñ\80ой Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ð½Ð¸ Ñ\80едакÑ\86ии Ð² Ð¿Ð¾Ñ\81ледниÑ\82е Ð¿Ñ\80омени, Ð¸Ñ\81Ñ\82оÑ\80иÑ\8fÑ\82а Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и Ð¸ Ð»Ð¾Ð³Ð¾Ð²Ðµ Ð¿Ð¾ Ð¿Ð¾Ð´Ñ\80азбиÑ\80ане:",
+       "prefs-help-recentchangescount": "Ð\9cакÑ\81имален Ð±Ñ\80ой: 1000",
        "prefs-help-watchlist-token2": "Това е секретният ключ към уеб хранилката на вашия списък за наблюдение.\nВсеки, който го знае, би могъл да прегледа списъка ви за наблюдение, така че не го споделяйте.\nПри нужда можете да го [[Special:ResetTokens|изчистите]].",
        "prefs-help-tokenmanagement": "Можете да видите и нулирате тайния ключ за Вашата сметка, който може да има достъп до уеб хранилката на Вашия списък за наблюдение. Всеки, който знае ключа, ще може да види Вашия списък за наблюдение, така че не го споделяйте.",
        "savedprefs": "Настройките ви бяха съхранени.",
        "default": "по подразбиране",
        "prefs-files": "Файлове",
        "prefs-custom-css": "Личен CSS",
+       "prefs-custom-json": "Потребителски JSON",
        "prefs-custom-js": "Личен JS",
-       "prefs-common-config": "Общи настройки на CSS/JS за всички облици:",
+       "prefs-common-config": "Общи настройки на CSS/JSON/JavaScript за всички облици:",
        "prefs-reset-intro": "Тази страница може да се използва за възстановяване на потребителските настройки към стандартните за сайта.\nТова действие е необратимо.",
        "prefs-emailconfirm-label": "Потвърждаване на адрес за е-поща:",
        "youremail": "Е-поща:",
        "right-block": "Спиране на достъпа до редактиране",
        "right-blockemail": "Блокиране на потребители да изпращат писма по е-поща",
        "right-hideuser": "Блокиране и скриване на потребителско име",
-       "right-ipblock-exempt": "Пренебрегване на блокирания по IP, автоматични блокирания и блокирани IP интервали",
+       "right-ipblock-exempt": "Пренебрегване на блокирания по IP, автоматични блокирания и блокирани IP-диапазони",
        "right-unblockself": "Собствено отблокиране",
        "right-protect": "Променяне на нивото на защита и редактиране на каскадно-защитените страници",
        "right-editprotected": "Редактиране на страници защитени като „{{int:protect-level-sysop}}“",
        "right-editinterface": "Редактиране на потребителския интерфейс",
        "right-editusercss": "Редактиране на CSS файловете на други потребители",
        "right-edituserjson": "Редактиране на JSON файловете на други потребители",
-       "right-edituserjs": "Редактиране на JS файловете на други потребители",
+       "right-edituserjs": "Редактиране на JavaScript файловете на други потребители",
        "right-editmyusercss": "Редактиране на собствените потребителски CSS файлове",
        "right-editmyuserjson": "Редактиране на собствените потребителски JSON файлове",
        "right-editmyuserjs": "Редактиране на собствените потребителски JavaScript файлове",
        "right-sendemail": "Изпращане на е-писма до другите потребители",
        "right-managechangetags": "Създаване и (де)активиране на [[Special:Tags|етикети]]",
        "right-applychangetags": "Задаване на [[Special:Tags|етикети]] заедно с направените промени",
-       "right-changetags": "Ð\94обавÑ\8fне Ð¸ Ð¿Ñ\80емаÑ\85ване Ð½Ð° Ð¿Ñ\80оизволни [[Special:Tags|еÑ\82икеÑ\82и]] Ð² индивидуални редакции и записи в дневници",
-       "right-deletechangetags": "Ð\98зÑ\82Ñ\80иване Ð½Ð° [[Special:Tags|еÑ\82икеÑ\82и]] Ð¾Ñ\82 Ð±Ð°Ð·Ð°Ñ\82а Ð½Ð° данни",
+       "right-changetags": "Ð\94обавÑ\8fне Ð¸ Ð¿Ñ\80емаÑ\85ване Ð½Ð° Ð¿Ñ\80оизволни [[Special:Tags|еÑ\82икеÑ\82и]] Ð½Ð° индивидуални редакции и записи в дневници",
+       "right-deletechangetags": "Ð\98зÑ\82Ñ\80иване Ð½Ð° [[Special:Tags|еÑ\82икеÑ\82и]] Ð¾Ñ\82 Ð±Ð°Ð·Ð°Ñ\82а Ð¾Ñ\82 данни",
        "grant-group-page-interaction": "Взаимодействие със страници",
        "grant-group-file-interaction": "Взаимодействие с медийни файлове",
        "grant-group-watchlist-interaction": "Взаимодействие с вашия списък за наблюдение",
        "action-editcontentmodel": "редактиране на модела на съдържанието на страница",
        "action-managechangetags": "създаване и (де)активиране на етикети",
        "action-applychangetags": "прилагане на етикетите заедно с промените ви",
-       "action-changetags": "добавÑ\8fне Ð¸ Ð¿Ñ\80емаÑ\85ване Ð½Ð° Ð¿Ñ\80оизволни ÐµÑ\82икеÑ\82и Ð² индивидуални редакции и записи в дневниците",
+       "action-changetags": "добавÑ\8fне Ð¸ Ð¿Ñ\80емаÑ\85ване Ð½Ð° Ð¿Ñ\80оизволни ÐµÑ\82икеÑ\82и Ð½Ð° индивидуални редакции и записи в дневниците",
        "action-deletechangetags": "изтриване на етикети от базата от данни",
        "action-purge": "почисти кеша на тази страница",
        "nchanges": "$1 {{PLURAL:$1|промяна|промени}}",
        "upload-form-label-own-work-message-generic-local": "Потвърждавам, че качвам този файл в съответствие с правилата и лицензионната политика на сайта {{SITENAME}}.",
        "upload-form-label-not-own-work-message-generic-local": "Ако не можете да заредите този файл в съответствие с правилата на сайта {{SITENAME}}, моля, затворете този прозорец и опитайте друг метод.",
        "upload-form-label-not-own-work-message-generic-foreign": "Ако не можете да качите този файл в съответствие с правилата на споделеното хранилище, моля, затворете този прозорец и опитайте друг метод.",
+       "backend-fail-backup": "Файлът „$1“ не можа да бъде архивиран.",
        "backend-fail-notexists": "Файлът „$1“ не съществува.",
        "backend-fail-delete": "Файлът „$1“ не може да бъде изтрит.",
        "backend-fail-describe": "Метаданните не могат да бъдат променени за файл „$1“.",
        "uploadstash-errclear": "Изчистването на файловете беше неуспешно.",
        "uploadstash-refresh": "Обновяване на списъка с файлове",
        "uploadstash-thumbnail": "преглед на миниатюра",
+       "uploadstash-bad-path-unknown-type": "Неизвестен тип „$1“.",
        "img-auth-accessdenied": "Достъпът е отказан",
        "img-auth-nopathinfo": "Липсва информация за пътя.\nВашият сървър трябва да бъде настроен да предава променливите REQUEST_URI и PATH_INFO .\nАко това е така, опитайте да активирате $wgUsePathInfo.\n\nВижте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
        "img-auth-notindir": "Търсеният път не е в настроената директория за качвания.",
        "brokenredirects-edit": "редактиране",
        "brokenredirects-delete": "изтриване",
        "withoutinterwiki": "Страници без междуезикови препратки",
-       "withoutinterwiki-summary": "Следните страници не препращат към версии на други езици:",
+       "withoutinterwiki-summary": "Следните страници не са свързани с версии на други езици:",
        "withoutinterwiki-legend": "Представка",
        "withoutinterwiki-submit": "Показване",
        "fewestrevisions": "Страници с най-малко редакции",
        "deadendpages": "Задънени страници",
        "deadendpagestext": "Следните страници нямат препратки към други страници от {{SITENAME}}.",
        "protectedpages": "Защитени страници",
+       "protectedpages-filters": "Филтри:",
        "protectedpages-indef": "Само безсрочни защити",
        "protectedpages-summary": "Списък на страниците, които са защитени. За списък на заглавията, които са защитени от създаване, вижте [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "protectedpages-cascade": "Само каскадни защити",
        "protectedtitles-submit": "Показване на заглавията",
        "listusers": "Списък на потребителите",
        "listusers-editsonly": "Показване само на потребители с редакции",
+       "listusers-temporarygroupsonly": "Показване само на потребители във временни потребителски групи",
        "listusers-creationsort": "Сортиране по дата на създаване",
        "listusers-desc": "Сортиране в низходящ ред",
        "usereditcount": "$1 {{PLURAL:$1|редакция|редакции}}",
        "apisandbox-dynamic-error-exists": "Параметър с име „$1“ вече съществува.",
        "apisandbox-deprecated-parameters": "Остарели параметри",
        "apisandbox-fetch-token": "Автоматично попълване на маркера",
+       "apisandbox-add-multi": "Добавяне",
        "apisandbox-submit-invalid-fields-title": "Някои полета са невалидни",
        "apisandbox-submit-invalid-fields-message": "Моля, поправете маркираните полета и опитайте пак.",
        "apisandbox-results": "Резултати",
        "log": "Дневници",
        "logeventslist-submit": "Показване",
        "logeventslist-more-filters": "Показване на още дневници:",
-       "logeventslist-patrol-log": "Ð\94невник Ð½Ð° Ð¿Ð°Ñ\82Ñ\80Ñ\83ла",
+       "logeventslist-patrol-log": "Ð\94невник Ð½Ð° Ð¿Ð°Ñ\82Ñ\80Ñ\83лиÑ\80анеÑ\82о",
        "logeventslist-tag-log": "Дневник на етикетите",
        "all-logs-page": "Всички публични дневници",
        "alllogstext": "Смесено показване на записи от всички налични дневници в {{SITENAME}}.\nМожете да ограничите прегледа, като изберете вид на дневника, потребителско име или определена страница.",
        "logempty": "Дневникът не съдържа записи, отговарящи на избрания критерий.",
-       "log-title-wildcard": "Търсене на заглавия, започващи със",
+       "log-title-wildcard": "Търсене на заглавия, започващи със следния текст",
        "showhideselectedlogentries": "Промяна на видимостта на избраните записи",
        "log-edit-tags": "Редактиране на етикетите на избраните записи в дневника",
        "checkbox-select": "Избор: $1",
        "listusers-noresult": "Няма намерени потребители.",
        "listusers-blocked": "(блокиран)",
        "activeusers": "Списък на активните потребители",
-       "activeusers-intro": "Това Ðµ Ñ\81пиÑ\81Ñ\8aк Ð½Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елиÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\81а Ð´ÐµÐ¼Ð¾Ð½Ñ\81Ñ\82Ñ\80иÑ\80али някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.",
+       "activeusers-intro": "Това Ðµ Ñ\81пиÑ\81Ñ\8aк Ð½Ð° Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82елиÑ\82е, ÐºÐ¾Ð¸Ñ\82о Ñ\81а Ð¸Ð¼али някаква активност през {{PLURAL:$1|последния|последните}} $1 {{PLURAL:$1|ден|дни}}.",
        "activeusers-count": "$1 {{PLURAL:$1|действие|действия}} за {{PLURAL:$3|последния ден|последните $3 дни}}",
        "activeusers-from": "Показване на потребителите, започвайки от:",
        "activeusers-groups": "Показване на потребителите, принадлежащи към групи:",
        "emailuser-title-target": "Писмо до {{GENDER:$1|потребителя}}",
        "emailuser-title-notarget": "Изпращане на е-писмо на потребител",
        "emailpagetext": "Можете да използвате формуляра по-долу, за да изпратите електронно писмо на {{GENDER:$1|този потребител}}.\nАдресът, който се въвели в [[Special:Preferences|настройките си]], ще се появи в полето „От“ на писмото, така че получателят ще е в състояние да ви отговори директно.",
-       "defemailsubject": "Писмо от потребител $1 в {{SITENAME}}",
+       "defemailsubject": "Писмо от потребител „$1“ в {{SITENAME}}",
        "usermaildisabled": "Потребителят не е разрешил да получава електронна поща",
        "usermaildisabledtext": "Не можете да изпращате електронна поща на други потребители от това уики",
        "noemailtitle": "Няма електронна поща",
        "noemailtext": "Този потребител не е посочил валиден адрес за електронна поща.",
        "nowikiemailtext": "Този потребител е избрал да не получава електронна поща от други потребители.",
-       "emailnotarget": "Несъществуващ или невалиден получател на е-писмото.",
+       "emailnotarget": "Несъществуващо или невалидно потребителско име за получател.",
        "emailtarget": "Въвежда се получателят на е-писмото",
        "emailusername": "Потребителско име:",
        "emailusernamesubmit": "Изпращане",
        "email-legend": "Изпращане на електронно писмо до друг потребител на {{SITENAME}}",
        "emailfrom": "От:",
        "emailto": "До:",
-       "emailsubject": "Ð\9eÑ\82ноÑ\81но:",
+       "emailsubject": "Тема:",
        "emailmessage": "Съобщение:",
        "emailsend": "Изпращане",
        "emailccme": "Изпращане на копие на писмото до автора.",
-       "emailccsubject": "Ð\9aопие Ð½Ð° Ð¿Ð¸Ñ\81моÑ\82о Ð²и до $1: $2",
+       "emailccsubject": "Ð\9aопие Ð½Ð° Ð¿Ð¸Ñ\81моÑ\82о Ð\92и до $1: $2",
        "emailsent": "Писмото е изпратено",
-       "emailsenttext": "Ð\9fиÑ\81моÑ\82о Ð²и беше изпратено.",
+       "emailsenttext": "Ð\9fиÑ\81моÑ\82о Ð\92и беше изпратено.",
        "emailuserfooter": "Това писмо беше изпратено от $1 на {{GENDER:$2|$2}} чрез функцията „{{int:emailuser}}“ на {{SITENAME}}. Ако отговорите на писмото, вашето писмо ще бъде изпратено директно на {{GENDER:$1|първоначалния подател}}, показвайки адреса на ел. Ви поща на получателя.",
        "usermessage-summary": "Оставяне на системно съобщение.",
        "usermessage-editor": "Системни съобщения",
        "watchlist": "Списък за наблюдение",
        "mywatchlist": "Списък за наблюдение",
        "watchlistfor2": "За $1 $2",
-       "nowatchlist": "СпиÑ\81Ñ\8aкÑ\8aÑ\82 Ð²и за наблюдение е празен.",
+       "nowatchlist": "СпиÑ\81Ñ\8aкÑ\8aÑ\82 Ð\92и за наблюдение е празен.",
        "watchlistanontext": "За преглеждане и редактиране на списъка за наблюдение се изисква влизане в системата.",
        "watchnologin": "Не сте влезли",
        "addwatch": "Добавяне към списъка за наблюдение",
        "protectexpiry": "Изтича на:",
        "protect_expiry_invalid": "Невалиден срок на изтичане.",
        "protect_expiry_old": "Срокът на изтичане е минал.",
-       "protect-unchain-permissions": "Ð\9fозволÑ\8fване Ð½Ð° Ð¿Ð¾-наÑ\82аÑ\82Ñ\8aÑ\88ни възможности за защита",
+       "protect-unchain-permissions": "Ð\9fозволÑ\8fване Ð½Ð° Ð´Ð¾Ð¿Ñ\8aлниÑ\82елни възможности за защита",
        "protect-text": "Тук можете да прегледате и промените нивото на защита на страницата <strong>$1</strong>.",
        "protect-locked-blocked": "Не можете да променяте нивата на защита на страниците, докато сте блокиран(а).\nТекущите настройки за страницата <strong>$1</strong> са:",
        "protect-locked-dblock": "Нивата на защита на страниците не могат да бъдат променяни, защото базата от данни е заключена.\nЕто текущите настройки за страницата <strong>$1</strong>:",
-       "protect-locked-access": "Нямате правото да променяте нивата на защита на страниците. Ето текущите настройки за страницата „'''$1'''“:",
+       "protect-locked-access": "Нямате правото да променяте нивата на защита на страниците. Ето текущите настройки за страницата <strong>$1</strong>:",
        "protect-cascadeon": "Тази страница е защитена против редактиране, защото е включена в {{PLURAL:$1|следната страница, която от своя страна има|следните страници, които от своя страна имат}} каскадна защита.\nМожете да промените нивото на защита на страницата, но това няма да повлияе върху каскадната защита.",
        "protect-default": "Позволяване за всички потребители",
        "protect-fallback": "Позволяване само за потребители с права на „$1“",
        "viewdeletedpage": "Преглед на изтрити страници",
        "undeletepagetext": "{{PLURAL:$1|Следната страница беше изтрита, но все още се намира в архива и може да бъде възстановена|Следните $1 страници бяха изтрити, но все още се намират в архива и могат да бъдат възстановени}}. Архивът може да се почиства от време на време.",
        "undelete-fieldset-title": "Възстановяване на версии",
-       "undeleteextrahelp": "За възстановяване на пълната история на страницата не се слагат отметки и се натиска '''''{{int:undeletebtn}}'''''.\nЗа частично възстановяване се поставят отметки на тези версии на страницата, които трябва да бъдат възстановени, след което се натиска '''''{{int:undeletebtn}}'''''.",
+       "undeleteextrahelp": "За възстановяване на пълната история на страницата не се слагат отметки и се натиска <strong><em>{{int:undeletebtn}}</em></strong>.\nЗа частично възстановяване се поставят отметки на тези версии на страницата, които трябва да бъдат възстановени, след което се натиска <strong><em>{{int:undeletebtn}}</em></strong>.",
        "undeleterevisions": "$1 {{PLURAL:$1|версия беше изтрита|версии бяха изтрити}}",
        "undeletehistory": "Ако възстановите страницата, всички версии ще бъдат върнати в историята.\nАко след изтриването е създадена страница със същото име, възстановените версии ще се появят като по-ранна история, а текущата версия на страницата няма да бъде заменена автоматично. Също така обърнете внимание, че ограниченията, приложени върху версиите, ще се загубят след възстановяването.",
        "undeleterevdel": "Възстановяването няма да бъде изпълнено, ако би довело до частично изтриване на актуалната версия. В такъв случай актуалната версия не трябва да бъде избирана или пък състоянието ѝ трябва да бъде променено на нормална (нескрита) версия. Версиите на файлове, които нямате право да преглеждате, няма да бъдат възстановени.",
        "undeletehistorynoadmin": "Тази страница е била изтрита. В резюмето отдолу е посочена причината за това, заедно с информация за потребителите, редактирали страницата преди изтриването ѝ. Конкретното съдържание на изтритите версии е достъпно само за администратори.",
        "undelete-revision": "Изтрита версия на $1 (към $4, в $5) от $3:",
-       "undeleterevision-missing": "Неправилна или липсваща версия. Може да сте последвали грешна препратка или указаната версия да е била възстановена или премахната от архива",
+       "undeleterevision-missing": "Неправилна или липсваща версия.\nМоже да сте последвали грешна препратка или указаната версия да е била възстановена или премахната от архива.",
        "undelete-nodiff": "Не е открита предишна редакция.",
        "undeletebtn": "Възстановяване",
        "undeletelink": "преглед/възстановяване",
        "undeleteinvert": "Обръщане на избора",
        "undeletecomment": "Причина:",
        "cannotundelete": "Една или повече операции по възстановяване се провалиха:\n$1",
-       "undeletedpage": "'''Страницата „$1“ беше възстановена.'''\n\nМожете да видите последните изтрити и възстановени страници в [[Special:Log/delete|дневника на изтриванията]].",
+       "undeletedpage": "<strong>Страницата $1 беше възстановена</strong>\n\nМожете да видите последните изтрити и възстановени страници в [[Special:Log/delete|дневника на изтриванията]].",
        "undelete-header": "Прегледайте [[Special:Log/delete|дневника на изтриванията]] за текущо изтритите страници.",
        "undelete-search-title": "Търсене на изтрити страници",
        "undelete-search-box": "Търсене на изтрити страници",
-       "undelete-search-prefix": "Показване на страници, започващи със:",
+       "undelete-search-prefix": "Показване на страници, започващи с:",
        "undelete-search-full": "Показване на заглавия на страници, съдържащи:",
        "undelete-search-submit": "Търсене",
        "undelete-no-results": "Не са намерени страници, отговарящи на търсения критерий.",
        "undelete-filename-mismatch": "Не е възможно възстановяването на файловата версия с времева отметка $1: несъответствие в името на файла",
        "undelete-bad-store-key": "Не е възможно възстановяването на файловата версия с времева отметка $1: файлът е липсвал преди изтриването.",
        "undelete-cleanup-error": "Грешка при изтриване на неизползвания архивен файл „$1“.",
-       "undelete-missing-filearchive": "Не е възможно възстановяването на файла с ID $1, защото не присъства в базата от данни. Вероятно вече е възстановен.",
+       "undelete-missing-filearchive": "Не е възможно възстановяването на файла с ID $1, защото не присъства в базата от данни.\nВероятно вече е възстановен.",
        "undelete-error": "Грешка при възстановяване на страницата",
        "undelete-error-short": "Грешка при възстановяването на изтрития файл: $1",
        "undelete-error-long": "Възникнаха грешки при възстановяването на изтрития файл:\n\n$1",
        "year": "От година (и по-рано):",
        "date": "От дата (и по-рано):",
        "sp-contributions-newbies": "Показване само на приносите на нови потребители",
-       "sp-contributions-newbies-sub": "на Ð½Ð¾Ð²Ð¸ Ð¿Ð¾Ñ\82Ñ\80ебиÑ\82ели",
+       "sp-contributions-newbies-sub": "Ð\97а Ð½Ð¾Ð²Ð¸ Ñ\81меÑ\82ки",
        "sp-contributions-newbies-title": "Потребителски приноси за нови сметки",
        "sp-contributions-blocklog": "дневник на блокиранията",
        "sp-contributions-deleted": "изтрити приноси на {{GENDER:$1|потребител}}",
        "unblock": "Отблокиране на потребител",
        "blockip": "Блокиране на {{GENDER:$1|потребител}}",
        "blockiptext": "Формулярът по-долу се използва, за да се забрани правото на писане на определен IP-адрес или потребителско име.\nТова трябва да се направи само за предотвратяване прояви на вандализъм\nи в съответствие с [[{{MediaWiki:Policy-url}}|политиката за поведение]].\nНеобходимо е да се посочи и причина за блокирането (например заглавия на страници, станали обект на вандализъм).\nМожете да блокирате диапазон от IP-адреси чрез синтаксиса на [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; максималният позволен диапазон е /$1 за IPv4 и /$2 за IPv6.",
-       "ipaddressorusername": "IP-адрес или потребител:",
+       "ipaddressorusername": "IP-адрес или потребителско име:",
        "ipbexpiry": "Срок:",
        "ipbreason": "Причина:",
        "ipbreason-dropdown": "* Общи причини за блокиране\n** Въвеждане на невярна информация\n** Премахване на съдържание от страниците\n** Добавяне на спам/нежелани външни препратки\n** Въвеждане на безсмислици в страниците\n** Заплашително поведение/тормоз\n** Злоупотреба с няколко потребителски сметки\n** Неприемливо потребителско име",
-       "ipb-hardblock": "Спиране на възможността влезли потребители да редактират от този IP адрес",
+       "ipb-hardblock": "Спиране на възможността влезли потребители да редактират от този IP-адрес",
        "ipbcreateaccount": "Забрана за създаване на потребителски сметки",
        "ipbemailban": "Забрана на потребителя да праща е-поща",
        "ipbenableautoblock": "Автоматично блокиране на последния IP-адрес, използван от потребителя, както и на всички останали адреси, от които се опита да редактира",
        "blockipsuccesssub": "Блокирането беше успешно",
        "blockipsuccesstext": "Потребител [[Special:Contributions/$1|$1]] беше блокиран(а).<br />\nМожете да прегледате пълния [[Special:BlockList|списък на блокираните потребители]].",
        "ipb-blockingself": "На път сте да блокирате себе си! Наистина ли желаете да извършите това действие?",
-       "ipb-confirmhideuser": "На път сте да блокирате потребител, който е \"скрит потребител\". Това действие ще заличи потребителското име от всички списъци и дневници. Наистина ли желаете да направите това?",
-       "ipb-edit-dropdown": "Ð\9fÑ\80иÑ\87ини за блокиране",
+       "ipb-confirmhideuser": "На път сте да блокирате потребител, който е „скрит потребител“. Това действие ще заличи потребителското име от всички списъци и дневници. Наистина ли желаете да направите това?",
+       "ipb-edit-dropdown": "РедакÑ\82иÑ\80ане Ð½Ð° Ð¿Ñ\80иÑ\87иниÑ\82е за блокиране",
        "ipb-unblock-addr": "Отблокиране на $1",
        "ipb-unblock": "Отблокиране на потребителско име или IP-адрес",
        "ipb-blocklist": "Преглед на текущите блокирания",
        "autoblocklist-empty": "Списъкът на автоматичните блокирания е празен.",
        "ipblocklist": "Блокирани потребители",
        "ipblocklist-legend": "Търсене на блокиран потребител",
-       "blocklist-userblocks": "СкÑ\80иване Ð½Ð° Ð±Ð»Ð¾ÐºÐ¸Ñ\80ани потребителски сметки",
+       "blocklist-userblocks": "СкÑ\80иване Ð±Ð»Ð¾ÐºÐ¸Ñ\80анеÑ\82о Ð½Ð° потребителски сметки",
        "blocklist-tempblocks": "Скриване на временни блокирания",
-       "blocklist-addressblocks": "Скриване на отделни блокирани IP адреси",
+       "blocklist-addressblocks": "Скриване на отделни блокирания на IP адреси",
        "blocklist-rangeblocks": "Скриване на блокиранията по IP диапазон",
        "blocklist-timestamp": "Дата и час",
        "blocklist-target": "Цел",
        "block-log-flags-nousertalk": "забрана за редактиране на личната беседа",
        "block-log-flags-angry-autoblock": "разширената автоблокировка е включена",
        "block-log-flags-hiddenname": "скрито потребителско име",
-       "range_block_disabled": "Ð\92Ñ\8aзможноÑ\81Ñ\82Ñ\82а Ð½Ð° Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80иÑ\82е Ð´Ð° Ð·Ð°Ð´Ð°Ð²Ð°Ñ\82 Ð¸Ð½Ñ\82еÑ\80вали при IP-адресите е изключена.",
+       "range_block_disabled": "Ð\92Ñ\8aзможноÑ\81Ñ\82Ñ\82а Ð½Ð° Ð°Ð´Ð¼Ð¸Ð½Ð¸Ñ\81Ñ\82Ñ\80аÑ\82оÑ\80иÑ\82е Ð´Ð° Ð·Ð°Ð´Ð°Ð²Ð°Ñ\82 Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½и при IP-адресите е изключена.",
        "ipb_expiry_invalid": "Невалиден срок на изтичане.",
        "ipb_expiry_old": "Срокът на изтичане е минал.",
        "ipb_expiry_temp": "Скритите потребителски имена трябва да се блокират безсрочно.",
        "unblock-hideuser": "Не можете да отблокирате този потребител, тъй като потребителското му име е скрито.",
        "ipb_cant_unblock": "Грешка: Не е намерен блок с номер $1. Вероятно потребителят е вече отблокиран.",
        "ipb_blocked_as_range": "Грешка: IP-адресът $1 не може да бъде разблокиран, тъй като е част от блокирания регистър $2. Можете да разблокирате адреса, като разблокирате целия регистър.",
-       "ip_range_invalid": "Ð\9dевалиден Ð¸Ð½Ñ\82еÑ\80вал Ð·а IP-адреси.",
+       "ip_range_invalid": "Ð\9dевалиден Ð´Ð¸Ð°Ð¿Ð°Ð·Ð¾Ð½ Ð½а IP-адреси.",
        "ip_range_toolarge": "Забранено е блокиране на диапазони от IP адреси по-големи от /$1.",
        "ip_range_exceeded": "IP диапазонът превишава максималния диапазон. Позволен диапазон: /$1.",
        "proxyblocker": "Блокировач на проксита",
        "pageinfo-category-subcats": "Брой подкатегории",
        "pageinfo-category-files": "Брой файлове",
        "pageinfo-user-id": "Потребителски номер",
+       "pageinfo-file-hash": "Хеш-стойност",
        "markaspatrolleddiff": "Отбелязване като проверена редакция",
        "markaspatrolledtext": "Отбелязване на редакцията като проверена",
        "markaspatrolledtext-file": "Отбелязване на версията на файла като проверена",
        "newimages-newbies": "Показване на приносите само на нови потребители",
        "newimages-showbots": "Показване на качвания от ботове",
        "newimages-hidepatrolled": "Скриване на проверените качвания",
+       "newimages-mediatype": "Файлов тип:",
        "noimages": "Няма нищо.",
        "ilsubmit": "Търсене",
        "bydate": "по дата",
        "exif-source": "Източник",
        "exif-urgency": "Спешност",
        "exif-contact": "Информация за контакти",
+       "exif-writer": "Автор на текста",
        "exif-languagecode": "Език",
        "exif-iimversion": "IIM версия",
        "exif-iimcategory": "Категория",
        "confirm_purge_button": "Добре",
        "confirm-purge-top": "Изчистване на складираното копие на страницата?",
        "confirm-purge-bottom": "Изчистването на страница опреснява кеша и показва последната ѝ версия.",
-       "confirm-watch-button": "Ð\9fоÑ\82вÑ\8aÑ\80ждаване",
-       "confirm-watch-top": "Ð\94обавÑ\8fне Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а Ð² Ñ\81пиÑ\81Ñ\8aка Ð²и за наблюдение?",
+       "confirm-watch-button": "Ð\94обÑ\80е",
+       "confirm-watch-top": "Ð\94обавÑ\8fне Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86аÑ\82а Ð² Ñ\81пиÑ\81Ñ\8aка Ð\92и за наблюдение?",
        "confirm-unwatch-button": "Потвърждаване",
        "confirm-unwatch-top": "Премахване на страницата от списъка Ви за наблюдение?",
        "confirm-rollback-button": "OK",
        "version-specialpages": "Специални страници",
        "version-parserhooks": "Куки в парсера",
        "version-variables": "Променливи",
+       "version-editors": "Редактори",
        "version-antispam": "Предотвратяване на спам",
        "version-other": "Други",
        "version-mediahandlers": "Обработчици на медия",
        "linkaccounts-success-text": "Сметката беше свързана.",
        "linkaccounts-submit": "Свързване на сметки",
        "restrictionsfield-badip": "Невалиден IP-адрес или интервал от адреси: $1",
+       "restrictionsfield-label": "Позволени IP-диапазони:",
        "edit-error-short": "Грешка: $1",
        "edit-error-long": "Грешки:\n\n$1",
        "revid": "версия $1",
+       "pageid": "ID на страницата $1",
+       "gotointerwiki": "Напускане на {{SITENAME}}",
+       "gotointerwiki-invalid": "Указаното заглавие е невалидно.",
+       "pagedata-title": "Данни за страницата",
        "pagedata-bad-title": "Невалидно заглавие: $1.",
        "passwordpolicies": "Правила за паролите",
        "passwordpolicies-summary": "Това е списъкът на действащите правила за паролите на потребителските групи дефинирани в това уики.",
+       "passwordpolicies-group": "Група",
+       "passwordpolicies-policies": "Правила",
        "passwordpolicies-policy-minimalpasswordlength": "Паролата трябва да бъде от поне $1 {{PLURAL:$1|знак|знака}}",
        "passwordpolicies-policy-minimumpasswordlengthtologin": "Паролата трябва да бъде поне $1 {{PLURAL:$1|знак|знака}} за да можете да влезете",
        "passwordpolicies-policy-passwordcannotmatchusername": "Паролата не може да бъде същата като потребителското име",
index 7115f8a..66849a1 100644 (file)
        "customcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "customjsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এই পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
        "customjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই, কারণ এ পাতায় অন্য ব্যবহারকারীর নিজস্ব সেটিংস রয়েছে।",
-       "sitecssprotected": "আপনার এই CSS পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
-       "sitejsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
-       "sitejsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
+       "sitecssprotected": "আপনার এই CSS পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
+       "sitejsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
+       "sitejsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই কারণ এটি সমস্ত পরিদর্শককে প্রভাবিত করতে পারে",
        "mycustomcssprotected": "আপনার এই সিএসএস পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "mycustomjsonprotected": "আপনার এই JSON পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "mycustomjsprotected": "আপনার এই জাভাস্ক্রিপ্ট পাতাটি সম্পাদনা করার অনুমতি নেই।",
        "confirm-unwatch-top": "এই পাতাটি আপনার নজরতালিকা থেকে সরিয়ে ফেলতে ইচ্ছুক?",
        "confirm-rollback-button": "ঠিক আছে",
        "confirm-rollback-top": "এই পাতায় করা সম্পাদনাগুলি প্রত্যাবর্তন করবেন?",
+       "mcrundofailed": "পূর্বাবস্থায় ফেরা ব্যর্থ হয়েছে",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← পূর্ববর্তী পাতা",
        "imgmultipagenext": "পরবর্তী পাতা →",
index 57ef3c8..3240ff7 100644 (file)
@@ -14,7 +14,8 @@
                        "Macofe",
                        "GnuDoyng",
                        "Davidzdh",
-                       "Suzukaze-c"
+                       "Suzukaze-c",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Â-hĕk-siáng lièng-giék",
        "currentrev": "最新版本",
        "currentrev-asof": "$1 muōi-muōi siŏh-huôi biĕng-cĭk",
        "revisionasof": "$1 gì bēng-buōng",
+       "revision-info": "Găk $1 iù {{GENDER:$6|$2}} có̤ gì biĕng-cĭk $7",
        "previousrevision": "← Gá-gô gì bēng-buōng",
        "nextrevision": "加新其版本→",
        "currentrevisionlink": "最新版本",
        "yourrealname": "真實姓名:",
        "yourlanguage": "語言:",
        "yournick": "新其簽名:",
+       "badsig": "Nguòng-sṳ̄ chiĕng-miàng ô dâng.\nGái káng-lâ HTML biēu-chiĕng.",
        "email": "電批",
        "prefs-help-email": "電子郵件地址是愛寫就寫其,但是如果汝𣍐記密碼咯,密碼重置其時候需要茲。",
        "prefs-help-email-others": "汝也會使選擇讓其他其用戶通過汝其用戶頁面或者討論頁面懸頂其鏈接,使電子郵件來聯繫汝。其他其用戶聯繫汝其辰候,汝其電子郵件地址𣍐顯示出來。",
        "boteditletter": "^",
        "rc-change-size-new": "Siŭ-gāi ī-hâiu biéng có̤ $1 cê-ciék",
        "rc-enhanced-hide": "囥起細節",
+       "rc-old-title": "Kī-tàu hô̤ lā̤ „$1“",
        "recentchangeslinked": "相關其改變",
        "recentchangeslinked-feed": "相關其改變",
        "recentchangeslinked-toolbox": "Sŏng-guăng gì gāi-biéng",
        "unwatch": "伓使監視",
        "unwatchthispage": "停止監視",
        "watchlist-details": "Nṳ̄ gì găng-sê-dăng {{PLURAL:$1|ô $1 gó|dŭ liāng ô $1 gó}} hiĕk-miêng (bău-guák tō̤-lâung-hiĕk).",
+       "wlheader-enotif": "Ī-gĭng kŭi kó̤ diêng-piĕ tŭng-dĭ.",
+       "wlheader-showupdated": "Ṳ̀-guō ô diê-siŏh-hiĕk, găk nṳ̄ muōi-muōi siŏh-huòi káng guó cī-hâiu, bô ké̤ṳk nè̤ng gāi kó̤, hī-siŏh-hiĕk gì biĕu-dà̤ cêu-sê <strong>cū-tā̤</strong>.",
        "wlshowlast": "顯示最$1點鐘$2日",
        "watchlist-options": "監視單選項",
        "watching": "監視...",
        "deletecomment": "原因:",
        "rollback": "再修改轉去",
        "rollbacklink": "duōng",
+       "rollbacklinkcount": "Huòi-tó̤i $1 huòi biĕng-cĭk",
        "rollbackfailed": "轉𣍐去",
        "cantrollback": "𣍐使恢復修改;最後其貢獻者是茲蜀頁其唯一其作者。",
        "alreadyrolled": "𣍐使回滾最後蜀回[[User:$2|$2]] ([[User talk:$2|討論]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]])其[[:$1]]編輯;\n有其他儂已經編輯過了或者茲蜀頁已經乞回滾過了。\n\n最後蜀回茲蜀頁其修改是[[User:$3|$3]] ([[User talk:$3|討論]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]])改其。",
        "movelogpagetext": "下底是乞移動過其頁其單單。",
        "movereason": "原因:",
        "delete_and_move_confirm": "正式,刪掉茲蜀頁",
+       "delete_and_move_reason": "Ciā hiĕk ī-gĭng dṳ̀-lâi, ciŏng-uâng „[[$1]]“ â̤-sāi iè-dông gáu cē̤-nē̤",
        "export": "Dô̤-chók hiĕk-miêng",
        "allmessages": "系統消息",
        "allmessagesname": "名",
        "tooltip-feed-atom": "Cī-siŏh-hiĕk gì Atom lài-nguòng",
        "tooltip-t-contributions": "{{GENDER:$1|茲蜀隻用戶}}其貢獻單單",
        "tooltip-t-emailuser": "向{{GENDER:$1|茲蜀隻用戶}}寄電批",
+       "tooltip-t-info": "Cī-siŏh-hiĕk gì gó-sâ̤ séng-sék",
        "tooltip-t-upload": "Siông-diòng ùng-giông",
        "tooltip-t-specialpages": "Cuòng-buô dĕk-sṳ̀-hiĕk dăng-dăng",
        "tooltip-t-print": "Cī-hiĕk â̤ páh-éng gì bēng-buōng",
        "watchlisttools-view": "看相關改變",
        "watchlisttools-edit": "看共修改監視單",
        "watchlisttools-raw": "修改原始監視單",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|tō̤-lâung]])",
        "redirect": "Áng ùng-giông, ê̤ṳng-hô, hiĕk-miêng siŭ-gāi, nĭk-cé ID kó̤ tṳ̀ng-dêng-hióng",
        "redirect-submit": "Kó̤",
        "redirect-lookup": "Sìng-tō̤:",
        "specialpages": "Dĕk-sṳ̀-hiĕk",
        "tag-filter": "Áng [[Special:Tags|biĕu-chiĕng]] tō̤:",
        "tag-list-wrapper": "([[Special:Tags|$1 bĭh biĕu-chiĕng]]: $2)",
+       "tag-mw-new-redirect": "Sĭng gì tṳ̀ng-dêng-hióng",
        "tags-active-yes": "Ciáng-sê",
        "tags-active-no": "Ng-sê",
        "tags-hitcount": "$1 huòi {{PLURAL:$1|siŭ-gāi}}",
        "logentry-delete-delete": "$1 dṳ̀ kó̤ hiĕk-miêng $3",
+       "logentry-delete-delete_redir": "$1 sāi sĭng gì nó̤h muák-lâi kó̤ tṳ̀ng-dêng-hióng $3",
        "revdelete-content-hid": "Káung-kī gì nó̤h",
        "logentry-move-move": "$1 ī-gĭng ciŏng hiĕk-miêng $3 {{GENDER:$2|iè-dông}} gáu $4",
        "logentry-move-move-noredirect": "$1 iè-dông kó̤ hiĕk-miêng $3 gáu $4, mò̤ làu-giâ tṳ̀ng-dêng-hióng",
index b97674b..75940d2 100644 (file)
        "userrights-expiry-in-past": "کاتی بەسەرچوون بۆ گرووپی «$1» لە ڕابردوودایە.",
        "group": "گرووپ:",
        "group-user": "بەکارھێنەران",
-       "group-autoconfirmed": "بەکارھێنەرە خۆبەخۆ پەسندکراوەکان",
+       "group-autoconfirmed": "بەکارھێنەرانی پەسەندکراوی خۆگەڕ",
        "group-bot": "بۆتەکان",
        "group-sysop": "بەڕێوەبەران",
        "group-interface-admin": "بەڕێوەبەرانی ڕووکار",
        "group-suppress": "چاودێرەکان",
        "group-all": "(ھەموو)",
        "group-user-member": "{{GENDER:$1|بەکارھێنەر}}",
-       "group-autoconfirmed-member": "{{GENDER:$1|بەکارھێنەرە خۆبەخۆ پەسندکراوەکان}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|بەکارھێنەرانی پەسەندکراوی خۆگەڕ}}",
        "group-bot-member": "بۆت",
        "group-sysop-member": "{{GENDER:$1|بەڕێوەبەر}}",
        "group-interface-admin-member": "{{GENDER:$1|بەڕێوەبەری ڕووکار}}",
        "group-bureaucrat-member": "{{GENDER:$1|بیوروکرات}}",
        "group-suppress-member": "{{GENDER:$1|چاودێر}}",
        "grouppage-user": "{{ns:project}}:بەکارھێنەران",
-       "grouppage-autoconfirmed": "{{ns:project}}:بەکارھێنەرە خۆبەخۆ پەسندکراوەکان",
+       "grouppage-autoconfirmed": "{{ns:project}}:بەکارھێنەرانی پەسەندکراوی خۆگەڕ",
        "grouppage-bot": "{{ns:project}}:بۆت",
        "grouppage-sysop": "{{ns:project}}:بەڕێوەبەران",
        "grouppage-interface-admin": "{{ns:project}}:بەڕێوەبەرانی ڕووکار",
        "rcfilters-liveupdates-button": "نوێکردنەوەی زیندوو",
        "rcfilters-watchlist-edit-watchlist-button": "دەستکاریکردنی پێڕستی پەڕە چاودێریکراوەکانت",
        "rcfilters-watchlist-showupdated": "ئەو پەڕانەی دەستکاریکراون و لەکاتی دەستکاریکردنەکەوە سەردانت نەکردوونەتەوە بە <strong>تۆخ</strong> دەردەکەون، بە نیشانی پڕکراوەوە.",
+       "rcfilters-preference-label": "گەڕاندنەوەی وەشانی نوێی دوایین گۆڕانکارییەکان",
+       "rcfilters-watchlist-preference-label": "شاردنەوەی وەشانی نوێی پێڕستی چاودێری",
+       "rcfilters-watchlist-preference-help": "ئەم ھەڵبژاردەیە وەشانی نوێی ڕووکار و ھەموو ئامرازەکانی لەو کاتەوە زیاد کراون دەگەڕێنێتەوە.",
        "rcnotefrom": "ژێرەوە {{PLURAL:$5|گۆڕانکارییەکەیە|گۆڕانکارییەکانە}} لە <strong>$3، $4</strong>ەوە (ھەتا <strong>$1</strong> نیشان دراوە).",
        "rclistfromreset": "گەڕاندنەوەی ھەڵبژاردەی بەروار",
        "rclistfrom": "گۆڕانکارییە نوێکان نیشان بدە بە دەستپێکردن لە $3 $2",
        "specialpages-group-wiki": "دراوەکان و ئامرازەکان",
        "specialpages-group-redirects": "پەڕە تایبەتەکانی ڕەوانەکردن",
        "specialpages-group-spam": "ئامرازەکانی سپەم",
+       "specialpages-group-developer": "ئامرازەکانی بەرھەمھێنەر",
        "blankpage": "پەڕەی واڵا",
        "intentionallyblankpage": "ئەم پەڕەیە لەقەست واڵا ھێڵراوەتەوە.",
        "external_image_whitelist": " #ئەم دێڕ ھەر بەم جۆرە کە ھەیە بەجێبێڵە<pre>\n#کەرتەکانی regular expression (تەنیا ئە بەشە کە لە نێوان // دا دێت) لە خوارەوە دابنێ\n#These will be matched with the URLs of external (hotlinked) images\n#Those that match will be displayed as images, otherwise only a link to the image will be shown\n#ئەو دێڕانە بە # دەست پێدەکەن وەک شرۆڤە (comments) مامەڵەیان لەگەڵ دەکرێ\n#بە گەورە و بچووکی پیتەکان ھەستیارە (case-insensitive)\n\n#گشت کەرتەکانی regex لە سەرەوەی ئەم دێرەدا دابنێ. ئەم دێڕ ھەر بەم جۆرە کە ھەیە بەجێبێڵە</pre>",
index 9271047..8bc287d 100644 (file)
        "redirect-file": "Jméno souboru",
        "redirect-logid": "ID protokolovacího záznamu",
        "redirect-not-exists": "Hodnota nenalezena",
+       "redirect-not-numeric": "Hodnota není číslo",
        "fileduplicatesearch": "Hledání duplicitních souborů",
        "fileduplicatesearch-summary": "Hledání duplicitních souborů podle jejich hašů.",
        "fileduplicatesearch-filename": "Jméno souboru:",
index a0da0e1..3f09838 100644 (file)
        "versionrequired": "Kræver version $1 af MediaWiki",
        "versionrequiredtext": "Version $1 af MediaWiki er nødvendig for at bruge denne side. Se [[Special:Version|Versionssiden]]",
        "ok": "OK",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Hentet fra \"$1\"",
        "youhavenewmessages": "Du har $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Du har}} $1 fra {{PLURAL:$3|en anden bruger|$3 brugere}} ($2).",
        "site-atom-feed": "$1 Atom-feed",
        "page-rss-feed": "\"$1\" RSS-feed",
        "page-atom-feed": "\"$1\" Atom-feed",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (siden findes ikke)",
        "sort-descending": "Sorter faldende",
        "sort-ascending": "Sorter stigende",
        "group-autoconfirmed": "Registrerede brugere",
        "group-bot": "Robotter",
        "group-sysop": "Administratorer",
+       "group-interface-admin": "Grænsesnitadministratorer",
        "group-bureaucrat": "Bureaukrater",
        "group-suppress": "Undertrykkere",
        "group-all": "(alle)",
        "recentchanges-page-added-to-category": "[[:$1]] tilføjet til kategori",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] tilføjet til kategorien, [[Special:WhatLinksHere/$1|denne side er inkluderet i andre sider]]",
        "recentchanges-page-removed-from-category": "[[:$1]] fjernet fra kategori",
+       "autochange-username": "Automatisk MediaWiki-ændring",
        "upload": "Læg en fil op",
        "uploadbtn": "Læg en fil op",
        "reuploaddesc": "Tilbage til formularen til at lægge filer op.",
        "uploadstash-bad-path-invalid": "Stien er ugyldig.",
        "uploadstash-bad-path-unknown-type": "Ukendt type »$1«.",
        "uploadstash-file-not-found-no-object": "Kunne ikke oprette lokalt filobjekt for miniaturebillede.",
+       "uploadstash-file-too-large": "Kan ikke behandle en fil der er større end $1 bytes.",
        "uploadstash-not-logged-in": "Ingen bruger er logget ind, filer skal tilhøre brugere.",
        "uploadstash-wrong-owner": "Filen ($1) tilhører ikke den nuværende bruger.",
        "uploadstash-no-such-key": "Ingen sådan nøgle ($1), kan ikke fjerne.",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-expansiondepth": "Største udvidelsesdybde",
        "limitreport-expensivefunctioncount": "Antal dyre parserfunktioner",
+       "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "expandtemplates": "Udfold skabeloner",
        "expand_templates_intro": "Denne specialside tager en tekst og udfolder alle benyttede skabeloner rekursivt.\nDen udfolder også understøttede parserfunktioner så som\n<code><nowiki>{{</nowiki>#language:…}}</code> og variabler så som \n<code><nowiki>{{</nowiki>CURRENTDAY}}</code>\nFaktisk udfolder den stort set alt i dobbelte tuborgklammer.",
        "expand_templates_title": "Sammenhængstitel, for {{FULLPAGENAME}} osv.:",
        "log-action-filter-move": "Flyttetype:",
        "log-action-filter-patrol": "Patruljeringstype:",
        "log-action-filter-protect": "Beskyttelsestype:",
+       "log-action-filter-rights": "Type af rettighedændring:",
        "log-action-filter-all": "Alle",
        "log-action-filter-block-block": "Blokering",
        "log-action-filter-block-reblock": "Ændring af blokering",
        "authform-notoken": "Mangler nøgle",
        "authform-wrongtoken": "Forkert nøgle",
        "specialpage-securitylevel-not-allowed-title": "Ikke tilladt",
+       "authpage-cannot-login": "Kunne ikke starte login.",
        "cannotauth-not-allowed-title": "Adgang nægtet",
        "cannotauth-not-allowed": "Du har ikke tilladelse til at bruge denne side",
        "removecredentials": "Fjern akkreditiver",
index 0b44ae2..768ca98 100644 (file)
@@ -13,7 +13,8 @@
                        "FriedhelmW",
                        "J. 'mach' wust",
                        "Macofe",
-                       "Marcell0"
+                       "Marcell0",
+                       "L*E*D"
                ]
        },
        "tog-hideminor": "Kleine Änderungen in den «Letzten Änderungen» ausblenden",
@@ -21,6 +22,7 @@
        "tog-newpageshidepatrolled": "Kontrollierte Seiten bei den «Neuen Seiten» ausblenden",
        "tog-usenewrc": "Seitenbezogene Gruppierung in den «Letzten Änderungen» und auf der Beobachtungsliste",
        "tog-minordefault": "Eigene Änderungen standardmässig als minim markieren",
+       "tuesday": "Dienstag",
        "january": "Januar",
        "february": "Februar",
        "march": "März",
        "searchbutton": "Suche",
        "searcharticle": "Gehe",
        "printableversion": "Druckbare Version",
+       "permalink": "Permanenter Link",
        "edit": "Bearbeiten",
        "talkpagelinktext": "Diskussion",
        "personaltools": "Meine Werkzeuge",
        "talk": "Diskussion",
        "views": "Ansichten",
        "toolbox": "Werkzeuge",
+       "otherlanguages": "In anderen Sprachen",
+       "lastmodifiedat": "Diese Seite wurde zuletzt am $1 um $2 Uhr bearbeitet.",
        "jumpto": "Wechseln zu:",
        "jumptonavigation": "Navigation",
        "jumptosearch": "Suche",
        "aboutsite": "Über {{SITENAME}}",
        "aboutpage": "Project:Über_{{SITENAME}}",
+       "currentevents": "Aktuelle Ereignisse",
+       "currentevents-url": "Project:Aktuelle Ereignisse",
        "disclaimers": "Impressum",
        "disclaimerpage": "Project:Impressum",
+       "mainpage": "Hauptseite",
+       "mainpage-description": "Hauptseite",
+       "portal": "Gemeinschaftsportal",
+       "portal-url": "Project:Gemeinschaftsportal",
        "privacy": "Datenschutz",
        "privacypage": "Project:Datenschutz",
        "badaccess-groups": "Diese Aktion ist auf Benutzer beschränkt, die {{PLURAL:$2|der Gruppe|einer der Gruppen}} «$1» angehören.",
@@ -79,6 +90,8 @@
        "page-rss-feed": "RSS-Feed für «$1»",
        "page-atom-feed": "Atom-Feed für «$1»",
        "red-link-title": "$1 (Seite nicht vorhanden)",
+       "nstab-main": "Seite",
+       "mainpage-nstab": "Hauptseite",
        "missing-article": "Der Text von «$1» $2 wurde nicht in der Datenbank gefunden.\n\nDie Seite ist möglicherweise gelöscht oder verschoben worden.\n\nFalls dies nicht  zutrifft, hast du eventuell einen Fehler in der Software gefunden. Bitte melde dies einem [[Special:ListUsers/sysop|Administrator]] unter Nennung der URL.",
        "filecopyerror": "Die Datei «$1» konnte nicht nach «$2» kopiert werden.",
        "filerenameerror": "Die Datei «$1» konnte nicht nach «$2» umbenannt werden.",
        "mergehistory-autocomment": "«[[:$1]]» vereinigt nach «[[:$2]]»",
        "mergehistory-comment": "«[[:$1]]» vereinigt nach «[[:$2]]»: $3",
        "history-title": "$1: Versionsgeschichte",
+       "lineno": "Zeile $1:",
        "searchresults-title": "Suchergebnisse für «$1»",
        "searchmenu-exists": "'''Es gibt eine Seite, die den Namen «[[:$1]]» hat.'''",
        "searchmenu-new": "<strong>Erstelle die Seite «[[:$1]]» in diesem Wiki.</strong> {{PLURAL:$2|0=|Siehe auch die über deine Suche gefundene Seite.|Siehe auch die gefundenen Suchergebnisse.}}",
        "right-viewmyprivateinfo": "Eigene private Daten ansehen (beispielsweise E-Mail-Adresse, richtiger Name)",
        "right-editmyprivateinfo": "Eigene private Daten bearbeiten (beispielsweise E-Mail-Adresse, richtiger Name)",
        "right-override-export-depth": "Exportiere Seiten einschliesslich verlinkter Seiten bis zu einer Tiefe von 5",
+       "recentchanges": "Letzte Änderungen",
        "recentchanges-label-plusminus": "Die Änderung der Seitengrösse in Bytes",
        "rc-change-size-new": "$1 {{PLURAL:$1|Byte|Bytes}} nach der Änderung",
        "rc-old-title": "ursprünglich erstellt als «$1»",
        "recentchangeslinked-title": "Änderungen an Seiten, die von «$1» verlinkt sind",
+       "upload": "Datei hochladen",
        "uploadtext": "Benutze dieses Formular, um neue Dateien hochzuladen.\n\nGehe zu der [[Special:FileList|Liste hochgeladener Dateien]], um vorhandene Dateien zu suchen und anzuzeigen. Siehe auch das [[Special:Log/upload|Datei-]] und [[Special:Log/delete|Lösch-Logbuch]].\n\nUm ein '''Bild''' in einer Seite zu verwenden, nutze einen Link in der folgenden Form:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.jpg]]</nowiki></code>''' – für ein Vollbild\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:Datei.png|200px|thumb|left|Alternativer Text]]</nowiki></code>''' – für ein 200px breites Bild innerhalb einer Box, mit «Alternativer Text» als Bildbeschreibung\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:Datei.ogg]]</nowiki></code>''' – für einen direkten Link auf die Datei, ohne Darstellung der Datei",
        "illegalfilename": "Der Dateiname «$1» enthält mindestens ein nicht erlaubtes Zeichen. Bitte benenne die Datei um und versuche, sie erneut hochzuladen.",
        "filename-toolong": "Dateinamen dürfen nicht grösser als 240 Byte sein.",
        "filedelete-success-old": "Von der Datei '''«[[Media:$1|$1]]»''' wurde die Version vom $2, $3 Uhr gelöscht.",
        "filedelete-nofile": "'''«$1»''' ist nicht vorhanden.",
        "filedelete-nofile-old": "Es gibt von '''«$1»''' keine archivierte Version mit den angegebenen Attributen.",
+       "randompage": "Zufällige Seite",
        "randompage-nopages": "Es sind keine Seiten {{PLURAL:$2|im folgenden Namensraum|in den folgenden Namensräumen}} enthalten: «$1»",
        "randomredirect-nopages": "Im Namensraum «$1» sind keine Weiterleitungen vorhanden.",
        "alllogstext": "Dies ist die kombinierte Anzeige aller in {{SITENAME}} geführten Logbücher.\nDie Ausgabe kann durch die Auswahl des Logbuchtyps, des Benutzers oder des Seitentitels eingeschränkt werden (Gross-/Kleinschreibung muss beachtet werden).",
        "undelete-show-file-confirm": "Bist du sicher, dass du eine gelöschte Version der Datei «<nowiki>$1</nowiki>» vom $2, $3 Uhr sehen willst?",
        "blanknamespace": "(Seiten)",
        "contributions-title": "Benutzerbeiträge von «$1»",
+       "whatlinkshere": "Links auf diese Seite",
        "whatlinkshere-title": "Seiten, die auf «$1» verlinken",
        "linkshere": "Die folgenden Seiten verlinken auf '''«$2»''':",
        "nolinkshere": "Keine Seite verlinkt auf '''«$2»'''.",
        "import-error-interwiki": "Die Seite «$1» wurde nicht importiert, da deren Name für externe Links (Interwiki) reserviert ist.",
        "import-error-special": "Die Seite «$1» wurde nicht importiert, da sie zu einem besonderen Namensraum gehört, in dem keine Seiten möglich sind.",
        "import-error-invalid": "Seite «$1» wurde nicht importiert, da deren Name ungültig ist.",
+       "tooltip-pt-login": "Sich anzumelden wird gerne gesehen, ist jedoch nicht zwingend erforderlich.",
        "tooltip-pt-createaccount": "Wir ermutigen dich ein Benutzerkonto zu erstellen und dich anzumelden. Es ist jedoch nicht zwingend erforderlich.",
+       "tooltip-ca-edit": "Diese Seite bearbeiten",
+       "tooltip-ca-history": "Frühere Versionen dieser Seite",
        "tooltip-search": "{{SITENAME}} durchsuchen",
        "tooltip-search-go": "Gehe zur Seite mit diesem exakten Namen, falls diese existiert.",
        "tooltip-search-fulltext": "Durchsuche die Seiten nach diesem Text",
        "tooltip-p-logo": "Hauptseite aufsuchen",
+       "tooltip-n-mainpage-description": "Hauptseite besuchen",
+       "tooltip-n-portal": "Über das Projekt, was du tun kannst, wo was zu finden ist",
+       "tooltip-n-currentevents": "Hintergrundinformationen zu aktuellen Ereignissen finden",
        "tooltip-n-recentchanges": "Liste der letzten Änderungen in diesem Wiki",
+       "tooltip-n-randompage": "Zufällige Seite aufrufen",
        "tooltip-n-help": "Der Platz um herauszufinden",
+       "tooltip-t-whatlinkshere": "Eine Liste aller Seiten, die hierher verlinken",
+       "tooltip-t-recentchangeslinked": "Letzte Änderungen an Seiten, die von hier verlinkt sind",
        "tooltip-t-emailuser": "Ein E-Mail an diesen Benutzer senden",
+       "tooltip-t-upload": "Dateien hochladen",
        "tooltip-t-specialpages": "Liste aller Spezialseiten",
+       "tooltip-t-print": "Druckansicht dieser Seite",
+       "tooltip-t-permalink": "Dauerhafter Link zu dieser Seitenversion",
        "pageinfo-title": "Informationen zu «$1»",
        "pageinfo-toolboxlink": "Informationen zur Seite",
        "markedaspatrollederror": "Markierung als «kontrolliert» nicht möglich.",
        "external_image_whitelist": " #Diese Zeile nicht verändern.<pre>\n#Untenstehend können Fragmente regulärer Ausdrücke (der Teil zwischen den //) eingegeben werden.\n#Diese werden mit den URLs von Bildern aus externen Quellen verglichen.\n#Ein positiver Vergleich führt zur Anzeige des Bildes, andernfalls wird das Bild nur als Link angezeigt.\n#Zeilen, die mit einem # beginnen, werden als Kommentar behandelt.\n#Es wird nicht zwischen Gross- und Kleinschreibung unterschieden.\n\n#Fragmente regulärer Ausdrücke nach dieser Zeile eintragen. Diese Zeile nicht verändern.</pre>",
        "feedback-bugornote": "Sofern Du detailliert ein technisches Problem beschreiben möchtest, melde bitte [$1 einen Fehler].\nAnderenfalls kannst du auch das untenstehende einfache Formular nutzen. Dein Kommentar wird, zusammen mit deinem Benutzernamen und der Version des von Dir verwendeten Webbrowsers sowie Betriebssystems, auf der Seite «[$3 $2]» hinzugefügt.",
        "feedback-thanks": "Vielen Dank. Deine Rückmeldung wurde auf der Seite «[$2 $1]» gespeichert.",
-       "searchsuggest-search": "Suche",
+       "searchsuggest-search": "{{SITENAME}} durchsuchen",
        "api-error-unknown-warning": "Unbekannte Warnung: «$1»",
        "api-error-unknownerror": "Unbekannter Fehler: «$1»"
 }
index 7bf7807..208fb49 100644 (file)
        "botpasswords-invalid-name": "Der angegebene Benutzername enthält keinen Botpassworttrenner („$1“).",
        "botpasswords-not-exist": "Der Benutzer „$1“ hat kein Botpasswort mit dem Namen „$2“.",
        "botpasswords-needs-reset": "Das Botpasswort für den Botnamen „$2“ {{GENDER:$1|des Benutzers|der Benutzerin}} „$1“ muss zurückgesetzt werden.",
+       "botpasswords-locked": "Du kannst dich nicht mit einem Botpasswort anmelden, da dein Benutzerkonto gesperrt ist.",
        "resetpass_forbidden": "Das Passwort kann nicht geändert werden.",
        "resetpass_forbidden-reason": "Die Passwörter können nicht geändert werden: $1",
        "resetpass-no-info": "Du musst dich anmelden, um auf diese Seite direkt zuzugreifen.",
        "confirm-unwatch-top": "Diese Seite von der persönlichen Beobachtungsliste entfernen?",
        "confirm-rollback-button": "Okay",
        "confirm-rollback-top": "Bearbeitungen an dieser Seite zurücksetzen?",
+       "confirm-mcrrestore-title": "Eine Version wiederherstellen",
        "confirm-mcrundo-title": "Eine Änderung rückgängig machen",
        "mcrundofailed": "Rückgängigmachung fehlgeschlagen",
        "mcrundo-missingparam": "Erforderliche Parameter fehlen bei der Anfrage.",
        "mcrundo-changed": "Die Seite wurde verändert, seit du dir den Versionsunterschied ansiehst. Bitte überprüfe die neue Änderung.",
+       "mcrundo-parse-failed": "Die neue Version konnte nicht geparst werden: $1",
        "ellipsis": "…",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
        "redirect-file": "Datei",
        "redirect-logid": "Logbucheintrag",
        "redirect-not-exists": "Der Wert wurde nicht gefunden",
+       "redirect-not-numeric": "Der Wert ist nicht numerisch",
        "fileduplicatesearch": "Dateiduplikatsuche",
        "fileduplicatesearch-summary": "Suche nach Dateiduplikaten auf Basis ihres Hashwertes.",
        "fileduplicatesearch-filename": "Dateiname:",
index 1ba6eec..b886c37 100644 (file)
@@ -30,7 +30,8 @@
                        "Gambollar",
                        "Dılmıc",
                        "Archaeodontosaurus",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Bınê gırey de xete bance:",
index 29651e9..e0137af 100644 (file)
        "right-editinterface": "Wužywański pówjerch wobźěłaś",
        "right-editusercss": "Dataje CSS drugich wužywarjow wobźěłaś",
        "right-edituserjson": "Dataje JSON drugich wužywarjow wobźěłaś",
-       "right-edituserjs": "Dataje JS drugich wužywarjow wobźěłaś",
+       "right-edituserjs": "Dataje JavaScript drugich wužywarjow wobźěłaś",
        "right-editmyusercss": "Twóje swójske wužywarske CSS-dataje wobźěłaś",
        "right-editmyuserjson": "Twóje swójske wužywarske JSON-dataje wobźěłaś",
        "right-editmyuserjs": "Twóje swójske wužywarske JavaScript-dataje wobźěłaś",
index 1cdb10d..30a9699 100644 (file)
        "botpasswords-invalid-name": "The username specified does not contain the bot password separator (\"$1\").",
        "botpasswords-not-exist": "User \"$1\" does not have a bot password named \"$2\".",
        "botpasswords-needs-reset": "The bot password for bot name \"$2\" of {{GENDER:$1|user}} \"$1\" must be reset.",
+       "botpasswords-locked": "You cannot login with a bot password as your account is locked.",
        "resetpass_forbidden": "Passwords cannot be changed",
        "resetpass_forbidden-reason": "Passwords cannot be changed: $1",
        "resetpass-no-info": "You must be logged in to access this page directly.",
        "previousdiff": "← Older edit",
        "nextdiff": "Newer edit →",
        "mediawarning": "<strong>Warning:</strong> This file type may contain malicious code.\nBy executing it, your system may be compromised.",
-       "imagemaxsize": "Image size limit:<br /><em>(for file description pages)</em>",
+       "imagemaxsize": "Image size limit on file description pages:",
        "thumbsize": "Thumbnail size:",
        "widthheight": "$1 × $2",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|page|pages}}",
        "confirm-unwatch-top": "Remove this page from your watchlist?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Revert edits to this page?",
+       "confirm-mcrrestore-title": "Restore a revision",
        "confirm-mcrundo-title": "Undo a change",
        "mcrundofailed": "Undo failed",
        "mcrundo-missingparam": "Missing required parameters on request.",
        "mcrundo-changed": "The page has been changed since you viewed the diff. Please review the new change.",
+       "mcrundo-parse-failed": "Failed to parse the new revision: $1",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "redirect-file": "Filename",
        "redirect-logid": "Log ID",
        "redirect-not-exists": "Value not found",
+       "redirect-not-numeric": "Value not numeric",
        "fileduplicatesearch": "Search for duplicate files",
        "fileduplicatesearch-summary": "Search for duplicate files based on hash values.",
        "fileduplicatesearch-filename": "Filename:",
index 15cab05..5852c55 100644 (file)
                        "Astroemi",
                        "Jelou",
                        "Ktranz",
-                       "AVIADOR71"
+                       "AVIADOR71",
+                       "AHmed Khaled",
+                       "Caleidoscopic",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "tog-editsectiononrightclick": "Permitir las modificaciones de sección al hacer clic derecho en sus títulos",
        "tog-watchcreations": "Añadir a mi lista de seguimiento las páginas que cree y los archivos que suba",
        "tog-watchdefault": "Añadir a mi lista de seguimiento las páginas y archivos que edite",
-       "tog-watchmoves": "Añadir las páginas y archivos que mueva a mi lista de seguimiento",
+       "tog-watchmoves": "Añadir a mi lista de seguimiento las páginas y archivos que mueva",
        "tog-watchdeletion": "Añadir las páginas y archivos que borre a mi lista de seguimiento",
        "tog-watchuploads": "Añadir a mi lista de seguimiento los archivos nuevos que suba",
        "tog-watchrollback": "Añadir a mi lista de seguimiento las páginas en las que haya realizado una reversión",
        "actioncomplete": "Se ha realizado la acción",
        "actionfailed": "Ha fallado la acción",
        "deletedtext": "«$1» ha sido borrado.\nVéase $2 para un registro de los borrados recientes.",
-       "dellogpage": "Registro de borrado",
+       "dellogpage": "Registro de borrados",
        "dellogpagetext": "A continuación se muestra una lista de los borrados más recientes.",
        "deletionlog": "registro de borrados",
        "log-name-create": "Registro de creación de páginas",
        "redirect-file": "Nombre del archivo",
        "redirect-logid": "Identificador de registro",
        "redirect-not-exists": "No se encontró el valor",
+       "redirect-not-numeric": "Valor no numérico",
        "fileduplicatesearch": "Búsqueda de archivos duplicados",
        "fileduplicatesearch-summary": "Búsqueda de archivos duplicados en base a su valor hash.",
        "fileduplicatesearch-filename": "Nombre de archivo:",
        "edit-error-long": "Errores:\n\n$1",
        "revid": "revisión $1",
        "pageid": "ID de página $1",
-       "interfaceadmin-info": "$1\n\nLos permisos para editar las páginas de configuración con formato CSS, JS y JSON han sido recientemente segregados del permiso <code>editinterface</code>. Si no comprendes por qué recibes este error, por favor lee [[mw:MediaWiki_1.32/interface-admin]].",
+       "interfaceadmin-info": "$1\n\nLos permisos para editar los archivos con formato CSS, JS y JSON en todo el sitio han sido recientemente separados del permiso <code>editinterface</code>. Si no comprendes por qué recibes este error, por favor lee [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "No se pueden emplear las etiquetas &lt;html&gt; si no es en las páginas normales.",
        "gotointerwiki": "Salir de {{SITENAME}}",
        "gotointerwiki-invalid": "El título especificado no es válido.",
index 7230cae..cfd0594 100644 (file)
        "ns-specialprotected": "Ezin dira {{ns:special}} izen-tarteko orrialdeak editatu.",
        "titleprotected": "[[User:$1|$1]]ek izenburu hau sortzea ekidin zuen.\nEmandako arrazoia <em>$2</em> izan zen.",
        "filereadonlyerror": "Ezin izan da \"$1\" fitxategia aldatu, \"$2\" fitxategi bilduma irakrutzeko-bakarrik moduan dagoelako.\n\nBlokeoa ezarri zuen sistema administratzaileak honako arrazoia eman zuen: \"$3\".",
+       "invalidtitle": "Balio gabeko izenburua",
        "invalidtitle-knownnamespace": "Izenburua gaizki dago \"$2\" izen eremuan eta \"$3\" testuan",
        "invalidtitle-unknownnamespace": "Izenburua gaizki dago \"$1\" izen eremuan ezezagunean eta \"$2\" testuan",
        "exception-nologin": "Saioa hasi gabe",
        "autosumm-blank": "Orritik eduki guztia ezabatuta",
        "autosumm-replace": "Orriaren edukiaren ordez, «$1» jarri da",
        "autoredircomment": "«[[$1]]» orrira birzuzendua",
-       "autosumm-removed-redirect": "[[$1]]-ra birbideraketa ezabatua",
+       "autosumm-removed-redirect": "«[[$1]]» orrira zeraman birbideratzea ezabatu da",
        "autosumm-changed-redirect-target": "Birbideraketaren helburua «[[$1]]» orritik «[[$2]]» orrira aldatu da",
        "autosumm-new": "Orria sortu da. Edukia: $1",
        "autosumm-newblank": "Orrialde zuria sortu da",
        "tag-mw-contentmodelchange-description": "Orri baten [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel change the content model] aldaketak",
        "tag-mw-new-redirect": "Birbideratze berria",
        "tag-mw-new-redirect-description": "Birbideratze berri bat sortzen duten aldaketak edo birbidaltzeko orrialdea aldatzen dutenak",
-       "tag-mw-removed-redirect": "Birbideraketa ezabatua",
+       "tag-mw-removed-redirect": "Birbideratzea ezabatu da",
        "tag-mw-removed-redirect-description": "Existitzen den birbidaltze bati ez birbidaltzeko bihurtzen duten aldaketak",
        "tag-mw-changed-redirect-target": "Birbideraketaren helburua aldatu da",
        "tag-mw-changed-redirect-target-description": "Birbideraketa baten helburua eraldatzen duten aldaketak",
index 5b3f6e8..2c09e0b 100644 (file)
        "redirect-file": "Tiedostonimi",
        "redirect-logid": "Lokin tunnistenumero",
        "redirect-not-exists": "Arvoa ei löytynyt",
+       "redirect-not-numeric": "Arvo ei numeerinen",
        "fileduplicatesearch": "Kaksoiskappaleiden haku",
        "fileduplicatesearch-summary": "Etsii tiedoston kaksoiskappaleita hajautusarvon perusteella.",
        "fileduplicatesearch-filename": "Tiedostonimi",
        "edit-error-long": "Virheet:\n\n$1",
        "revid": "versio $1",
        "pageid": "sivun tunnistenumero $1",
+       "interfaceadmin-info": "$1\n\nSivustonlaajuisten CSS/JS/JSON-tiedostojen muokkaamisoikeus erotettiin äskettäin <code>editinterface</code>-oikeudesta. Jos et ymmärrä, miksi saat tämän virheen, katso [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "&lt;html&gt; komentoa ei voida käyttää normaalien sivujen ulkopuolella.",
        "gotointerwiki": "Lähdössä {{GRAMMAR:elative|{{SITENAME}}}}",
        "gotointerwiki-invalid": "Annettu otsikko on virheellinen.",
index 2582776..f34d6db 100644 (file)
        "botpasswords-invalid-name": "Le nom d’utilisateur spécifié ne contient pas de séparateur de mot de passe de robots (« $1 »).",
        "botpasswords-not-exist": "L’{{GENDER:$1|utilisateur|utilisatrice}} « $1 » n’a pas de mot de passe de robot nommé « $2 ».",
        "botpasswords-needs-reset": "Le mot de passe du robot de nom « $2 » de l’utilisat{{GENDER:$1|eur|rice}} « $1 » doit être réinitialisé.",
+       "botpasswords-locked": "Vous ne pouvez pas vous connecter avec un mot de passe de robot, car votre compte est bloqué.",
        "resetpass_forbidden": "Les mots de passe ne peuvent pas être changés",
        "resetpass_forbidden-reason": "Les mots de passe ne peuvent pas être modifiés : $1",
        "resetpass-no-info": "Vous devez être connecté(e) pour accéder directement à cette page.",
        "confirm-unwatch-top": "Supprimer cette page de votre liste de suivi ?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Révoquer les modifications de cette page ?",
+       "confirm-mcrrestore-title": "Restaurer une version",
        "confirm-mcrundo-title": "Annuler une modification",
        "mcrundofailed": "L’annulation a échoué",
        "mcrundo-missingparam": "Paramètres obligatoires absents dans la requête.",
        "mcrundo-changed": "La page a été modifiée depuis que vous avez affiché le diff. Veuillez revoir la nouvelle modification.",
+       "mcrundo-parse-failed": "Echec dans l'analyse de la nouvelle version : $1",
        "semicolon-separator": "&nbsp;;&#32;",
        "colon-separator": "&nbsp;:&#32;",
        "percent": "$1&#160;%",
        "redirect-file": "Nom du fichier",
        "redirect-logid": "ID de journal",
        "redirect-not-exists": "Valeur non trouvée",
+       "redirect-not-numeric": "Valeur non numérique",
        "fileduplicatesearch": "Recherche de doublons",
        "fileduplicatesearch-summary": "Recherche des copies de fichiers identiques d'après leur empreinte de hachage.",
        "fileduplicatesearch-filename": "Nom du fichier :",
index 703d080..e37a2ca 100644 (file)
@@ -21,7 +21,8 @@
                        "SeoMac",
                        "Macofe",
                        "Tem",
-                       "Nmacu"
+                       "Nmacu",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Folínte faoi naisc:",
index 3d501ac..58e464d 100644 (file)
@@ -5,22 +5,22 @@
                ]
        },
        "tog-underline": "Soulignman dé lyannaj :",
-       "tog-hideminor": "Maské modifikasyon minò andan modifikasyon résant",
-       "tog-hidepatrolled": "Maské modifikasyon ki rouli andan modifikasyon résant",
+       "tog-hideminor": "Maské modifikasyon minò-ya annan modifikasyon résan-yan",
+       "tog-hidepatrolled": "Maské modifikasyon-yan ki rouli annan modifikasyon résan-yan",
        "tog-newpageshidepatrolled": "Maské paj ki rouli andan lis dé nouvèl paj",
        "tog-hidecategorization": "Maské katégorizasyon dé paj",
-       "tog-extendwatchlist": "Étann lis di swivi pou afiché tout modifikasyon é pa inikman pli résant",
-       "tog-usenewrc": "Groupé chanjman-yan pa paj andan modifikasyon-yan résant ké lis di swivi-a",
+       "tog-extendwatchlist": "Étann lis di swivi pou afiché tout modifikasyon-yan é pa inikman pli résan-yan",
+       "tog-usenewrc": "Groupé chanjman-yan pa paj annan modifikasyon résan-yan é lis di swivi-a",
        "tog-numberheadings": "Niméroté otomatikman tit di sèksyon",
        "tog-showtoolbar": "Afiché bar di zouti di édisyon",
        "tog-editondblclick": "Modifyé paj-ya ké roun doub-klik",
-       "tog-editsectiononrightclick": "Aktivé modifikasyon-an dé sèksyon pa roun klik drèt asou tit di sèksyon",
+       "tog-editsectiononrightclick": "Agtivé modifikasyon-an dé sègsyon pa roun klik drèt asou tit-ya di sègsyon",
        "tog-watchcreations": "Ajouté à mo lis di swivi paj-ya ki mo kréyé é fiché-ya ki mo ka enpòrté",
        "tog-watchdefault": "Ajouté à mo lis di swivi paj-ya ké fiché-ya ki mo ka modifyé",
        "tog-watchmoves": "Ajouté paj-ya ké fiché-ya ki mo ka déplasé annan mo lis di swivi",
-       "tog-watchdeletion": "Ajouté à mo lis di swivi paj-ya ké fiché-ya ki mo ka souprimé",
+       "tog-watchdeletion": "Ajouté à mo lis di swivi paj-ya ké fiché-ya ki mo ka siprimen",
        "tog-watchuploads": "Ajouté nouvèl fiché ki mo ka enpòrté à mo lis di swivi",
-       "tog-watchrollback": "Ajouté à mo lis di swivi paj-ya asou lakèl mo éfèktchwé roun révokasyon",
+       "tog-watchrollback": "Ajouté à mo lis di swivi paj-ya asou lakèl mo éfègtchwé roun révokasyon",
        "tog-minordefault": "Marké tout mo modifikasyon kou minò pa défo",
        "tog-previewontop": "Afiché prévizwalizasyon-an laro di zonn di modifikasyon",
        "tog-previewonfirst": "Afiché prévizwalizasyon-an lò di pronmyé modifikasyon",
@@ -39,7 +39,7 @@
        "tog-watchlisthideliu": "Maské modifikasyon-yan ki fè pa dé itilizatò annan lis di swivi",
        "tog-watchlistreloadautomatically": "Roucharjé otomatikman lis di swivi-a lò lòpsyon di filtraj sa modifyé (JavaScript réki)",
        "tog-watchlistunwatchlinks": "Ajouté dé markèr dirèk ({{int:Watchlist-unwatch}}/{{int:Watchlist-unwatch-undo}}) pou paj-ya swivi ké dé chanjman (JavaScript sa nésésèr pou itilizé fonksyonalité-a)",
-       "tog-watchlisthideanons": "Maské modifikasyon-yan di itilizatò anonim annan lis di swivi",
+       "tog-watchlisthideanons": "Maské modifikasyon-yan di itilizatò annonnim annan lis di swivi-a",
        "tog-watchlisthidepatrolled": "Maské modifikasyon-yan ki rouli annan lis di swivi",
        "tog-watchlisthidecategorization": "Maské katégorizasyon dé paj",
        "tog-ccmeonemails": "• Voyé mo roun kopi dé kouryé ki mo ka voyé pou ròt itilizatò",
        "namespaces": "Lèspas di non",
        "variants": "Varyant",
        "navigation-heading": "Ménou di navigasyon",
-       "errorpagetitle": "Érò",
+       "errorpagetitle": "rò",
        "returnto": "Rouvini kot paj-a $1.",
        "tagline": "Di {{SITENAME}}",
        "help": "Lèd",
        "edit-local": "Modifyé dèskripsyon lokal",
        "create": "Kréyé",
        "create-local": "Ajouté roun dèskripsyon lokal",
-       "delete": "Souprimé",
+       "delete": "Siprimen",
        "undelete_short": "Rèstoré {{PLURAL:$1|roun modifikasyon|$1 modifikasyon}}",
-       "viewdeleted_short": "Wè {{PLURAL:$1|roun modifikasyon souprimé|$1 modifikasyon souprimé}}",
+       "viewdeleted_short": "Wè {{PLURAL:$1|roun modifikasyon ki siprimen|$1 modifikasyon ki siprimen}}",
        "protect": "Protéjé",
        "protect_change": "modifyé",
-       "unprotect": "Chanjé protèksyon-an",
+       "unprotect": "Chanjé protègsyon-an",
        "newpage": "Nouvèl paj",
        "talkpagelinktext": "diskisyon",
        "specialpage": "Paj èspésyal",
        "viewhelppage": "Wè paj di lèd",
        "categorypage": "Wè paj di katégori",
        "viewtalkpage": "Wè paj di diskisyon",
-       "otherlanguages": "Annan rounòt langaj",
+       "otherlanguages": "Annan ròt lanng",
        "redirectedfrom": "(Roudirijé dipi $1)",
        "redirectpagesub": "Paj di roudirègsyon",
        "redirectto": "Roudirijé bò'd :",
        "generic-pool-error": "Dézolé, sèrvò-ya sa sircharjé pou moman-an.\nTròp itilizatò ka sasé konsilté sa rousours.\nSouplé, atann enpé anvan di tanté òkò d'aksédé à sala.",
        "pool-timeout": "Délè di atant di vérou dépasé",
        "pool-queuefull": "Fil dé processus sa plen",
-       "pool-errorunknown": "Éròr enkonèt",
-       "pool-servererror": "Sèrvis di rézèrvasyon pa disponib ($1).",
-       "poolcounter-usage-error": "Éròr di itilizasyon : $1",
+       "pool-errorunknown": "Lérò enkonnèt",
+       "pool-servererror": "Sèrvis-a di rézèrvasyon pa disponnib ($1).",
+       "poolcounter-usage-error": "Lérò di litilizasyon : $1",
        "aboutsite": "Apropo di {{SITENAME}}",
        "aboutpage": "Project:Apropo di",
        "copyright": "Kontni-a sa disponib anba lisans $1 sof mansyon kontrèr.",
        "portal-url": "Project:Pòrtay kouminotèr",
        "privacy": "Politik di konfidansyalité",
        "privacypage": "Project:Politik di konfidansyalité",
-       "badaccess": "Éròr di pèrmisyon",
+       "badaccess": "Lérò di pèrmisyon",
        "badaccess-group0": "Zòt pa gen drwè sifizan pou réyalizé laksyon doumandé.",
        "badaccess-groups": "Aksyon-an ki zòt ka éséyé di réyalizé sa pèrmi yenk pou itilizatò-ya {{PLURAL:$2|di group|di roun dé group}} : $1.",
        "versionrequired": "Vèrsyon $1 di MediaWiki nésésèr",
        "restorelink": "Wè {{PLURAL:$1|roun modifikasyon éfasé|$1 modifikasyon éfasé}}",
        "feedlinks": "Flux :",
        "feed-invalid": "Tip di flux d'abonnman pa valid.",
-       "feed-unavailable": "Flux-ya di sendikasyon pa disponib",
+       "feed-unavailable": "Fligs-ya di sendikasyon pa disponnib",
        "site-rss-feed": "Flux RSS di $1",
        "site-atom-feed": "Flux Atom di $1",
        "page-rss-feed": "Flux RSS di « $1 »",
        "nstab-help": "Lèd",
        "nstab-category": "Katégori",
        "mainpage-nstab": "Paj prensipal",
-       "nosuchaction": "Aksyon enkonèt",
+       "nosuchaction": "Agsyon enkonnèt",
        "nosuchactiontext": "Agsyon-an ki èspésifyé annan URL-a sa envalid.\nZòt pitèt mal antré URL-a oben swivi roun lyannaj éronnen.\nLi pouvé égalman endiké oun annonmanli annan logisyèl-a ki itilizé pa {{SITENAME}}.",
        "nosuchspecialpage": "Paj èspésyal inègzistant",
        "nospecialpagetext": "<strong>Zòt doumandé oun paj èspésyal ki pa ka ègzisté.</strong>\n\nOun lis dé paj èspésyal valid ka trouvé so kò asou [[Special:SpecialPages|{{int:specialpages}}]].",
-       "error": "Érò",
-       "databaseerror": "Érò di baz-a di data",
+       "error": "rò",
+       "databaseerror": "rò di baz-a di data",
        "databaseerror-text": "Oun lérò di rékèt di baz di data prodjwi so kò.\nSala pouvé provini di roun annomali annan lojisyèl-a.",
        "databaseerror-textcl": "Oun lérò di rékèt di baz di data prodjwi so kò.",
        "databaseerror-query": "Rékèt : $1",
        "databaseerror-function": "Fonksyon : $1",
-       "databaseerror-error": "Érò : $1",
+       "databaseerror-error": "rò : $1",
        "transaction-duration-limit-exceeded": "Pou évité roun tròp fò ogmantasyon di délè di réplikasyon, sa tranzagsyon té annilé pas douré-a di ékritir ($1) dépasé limit-a di $2 ségonn. Si zòt ka sasé à modifyé oun gran nonm di éléman similtanéman, éséyé plito di éfègtchwé lopérasyon-an an plizyò létap pli piti.",
-       "laggedslavemode": "Panga, sa paj pa pouvé kontni tout dannyé modifikasyon éfèktchwé",
+       "laggedslavemode": "Panga, sa paj pa pouvé kontni tout dannyé modifikasyon-yan ki éfègtchwé",
        "readonly": "Baz di data vérouyé",
        "enterlockreason": "Endiké rézon-an di vérouyaj ensi ki roun èstimasyon di so douré",
        "readonlytext": "Ajou ké mizajou di baz di data sa atchwèlman bloké, probabman pou pèrmèt mentnans di baz-a, aprè sa, tout bagaj ké rantré annan lòrd.\n\nAdministratò sistenm-an ki vérouyé baz di data fourni èsplikasyon-an ki ka swiv :<br /> $1",
-       "missing-article": "Baz-a di data pa trouvé tègs-a di roun paj ki li té divèt trouvé, ki entitilé « $1 » $2.\n\nJénéralman, sala ka sirvini an swivan roun lyannaj bò'd roun dif ki périmen oben bò'd listorik-a di roun paj ki souprimen.\n\nSi a pa sa ki la, zòt pitèt trouvé roun annonmanli annan progranm-an.\nSouplé, signalé li à roun [[Special:ListUsers/sysop|administratò]] é pa bliyé di endiké li URL-a di paj-a.",
+       "missing-article": "Baz-a di data pa trouvé tègs-a di roun paj ki li té divèt trouvé, ki entitilé « $1 » $2.\n\nJénéralman, sala ka sirvini an swivan roun lyannaj bò'd roun dif ki périmen oben bò'd listorik-a di roun paj ki siprimen.\n\nSi a pa sa ki la, zòt pitèt trouvé roun annonmanli annan progranm-an.\nSouplé, signalé li à roun [[Special:ListUsers/sysop|administratò]] é pa bliyé di endiké li URL-a di paj-a.",
        "missingarticle-rev": "(niméro di vèrsyon : $1)",
        "missingarticle-diff": "(diff : $1, $2)",
        "readonly_lag": "Baz-a di data té otonmatikman vérouyé pannan ki sèrvò-ya ségondèr ka réyaligné yé kò asou sèrvò prensipal-a",
        "nonwrite-api-promise-error": "Ankèt-a HTTP « <code>Promise-Non-Write-API-Action:</code> » té voyé mè rékèt-a té fè à oun modjoul di ékritir di API-a.",
-       "internalerror": "Érò entèrn",
-       "internalerror_info": "Érò entèrn : $1",
-       "internalerror-fatal-exception": "Érò fatal di tip « $1 »",
+       "internalerror": "rò entèrn",
+       "internalerror_info": "rò entèrn : $1",
+       "internalerror-fatal-exception": "rò fatal di tip « $1 »",
        "filecopyerror": "Enposib di kopyé fiché-a « $1 » bò'd « $2 ».",
        "filerenameerror": "Enposib di rounonmen fiché-a « $1 » an « $2 ».",
-       "filedeleteerror": "Enposib di souprimé fiché-a « $1 ».",
+       "filedeleteerror": "Enposib di siprimen fiché-a « $1 ».",
        "directorycreateerror": "Enposib di kréyé répèrtwar-a « $1 ».",
        "directoryreadonlyerror": "Répèrtwar-a « $1 » sa an lèktir sèl.",
        "directorynotreadableerror": "Répèrtwar-a « $1 » pa lizib.",
        "filenotfound": "Enposib di trouvé fiché-a « $1 ».",
        "unexpected": "Valò ki pa nòrmal : « $1 » = « $2 ».",
-       "formerror": "Érò : enposib di soumèt fòrmilèr-a.",
-       "badarticleerror": "Sa aksyon pa pouvé fika éfèktchwé asou sa paj.",
-       "cannotdelete": "Enposib di souprimé paj-a oben fiché-a « $1 ».\nSouprésyon-an pitèt ja té éfèktchwé pa rounòt moun.",
-       "cannotdelete-title": "Enposib di souprimé paj-a « $1 »",
-       "delete-hook-aborted": "Souprésyon annilé pa roun ègstansyon.\nPyès èsplikasyon té bay.",
+       "formerror": "rò : enposib di soumèt fòrmilèr-a.",
+       "badarticleerror": "Sa agsyon pa pouvé fika éfègtchwé asou sa paj.",
+       "cannotdelete": "Enposib di siprimen paj-a oben fiché-a « $1 ».\nSiprésyon-an pitèt ja té éfègtchwé pa rounòt moun.",
+       "cannotdelete-title": "Enposib di siprimen paj-a « $1 »",
+       "delete-hook-aborted": "Siprésyon annilé pa roun ègstansyon.\nPyès lèsplikasyon té fourni.",
        "no-null-revision": "Enposib di kréyé roun nouvèl révizyon vid pou paj-a « $1 »",
        "badtitle": "Movè tit",
        "badtitletext": "Tit di paj doumandé pa valid, vid, oben mal fòrmé si a roun tit entèr-lanng oben entèr-projè.\nI ka kontni pitèt oun oben plizyò karaktèr ki pa pouvé fika itilizé annan tit-ya.",
        "title-invalid-magic-tilde": "Tit di paj doumandé ka kontni roun sékans di tilde majik ki pa valid (<nowiki>~~~</nowiki>).",
        "title-invalid-too-long": "Tit di paj doumandé sa tròp lonng. Li pa divèt dépasé $1 {{PLURAL:$1|ògtè}} annan lankodaj-a UTF-8.",
        "title-invalid-leading-colon": "Tit di paj doumandé ka kontni roun dé-pwen envalid o koumansman.",
-       "perfcached": "Data-ya ki ka swiv sa an kach é pa pouvé fika mizajou. Oun magsimonm di {{PLURAL:$1|1=roun rézilta|$1 rézilta}} sa disponib annan kach-a.",
-       "perfcachedts": "Data-ya ki ka swiv sa an kach é té mizajou pou dannyè fwè-a $1-a. Oun magsimonm di {{PLURAL:$4|1=roun rézilta sa disponib|$4 rézilta sa disponib}} annan kach-a.",
+       "perfcached": "Data-ya ki ka swiv sa an kach é pa pouvé fika mizajou. Oun magsimonm di {{PLURAL:$1|1=roun rézilta|$1 rézilta}} sa disponnib annan kach-a.",
+       "perfcachedts": "Data-ya ki ka swiv sa an kach é té mizajou pou dannyè fwè-a $1-a. Oun magsimonm di {{PLURAL:$4|1=roun rézilta sa disponnib|$4 rézilta sa disponnib}} annan kach-a.",
        "querypage-no-updates": "Mizajou-ya pou sa paj sa atchwèlman dézagtivé.\nData-ya ki anba pa ké fika mizajou.",
        "viewsource": "Wè tègs sours-a",
        "viewsource-title": "Wè sours-a di $1",
        "actionthrottled": "Aksyon limité",
-       "actionthrottledtext": "Pou briga kont abi-ya, itilizasyon-an di sa aksyon sa limité à roun sèrten nonm di fwè annan roun laps di tan asé kourt é zòt dépasé sa limit.\nSouplé, éséyé òkò annan tchèk minout.",
+       "actionthrottledtext": "Pou briga kont abi-ya, litilizasyon-an di sa agsyon sa limité à roun sèrten nonm di fwè annan roun laps di tan asé kourt é zòt dépasé sa limit.\nSouplé, éséyé òkò annan tchèk minout.",
        "protectedpagetext": "Sa paj té protéjé pou anpéché so modifikasyon oben dé ròt aksyon.",
        "viewsourcetext": "Zòt pouvé wè é kopyé kontni-a di sa paj.",
        "viewyourtext": "Zòt pouvé wè ké kopyé kontni-a di <strong>zòt modifikasyon</strong> à sa paj.",
        "protectedinterface": "Sa paj ka fourni tègs di lentèrfas pou lojisyèl-a asou sa wiki é sa protéjé pou évité abi-ya.\nPou ajouté oben modifyé dé anmòrfwézaj asou tout wiki, souplé, itilizé [https://translatewiki.net/ translatewiki.net], projè-a di réjyonnalizasyon di MediaWiki.",
        "editinginterface": "<strong>Panga :</strong> zòt ka modifiyé oun paj ki itilizé pou kréyé tègs-a di lentèrfas-a di lojisyèl.\nChanjman-yan asou sa paj ké répèrkité yé kò asou laparans-a di lentèrfas itilizatò-a pou ròt itilizatò-ya di sa wiki.",
        "translateinterface": "Pou ajouté oben modifyé dé anmòrfwézaj pou tout wiki, souplé, itilizé [https://translatewiki.net/ translatewiki.net], projè-a di lokalizasyon lengwistik di MediaWiki.",
-       "cascadeprotected": "Sa paj protéjé kont modifikasyon-yan pas li sa transkliz pa {{PLURAL:$1|paj-a ki ka swiv, ki té protéjé|paj-ya ki ka swiv, ki té protéjé}} ké lòpsyon « protèksyon an kaskad » aktivé :\n$2",
+       "cascadeprotected": "Sa paj protéjé kont modifikasyon-yan pas li sa transkliz pa {{PLURAL:$1|paj-a ki ka swiv, ki té protéjé|paj-ya ki ka swiv, ki té protéjé}} ké lòpsyon « protègsyon an kaskad » agtivé :\n$2",
        "namespaceprotected": "Zòt pa gen pèrmisyon-an di modifyé paj-ya di lèspas di non « <strong>$1</strong> ».",
        "customcssprotected": "Zòt pa gen pèrmisyon-an di modifyé sa féy di stil CSS, pas li ka kontni paramèt pèrsonèl di rounòt itilizatò.",
        "customjsonprotected": "Zòt pa gen drwè di modifyé sa paj JSON pas li ka kontni paramèt pèrsonèl di rounòt itilizatò.",
        "filereadonlyerror": "Enposib di modifyé fiché-a « $1 » pas répèrtwar-a di fiché « $2 » sa an lèktir sèl.\n\nAdministratò sistèm ki li vérouyé té fourni sa motif : « $3 ».",
        "invalidtitle": "Tit pa valid",
        "invalidtitle-knownnamespace": "Tit pa valid ké lèspas di non « $2 » é entitilé-a « $3 »",
-       "invalidtitle-unknownnamespace": "Tit pa valid ké niméro-a di lèspas di non $1 enkonèt é entitilé-a « $2 »",
+       "invalidtitle-unknownnamespace": "Tit pa valid ké niméro-a di lèspas di non $1 enkonnèt é entitilé-a « $2 »",
        "exception-nologin": "Pa konnègté",
        "exception-nologin-text": "Souplé, konnègté zòt kò pou agsédé à sa paj oben sa agsyon.",
        "exception-nologin-text-manual": "Souplé zòt $1 pou aksédé à sa paj oben sa aksyon.",
-       "virus-badscanner": "Movèz konfigirasyon : analizò di viris enkonèt : <em>$1</em>",
+       "virus-badscanner": "Mové konfigirasyon : analizò di viris enkonnèt : <em>$1</em>",
        "virus-scanfailed": "échèk di analiz-a (kod $1)",
-       "virus-unknownscanner": "antiviris enkonèt :",
+       "virus-unknownscanner": "antiviris enkonnèt :",
        "logouttext": "<strong>Zòt atchwèlman dékonnègté.</strong>\n\nNoté ki sèrten paj pouvé fika òkò afiché kou si zòt toujou konnègté, jouk zòt désidé di éfasé kach-a di zòt navigatò.",
        "cannotlogoutnow-title": "Enposib di dékonnègté so kò atchwèlman",
        "cannotlogoutnow-text": "Dékonnègsyon-an pa posib an itilizan $1.",
        "cannotloginnow-title": "Enposib di konnègté so kò atchwèlman",
        "cannotloginnow-text": "Konnègsyon-an pa posib an itilizan $1.",
        "cannotcreateaccount-title": "Kréyasyon di kont enposib",
-       "cannotcreateaccount-text": "Kréyasyon-an dirèk di kont itilizatò pa aktivé asou sa wiki.",
+       "cannotcreateaccount-text": "Kréyasyon-an dirèk di kont itilizatò pa fika agtivé asou sa wiki.",
        "yourdomainname": "Zòt domenn :",
        "password-change-forbidden": "Zòt pa pouvé modifyé mo di pas asou sa wiki.",
        "externaldberror": "Swé roun lérò prodjwi so kò asou baz-a di data d'otantifikasyon, swé zòt pa otorizé à mété à jou zòt kont ègstèrn.",
        "createacct-benefit-heading": "{{SITENAME}} sa ékri pa dé moun kou zòt.",
        "createacct-benefit-body1": "modifikasyon{{PLURAL:$1|}}",
        "createacct-benefit-body2": "paj{{PLURAL:$1|}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|kontribitò résant}}",
+       "createacct-benefit-body3": "{{PLURAL:$1|kontribitò résan}}",
        "badretype": "Mo di pas ki zòt sézi pa ka korèsponn.",
        "usernameinprogress": "Oun kréyasyon di kont pou sa non d'itilizatò ja an kour.\nSouplé, pasyanté.",
        "userexists": "Non d'itilizatò sézi ja itilizé.\nSouplé, chwézi roun non diféran.",
        "loginerror": "Lérò di konnègsyon",
-       "createacct-error": "Érò lò kréyasyon-an di kont",
+       "createacct-error": "Lérò lò di kréyasyon-an di kont",
        "createaccounterror": "Enposib di kréyé kont-a : $1",
        "nocookiesnew": "Kont itilizatò-a kréyé, mé zòt pa konnègté.\n{{SITENAME}} ka itilizé dé témwen (''cookies'') pou konsèrvé konnègsyon-an mé zòt dézagtivé yé.\nSouplé, agtivé yé é rikonnègté zòt kò ké menm non é menm modipas.",
        "nocookieslogin": "{{SITENAME}} itilizé dé témwen (''cookies'') pou konsèrvé konnègsyon-an mé zòt dézagtivé yé.\nSouplé, agtivé yé é rikonnègté zòt kò.",
-       "nocookiesfornew": "Kont itilizatò pa té kréyé, pas nou pa té pouvé idantifyé so lorijin.\nVérifyé ki zòt aktivé témwen-yan (''cookies''), roucharjé paj-a é éséyé òkò.",
+       "nocookiesfornew": "Kont itilizatò-a pa té fika kréyé, pas nou pa té pouvé idantifyé so lorijin.\nVérifyé ki zòt agtivé témwen-yan (''cookies''), roucharjé paj-a é éséyé òkò.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "createacct-loginerror": "Kont-a byen té kréyé mé zòt pa pouvé konnègté zòt kò otonmatikman.\nSouplé, [[Special:UserLogin|konnègté zòt kò manniyèlman]].",
        "noname": "Zòt pa sézi roun non d'itilizatò valid.",
        "passwordtoolong": "Mo di pas pa pouvé dépasé $1 karaktèr{{PLURAL:$1|}}.",
        "passwordtoopopular": "Mo di pas ki tròp kouran pa pouvé fika itilizé. Souplé, chwézi roun mo di pas pli difisil à douviné.",
        "password-name-match": "Zòt mo di pas divèt fika diféran di zòt non d'itilizatò.",
-       "password-login-forbidden": "Itilizasyon-an di sa non d'itilizatò oben di sa mo di pas té entèrdit.",
+       "password-login-forbidden": "Litilizasyon-an di sa non d'itilizatò oben di sa modipas sa entèrdi.",
        "mailmypassword": "Réyinisyalizé modipas-a",
        "passwordremindertitle": "Nouvèl mo di pas tanporèr pou {{SITENAME}}",
        "passwordremindertext": "Tchèk moun (dipi adrès IP-a $1) doumandé roun modipas nòv pou {{SITENAME}} ($4). Oun modipas tanporèr pou itilizatò-a\n« $2 » té kréyé é sa « $3 ». Si sala té zòt entansyon,\nzòt divèt konnègté zòt kò é chwézi roun modipas nòv.\nZòt modipas tanporèr ké èspiré annan $5 jou{{PLURAL:}}.\n\nSi zòt pa lotò di sa doumann, oben si zòt ka souvni zòt kò atchwèlman di zòt modipas é zòt pli ka swété an chanjé, zòt pouvé ignoré sa mésaj é kontinwé di itilizé zòt ansyen modipas.",
        "blocked-mailpassword": "Zòt adrès IP bloké an modifikasyon. Pou évité abi-ya, i pa otorizé di itilizé rékipérasyon-an di mo à partir di sa adrès IP.",
        "eauthentsent": "Roun kouryé di konfirmasyon té voyé à adrès-a ki endiké.\nAnvan ki rounòt kouryé ka fika voyé à sa kont, zòt divèt swiv enstriksyon di kouryé é konfirmé ki kont-a byen di zòt.",
        "throttled-mailpassword": "Roun kouryé di réyinisyalizasyon di zòt mo di pas té ja voyé douran {{PLURAL:$1|dannyé lò|$1 dannyé lò}}. \nAfen di évité abi-ya, roun sèl kouryé di réyinisyalizasyon di zòt mo di pas ké fika voyé pa {{PLURAL:$1|lò|entèrval di $1 lò}}.",
-       "mailerror": "Érò lò di voyé di kouryé : $1",
+       "mailerror": "Lérò lò di voyé-a di kouryé : $1",
        "acct_creation_throttle_hit": "Vizitò-ya di sa wiki ki ka itilizé zòt adrès IP kréyé {{PLURAL:$1|roun kont|$1 kont}} douran dannyé $2, sa ki sa limit maksimal otorizé andan sa entèrval di tan.\nPa konsékan, kréyasyon di kont pou vizitò-ya ki ka itilizé sa adrès IP sa tanporèrman enposib.",
        "emailauthenticated": "Zòt adrès di kouryé té konfirmé $2 à $3.",
        "emailnotauthenticated": "Zòt adrès di kouryé pa òkò konfirmé.\nPyès kouryé ké fika voyé pou chaken dé fonksyon swivant.",
        "accountcreated": "Kont kréyé",
        "accountcreatedtext": "Kont itilizatò pou [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|diskisyon]]) té kréyé.",
        "createaccount-title": "Kréyasyon di roun kont pou {{SITENAME}}",
-       "createaccount-text": "Tchèk moun kréyé roun kont pou zòt adrès di kouryé asou {{SITENAME}} ($4) entitilé « $2 », ké mo di pas « $3 ».\nZòt divèt ouvri roun sésyon é atchwèlman modifyé zòt mo di pas.\n\nIgnoré sa mésaj si sa kont té kréyé pa érò.",
+       "createaccount-text": "Tchèk moun kréyé roun kont pou zòt adrès di kouryé asou {{SITENAME}} ($4) ki entitilé « $2 », ké modipas « $3 ».\nZòt divèt ouvri roun sésyon é modifyé atchwèlman zòt modipas.\n\nIgnoré sa mésaj si sa kont té kréyé pa lérò.",
        "login-throttled": "Zòt tanté dannyéman roun nonm tròp élvé di konnègsyon.\nSouplé, antann $1 anvan di éséyé òkò.",
        "login-abort-generic": "Zòt échwé zòt tantativ di konnègsyon",
        "login-migrated-generic": "Zòt kont té migré, é zòt non d'itilizatò pa ka ègzisté òkò asou sa wiki.",
        "pt-login-continue-button": "Kontinwé konnègsyon-an",
        "pt-createaccount": "Kréyé roun kont",
        "pt-userlogout": "Dékonnègté so kò",
-       "php-mail-error-unknown": "Érò enkonèt annan fonksyon-an <code>mail()</code> di PHP.",
+       "php-mail-error-unknown": "Lérò enkonnèt annan fongsyon-an <kod>mail()</kod> di PHP.",
        "user-mail-no-addy": "Enposib di voyé roun kouryé san adrès di kouryé.",
        "user-mail-no-body": "Ésè di voyé di roun kouryé ké roun kò vid oben anòrmalman kour.",
        "changepassword": "Chanjé di mo di pas",
        "changepassword-success": "Zòt modipas modifyé !",
        "changepassword-throttled": "Zòt fè tròp di tantativ di konnègsyon résaman. \nSouplé, antann $1 anvan di réyéséyé.",
        "botpasswords": "Mo di pas di robo",
-       "botpasswords-summary": "<em>Modipas-ya di robo</em> ka pèrmèt di agsédé à roun kont itilizatò vya API-a san itilizé idantifyan-yan di konnègsyon prensipal. Drwè itilizatò disponib lò to konnègté ké roun modipas robo pouvé fika rédjwi.\n\nSi zòt pa ka wè poukisa zòt ké lé fè sa, a ki zòt pa benzwen di fè sa. Pésonn divèt janmen doumandé zòt di an jénéré roun é di bay li.",
+       "botpasswords-summary": "<em>Modipas-ya di robo</em> ka pèrmèt di agsédé à roun kont itilizatò vya API-a san itilizé idantifyan-yan di konnègsyon prensipal. Drwè itilizatò-ya ki disponnib lò to konnègté ké roun modipas robo pouvé fika rédjwi.\n\nSi zòt pa ka wè poukisa zòt ké lé fè sa, a ki zòt pa benzwen di fè sa. Pésonn divèt janmen doumandé zòt di an jénéré roun é di bay li.",
        "botpasswords-disabled": "Mo di pas di robo sa dézaktivé.",
        "botpasswords-no-central-id": "Pou itilizé modipas-ya di robo, zòt divèt fika konnègté à roun kont ki santralizé.",
        "botpasswords-existing": "Mo di pas di robo ègzistan",
        "botpasswords-label-create": "Kréyé",
        "botpasswords-label-update": "Mété à jou",
        "botpasswords-label-cancel": "Annilé",
-       "botpasswords-label-delete": "Souprimé",
+       "botpasswords-label-delete": "Siprimen",
        "botpasswords-label-resetpassword": "Réyinisyalizé mo di pas",
        "botpasswords-label-grants": "Drwè aplikab :",
-       "botpasswords-help-grants": "Otorizasyon-yan ka pèrmèt di aksédé o drwè ki déja akòrdé à zòt kont itilizatò. Aktivé roun otorizasyon isi ka fourni laksè à pyès drwè ki zòt kont itilizatò pa gen dayò. Wè [[Special:ListGrants|tablo dé otorizasyon]] pou plis d’enfòrmasyon.",
+       "botpasswords-help-grants": "Lotorizasyon-yan ka pèrmèt di agsédé o drwè ki déja akòrdé à zòt kont itilizatò. Agtivé roun lotorizasyon isi ka fourni lagsè à pyès drwè ki zòt kont itilizatò péké ganyen dayò. Wè [[Special:ListGrants|tablo dé lotorizasyon]] pou plis di lenfòrmasyon.",
        "botpasswords-label-grants-column": "Akòrdé",
        "botpasswords-bad-appid": "Non-an di robo « $1 » pa valid.",
        "botpasswords-insert-failed": "Échèk di ajou-a di non di robo « $1 ». Ès i té ja ajouté ?",
-       "botpasswords-update-failed": "Échèk di mizajou-a di non di robo « $1 ». Ès i té ja souprimé ?",
+       "botpasswords-update-failed": "Léchèk di mizajou di non di robo « $1 ». Ès i té ja siprimen ?",
        "botpasswords-created-title": "Mo di pas di robo kréyé",
        "botpasswords-created-body": "Mo di pas pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té kréyé.",
        "botpasswords-updated-title": "Mo di pas di robo mizajou",
        "botpasswords-updated-body": "Mo di pas pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té mizajou.",
-       "botpasswords-deleted-title": "Mo di pas di robo souprimé",
-       "botpasswords-deleted-body": "Mo di pas pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té souprimé.",
-       "botpasswords-newpassword": "Nouvèl modipas-a pou konnègté so kò Ã <strong>$1</strong> sa <strong>$2</strong>. <em>Souplé, anréjistré li pou fè référans asou li iltèryèrman.</em><br> (Pou ansyen robo ki ka nésésité ki non fourni pou konnègsyon-an ka fika menm-an ki non di itilizasyon évantchwèl, zòt pouvé osi itilizé <strong>$3</strong> kou non di itilizatò é <strong>$4</strong> kou modipas).",
-       "botpasswords-no-provider": "BotPasswordsSessionProvider pa disponib.",
+       "botpasswords-deleted-title": "Modipas di robo siprimen",
+       "botpasswords-deleted-body": "Modipas-a pou robo-a « $1 » di {{GENDER:$2|itilizatò|itilizatris}}-a « $2 » té siprimen.",
+       "botpasswords-newpassword": "Nouvèl modipas-a pou konnègté so kò Ã <strong>$1</strong> sa <strong>$2</strong>. <em>Souplé, anréjistré li pou fè référans asou li iltèryòrman.</em><br> (Pou ansyen robo-ya ki ka nésésité ki non-an ki fourni pou konnègsyon-an ka fika menm-an ki non-an di itilizatò évantchwèl, zòt pouvé osi itilizé <strong>$3</strong> kou non di itilizatò é <strong>$4</strong> kou modipas).",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider pa disponnib.",
        "botpasswords-restriction-failed": "Rèstrigsyon-yan di modipas di robo ka anpéché sa konnègsyon.",
        "botpasswords-invalid-name": "Non-an d'itilizatò spésifyé pa ka kontni di séparatò di mo di pas di robo (« $1 »).",
        "botpasswords-not-exist": "{{GENDER:$1|Itilizatò|Itilizatris}}-a « $1 » pa gen di mo di pas di robo nonmen « $2 ».",
        "passwordreset-nosuchcaller": "Apélan-an pa ka ègzisté : $1",
        "passwordreset-invalidemail": "Adrès di mésajri envalid",
        "passwordreset-nodata": "Pyès non d'itilizatò oben adrès di mésajri té fourni",
-       "changeemail": "Chanjé oben souprimé adrès di kouryé",
+       "changeemail": "Chanjé oben siprimen adrès-a di kouryé",
        "changeemail-no-info": "Zòt divèt fika konnègté pou agsédé dirèkman à sa paj.",
        "changeemail-oldemail": "Adrès di kouryé atchwèl :",
        "changeemail-newemail": "Nouvèl adrès di kouryé :",
        "showpreview": "Prévizwalizé",
        "showdiff": "Wè modifikasyon-yan",
        "anoneditwarning": "<strong>Panga :</strong> zòt pa konnègté. Zòt adrès IP ké vizib pa tout moun si zòt ka fè dé modifikasyon. Si zòt <strong>[$1 ka konnègté zòt kò]</strong> oben <strong>[$2 kréyé roun kont]</strong>, zòt modifikasyon ké fika atribiyé à zòt pròp non di itilizatò é zòt ké gen ròt avantaj.",
-       "blockedtext": "<strong>Zòt kont itilizatò oben zòt adrès IP bloké.</strong>\n\nBlokaj té éfèktchwé pa $1.\nRézon-an ki évoké ka swiv : <em>$2</em>.\n\n* Koumansman di blokaj : $8\n* Èspirasyon di blokaj : $6\n* Kont bloké : $7.\n\nZòt pouvé kontakté $1 oben rounòt [[{{MediaWiki:Grouppage-sysop}}|administratò]] pou an diskité.\nZòt pa pouvé itilizé fonksyon-an « {{int:emailuser}} » rounso si oun adrès di kouryé valid sa èspésifyé andan zòt [[Special:Preferences|préférans]] é rounso si sa fonksyonalité pa bloké.\nZòt adrès IP atchwèl sa $3 é zòt idantifyan di blokaj sa $5.\nSouplé, enkli tout détay-ya lasou'l annan chakin dé rékèt ki zòt ké fè.",
+       "blockedtext": "<strong>Zòt kont itilizatò oben zòt adrès IP bloké.</strong>\n\nBlokaj té éfègtchwé pa $1.\nRézon-an ki évoké ka swiv : <em>$2</em>.\n\n* Koumansman di blokaj : $8\n* Lèspirasyon di blokaj : $6\n* Kont bloké : $7.\n\nZòt pouvé kontagté $1 oben rounòt [[{{MediaWiki:Grouppage-sysop}}|administratò]] pou an diskité.\nZòt pouvé itilizé fongsyon-an « {{int:emailuser}} » rounso si roun adrès di kouryé valid sa èspésifyé annan zòt [[Special:Preferences|préférans]] é rounso si sa fongsyonnalité pa bloké pou zòt.\nZòt adrès IP atchwèl sa $3 é zòt idantifyan di blokaj sa $5.\nSouplé, enkli tout détay-ya lasou'l annan chaken dé rékèt ki zòt ké fè.",
        "loginreqlink": "konnègté so kò",
        "newarticletext": "Zòt té ka swiv roun lyannaj bò'd roun paj ki pa ka ègzisté òkò. \nAfen di kréyé sa paj, antré zòt tègs annan bwèt-a ki apré (zòt pouvé konsilté [$1 paj di lèd-a] pou plis di lenfòrmasyon).\nSi zòt vini{{GENDER:|}} isi pa lérò, kliké asou bouton-an <strong>Routour</strong> di zòt navigatò.",
        "anontalkpagetext": "----\n<em>Zòt asou paj di diskisyon di roun itilizatò annonnim ki pa òkò kréyé di kont oben ki pa ka an itilizé</em>.\nPou sa rézon, nou divèt itilizé so adrès IP pou idantifyé li.\nOun adrès IP pouvé fika patajé pa plizyò itilizatò.\nSi zòt roun itiliza{{GENDER:|ò}} annonnim é si zòt ka kontasté ki dé koumantèr ki pa ka konsèrné zòt sa adrèsé pou zòt, zòt pouvé [[Special:CreateAccount|kréyé roun kont]] oben [[Special:UserLogin|konnègté zòt kò]] atò di évité tout konfizyon fitir ké ròt kontribitò annonnim.",
        "template-protected": "(protéjé)",
        "template-semiprotected": "(sémi-protéjé)",
        "hiddencategories": "{{PLURAL:$1|Katégori kaché}} don sa paj ka fè parti :",
-       "permissionserrors": "Éròr di pèrmisyon",
+       "permissionserrors": "Lérò di pèrmisyon",
        "permissionserrorstext-withaction": "Zòt pa pouvé $2, pou {{PLURAL:$1|rézon swivant}} :",
-       "recreate-moveddeleted-warn": "<strong>Panga : zòt ka roukréyé oun paj ki té présédaman souprimé.</strong>\n\nAsouré-zòt ki li sa pertinan di pourswiv modifikasyon-yan asou sa paj.\nJournal dé souprésyon é dé déplasman pou sa paj sa afiché anba à tit di enfòrmasyon :",
-       "moveddeleted-notice": "Sa paj té souprimé. \nJournal dé souprésyon, dé protèksyon é dé déplasman di paj-a sa afiché anba pou référans.",
+       "recreate-moveddeleted-warn": "<strong>Panga : zòt ka roukréyé roun paj ki té présédanman siprimen.</strong>\n\nAsouré-zòt ki i sa pèrtinan di pourswiv modifikasyon-yan asou sa paj.\nJournal-ya dé siprésyon é dé déplasman pou sa paj sa fourni isi pou lenfòrmasyon :",
+       "moveddeleted-notice": "Sa paj té siprimen. \nJournal-ya dé siprésyon, dé protègsyon é dé déplasman pou paj-a sa afiché anba pou référans.",
        "content-model-wikitext": "wikitèks",
        "undo-failure": "Sa modifikasyon pa pouvé défèt : sala ké antré an konfli ké modifikasyon entèrmédjèr-ya.",
        "viewpagelogs": "Wè opérasyon-yan asou sa paj",
        "currentrevisionlink": "Wè vèrsyon atchwèl-a",
        "cur": "atch",
        "last": "dif",
-       "histlegend": "Sélèksyon di diff : koché bouton radjo-ya dé vèrsyon à konparé é apiyé asou antré oben asou bouton-an ki anba.<br />\nLéjann : <strong>({{int:cur}})</strong> = diférans ké dannyé vèrsyon-an, <strong>({{int:last}})</strong> = diférans ké vèrsyon présédant-a, <strong>{{int:minoreditletter}}</strong> = modifikasyon minò.",
+       "histlegend": "Sélègsyon di diff : koché bouton radjo-ya dé vèrsyon à konparé é apiyé asou antré oben asou bouton-an ki anba.<br />\nLéjann : <strong>({{int:cur}})</strong> = diférans ké dannyé vèrsyon-an, <strong>({{int:last}})</strong> = diférans ké vèrsyon présédan-an, <strong>{{int:minoreditletter}}</strong> = modifikasyon minò.",
        "history-fieldset-title": "Sasé dé révizyon",
        "histfirst": "Pli ansyenn",
-       "histlast": "Pli résant",
+       "histlast": "Pli résan-yan",
        "history-feed-title": "Listorik dé vèrsyon",
        "history-feed-description": "Listorik dé vèrsyon pou sa paj asou wiki-a",
        "history-feed-item-nocomment": "$1 à $2",
        "action-edit": "modifyé sa paj",
        "action-createaccount": "kréyé sa kont itilizatò",
        "enhancedrc-history": "listorik",
-       "recentchanges": "Modifikasyon résant",
-       "recentchanges-legend": "Lòpsyon dé modifikasyon résant",
+       "recentchanges": "Modifikasyon résan",
+       "recentchanges-legend": "Lòpsyon dé modifikasyon résan",
        "recentchanges-summary": "Swiv chanjman-yan pli résan wiki asou sa paj.",
        "recentchanges-noresult": "Pyès modifikasyon ka korèsponn à sa kritèr asou péryòd endiké.",
        "recentchanges-feed-description": "Swivé dannyé modifikasyon-yan di wiki andan sa flux.",
        "recentchanges-label-plusminus": "Tay di paj-a chanjé di sa nonm d'oktè.",
        "recentchanges-legend-heading": "<strong>Léjann :</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (wè osi [[Special:NewPages|lis dé nouvèl paj]]).",
-       "rcnotefrom": "Anba {{PLURAL:$5|modifikasyon éfèktchwé}} dipi <strong>$3, $4</strong> (afiché jouk à <strong>$1</strong>).",
+       "rcnotefrom": "Anba {{PLURAL:$5|modifikasyon-an ki éfègtchwé|modifikasyon-yan ki éfègtchwé}} dipi <strong>$3, $4</strong> (afiché jouk <strong>$1</strong>).",
        "rclistfrom": "Afiché nouvèl modifikasyon-yan dipi $3, $2",
        "rcshowhideminor": "$1 modifikasyon minò",
        "rcshowhideminor-show": "Afiché",
        "rcshowhideliu": "$1 itilizatò anréjistré",
        "rcshowhideliu-show": "Afiché",
        "rcshowhideliu-hide": "Maské",
-       "rcshowhideanons": "$1 itilizatò anonim-ya",
+       "rcshowhideanons": "$1 itilizatò annonnim-yan",
        "rcshowhideanons-show": "Afiché",
        "rcshowhideanons-hide": "Maské",
        "rcshowhidepatr": "$1 modifikasyon sirvéyé",
        "rcshowhidemine": "$1 mo modifikasyon-yan",
        "rcshowhidemine-show": "Afiché",
        "rcshowhidemine-hide": "Maské",
-       "rclinks": "Afiché $1 dannyé modifikasyon éfèktchwé o kour dé $2 dannyé jou.",
+       "rclinks": "Afiché $1 dannyé modifikasyon-yan ki éfègtchwé o kour dé $2 dannyé jou.",
        "diff": "dif",
        "hist": "ist",
        "hide": "Maské",
        "uploadlogpage": "Journal di enpo di fiché",
        "filedesc": "Dèskripsyon",
        "license": "Lisans",
-       "license-header": "Kondisyon di itilizasyon",
+       "license-header": "Kondisyon di litilizasyon",
        "imgfile": "fiché",
        "listfiles": "Lis di fiché",
        "file-anchor-link": "Fiché",
        "filehist-user": "Itilizatò",
        "filehist-dimensions": "Dimansyon",
        "filehist-comment": "Koumantèr",
-       "imagelinks": "Itilizasyon di fiché",
+       "imagelinks": "Litilizasyon di fiché",
        "linkstoimage": "{{PLURAL:$1|Paj ki ka swiv ka itilizé|$1 paj-ya ki ka swiv ka itilizé}} sa fiché :",
        "linkstoimage-more": "Pli {{PLURAL:$1|di roun paj ka itilizé|di $1 paj ka itilizé}} sa fiché.\nLis-a ki ka swiv ka afiché rounso {{PLURAL:$1|pronmyé paj-a ki ka itilizé|$1 pronmyé paj-ya ki ka itilizé}} sa fiché.\nOun [[Special:WhatLinksHere/$2|lis konplèt]] sa disponnib.",
        "nolinkstoimage": "Pyès paj ka itilizé sa fiché.",
        "listusers": "Lis dé itilizatò",
        "newpages": "Nouvèl paj",
        "move": "Rounonmen",
-       "pager-newer-n": "{{PLURAL:$1|1 pli résant|$1}}",
+       "pager-newer-n": "{{PLURAL:$1|1 pli résan|$1}}",
        "pager-older-n": "{{PLURAL:$1|1 pli ansyenn|$1}}",
        "booksources": "Ouvraj di référans",
        "booksources-search-legend": "Sasé parmi dé ouvraj di référans",
        "speciallogtitlelabel": "Sib (tit oben {{ns:user}}:non di itilizatò) :",
        "log": "Journal d’opérasyon",
        "all-logs-page": "Tout journal piblik",
-       "alllogstext": "Afichaj konbiné di tout journal disponib asou {{SITENAME}}.\nZòt pouvé pèrsonalizé afichaj an sélèksyonnan tip di journal, non di itilizatò oben paj-a ki konsèrné (sa Dé dannyé sa sansib à lakas).",
+       "alllogstext": "Lafichaj konbinen di tout journal-ya ki disponnib asou {{SITENAME}}.\nZòt pouvé pèrsonalizé lafichaj an sélègsyonnan tip di journal-a, non di itilizatò-a oben paj-a ki konsèrnen (sa Dé dannyé sa sansib à lakas).",
        "logempty": "Pyès opérasyon korèspondant andan journal-ya.",
        "allpages": "Tout paj-ya",
        "allarticles": "Tout paj-ya",
        "unwatch": "Pli swiv òkò",
        "watchlist-details": "{{PLURAL:$1|$1 paj sa|$1}} annan zòt lis di swivi (plis paj-ya di diskisyon).",
        "wlheader-showupdated": "Paj-ya ki modifyé dipi zòt dannyé vizit sa afiché an <strong>gra</strong>.",
-       "wlnote": "Anba {{PLURAL:$1|figir dannyé modifikasyon-an éfèktchwé|figir <strong>$1</strong> dannyé modifikasyon-yan éfèktchwé}} douran {{PLURAL:$2|dannyé lò| <strong>$2</strong>}}, jouk o $3, $4.",
+       "wlnote": "Anba {{PLURAL:$1|ka figiré dannyé modifikasyon-an ki éfègtchwé|ka figiré <strong>$1</strong> dannyé modifikasyon-yan ki éfègtchwé}} douran {{PLURAL:$2|dannyé lèr-a|<strong>$2</strong> dannyé lèr-ya}}, jouk $3, $4.",
        "wlshowlast": "Montré dannyé $1 lò, dannyé $2 jou",
        "watchlist-options": "Opsyon di lis di swivi",
        "enotif_reset": "Marké tout paj-ya kou vizité",
-       "dellogpage": "Journal dé souprésyon",
+       "dellogpage": "Journal dé siprésyon",
        "rollbacklink": "révoké",
        "rollbacklinkcount": "révoké $1 {{PLURAL:$1|modifikasyon}}",
-       "protectlogpage": "Journal dé protèksyon",
+       "protectlogpage": "Journal dé protègsyon",
        "protectedarticle": "protéjé « [[$1]] »",
-       "modifiedarticleprotection": "modifyé nivo di protèksyon di « [[$1]] »",
+       "modifiedarticleprotection": "modifyé nivo-a di protègsyon di « [[$1]] »",
        "protect-default": "Otorizé tout itilizatò-ya",
        "restriction-edit": "Modifyé",
        "restriction-move": "Rounonmen",
        "namespace": "Lèspas di non",
-       "invert": "Envèrsé sélèksyon-an",
+       "invert": "Envèrsé sélègsyon-an",
        "tooltip-invert": "Koché sa kaz pou kaché modifikasyon-yan dé paj annan lèspas di non sélèksyoné (ké lèspas di non asosyé si koché)",
        "namespace_association": "Lèspas di non asosyé",
        "tooltip-namespace_association": "Koché sa kaz pou enkli égalman lèspas di non di diskisyon oben di sijè, ki asosyé à lèspas di non ki sélèksyoné",
        "tooltip-ca-viewsource": "Sa paj sa protéjé.\nZòt pouvé toutfwè vizwalizé sours-a.",
        "tooltip-ca-history": "Listorik dé vèrsyon di sa paj",
        "tooltip-ca-protect": "Protéjé sa paj",
-       "tooltip-ca-delete": "Souprimé sa paj",
+       "tooltip-ca-delete": "Siprimen sa paj",
        "tooltip-ca-move": "Rounonmen sa paj",
        "tooltip-ca-watch": "Ajouté sa paj annan zòt lis di swivi",
        "tooltip-ca-unwatch": "Routiré sa paj di zòt lis di swivi",
        "tooltip-n-mainpage-description": "Paj prensipal jénéral",
        "tooltip-n-portal": "Apropo di projè, sa ki zòt pouvé fè, koté trouvé enfòrmasyon-yan",
        "tooltip-n-currentevents": "Trouvé plis d'enfòrmasyon asou atchwalité an kour",
-       "tooltip-n-recentchanges": "Lis di modifikasyon résant asou wiki-a",
+       "tooltip-n-recentchanges": "Lis dé modifikasyon résan asou wiki-a",
        "tooltip-n-randompage": "Afiché roun paj an azò",
        "tooltip-n-help": "Aksè à lèd",
        "tooltip-t-whatlinkshere": "Lis dé paj ki lyannen ki ka pwenté asou sala",
-       "tooltip-t-recentchangeslinked": "Lis di modifikasyon résant liyé à sa paj",
+       "tooltip-t-recentchangeslinked": "Lis dé modifikasyon résan ki lyannen ké sa paj",
        "tooltip-feed-atom": "Flux Atom pou sa paj",
        "tooltip-t-contributions": "Wè lis dé kontribisyon di {{GENDER:$1|sa itilizatò|sa itilizatris}}",
        "tooltip-t-emailuser": "Voyé roun kouryé à {{GENDER:$1|sa itilizatò|sa itilizatris}}",
        "pageinfo-title": "Enfòrmasyon pou « $1 »",
        "pageinfo-header-basic": "Enfòrmasyon di baz",
        "pageinfo-header-edits": "Listorik dé modifikasyon",
-       "pageinfo-header-restrictions": "Protèksyon di paj-a",
+       "pageinfo-header-restrictions": "Protègsyon di paj-a",
        "pageinfo-header-properties": "Propriyété di paj-a",
        "pageinfo-display-title": "Tit afiché",
        "pageinfo-default-sort": "Klé di tri pa défo",
        "pageinfo-length": "Tay di paj-a (an ògtè)",
        "pageinfo-article-id": "Niméro di paj-a",
-       "pageinfo-language": "Langaj di kontni di paj-a",
+       "pageinfo-language": "Lanng di kontni di paj-a",
        "pageinfo-content-model": "Modèl di kontni di paj-a",
        "pageinfo-robot-policy": "Endèksasyon pa robo",
        "pageinfo-robot-index": "Otorizé",
        "pageinfo-lasttime": "Dat di dannyé modifikasyon",
        "pageinfo-edits": "Nonm total di modifikasyon",
        "pageinfo-authors": "Nonm total di otò distenk",
-       "pageinfo-recent-edits": "Nonm di modifikasyon résant (annan dannyé $1)",
-       "pageinfo-recent-authors": "Nonm di otò distenk résant",
+       "pageinfo-recent-edits": "Nonm di modifikasyon résan (annan dannyé-ya $1)",
+       "pageinfo-recent-authors": "Nonm di lotò distenk résan",
        "pageinfo-magic-words": "{{PLURAL:$1|Mo majik}} ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Katégori kaché|}} ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Modèl enkli}} ($1)",
        "widthheightpage": "$1 × $2, $3 paj{{PLURAL:$3|}}",
        "file-info-size": "$1 × $2 piksèl, tay di fiché : $3, tip MIME : $4",
        "file-info-size-pages": "$1 × $2 piksèl ; tay di fiché : $3 ; tip MIME : $4 ; $5 paj{{PLURAL:$5|}}",
-       "file-nohires": "Pa di pli rot rézolisyon disponib.",
+       "file-nohires": "Pa di pli rot rézolisyon disponnib.",
        "svg-long-desc": "Fiché SVG, rézolisyon di $1 × $2 piksèl, tay : $3",
        "show-big-image": "Fiché d’orijin",
        "show-big-image-preview": "Tay di sa apèrsou : $1.",
        "exif-exposureprogram-1": "Manniyèl",
        "namespacesall": "tout",
        "monthsall": "tout",
+       "confirm-purge-title": "Prijé sa paj",
        "imgmultipagenext": "paj swivant →",
        "imgmultigo": "Aksédé !",
        "imgmultigoto": "Alé koté paj $1",
        "watchlisttools-raw": "Modifyé lis di swivi an mòd brout",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|diskisyon]])",
        "redirect": "Roudirijé pa ID di fiché, itilizatò, paj, révizyon oben journal",
-       "redirect-summary": "Sa paj èspésyal ka roudirijé bò'd roun fiché (non di fiché fourni), oun paj (ID di révizyon oben di paj fourni), oun paj di itilizatò (idantifyan nimérik di itilizatò fourni), oben roun antré di journal (ID di journal fourni). Itilizasyon : [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], oben [[{{#Special:Redirect}}/logid/186]].",
+       "redirect-summary": "Sa paj èspésyal ka roudirijé bò'd roun fiché (non di fiché fourni), oun paj (ID di révizyon oben di paj fourni), oun paj di itilizatò (idantifyan nimérik di itilizatò-a ki fourni), oben roun antré di journal (ID di journal fourni). Litilizasyon : [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], oben [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Validé",
        "redirect-lookup": "Sasé :",
        "redirect-value": "Valò :",
        "tags-active-yes": "Wi",
        "tags-active-no": "Awa",
        "tags-hitcount": "$1 modifikasyon{{PLURAL:$1|}}",
-       "logentry-delete-delete": "$1 souprimé paj-a $3",
+       "logentry-delete-delete": "$1 siprimen paj-a $3",
        "logentry-delete-restore": "$1 rèstoré paj-a $3 ($4)",
        "logentry-delete-revision": "$1 {{GENDER:$2|modifyé}} vizibilité {{PLURAL:$5|di oun révizyon|di $5 révizyon}} asou paj $3 : $4",
        "revdelete-content-hid": "kontni maské",
index d964196..4f8282a 100644 (file)
        "customcssprotected": "Non ten os permisos necesarios para modificar esta páxina de CSS, dado que contén a configuración persoal doutro usuario.",
        "customjsonprotected": "Non ten os permisos necesarios para modificar esta páxina JSON xa que contén a configuración persoal doutro usuario.",
        "customjsprotected": "Non ten os permisos necesarios para modificar esta páxina de JavaScript, dado que contén a configuración persoal doutro usuario.",
-       "sitecssprotected": "Non ten permiso para editar esta páxina CSS xa que pode afectar a tódolos visitantes",
-       "sitejsonprotected": "Non ten permiso para editar esta páxina JSON xa que pode afectar a tódolos visitantes",
-       "sitejsprotected": "Non ten permiso para editar esta páxina JavaScript xa que pode afectar a tódolos visitantes",
+       "sitecssprotected": "Non ten permiso para editar esta páxina CSS xa que isto pode afectar a tódolos visitantes.",
+       "sitejsonprotected": "Non ten permiso para editar esta páxina JSON xa que isto pode afectar a tódolos visitantes.",
+       "sitejsprotected": "Non ten permiso para editar esta páxina JavaScript xa que isto pode afectar a tódolos visitantes.",
        "mycustomcssprotected": "Non ten os permisos necesarios para editar esta páxina de CSS.",
        "mycustomjsonprotected": "Non ten permisos para editar esta páxina JSON.",
        "mycustomjsprotected": "Non ten os permisos necesarios para editar esta páxina de JavaScript.",
        "redirect-file": "Nome de ficheiro",
        "redirect-logid": "Identificador de rexistro",
        "redirect-not-exists": "Non se atopou o valor",
+       "redirect-not-numeric": "Valor non numérico",
        "fileduplicatesearch": "Procurar ficheiros duplicados",
        "fileduplicatesearch-summary": "Procurar ficheiros duplicados a partir do valor de <i>hash</i> (un mecanismo de comprobación).",
        "fileduplicatesearch-filename": "Nome do ficheiro:",
        "edit-error-long": "Erros:\n\n$1",
        "revid": "revisión $1",
        "pageid": "identificador de páxina $1",
-       "interfaceadmin-info": "$1\n\nOs permisos para editar os ficheiros CSS/JS/JSON separáronse recentemente do dereito <code>editinterface</code>. Se non comprende porqué está vendo este erro, vexa [[mw:MediaWiki_1.32/interface-admin]].",
+       "interfaceadmin-info": "$1\n\nOs permisos para editar os ficheiros CSS/JS/JSON globais separáronse recentemente do dereito <code>editinterface</code>. Se non comprende porqué está vendo este erro, vexa [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "As marcas &lt;html&gt; non poden usarse fóra das páxinas normais.",
        "gotointerwiki": "Deixando {{SITENAME}}",
        "gotointerwiki-invalid": "O título especificado non é válido.",
index 7554e12..0e4d71f 100644 (file)
        "token_suffix_mismatch": "'''Dyyni Bearbeitig isch zruckgwise wore, wel Dyy Browser Zeiche im Bearbeite-Token verstimmlet het.\nS Spichere cha dr Inhalt vu dr Syte hii mache. Des git s e mänkmol, wänn eber e anonyme Proxy-Dienscht brucht, wu Fähler macht.'''",
        "edit_form_incomplete": "'''Dr Inhalt vum Bearbeitigsformular isch nit vollständig zum Server chuu. Bitte prief Dyy Bearbeitigen uf Vollständigkeit un versuech s nomol.'''",
        "editing": "Bearbeite vo «$1»",
-       "creating": "Am Aalege vu „$1“",
+       "creating": "„$1“ aalege",
        "editingsection": "Bearbeite vo «$1» (Absatz)",
        "editingcomment": "Bearbeite vu $1 (Neje Abschnitt)",
        "editconflict": "Bearbeitigs-Konflikt: «$1»",
index fc7756e..01aa41a 100644 (file)
        "botpasswords-invalid-name": "שם המשתמש שניתן אינו מכיל את תו הפרדת סיסמאות הבוט (\"$1\").",
        "botpasswords-not-exist": "{{GENDER:$1|למשתמש|למשתמשת}} \"$1\" אין סיסמת בוט בשם \"$2\".",
        "botpasswords-needs-reset": "נדרש איפוס של סיסמת הבוט עבור הבוט \"$2\" של {{GENDER:$1|המשתמש|המשתמשת}} \"$1\".",
+       "botpasswords-locked": "אין באפשרותך להיכנס עם סיסמת בוט, כי חשבונך נעול.",
        "resetpass_forbidden": "לא ניתן לשנות סיסמאות",
        "resetpass_forbidden-reason": "לא ניתן לשנות את הסיסמאות: $1",
        "resetpass-no-info": "נדרשת כניסה לחשבון כדי לגשת לדף זה באופן ישיר.",
        "redirect-file": "שם קובץ",
        "redirect-logid": "מזהה יומן",
        "redirect-not-exists": "הערך לא נמצא",
+       "redirect-not-numeric": "הערך אינו מספרי",
        "fileduplicatesearch": "חיפוש קבצים כפולים",
        "fileduplicatesearch-summary": "חיפוש קבצים כפולים על בסיס ערכי הגיבוב שלהם.",
        "fileduplicatesearch-filename": "קובץ:",
index bce4509..9a1d234 100644 (file)
        "grouppage-user": "{{ns:project}}:Sadasya",
        "grouppage-autoconfirmed": "{{ns:project}}:Autoconfirmed sadasya",
        "grouppage-bot": "{{ns:project}}:Bots",
-       "grouppage-sysop": "{{ns:project}}:Администраторар",
+       "grouppage-sysop": "{{ns:project}}:Administrators",
        "grouppage-bureaucrat": "{{ns:project}}:Bureaucrats",
        "grouppage-suppress": "{{ns:project}}:Suppress",
        "right-read": "Panna ke parrho",
index a28d22a..c268bb4 100644 (file)
        "right-editinterface": "Uređivanje suradničkog sučelja",
        "right-editusercss": "Uređivanje CSS stranica drugih suradnika",
        "right-edituserjson": "Uređivanje JSON stranica drugih suradnika",
-       "right-edituserjs": "Uređivanje JS stranica drugih suradnika",
+       "right-edituserjs": "Uređivanje JavaScript stranica drugih suradnika",
        "right-editmyusercss": "Uređivanje vlastitih CSS stranica",
        "right-editmyuserjson": "Uređivanje vlastitih JSON stranica",
        "right-editmyuserjs": "Uređivanje vlastitih JavaScript stranica",
        "rcfilters-activefilters": "Aktivni filtri",
        "rcfilters-activefilters-hide": "Skrij",
        "rcfilters-activefilters-show": "Pokaži",
+       "rcfilters-activefilters-hide-tooltip": "Sakrij aktivne filtre",
+       "rcfilters-activefilters-show-tooltip": "Pokaži aktivne filtre",
        "rcfilters-advancedfilters": "Napredni filtri",
        "rcfilters-limit-title": "Rezultata za prikaz",
        "rcfilters-limit-and-date-label": "{{PLURAL:$1|$1 izmjena|$1 izmjene|$1 izmjena}}, $2",
        "rcfilters-preference-help": "Vraća natrag stanje prije redizajna sučelja 2017., te svih oruđa dodanih tada i poslije toga.",
        "rcfilters-watchlist-preference-label": "Sakrij poboljšanu inačicu popisa praćenja",
        "rcfilters-watchlist-preference-help": "Vraća natrag stanje prije redizajna sučelja 2017., te svih oruđa dodanih tada i poslije toga.",
+       "rcfilters-filter-showlinkedfrom-label": "Prikaži promjene na povezanim stranicama",
+       "rcfilters-filter-showlinkedfrom-option-label": "<strong>Stranice na koje se povezuje</strong> izabrana stranica",
+       "rcfilters-filter-showlinkedto-option-label": "<strong>Stranice koje povezuju</strong> na izabranu stranicu",
        "rcnotefrom": "Ispod {{PLURAL:$5|je izmjena|su izmjene}} od <strong>$3, $4</strong> (prikazano ih do <strong>$1</strong>).",
        "rclistfromreset": "Vrati na zadano izbor datuma",
        "rclistfrom": "Prikaži nove promjene počevši od $3 $2",
        "allmessagesname": "Ime",
        "allmessagesdefault": "Prvotni tekst",
        "allmessagescurrent": "Trenutačni tekst",
-       "allmessagestext": "Ovo je popis sistemskih poruka u imenskom prostoru MediaWiki. Molimo posjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizaciju MediaWikija] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti lokalizaciji MediaWiki softvera.",
+       "allmessagestext": "Ovo je popis poruka sustava u imenskom prostoru MediaWiki. Molimo posjetite [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation lokalizaciju MediaWikija] i [https://translatewiki.net translatewiki.net] ako želite doprinijeti lokalizaciji MediaWiki softvera.",
        "allmessagesnotsupportedDB": "Ova stranica ne može biti korištena jer je isključen parametar '''$wgUseDatabaseMessages'''.",
        "allmessages-filter-legend": "Filtriraj",
        "allmessages-filter": "Filtriraj prema prilagođenom obliku:",
        "exif-stripoffsets": "Položaj bloka podataka",
        "exif-rowsperstrip": "Broj redova u bloku",
        "exif-stripbytecounts": "Veličina komprimiranog bloka",
-       "exif-jpeginterchangeformat": "Udaljenost JPEG previewa od početka datoteke",
+       "exif-jpeginterchangeformat": "Udaljenost JPEG mini-pregleda od početka datoteke",
        "exif-jpeginterchangeformatlength": "Količina bajtova JPEG previewa",
        "exif-whitepoint": "Kromaticitet bijele točke",
        "exif-primarychromaticities": "Kromaticitet primarnih boja",
index b5b1137..443217d 100644 (file)
        "right-editinterface": "Wužiwarski powjerch wobdźěłać",
        "right-editusercss": "Dataje CSS druhich wužiwarjow wobdźěłać",
        "right-edituserjson": "JSON-dataje druhich wužiwarjow wobdźěłać",
-       "right-edituserjs": "Dataje JS druhich wužiwarjow wobdźěłać",
+       "right-edituserjs": "Dataje JavaScript druhich wužiwarjow wobdźěłać",
        "right-editmyusercss": "Twoje swójske wužiwarske CSS-dataje wobdźěłać",
        "right-editmyuserjson": "Swójske JSON-dataje wobdźěłać",
        "right-editmyuserjs": "Twoje swójske wužiwarske JavaScript-dataje wobdźěłać",
index 3e79a2e..6f2dac3 100644 (file)
        "right-editusercss": "más felhasználók CSS fájljainak szerkesztése",
        "right-edituserjson": "Más felhasználók JSON fájljainak szerkesztése",
        "right-edituserjs": "más felhasználók JS fájljainak szerkesztése",
+       "right-editsitecss": "CSS-lapok szerkesztése",
+       "right-editsitejson": "JSON-lapok szerkesztése",
+       "right-editsitejs": "JavaScript-lapok szerkesztése",
        "right-editmyusercss": "Saját szerkesztői CSS-fájlok szerkesztése",
        "right-editmyuserjson": "Saját szerkesztői JSON-fájlok szerkesztése",
        "right-editmyuserjs": "saját szerkesztői JavaScript-fájlok szerkesztése",
        "grant-createaccount": "fiókok létrehozása",
        "grant-createeditmovepage": "lapok létrehozása, szerkesztése és átnevezése",
        "grant-delete": "lapok, lapváltozatok és naplóbejegyzések törlése",
-       "grant-editinterface": "MediaWiki-névtér és felhasználói CSS/JSON/JavaScript szerkesztése",
+       "grant-editinterface": "MediaWiki-névtér és JSON-lapok szerkesztése",
        "grant-editmycssjs": "Felhasználói CSS-ed/JSON-od/JavaScripted szerkesztése",
        "grant-editmyoptions": "felhasználói beállításaid módosítása",
        "grant-editmywatchlist": "figyelőlista szerkesztése",
+       "grant-editsiteconfig": "CSS/JS-lapok szerkesztése",
        "grant-editpage": "létező lapok szerkesztése",
        "grant-editprotected": "védett lapok szerkesztése",
        "grant-highvolume": "nagy mennyiségű szerkesztés",
        "filehist-filesize": "Fájlméret",
        "filehist-comment": "Megjegyzés",
        "imagelinks": "Fájlhasználat",
-       "linkstoimage": "Az alábbi {{PLURAL:$1|lap hivatkozik|lapok hivatkoznak}} erre a fájlra:",
-       "linkstoimage-more": "Több mint $1 oldal hivatkozik erre a fájlra.\nA következő lista csak az {{PLURAL:$1|első linket|első $1 linket}} tartalmazza.\nA teljes lista [[Special:WhatLinksHere/$2|ezen a lapon]] található meg.",
-       "nolinkstoimage": "Erre a fájlra nem hivatkozik lap.",
+       "linkstoimage": "Az alábbi {{PLURAL:$1|lap használja|lapok használják}} ezt a fájlt:",
+       "linkstoimage-more": "Több mint $1 oldal használja ezt a fájlt.\nA következő lista csak a fájlt használó {{PLURAL:$1|első|első $1}} lapot mutatja.\nA teljes lista [[Special:WhatLinksHere/$2|ezen a lapon]] található meg.",
+       "nolinkstoimage": "Ezt a fájlt nem használja egyetlen lap sem.",
        "morelinkstoimage": "[[Special:WhatLinksHere/$1|További hivatkozások]] megtekintése",
        "linkstoimage-redirect": "$1 (fájlátirányítás) $2",
        "duplicatesoffile": "A következő {{PLURAL:$1|fájl|$1 fájl}} ennek a fájlnak a duplikátuma ([[Special:FileDuplicateSearch/$2|további részletek]]):",
        "confirm-rollback-top": "Visszavonod a változtatásokat?",
        "confirm-mcrundo-title": "Egy változtatás visszavonva",
        "mcrundofailed": "A visszavonás nem sikerült",
+       "mcrundo-missingparam": "Kötelező paraméterek hiányoznak a kérésből.",
        "ellipsis": "…",
        "quotation-marks": "„$1”",
        "imgmultipageprev": "← előző oldal",
        "edit-error-long": "Hibák:\n\n$1",
        "revid": "$1 változat",
        "pageid": "$1 lapazonosító",
+       "interfaceadmin-info": "$1\n\nA CSS/JS/JSON lapok szerkesztéséhez szükséges jogosultság a közelmúltban elválasztásra került a <code>editinterface</code> jogtól. Amennyiben nem érted, miért látod ezt az üzenetet, [[mw:MediaWiki_1.32/interface-admin|itt tudhatsz meg többet]].",
        "rawhtml-notallowed": "&lt;html&gt; címkék nem használhatók normál lapokon kívül.",
        "gotointerwiki": "{{SITENAME}} elhagyása",
        "gotointerwiki-invalid": "A megadott cím érvénytelen.",
index d6c6350..ab57a67 100644 (file)
@@ -32,7 +32,8 @@
                        "Narek",
                        "23artashes",
                        "Fitoschido",
-                       "Սահակ"
+                       "Սահակ",
+                       "ديفيد"
                ]
        },
        "tog-underline": "ընդգծել հղումները՝",
        "toolbox": "Գործիքներ",
        "tool-link-userrights": "Փոփոխել {{GENDER:$1|մասնակից}} խմբեր",
        "tool-link-userrights-readonly": "Տեսնել {{GENDER:$1|մասնակից}} խումբը",
-       "tool-link-emailuser": "Ուղարկել էլ այս նամակ {{GENDER:$1|մասնակցին}}",
+       "tool-link-emailuser": "Ուղարկել էլ. նամակ այս {{GENDER:$1|մասնակցին}}",
        "imagepage": "Դիտել նիշքի էջը",
        "mediawikipage": "Դիտել հաղորդագրության էջը",
        "templatepage": "Դիտել կաղապարի էջը",
        "emptyfile": "Ձեր բեռնած նիշքը ըստ երևույթին դատարկ է։ Հնարավոր է սա նիշքի անվանման մեջ տառասխալի հետևանք է։ Խնդրում ենք ստուգել, թե արդյոք իսկապես ուզում եք բեռնել այս նիշքը։",
        "fileexists": "Այսպիսի անվանմամբ նիշք արդեն գոյություն ունի։ Խնդրում ենք ստուգել <strong>[[:$1]]</strong>, եթե դուք համոզված չեք, որ ուզում եք այն փոխարինել։\n[[$1|thumb]]",
        "fileexists-extension": "Գոյություն ունի համանման անվանմամբ նիշք՝ [[$2|thumb]]\n* Բեռնված նիշքի անվանում՝ <strong>[[:$1]]</strong>\n* Գոյություն ունեցող նիշքի անվանում՝ <strong>[[:$2]]</strong>\nԽնդրում ենք ընտրել մեկ այլ անվանում։",
-       "fileexists-thumbnail-yes": "Õ\86Õ«Õ·Ö\84Õ¨ Õ¨Õ½Õ¿ Õ¥Ö\80Ö\87Õ¸Ö\82ÕµÕ©Õ«Õ¶ Ö\83Õ¸Ö\84Ö\80Õ¡Ö\81Õ¾Õ¡Õ® ÕºÕ¡Õ¿Õ³Õ¥Õ¶ Õ§ ''(ÕºÕ¡Õ¿Õ¯Õ¥Ö\80Õ«Õ¯)''Ö\89 [[$1|thumb]]\nÔ½Õ¶Õ¤Ö\80Õ¸Ö\82Õ´ Õ¥Õ¶Ö\84 Õ½Õ¿Õ¸Ö\82Õ£Õ¥Õ¬ <strong>[[:$1]]</strong> Õ¶Õ«Õ·Ö\84Õ¨Ö\89\nÔµÕ©Õ¥ Õ¶Õ·Õ¾Õ¡Õ® Õ¶Õ«Õ·Ö\84Õ¨ Õ¶Õ¸Ö\82ÕµÕ¶ ÕºÕ¡Õ¿Õ¯Õ¥Ö\80Õ¶ Õ§ Õ¢Õ¶Ö\85Ö\80Õ«Õ¶Õ¡Õ¯ Õ¹Õ¡Ö\83Õ¸Õ¾, Õ¡ÕºÕ¡ Õ°Õ¡Ö\80Õ¯Õ¸վոր չէ բեռնել նրա փոքրացված պատճենը։",
+       "fileexists-thumbnail-yes": "Õ\86Õ«Õ·Ö\84Õ¨ Õ¨Õ½Õ¿ Õ¥Ö\80Ö\87Õ¸Ö\82ÕµÕ©Õ«Õ¶ Ö\83Õ¸Ö\84Ö\80Õ¡Ö\81Õ¾Õ¡Õ® ÕºÕ¡Õ¿Õ³Õ¥Õ¶ Õ§ ''(ÕºÕ¡Õ¿Õ¯Õ¥Ö\80Õ«Õ¯)''Ö\89 [[$1|thumb]]\nÔ½Õ¶Õ¤Ö\80Õ¸Ö\82Õ´ Õ¥Õ¶Ö\84 Õ½Õ¿Õ¸Ö\82Õ£Õ¥Õ¬ <strong>[[:$1]]</strong> Õ¶Õ«Õ·Ö\84Õ¨Ö\89\nÔµÕ©Õ¥ Õ¶Õ·Õ¾Õ¡Õ® Õ¶Õ«Õ·Ö\84Õ¨ Õ¶Õ¸Ö\82ÕµÕ¶ ÕºÕ¡Õ¿Õ¯Õ¥Ö\80Õ¶ Õ§ Õ¢Õ¶Ö\85Ö\80Õ«Õ¶Õ¡Õ¯ Õ¹Õ¡Ö\83Õ¸Õ¾, Õ¡ÕºÕ¡ Õ°Õ¡Ö\80Õ¯Õ¡վոր չէ բեռնել նրա փոքրացված պատճենը։",
        "file-thumbnail-no": "Նիշքի անվանման սկիզբն է՝ <strong>$1</strong>։ \nՀավանաբար սա փոքրացված պատճեն է ''(պատկերիկ)''։ \nԵթե դուք այս պատկերը ամբողջական լուծաչափով ունեք, ապա խնդրում ենք բեռնել այն, հակառակ դեպքում՝ խնդրում ենք փոխել նիշքի անվանումը։",
        "fileexists-forbidden": "Այսպիսի անվանմամբ նիշք արդեն գոյություն ունի։ Խնդրում ենք հետ վերադառնալ և բեռնել նիշքը նոր անվանմամբ։ [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Այսպիսի անվանմամբ նիշք արդեն գոյություն ունի նիշքերի ընդհանուր զետեղարանում։ Խնդրում ենք հետ վերադառնալ և բեռնել նիշքը նոր անվանմամբ։ [[File:$1|thumb|center|$1]]",
        "emailuser": "էլ-նամակ ուղարկել այս մասնակցին",
        "emailuser-title-target": "Ուղարկել էլ․ նամակ {{GENDER:$1|մասնակցին}}",
        "emailuser-title-notarget": "Ուղարկել էլ․ նամակ",
-       "emailpagetext": "Ô´Õ¸Ö\82Ö\84 Õ¯Õ¡Ö\80Õ¸Õ² Õ¥Ö\84 Ö\85Õ£Õ¿Õ¡Õ£Õ¸Ö\80Õ®Õ¥Õ¬ Õ¶Õ¥Ö\80Ö\84Ö\87Õ« Õ±Ö\87Õ¨ Õ¡ÕµÕ½ {{GENDER:$1|Õ´Õ¡Õ½Õ¶Õ¡Õ¯Ö\81Õ«Õ¶}} Õ§Õ¬-Õ¶Õ¡Õ´Õ¡Õ¡Õ¯ Õ¸Ö\82Õ²Õ¡Ö\80Õ¯Õ¥Õ¬Õ¸Ö\82 Õ°Õ¡Õ´Õ¡Ö\80Ö\89\n\nÕ\81Õ¥Ö\80 Õ¶Õ¡Õ­Õ¨Õ¶Õ¿Ö\80Õ¡Õ¶Ö\84Õ¶Õ¥Ö\80Õ¸Ö\82Õ´ Õ¶Õ·Õ¾Õ¡Õ® Õ§Õ¬-Õ°Õ¡Õ½Ö\81Õ¥Õ¶ Õ¯Õ¥Ö\80Ö\87Õ¡ Â«Õ\88Ö\82Õ´Õ«Ö\81» Õ¤Õ¡Õ·Õ¿Õ¸Ö\82Õ´ Ö\87 Õ½Õ¿Õ¡Ö\81Õ¸Õ²Õ¨ Õ¯Õ¡Ö\80Õ¸Õ² Õ§ Õ¡Õ¶Õ´Õ«Õ»Õ¡ÕºÕ¥Õ½ ÕºÕ¡Õ¿Õ¡Õ½Õ­Õ¡Õ¶Õ¥Õ¬ Õ±Õ¥Õ¦Ö\89",
+       "emailpagetext": "Դուք կարող եք օգտագործել ներքևի ձևը այս {{GENDER:$1|մասնակցին}} էլ-նամակ ուղարկելու համար։\n\nՁեր նախընտրանքներում նշված էլ-հասցեն կերևա «Ումից» դաշտում և ստացողը կարող է անմիջապես պատասխանել ձեզ։",
        "defemailsubject": "{{SITENAME}} էլ-նամակ",
        "usermaildisabled": "Էլ․ նամակ ուղարկելը թույլատրված չէ։",
        "usermaildisabledtext": "Այս վիքիում չեք կարղ էլ․ նամակ ուղարկել այլ մասնակիցների",
        "emailsubject": "Թեմա.",
        "emailmessage": "Ուղերձ.",
        "emailsend": "Ուղարկել",
-       "emailccme": "Ուղարկել ինձ իմ նամակի պատճեն։",
-       "emailccsubject": "Ձեր՝ $1 մասնակցին նամակի պատճեն. $2",
+       "emailccme": "Ուղարկել ինձ իմ նամակի պատճենը։",
+       "emailccsubject": "$1 մասնակցին ուղարկված Ձեր նամակի պատճենը. $2",
        "emailsent": "Էլեկտրոնային նամակն ուղարկված է",
        "emailsenttext": "Ձեր էլ-ուղերձն ուղարկված է։",
        "usermessage-editor": "Համակարգի սուրհանդակ",
        "tooltip-feed-atom": "Այս էջի Ատոմ սնուցումը",
        "tooltip-t-contributions": "Դիտել {{GENDER:$1|այս մասնակցի}} ներդրումների ցանկը",
        "tooltip-t-emailuser": "Ուղարկել էլ․ նամակ {{GENDER:$1|այս մասնակցին}}",
+       "tooltip-t-info": "Վիճակագրական տվյալներ էջի մասին",
        "tooltip-t-upload": "Բեռնել ֆայլեր",
        "tooltip-t-specialpages": "Բոլոր սպասարկող էջերի ցանկը",
        "tooltip-t-print": "Այս էջի տպելու տարբերակ",
index e174f14..5c75650 100644 (file)
        "ns-specialprotected": "Saan a mabalin nga urnosen dagiti espesial a panid.",
        "titleprotected": "Daytoy a titulo ket nasalakniban manipud iti pannakapartuat babaen ni [[User:$1|$1]].\nTi naited a rason ket <em>$2</em>.",
        "filereadonlyerror": "Di nabaliwan ti papeles ti \"$1\" gapu ta ti repositorio ti papeles ti \"$2\" ket mabasa laeng a moda.\n\nTi administrador ti sistema a nangserra ket nangited iti daytoy a panagilawlawag: \"$3\".",
+       "invalidtitle": "Imbalido a titulo",
        "invalidtitle-knownnamespace": "Imbalido a titulo iti nagan ti espasio \"$2\" ken teksto \"$3\"",
        "invalidtitle-unknownnamespace": "Imbalido a titulo iti di ammo a nagan ti espasio a bilang $1 ken teksto \"$2\"",
        "exception-nologin": "Saan a nakastrek",
        "diff-multi-manyusers": "({{PLURAL:$1|Maysa nga agtengnga a rebision|Dagiti $1 nga agtengnga a rebision}} babaen ti ad-adu ngem $2 {{PLURAL:$2|nga agar-aramat|kadagiti agar-aramat}} ti saan a naipakita)",
        "difference-missing-revision": "{{PLURAL:$2|Maysa a rebision|$2 kadagiti rebision}} iti daytoy a paggiddiatan ($1) {{PLURAL:$2|ket ti|ket dagiti}} saan a naburikan.\n\nDaytoy ket kadawyan a gapuanan babaen ti sumaganad a nabaak a silpo ti paggiddiatan ti maysa a panid a naikkaten.\nDagiti salaysay ket mabalin a mabirukan iti [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} listaan ti panagikkat].",
        "searchresults": "Dagiti resulta ti panagbiruk",
+       "search-filter-title-prefix-reset": "Biruken amin a pampanid",
        "searchresults-title": "Dagiti resulta ti panagbiruk para iti \"$1\"",
        "titlematches": "Dagiti kapadpada a titulo ti panid",
        "textmatches": "Dagiti agpapada a teksto ti panid",
        "rcfilters-other-review-tools": "Dagiti sabali pay a pangrepaso a ramit",
        "rcfilters-group-results-by-page": "Igrupo dagiti resulta babaen ti panid",
        "rcfilters-activefilters": "Dagiti aktibo a sagat",
+       "rcfilters-activefilters-hide": "Ilemmeng",
+       "rcfilters-activefilters-show": "Ipakita",
        "rcfilters-advancedfilters": "Dagiti napasayaat a sagat",
        "rcfilters-limit-title": "Dagiti ipakita a resulta",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|a binaliwan|a binalbaliwan}}, $2",
index 0c1916f..62f1dcd 100644 (file)
        "customcssprotected": "Vu ne es permisita redaktar ita CSS pagino nam ol kontenas personal ajustaji di altra uzero.",
        "customjsonprotected": "Vu ne havas permiso por redaktar ica pagino JSON pro ke ol kontenas personal ajustaji di altra uzero.",
        "customjsprotected": "Vu ne es permisita redaktar ita JavaScript pagino nam ol kontenas personal ajustaji di altra uzero.",
+       "sitecssprotected": "Vu ne havas permiso pri redaktar ica pagino CSS pro ol povus afektor omna viziteri.",
+       "sitejsonprotected": "Vu ne povas redaktar ica JSON (JavaScript Object Notation), pro ol povas afektar omna viziteri.",
        "sitejsprotected": "Vu ne povas redaktar ica JavaScript, pro ol povas afektar omna viziteri.",
        "mycustomcssprotected": "Vu ne es permisita redaktar ita CSS pagino.",
        "mycustomjsonprotected": "Vu ne es permisita redaktar ita pagino JSON.",
        "botpasswords-label-delete": "Efacar",
        "botpasswords-label-resetpassword": "Sendez nova pasovorto per e-posto",
        "botpasswords-label-grants": "Uzebla grantaji:",
+       "botpasswords-help-grants": "Permisas aceso al yuri quin vua uzero-konto ja havas. Permisar ulo hike furnisos nula altra aceso por altra yuri quin vua konto altramaniere ne havus. Videz la [[Special:ListGrants|tabelo pri permisi]] por plusa informi.",
        "botpasswords-label-grants-column": "Permisita",
        "botpasswords-bad-appid": "La nomo \"$1\" por la bot-programo esas nevalida.",
        "botpasswords-insert-failed": "L'adjunto di nova nomo \"$1\" por la 'bot' faliis. Ka ol ja adjuntesis?",
+       "botpasswords-update-failed": "Ne povis rinomizar la 'bot' nomizita \"$1\". Kad ol efacesis?",
        "botpasswords-created-title": "Kreita pasovorto por la 'bot'",
        "botpasswords-created-body": "La pasovorto por la 'bot' nomizita \"$1\" del {{GENDER:$2|uzero}} \"$2\" kreesis.",
        "botpasswords-updated-title": "La pasovorto dil 'bot' aktualigesis",
        "botpasswords-updated-body": "La pasovorto por la 'bot' nomizita \"$1\" del {{GENDER:$2|uzero}} \"$2\" kreesis.",
        "botpasswords-deleted-title": "La pasovorto por la 'bot' efacesis",
+       "botpasswords-deleted-body": "La pasovorto por la 'bot' nomizita \"$1\" del {{GENDER:$2|uzero}} \"$2\" kreesis.",
+       "botpasswords-not-exist": "L'uzero \"$1\" ne havas pasovorto nomizita \"$2\" por lua 'bot'.",
+       "botpasswords-needs-reset": "La pasovorto por la 'bot' nomizita \"$1\" dal {{GENDER:$2|uzero}} \"$2\" mustas rikreesar.",
        "resetpass_forbidden": "La pasovorti ne povas chanjesar",
        "resetpass_forbidden-reason": "Pasovorti ne povas chanjesar: $1",
        "resetpass-no-info": "Vu mustas enirar la konto por acesar ita pagino direte.",
        "passwordreset": "Sendez nova pasovorto per e-posto",
        "passwordreset-text-one": "Garnisez ica formulario por recevar provizora pasovorto per vua e-posto.",
        "passwordreset-text-many": "{{PLURAL:$1|Skribez en un ek la texto-buxi por recevar tempala pasovorto per e-posto.}}",
+       "passwordreset-emaildisabled": "La funcioni di e-posto (e-mail) blokusesis en ica Wiki.",
        "passwordreset-username": "Uzantonomo:",
        "passwordreset-domain": "Interreto-domeno:",
        "passwordreset-email": "E-postal adreso:",
        "passwordreset-emailtitle": "Detali pri la konto en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ulu (probable vu, de la IP-adresO $1) demandis la remplaso di la pasovorto por {{SITENAME}} ($4). La sequanta {{PLURAL:$3|konto|konti}} esas asociita kun ta adreso di e-posto:\n\n$2\n\nIca tempala {{PLURAL:$3| pasovorto|pasovorti}} perdos la valideso pos {{PLURAL:$5|un dio|$5 dii}}.\nTu mustas facar 'log in' e selektar nova pasovorto nemediate. Se altra persono facis ica demando, o se vu rimemoris l'antea pasovorto e ne pluse bezonas modifikor ol, vu povas ignorar ica mesajo e durar l'uzo dil antea pasovorto.",
+       "passwordreset-emailtext-user": "Ulu (posible vu, de la IP-adreso $1) demandis la remplaso di la pasovorto por {{SITENAME}} ($4). La sequanta {{PLURAL:$3|konto|konti}} esas asociita kun ta adreso di e-posto:\n\n$2\n\nIca tempala {{PLURAL:$3| pasovorto|pasovorti}} perdos la valideso pos {{PLURAL:$5|un dio|$5 dii}}.\nTu mustas facar 'log in' e selektar nova pasovorto nemediate. Se altra persono facis ica demando, o se vu rimemoris l'antea pasovorto e ne pluse bezonas modifikor ol, vu povas ignorar ica mesajo e durar l'uzo dil antea pasovorto.",
        "passwordreset-emailelement": "Uzantonomo:\n$1\n\nProvizora pasovorto:\n$2",
        "passwordreset-emailsentemail": "Se ica e-posto esas asociita kun vua konto, do la nova pasovorto sendesos a vu per e-posto.",
+       "passwordreset-emailsentusername": "Se ica e-posto esas asociita kun vua konto, do la nova pasovorto sendesos a vu per e-posto.",
        "passwordreset-nocaller": "Ula demandero mustas furnisesar",
        "passwordreset-nosuchcaller": "La demandero ne existas: $1",
        "passwordreset-invalidemail": "Ne-valida e-posto-adreso",
        "noarticletext-nopermission": "Til nun ne existas texto en ica pagino.\nVu povas [[Special:Search/{{PAGENAME}}|serchar ica titulo]] en altra pagini, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} serchar en la relata registri], o [{{fullurl:{{FULLPAGENAME}}|action=edit}} redaktar ica pagino]</span>, tamen vu ne havas permiso por krear ica pagino.",
        "userpage-userdoesnotexist": "Uzeronomo \"$1\" ne registragesis.\nVoluntez konfirmar se vu volas krear/redaktar ica pagino.",
        "userpage-userdoesnotexist-view": "L'uzeronomo \"$1\" ne enrejistresis.",
+       "blocked-notice-logextract": "Ica uzero nun esas blokusita.\nLa lasta protokolo pri blokuso esas videbla adinfre, por refero:",
        "clearyourcache": "<strong>Atencez:</strong> Pos registragar, vu probable mustas renovigar la tempala-magazino di vua navigilo por vidar la chanji.\n* <strong>Firefox / Safari:</strong>Tenez <em>Shift</em> kliktante <em>Reload</em>, o presez sive <em>Ctrl-F5</em> sive <em>Ctrl-R</em> (<em>⌘-R</em> ye Mac);\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> en komputeri Mac)\n* <strong>Internet Explorer:</strong> Tenez <em>Ctrl</em> kliktante <em>Refresh</em>, o presez <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Irez a <em>Menu → Settings</em> (<em>Opera → Preferences</em> ye komputeri Mac) e pose a <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
+       "usercssyoucanpreview": "<strong>Sugestajo:</strong> Uzez la butono \"{{int:showpreview}}\" por probar vua nova stilo CSS ante konservar ol.",
+       "userjsonyoucanpreview": "<strong>Sugestajo:</strong> Uzes la butono \"{{int:showpreview}}\" por provar vua nova JSON ante konservar ol.",
+       "userjsyoucanpreview": "<strong>Sugestajo:</strong> Uzes la butono \"{{int:showpreview}}\" por probar vua JavaScript ante konservar ol.",
        "usercsspreview": "'''Memorez ke vu nur previdas vua uzero-CSS.'''\n'''Ol ne registragesis ankore!'''",
+       "userjsonpreview": "<strong>Memorez ke vu nur previdas vua JSON (JavaScript Object Notation). Ol ankore ne konservesis!</strong>",
        "userjspreview": "'''Memorez ke vu nur previdas vua JavaScript di uzero. Ol ne registragesis ankore!'''",
+       "sitecsspreview": "<strong>Memorez ke vu nur previdas vua uzero-CSS. Ol ankore ne konservesis!</strong>",
        "updated": "(Aktualigita)",
        "note": "'''Noto:'''",
        "previewnote": "<strong>Atencez ke ico esas nur prevido.</strong> Ol ne registragesis ankore!",
        "autosumm-blank": "Pagino vakuigesis",
        "autosumm-replace": "Kontenajo remplasigesis kun '$1'",
        "autoredircomment": "Ridirektas a [[$1]]",
+       "autosumm-changed-redirect-target": "Chanjis la ridirektilo de [[$1]] a [[$2]]",
        "autosumm-new": "Pagino kreesis kun '$1'",
        "autosumm-newblank": "Kreita vakua pagino",
        "watchlistedit-normal-title": "Modifikez surveyo-listo",
        "tag-filter": "[[Special:Tags|etiketo]] filtrilo:",
        "tag-filter-submit": "Filtrez",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etikedo|Etikedi}}]]: $2)",
+       "tag-mw-contentmodelchange": "Modifiko di la kontenajo di ula modelo",
+       "tag-mw-contentmodelchange-description": "Redakturi qui [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel modifikas la modelo di kontenajo] di ula pagino",
+       "tag-mw-new-redirect": "Nova ridirekto",
+       "tag-mw-blank-description": "Redakturi qui efacas pagini",
+       "tag-mw-replace-description": "Redakturi qui removas plua kam 90% de la kontenajo di ula pagino",
        "tags-title": "Etiketi",
+       "tags-intro": "Ica pagino montras l'etiketi qui povas uzesar dal informatik-programo por markizar ula redakturo, e lia signifiko.",
+       "tags-tag": "Nomo dil etiketo",
+       "tags-display-header": "Aspekto en chanjebla listi",
        "tags-description-header": "Kompleta deskripto dil senco",
+       "tags-hitcount-header": "Modifikuri indikita",
+       "tags-actions-header": "Agadi",
        "tags-active-yes": "Yes",
        "tags-active-no": "No",
+       "tags-source-extension": "Definita dal informatikoprogramo",
        "tags-edit": "redaktar",
        "tags-hitcount": "$1 {{PLURAL:$1|chanjo|chanji}}",
+       "tags-create-heading": "Krear nova etiketo",
        "tags-create-explanation": "Segun predefino, la nova etiketi kreita divenos disponebla por uzado, sive da uzeri, sive da informatikoprogrami 'bot'.",
        "tags-create-tag-name": "Nomo dil etiketo:",
+       "tags-create-reason": "Motivo:",
+       "tags-create-submit": "Krear",
        "tags-create-warnings-above": "La sequanta {{PLURAL:$2|avizo|avizi}} renkontresis, probante kreir l'etiketo \"$1\":",
+       "tags-delete-reason": "Motivo:",
        "tags-delete-not-found": "L'etiketo \"$1\" ne existas.",
        "tags-delete-too-many-uses": "L'etiketo \"$1\" uzesas en plua kam $2 {{PLURAL:$2|revizo|revizi}}, do ol ne povas eskartesar.",
        "tags-delete-warnings-after-delete": "L'etiketo \"$1\" efacesis, ma la sequanta {{PLURAL:$2|avizo|avizi}} renkontresis:",
+       "tags-activate-reason": "Motivo:",
        "tags-activate-not-found": "L'etiketo \"$1\" ne existas.",
+       "tags-deactivate-reason": "Motivo:",
        "tags-update-blocked": "Dum ke {{GENDER:$1|vu}} blokusabos, vu ne povos modifikar od efacar etiketi.",
+       "tags-edit-chosen-no-results": "Trovesis nula etiketo qua koincidas kun to",
+       "tags-edit-reason": "Motivo:",
        "dberr-problems": "Pardonez! Ica retopagino subisas teknikala problemi.",
        "dberr-again": "Voluntez vartar kelka minuti, e riprobez acesar ol.",
        "dberr-info": "(Ne povis acesar la datumaro: $1)",
        "sessionprovider-nocookies": "''Bisquiti'' forsan esas desacendita. Certigez ke vu acendar ''bisquiti'' e riprobez.",
        "randomrootpage": "Hazarda radikopagino",
        "log-action-filter-delete": "Tipo di efacado:",
+       "log-action-filter-contentmodel-change": "Modifiko di la kontenajo di ula modelo",
        "log-action-filter-suppress-reblock": "User suppression by reblock"
 }
index f7e8441..0216ef2 100644 (file)
        "confirm-unwatch-top": "Rimuovere questa pagina dalla tua lista degli osservati speciali?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Ripristinare le modifiche di questa pagina?",
+       "confirm-mcrrestore-title": "Ripristina una versione",
        "confirm-mcrundo-title": "Annulla una modifica",
        "mcrundofailed": "Annullamento fallito",
        "mcrundo-missingparam": "Parametri obbligatori mancanti nella richiesta.",
        "redirect-file": "Nome del file",
        "redirect-logid": "ID registro",
        "redirect-not-exists": "Valore non trovato",
+       "redirect-not-numeric": "Valore non numerico",
        "fileduplicatesearch": "Ricerca dei file duplicati",
        "fileduplicatesearch-summary": "Ricerca di eventuali duplicati del file in base al valore di ''hash''.",
        "fileduplicatesearch-filename": "Nome del file:",
index b0b566c..b5091b2 100644 (file)
@@ -92,7 +92,9 @@
                        "Yusuke1109",
                        "Afaz",
                        "Oxbqskeptzwizkgdcxakhnrb",
-                       "Suyama"
+                       "Suyama",
+                       "고솜",
+                       "Wat"
                ]
        },
        "tog-underline": "リンクの下線:",
        "botpasswords-invalid-name": "指定された利用者名には、ボット用パスワードの区切りである「$1」 が含まれていません。",
        "botpasswords-not-exist": "利用者「$1」はボット「$2」のパスワードを所持していません。",
        "botpasswords-needs-reset": "{{GENDER:$1|利用者}}「$1」のボット名「$2」のためのパスワードはリセットする必要があります。",
+       "botpasswords-locked": "アカウントがロックされているため、bot用パスワードではログインできません。",
        "resetpass_forbidden": "パスワードは変更できません",
        "resetpass_forbidden-reason": "パスワードは変更できません: $1",
        "resetpass-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
        "apisandbox-dynamic-parameters-add-label": "引数の追加",
        "apisandbox-dynamic-parameters-add-placeholder": "引数名",
        "apisandbox-dynamic-error-exists": "引数名 \"$1\" は既に存在しています。",
+       "apisandbox-templated-parameter-reason": "この[[Special:ApiHelp/main#main/templatedparams|テンプレートパラメータ]]は、$2の{{PLURAL:$1|値}}に基づいて提供されます。",
        "apisandbox-deprecated-parameters": "廃止予定の引数",
        "apisandbox-fetch-token": "トークンを自動入力します",
        "apisandbox-add-multi": "追加",
        "redirect-file": "ファイル名",
        "redirect-logid": "記録 ID",
        "redirect-not-exists": "値が見つかりません",
+       "redirect-not-numeric": "値が数字ではありません",
        "fileduplicatesearch": "重複ファイルの検索",
        "fileduplicatesearch-summary": "重複ファイルをハッシュ値に基づいて検索します。",
        "fileduplicatesearch-filename": "ファイル名:",
        "logentry-managetags-deactivate": "$1 がタグ \"$4\" の利用者およびボットによる使用を{{GENDER:$2|無効化しました}}。",
        "log-name-tag": "タグ記録",
        "log-description-tag": "このページには、個々の版または記録項目から、いつ利用者が[[Special:Tags|タグ]]を追加または削除したかが記録されます。編集、削除、または同様の操作の一部として発生したタグ付けは記録には表示されません。",
-       "logentry-tag-update-add-revision": "$1 がページ $3 の版 $4 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
-       "logentry-tag-update-add-logentry": "$1 がページ $3 の記録項目 $5 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
+       "logentry-tag-update-add-revision": "$1 がページ「$3」の版 $4 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
+       "logentry-tag-update-add-logentry": "$1 がページ「$3」の記録項目 $5 に{{PLURAL:$7|タグ}} $6 を{{GENDER:$2|追加しました}}",
        "logentry-tag-update-remove-revision": "$1 がページ $3 の版 $4 から{{PLURAL:$9|タグ}} $8 を{{GENDER:$2|除去しました}}",
-       "logentry-tag-update-remove-logentry": "$1 がページ $3 の記録項目 $5 から{{PLURAL:$9|タグ}} $8 を{{GENDER:$2|除去しました}}",
+       "logentry-tag-update-remove-logentry": "$1 がページ「$3」の記録項目 $5 から{{PLURAL:$9|タグ}} $8 を{{GENDER:$2|除去しました}}",
        "logentry-tag-update-revision": "$1 がページ「$3」の版 $4 のタグを{{GENDER:$2|更新しました}} ($6 を{{PLURAL:$7|追加}}、$8 を{{PLURAL:$9|削除}})",
        "logentry-tag-update-logentry": "$1 がページ「$3」の記録項目 $5 のタグを{{GENDER:$2|更新しました}} ($6 を{{PLURAL:$7|追加}}、$8 を{{PLURAL:$9|削除}})",
        "rightsnone": "(なし)",
        "limitreport-expensivefunctioncount-value": "$1/$2",
        "limitreport-unstrip-depth": "\"unstrip\" を再帰的に実行する回数",
        "limitreport-unstrip-depth-value": "$1/$2",
+       "limitreport-unstrip-size": "展開後読み込み量を解除する",
        "limitreport-unstrip-size-value": "$1/$2 {{PLURAL:$2|バイト}}",
        "expandtemplates": "テンプレートを展開",
        "expand_templates_intro": "この特別ページは、入力したウィキテキストに含まれるすべてのテンプレートを再帰的に展開します。\n<code><nowiki>{{</nowiki>#language:…}}</code> のようなパーサー関数や、\n<code><nowiki>{{</nowiki>CURRENTDAY}}</code> のような変数も展開します。\nつまり、二重中括弧で囲まれたものほぼすべてを展開します。",
        "edit-error-long": "エラー:\n\n\n\n$1",
        "revid": "版 $1",
        "pageid": "ページID $1",
-       "interfaceadmin-info": "$1\n\nã\82µã\82¤ã\83\88å\85¨ä½\93ã\81®CSS/JavaScriptã\81®ç·¨é\9b\86権é\99\90ã\81¯ã\80\81æ\9c\80è¿\91<code>editinterface</code> æ¨©é\99\90ã\81\8bã\82\89å\88\86é\9b¢ã\81\95ã\82\8cã\81¾ã\81\97ã\81\9fã\80\82ã\81ªã\81\9cã\81\93ã\81®ã\82¨ã\83©ã\83¼ã\81\8c表示ã\81\95ã\82\8cã\82\8bのかわからない場合は、[[mw:MediaWiki_1.32/interface-admin]]をご覧ください。",
+       "interfaceadmin-info": "$1\n\nã\82µã\82¤ã\83\88å\85¨ä½\93ã\81®CSS/JavaScriptã\81®ç·¨é\9b\86権é\99\90ã\81¯ã\80\81æ\9c\80è¿\91<code>editinterface</code> æ¨©é\99\90ã\81\8bã\82\89å\88\86é\9b¢ã\81\95ã\82\8cã\81¾ã\81\97ã\81\9fã\80\82ã\81ªã\81\9cã\81\93ã\81®ã\82¨ã\83©ã\83¼ã\81\8c表示ã\81\95ã\82\8cã\81\9fのかわからない場合は、[[mw:MediaWiki_1.32/interface-admin]]をご覧ください。",
        "rawhtml-notallowed": "&lt;html&gt;タグは通常ページ以外では使用できません。",
        "gotointerwiki": "{{SITENAME}}を離れる",
        "gotointerwiki-invalid": "指定したページは無効です。",
        "undelete-cantedit": "このページを編集する許可がないため復元できません。",
        "undelete-cantcreate": "同名のページが存在せず、このページを作成する許可がないため復元できません。",
        "pagedata-title": "ページ・データ",
+       "pagedata-text": "このページは、ページへのデータインターフェースを提供します。サブページの構文を使用して、URLにページタイトルを入力してください。\n* コンテンツのネゴシエーションは、クライアントのAcceptヘッダーに基づいて適用されます。つまり、ページデータはクライアントが優先する形式で提供されます。",
        "pagedata-not-acceptable": "該当する形式が見つかりません。対応している MIME タイプ: $1",
        "pagedata-bad-title": "「$1」は無効なページ名です。",
        "unregistered-user-config": "セキュリティ上の理由から、JavaScript、CSSおよびJSONの利用者サブページは、登録されていない利用者に対しては読み込みできません。",
        "passwordpolicies-policy-passwordcannotmatchusername": "パスワードは利用者名と同じにすることはできません",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "パスワードは、特にブラックリストに載っているものと一致するものは設定できません",
        "passwordpolicies-policy-maximalpasswordlength": "パスワードは$1{{PLURAL:$1|文字}}以下でなければなりません",
-       "passwordpolicies-policy-passwordcannotbepopular": "パスワードは{{PLURAL:$1|一般的なものにすることはできません|一般的な$1個のパスワードのリストと一致するものにすることはできません}}"
+       "passwordpolicies-policy-passwordcannotbepopular": "パスワードは{{PLURAL:$1|一般的なものにすることはできません|一般的な$1個のパスワードのリストと一致するものにすることはできません}}",
+       "easydeflate-invaliddeflate": "提供されたコンテンツが適切に圧縮されていません"
 }
index 083fd5f..1591257 100644 (file)
@@ -26,7 +26,7 @@
        "tog-hidepatrolled": "Dhelikaké besutan ingawasan saka owah-owahan pungkasan",
        "tog-newpageshidepatrolled": "Dhelikaké kaca ingawasan saka pratélaning kaca anyar",
        "tog-hidecategorization": "Dhelikaké gegebengan kaca",
-       "tog-extendwatchlist": "Ambakaké pawawangan nedya nuduhaké kabèh owahan, ora mung sing paling anyar",
+       "tog-extendwatchlist": "Ambakaké pawawangan nedya nuduhaké kabèh owahan, ora mung kang paling anyar",
        "tog-usenewrc": "Golongaké owah-owahan miturut kaca ing owah-owahan anyar lan pawawangan",
        "tog-numberheadings": "Wènèhi angkaning sesirah kanthi otomatis",
        "tog-showtoolbar": "Tuduhaké wilah piranti sarana besut",
        "tog-watchmoves": "Wuwuh kaca lan barkas lih-lihanku menyang pawawanganku",
        "tog-watchdeletion": "Wuwuh kaca lan barkas busakanku menyang pawawanganku",
        "tog-watchuploads": "Wuwuh barkas anyar unggahanku menyang pawawanganku",
-       "tog-watchrollback": "Wuwuh kaca sing takpulihaké menyang pawawanganku",
+       "tog-watchrollback": "Wuwuh kaca kang dakpulihaké menyang pawawanganku",
        "tog-minordefault": "Tengeri kabèh besutan minangka besutan cilik sacara baku",
        "tog-previewontop": "Deleng pratuduh sadurungé mbesut kothak",
        "tog-previewonfirst": "Delelng pratuduh nalika mbesut pisanan",
-       "tog-enotifwatchlistpages": "Kirimi aku layang-èl yèn ana kaca utawa barkas ing pawawanganku sing diowahi",
-       "tog-enotifusertalkpages": "Kirimi aku layang-èl yèn kaca parembuganku ana sing ngowahi",
+       "tog-enotifwatchlistpages": "Kirimi aku layang-èl yèn ana kaca utawa barkas ing pawawanganku kang diowahi",
+       "tog-enotifusertalkpages": "Kirimi aku layang-èl yèn kaca parembuganku ana kang ngowahi",
        "tog-enotifminoredits": "Uga kirimi aku layang-èl yèn ana besutan cilik ing kaca lan barkas",
        "tog-enotifrevealaddr": "Tuduhaké alamat layang-èlku ing layang wara-wara",
-       "tog-shownumberswatching": "Tuduhaké cacah wong sing ngawasi",
-       "tog-oldsig": "Tapak asmané panjenengan sing ana:",
+       "tog-shownumberswatching": "Tuduhaké cacah wong kang ngawasi",
+       "tog-oldsig": "Tapak asmané panjenengan kang cumepak:",
        "tog-fancysig": "Cakaké tapak asma minangka tèks wiki (tanpa pranala otomatis)",
        "tog-uselivepreview": "Tuduhaké pratuduh tanpa ngamot ulang kacané",
        "tog-forceeditsummary": "Kandhani aku manawa kothak ringkesané besutan isih kosong",
        "tog-watchlisthideown": "Dhelikaké besutanku saka pawawangan",
        "tog-watchlisthidebots": "Dhelikaké besutan bot saka pangawasan",
        "tog-watchlisthideminor": "Dhelikaké besutan cilik saka pawawangan",
-       "tog-watchlisthideliu": "Dhelikaké besutané wong sing mlebu log saka pawawangan",
+       "tog-watchlisthideliu": "Dhelikaké besutané wong kang mlebu log saka pawawangan",
        "tog-watchlistreloadautomatically": "Mot manèh pawawangan kanthi otomanis samangsa panyaring diowah (butuh JavaScript)",
        "tog-watchlisthideanons": "Dhelikaké saka pawawangan besutaning para anonim",
        "tog-watchlisthidepatrolled": "Dhelikaké besutan ingawasan saka pawawangan",
        "tog-watchlisthidecategorization": "Dhelikaké kategorisasi kaca",
-       "tog-ccmeonemails": "Kirimi aku turunan layang-èl sing takkirim menyang wong liya",
+       "tog-ccmeonemails": "Kirimi aku turunan layang-èl kang dakkirim menyang wong liya",
        "tog-diffonly": "Aja tuduhaké isiné kaca sangisoré bédané besutan",
-       "tog-showhiddencats": "Tuduhaké kategori sing didhelikaké",
+       "tog-showhiddencats": "Tuduhaké kategori kang ndhelik",
        "tog-norollbackdiff": "Aja tuduhaké béda sawisé ngayahi bebalèn",
        "tog-useeditwarning": "Élingaké kula yèn ninggal kaca besutan sadurungé nyimpen",
-       "tog-prefershttps": "Tansah nganggo sambungan sing aman nalika mlebu log",
+       "tog-prefershttps": "Tansah nganggo sambungan kang aman nalika mlebu log",
        "underline-always": "Tansah",
        "underline-never": "Ora tau",
        "underline-default": "Ules utawa pangluru gawan",
        "category-subcat-count": "{{PLURAL:$2|Kategori iki mung ngandhut saanak kategori ngisor iki.|Kategori iki ngandhut {{PLURAL:$1|anak kategori|$1 anak kategori}} ngisor iki saka gunggung $2 anak kategori.}}",
        "category-subcat-count-limited": "Kategori iki duwé {{PLURAL:$1|anak kategori|$1 anak kategori}} kaya ngisor iki.",
        "category-article-count": "{{PLURAL:$2|Kategori iki mung ngandhut kaca ngisor iki.|{{PLURAL:$1|Kaca|$1 kaca}} ngisor iki ana ing kategori iki saka gunggung $2 kaca.}}",
-       "category-article-count-limited": "Kategori iki ngandhut {{PLURAL:$1|kaca|$1 kaca}} sing kapacak ing ngisor iki.",
+       "category-article-count-limited": "Kategori iki ngemu {{PLURAL:$1|kaca|$1 kaca}} kang kapacak ing isor iki.",
        "category-file-count": "{{PLURAL:$2|Kategori iki mung isi barkas iki.|{{PLURAL:$1|Barkas|$1 barkas}} iki ana sajeroning kategori iki saka $2 gunggungé.}}",
-       "category-file-count-limited": "Kategori iki duwé {{PLURAL:$1|barkas|$1 barkas}} sing kapacak ing ngisor iki.",
+       "category-file-count-limited": "Kategori iki duwé {{PLURAL:$1|barkas|$1 barkas}} kang kapacak ing isor iki.",
        "listingcontinuesabbrev": "samb.",
        "index-category": "Kaca kaindhèks",
        "noindex-category": "Kaca ora kaindhèks",
        "broken-file-category": "Kaca mawa pranala barkas rusak",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "Bab",
        "article": "Kaca isi",
        "newwindow": "(buka mawa jendhéla anyar)",
        "tagline": "Saka {{SITENAME}}",
        "help": "Pitulung",
        "search": "Golèk",
-       "search-ignored-headings": " #<!-- lirwakaké waé larik iki kaya asliné --> <pre>\n# Sesirah sing bakal dilirwakaké déning golèkan.\n# Owahan tumrap iki bakal katon nalika sesirahé wis diindhèks.\n# Panjenengan bisa meksa ngindhèks ulang kaca kanthi ngayahi besutan kosong.\n# Sintaksisé kaya mangkéné:\n#   * Samubarang saka karakter \"#\" tumeka pungkasané larik iku minangka tanggepan.\n#   * Saben larik sing ora kosong iku sesirah sing kudu dilirwakaké lan samubarangé.\nRujukan\nPranala njaba\nUga delengen\n #</pre> <!-- lirwakaké waé larik iki kaya asliné -->",
+       "search-ignored-headings": " #<!-- lirwakaké waé larik iki kaya asliné --> <pre>\n# Sesirah kang bakal dilirwakaké déning golèkan.\n# Owahan tumrap iki bakal katon nalika sesirahé wis diindhèks.\n# Panjenengan bisa meksa ngindhèks ulang kaca kanthi ngayahi besutan kosong.\n# Sintaksisé kaya mangkéné:\n#   * Samubarang saka karakter \"#\" tumeka pungkasané larik iku minangka tanggepan.\n#   * Saben larik kang ora kosong iku sesirah kang kudu dilirwakaké lan samubarangé.\nRujukan\nPranala njaba\nUga delengen\n #</pre> <!-- lirwakaké baé larik iki kaya asliné -->",
        "searchbutton": "Golèk",
        "go": "Menyang",
        "searcharticle": "Menyang",
        "jumpto": "Jujug:",
        "jumptonavigation": "navigasi",
        "jumptosearch": "golèk",
-       "view-pool-error": "Nyuwun ngapuro, peladèn lagi sibuk wektu iki.\nKakèhan panganggo sing nyoba mbukak kaca iki.\nEntèni sedhéla sadurungé nyoba ngaksès kaca iki manèh .\n\n$1",
-       "generic-pool-error": "Ngapunten, paladèné lagi kabotan momotan.\nPanganggo akèh sing péngin ndeleng sumber iki.\nEntènana sadhéla sadurungé panjenengan marani sumber iki manèh.",
-       "pool-timeout": "Kelangkung wekdal nengga kunci",
+       "view-pool-error": "Nyuwun ngapura, peladèn lagi sibuk wektu iki.\nKakèhan panganggo kang nyoba mbukak kaca iki.\nEntèni sedhéla sadurungé nyoba ngaksès kaca iki manèh .\n\n$1",
+       "generic-pool-error": "Ngapunten, paladèné lagi kabotan momotan.\nPanganggo akèh kang péngin ndeleng sumber iki.\nEntènana sadhéla sadurungé panjenengan marani sumber iki manèh.",
+       "pool-timeout": "Kaladuk suwé anggoné ngentèni gembok",
        "pool-queuefull": "Kempalan antrian kebak",
        "pool-errorunknown": "Kalepata ingkang mboten dipun mangertosi",
        "poolcounter-usage-error": "Masalah pangguna: $1",
        "privacy": "Niti privasi",
        "privacypage": "Project:Niti privasi",
        "badaccess": "Aksès ora olèh",
-       "badaccess-group0": "Panjenengan ora pareng nglakokaké tindhakan sing panjenengan gayuh.",
-       "badaccess-groups": "Tumindak sing panjenengan péngini winates marang panganggo ing {{PLURAL:$2|golongan|golongan}}: $1.",
+       "badaccess-group0": "Panjenengan ora pareng nglakokaké tindhakan kang panjenengan gayuh.",
+       "badaccess-groups": "Laku kang panjenengan karsakaké mung kanggo panganggo ing {{PLURAL:$2|golongan|golongan}}: $1.",
        "versionrequired": "Dibutuhaké MediaWiki vèrsi $1",
        "versionrequiredtext": "MediaWiki vèrsi $1 dibutuhaké kanggo nggunakaké kaca iki. Mangga mirsani [[Special:Version|kaca iki]]",
        "ok": "Oké",
+       "pagetitle": "$1 - {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Dijupuk saka \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|Panjenengan duwé}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Panjenengan duwé}} $1 saka {{PLURAL:$3|panganggo liya|$3 panganggo}} ($2).",
        "confirmable-no": "Ora",
        "thisisdeleted": "Deleng utawa pulihaké $1?",
        "viewdeleted": "Deleng $1?",
-       "restorelink": "$1 {{PLURAL:$1|besutan}} sing wis dibusak",
+       "restorelink": "$1 besutan kang wis binusek",
        "feedlinks": "Asupan:",
        "feed-invalid": "Tipe permintaan asupan ora bener.",
        "feed-unavailable": "Umpan sindikasi (''syndication feeds'') ora kasedyakaké",
        "site-atom-feed": "Lebon atom $1",
        "page-rss-feed": "\"$1\" ''RSS Feed''",
        "page-atom-feed": "Pakan atom \"$1\"",
+       "feed-atom": "Atom",
        "red-link-title": "$1 (kaca ora ana)",
        "sort-descending": "Urutaké medhun",
        "sort-ascending": "Urutaké munggah",
        "nstab-help": "Kaca pitulung",
        "nstab-category": "Kategori",
        "mainpage-nstab": "Tepas",
-       "nosuchaction": "Ora ana tumindak mangkono",
-       "nosuchactiontext": "Tumindak sing dikarepaké déning URL ora trep.\nPanjenengan bokmanawa salah ngetik URL-é, utawa salah nurut pranala.\nIki bokmanawa uga nuduhaké yèn ana ama ing piranti alus sing dianggo déning {{SITENAME}}.",
+       "nosuchaction": "Ora ana laku mangkono",
+       "nosuchactiontext": "Laku kang dikarepaké URL ora trep.\nPanjenengan bokmanawa salah nulis URL-é, utawa salah mènèhi pranala.\nIki bokmanawa uga nuduhaké yèn ana ama ing piranti alus kang dianggo {{SITENAME}}.",
        "nosuchspecialpage": "Ora ana kaca mirunggan mangkono",
-       "nospecialpagetext": "<strong>Panjenengan nyuwun kaca mirunggan sing ora sah.</strong>\n\nPratélan kaca mirunggan sing sah bisa tinemu ing [[Special:SpecialPages|{{int:specialpages}}]].",
+       "nospecialpagetext": "<strong>Panjenengan nyuwun kaca mirunggan kang ora trep.</strong>\n\nPratélan kaca mirunggan kang trep bisa tinemu ing [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Masalah",
        "databaseerror": "Masalah sasana dhata",
-       "databaseerror-text": "Ana kerusakan ing basis data (query error).\n\nMungkin ana masalah ing software-e.",
-       "databaseerror-textcl": "Ana kerusakan ing basis data (query error).",
-       "databaseerror-query": "Query: $1",
-       "databaseerror-function": "Function: $1",
+       "databaseerror-text": "Ana masalah ing kuwèri basis dhatah.\nBokmanawa iki nuduhaké yèn ana ama ing piranti alusé.",
+       "databaseerror-textcl": "Ana masalah kuwèri basis dhatah.",
+       "databaseerror-query": "Kuwèri: $1",
+       "databaseerror-function": "Fungsi: $1",
        "databaseerror-error": "Masalah: $1",
-       "laggedslavemode": "Pènget: Kaca iki mbokmenawa isiné dudu pangowahan pungkasan.",
+       "laggedslavemode": "Pènget: Kaca iki bokmanawa isiné dudu pangowahan pungkasan.",
        "readonly": "Umpak data kagembok",
        "enterlockreason": "Isi alesan ngreksa, kalebu rencana kapan pareksané bakal dibukak",
-       "readonlytext": "Juru administrasi sistem sing ngunci iku medhar mangkéné: $1",
-       "missing-article": "Basis data ora bisa nemokaké tèks kaca sing kuduné ana, yaiku \"$1\" $2.\nBab iki bisasané disebabaké déning pranala daluwarsa menyang revisi sadurungé kaca sing wis dibusak.\nYèn dudu iki panyebabé, panjenengan manawa bisa nemokaké kasalahan (''bug'') jroning piranti alus (''software''). Mangga dilapuraké bab iki menyang [[Special:ListUsers/sysop|administrator]], kanthi nyebutaké alamat URL sing dituju",
+       "readonlytext": "Juru administrasi sistem kang ngunci iku medhar mangkéné: $1",
+       "missing-article": "Basis dhatahé ora bisa nemu tulisan ing siji kaca kang kuduné ana, ya iku \"$1\" $2.\n\nMasalah iki sok ana amarga panjenengan ngeklik pranala sajarah kang lawas ing kaca kang wis kabusek.\n\nManawa ora amarga iku, panjenengan bokmanawa nemu ama ing piranti alusé.\nSumangga lapuraké ama mau menyang [[Special:ListUsers/sysop|pangurus]], kanthi nulisaké URL-é.",
        "missingarticle-rev": "(owahan#: $1)",
        "missingarticle-diff": "(Béda: $1, $2)",
        "readonly_lag": "Database wis dikunci mawa otomatis sawetara database sékundhèr lagi nglakoni sinkronisasi mawa database utama",
        "internalerror": "Masalah njero",
        "internalerror_info": "Masalah njero: $1",
-       "filecopyerror": "Ora bisa nulad berkas \"$1\" menyang \"$2\".",
+       "filecopyerror": "Ora bisa nurun barkas \"$1\" dadi \"$2\".",
        "filerenameerror": "Ora bisa ngowahi saka \"$1\" dadi \"$2\".",
-       "filedeleteerror": "Ora bisa mbusak berkas \"$1\".",
+       "filedeleteerror": "Ora bisa mbusek barkas \"$1\".",
        "directorycreateerror": "Ora bisa nggawé dirèktori \"$1\".",
        "directoryreadonlyerror": "Pérangan \"$1\" mung kena diwaca.",
        "directorynotreadableerror": "Pérangan \"$1\" ora kena diwaca.",
-       "filenotfound": "Ora bisa nemokaké berkas \"$1\".",
+       "filenotfound": "Ora bisa nemu barkas \"$1\".",
        "unexpected": "Biji (''nilai'') ing njabaning jangkauan: \"$1\"=\"$2\".",
        "formerror": "Masalah: Ora bisa ngirim formulir",
-       "badarticleerror": "Tumindak iki ora bisa diayahi ing kaca iki.",
-       "cannotdelete": "Kaca utawa berkas \"$1\" ora bisa dibusak.\nManawa wis dibusak déning wong liya.",
-       "cannotdelete-title": "Ora bisa mbusak kaca \"$1\"",
+       "badarticleerror": "Laku iki ora bisa kalakokaké ing kaca iki.",
+       "cannotdelete": "Kaca utawa barkas \"$1\" ora bisa panjenengan busak.\nBokmanawa kaca utawa barkasé wis dibusek wong liya.",
+       "cannotdelete-title": "Ora bisa mbusek kaca \"$1\"",
        "delete-hook-aborted": "Pambusakan dibatalaké déning ''hook''.\nOra ana alesané.",
        "no-null-revision": "Ora isa nggawe revisi 'null' anyar kanggo kaca \"$1\"",
        "badtitle": "Sesirah ala",
-       "badtitletext": "Sesirahing kaca sing disuwun ora trep, kosong, utawa salah nggayut menyang sesirah antarabasa utawa antarawiki.\nMungkin tulisané ngandhut pralambang cacah siji utawa luwih sing ora kena dianggo tumraping sesirah.",
-       "title-invalid-empty": "Sesirah kaca sing dikarepaké kosong utawa mung ngemu jenengé mandala-aran.",
-       "title-invalid-utf8": "Sesirah kaca sing dikarepaké ngemu reroncèn UTF-8 sing ora sah.",
-       "title-invalid-interwiki": "Sesirah kaca sing dikarepaké ngemu pranala interwiki sing ora bisa dicakaké dadi sesirah",
+       "badtitletext": "Sesirah kaca kang panjenengan suwun ora trep, kosong, utawa salah nggayut menyang sesirah antarabasa utawa antarawiki.\nTulisané bokmanawa ngemu karakter kang ora kena kaanggo ing sesirah.",
+       "title-invalid-empty": "Sesirah kaca kang panjenengan karsakaké kosong utawa mung ngemu jenengé mandala aran.",
+       "title-invalid-utf8": "Sesirah kaca kang panjenengan karsakaké ngemu reroncèn UTF-8 kang ora trep.",
+       "title-invalid-interwiki": "Sesirah kaca kang panjenengan karsakaké ngemu pranala interwiki kang ora bisa katrapaké ing sesirah.",
        "title-invalid-talk-namespace": "Sesirah kaca kang dikarepaké ngener ing kaca parembugan kang ora ana.",
-       "title-invalid-characters": "Sesirah kaca sing dikarepaké ngemu karakter sing ora sah: \"$1\".",
+       "title-invalid-characters": "Sesirah kaca kang panjenengan karsakaké ngemu karakter kang ora trep: \"$1\".",
        "title-invalid-relative": "Sesirah ngemu alamat rélatif. Sesirah kaca relatif (./, ../) iku ora sah amarga ora bisa ditekani lumantar pangluru.",
-       "title-invalid-magic-tilde": "Sesirah kaca sing dikarepaké ngemu reroncèn tilda (<nowiki>~~~</nowiki>) sing ora sah.",
-       "title-invalid-too-long": "Sesirah kaca sing dikarepaké kedawan. Kuduné ora munjuli $1 bèt sarana kodhé UTF-8.",
-       "title-invalid-leading-colon": "Sesirah kaca sing dikarepaké ngemu titik loro sing ora sah ing ngarepé.",
+       "title-invalid-magic-tilde": "Sesirah kaca kang panjenengan karsakaké ngemu reroncèn tildhe (<nowiki>~~~</nowiki>) kang ora trep.",
+       "title-invalid-too-long": "Sesirah kaca kang panjenengan karsakaké kedawan. Sesirahé ora kena munjuli {{PLURAL:$1|bèt|bèt}} ing pangodhe UTF-8.",
+       "title-invalid-leading-colon": "Sesirah kaca kang panjenengan karsakaké ngemu titik loro kang ora trep ing arepé.",
        "perfcached": "Dhata ing ngisor iki kasimpen ing telih lan mungkin durung dianyari. Paling akèh ana {{PLURAL:$1|sakasil|$1 kasil}} ing telih iku.",
        "perfcachedts": "Dhata ing ngisor iki kasimpen ing telih, lan pungkasan dianyari $1. Paling akèh ana {{PLURAL:$4|sakasil|$4 kasil}} ing telih iku.",
-       "querypage-no-updates": "Update saka kaca iki lagi dipatèni. Data sing ana ing kéné saiki ora bisa bakal dibalèni unggah manèh.",
+       "querypage-no-updates": "Update saka kaca iki lagi dipatèni. Data kang ana ing kéné saiki ora bisa bakal dibalèni unggah manèh.",
        "viewsource": "Deleng sumber",
        "viewsource-title": "Deleng sumberé $1",
        "actionthrottled": "Tindakan diwatesi",
-       "actionthrottledtext": "Minangka upaya lumawan tumindak salah-guna, panjenengan diwatesi nalika ngayahi iki ping bola-bali tur rikat, lan panjenengan wis munjuli watesané.\nMangga jajalen manèh mengko.",
+       "actionthrottledtext": "Minangka upaya nglawan laku salah-guna, panjenengan ora bisa nglakokaké iki ping bola-bali ing dalem waktu sadhéla, lan panjenengan wis munjuli watesané.\nSumangga jajal manèh mengko.",
        "protectedpagetext": "Kaca iki wis direksa supaya ora dibesut lan diapa-apakaké.",
        "viewsourcetext": "Panjenengan bisa ndeleng lan nurun sumberé kaca iki.",
        "viewyourtext": "Panjenengan bisa ndeleng lan nurun sumberé <strong>besutané panjenengan</strong> menyang kaca iki.",
-       "protectedinterface": "Kaca iki isiné tèks antarmuka sing dienggo software lan wis dikunci kanggo menghindari kasalahan.",
-       "editinginterface": "<strong>Pélik:</strong> Panjenengan lagi mbesut kaca sing kanggo ngisèni tèks mukantarané piranti alus.\nOwahan tumrap kaca iki bakal mrabawani cakriké mukantarané panganggo liya ing wiki iki.",
+       "protectedinterface": "Kaca iki isiné tèks antarmuka kang dienggo software lan wis dikunci kanggo menghindari kasalahan.",
+       "editinginterface": "<strong>Pepéling:</strong> Panjenengan lagi mbesut kaca kang ngemu tulisan kanggo mukantarané piranti alus.\nNgowahi kaca iki bakal mrabawani cakrik mukantarané panganggo liya ing wiki iki.",
        "translateinterface": "Saperlu nambah utawa ngowah pertalan tumrap kabèh wiki, mangga anggoa [https://translatewiki.net/ translatewiki.net] minangka proyèk panglokaling MediaWiki.",
-       "cascadeprotected": "Kaca iki wis direksa saka besutan amarga katransklusi ing {{PLURAL:$1|kaca, sing|kaca-kaca, sing}} kareksa mawa pilihan \"runut\" murub:\n$2",
+       "cascadeprotected": "Kaca iki wis direksa saka besutan amarga katransklusi ing {{PLURAL:$1|kaca|kaca-kaca}} kang kareksa mawa pilihan \"runut\" murub:\n$2",
        "namespaceprotected": "Panjenengan ora duwé idin kanggo mbesut kaca ing mandala aran <strong>$1</strong>.",
        "customcssprotected": "Panjenengan ora diidinaké mbesut kaca CSS iki amarga isiné setèlan pribadhi panganggo liyané.",
        "customjsprotected": "Panjenengan ora diidinaké mbesut kaca JavaScript iki amarga isiné setèlan pribadhi panganggo liyané.",
        "mypreferencesprotected": "Sampèyan ora duwé idin kanggo ngowah preferensi sampèyan.",
        "ns-specialprotected": "Kaca mirunggan ora bisa dibesut.",
        "titleprotected": "Irah-irahan iki direksa ora olèh digawé déning [[User:$1|$1]].\nAlesané yaiku <em>$2</em>.",
-       "filereadonlyerror": "Ora bisa ndandani barkas \"$1\" amarga panyimpenan barkas \"$2\" mung bisa diwaca.\n\nPangurus sistem sing ngunci iku njlèntrèhaké: \"$3\".",
+       "filereadonlyerror": "Ora bisa ndandani barkas \"$1\" amarga panyimpenan barkas \"$2\" mung bisa diwaca.\n\nPangurus sistem kang ngunci iku njlèntrèhaké: \"$3\".",
+       "invalidtitle": "Sesirah ora trep",
        "invalidtitle-knownnamespace": "Irah-irahan ora sah mawa bilik jeneng \"$2\" lan tèks \"$3\"",
-       "invalidtitle-unknownnamespace": "Judhul ora sah mawa angka $1 lan tèks \"$2\" bilik jeneng sing ora dingertèni",
+       "invalidtitle-unknownnamespace": "Judhul ora trep mawa angka $1 lan tèks \"$2\" bilik jeneng kang ora dingertèni",
        "exception-nologin": "Durung mlebu log",
-       "exception-nologin-text": "Mangga mlebua log supaya bisa ngaksès kaca utawa tumindak iki.",
+       "exception-nologin-text": "Sumangga panjenengan mlebu log supaya bisa ngaksès kaca utawa laku iki.",
        "exception-nologin-text-manual": "Tulung $1 kanggo ngakses kaca utawa kelakon iki.",
        "virus-badscanner": "Kasalahan konfigurasi: pamindai virus ora dikenal: ''$1''",
        "virus-scanfailed": "''Pemindaian'' utawa ''scan'' gagal (kode $1)",
        "virus-unknownscanner": "antivirus buhbuhan:",
-       "logouttext": "<strong>Panjenengan wis metu log.</strong>\n\nTulung gatèkaké yèn sawenèh kaca bokmanawa bakal isih katon kaya déné yèn panjenengan isih mlebu log, kajaba panjenengan mbusak ''cache'' pangluruné panjenengan.",
+       "logouttext": "<strong>Panjenengan wis metu log.</strong>\n\nTulung gatèkaké yèn sawenèh kaca bokmanawa bakal isih katon kaya déné yèn panjenengan isih mlebu log, kajaba panjenengan mbusek telih pangluruné panjenengan.",
        "cannotlogoutnow-title": "Ora bisa metu saiki",
-       "cannotlogoutnow-text": "Metu ora mungkin menawa nganggo $1.",
+       "cannotlogoutnow-text": "Mokal metu log nalika nganggo $1.",
        "welcomeuser": "Sugeng Rawuh, $1!",
        "welcomecreation-msg": "Akun panjenengan wis kacipta. Aja lali nata konfigurasi [[Special:Preferences|preferensi {{SITENAME}}]] panjenengan.",
        "yourname": "Jeneng panganggo:",
        "userlogin-resetpassword-link": "Lali tembung wadiné panjenengan?",
        "userlogin-helplink2": "Tulungi mlebu log",
        "userlogin-loggedin": "Panjenengan wis mlebu log minangka {{GENDER:$1|$1}}.\nAnggonen formulir ngisor iki saperlu mlebu log minangka panganggo liya.",
+       "userlogin-reauth": "Panjenengan kudu mlebu log manèh saperlu vèrifikasi yèn panjenengan bener {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Gawé akun liya",
        "createacct-emailrequired": "Alamat layang-èl",
        "createacct-emailoptional": "Alamat layang-èl (manasuka)",
        "createacct-email-ph": "Isi layang-èl panjenengan",
        "createacct-another-email-ph": "Isi alamat layang-èl",
-       "createaccountmail": "Nganggo tembung wadi sauntara sing dikirimaké menyang alamat layang-èl",
+       "createaccountmail": "Nganggo tembung wadi sauntara kang dikirimaké menyang alamat layang-èl",
+       "createaccountmail-help": "Bisa kanggo nggawèkaké wong liya akun tanpa ngurusi tembung wadiné.",
        "createacct-realname": "Jeneng asli (manasuka)",
        "createacct-reason": "Alesan",
        "createacct-reason-ph": "Alesané panjenengan nggawé akun liya",
+       "createacct-reason-help": "Layang kang kapacak ing log gawéan akun",
        "createacct-submit": "Gawé akun panjenengan",
        "createacct-another-submit": "Gawé akun",
        "createacct-continue-submit": "Banjuraké gawé akun",
        "createacct-benefit-heading": "{{SITENAME}} digawé déning wong-wong kaya panjenengan.",
        "createacct-benefit-body1": "{{PLURAL:$1|besutan}}",
        "createacct-benefit-body2": "{{PLURAL:$1|kaca}}",
-       "createacct-benefit-body3": "{{PLURAL:$1|sing nyumbang}} mentas waé",
-       "badretype": "Tembung wadi sing panjenengan isèkaké ora gathuk.",
+       "createacct-benefit-body3": "{{PLURAL:$1|kang nyumbang}} mentas waé",
+       "badretype": "Tembung wadi kang panjenengan isèkaké ora gathuk.",
        "usernameinprogress": "Panggawéning akun tumrap jeneng panganggo iki tembé lumaku.\nEntèni sadhéla.",
-       "userexists": "Jeneng panganggo sing dilebokaké lagi dianggo.\nMangga pilih jeneng liya.",
+       "userexists": "Jeneng panganggo kang dilebokaké lagi dianggo.\nMangga pilih jeneng liya.",
        "loginerror": "Masalah mlebu log",
        "createacct-error": "Masalah panggawé akun",
        "createaccounterror": "Ora bisa gawé akun: $1",
-       "nocookiesnew": "Akun panganggoné wis digawé, nanging panjenengan durung mlebu log.\n{{SITENAME}} nganggo kuki kanggo nglebokaké panganggo ing log.\nÉwadéné, kukiné panjenengan dipatèni.\nMangga urubaké iku, banjur mlebua log kanthi nganggo jeneng panganggo lan tembung wadiné panjenengan sing anyar.",
+       "nocookiesnew": "Akun panganggoné wis digawé, nanging panjenengan durung mlebu log.\n{{SITENAME}} nganggo kuki kanggo nglebokaké panganggo ing log.\nÉwadéné, kukiné panjenengan dipatèni.\nMangga urubaké iku, banjur mlebua log kanthi nganggo jeneng panganggo lan tembung wadiné panjenengan kang anyar.",
        "nocookieslogin": "{{SITENAME}} nggunakaké ''cookies'' kanggo log panganggoné. ''Cookies'' ing panjlajah wèb panjenengan dipatèni. Mangga ngaktifaké manèh lan coba manèh.",
        "nocookiesfornew": "Akun panganggoné wurung digawé amarga awak dhéwé ora bisa mesthèkaké sumberé.\nPesthèkaké panjenengan wis ngurubaké kuki, banjur ambalana ngamot kaca iki lan njajalana manèh.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
        "createacct-loginerror": "Akuné wis kasil digawe nanging panjenengan ora bisa otomatis mlebu log. Mangga [[Special:UserLogin|mlebua log kanthi manual]].",
-       "noname": "Panjenengan durung awèh jeneng panganggo sing trep.",
+       "noname": "Panjenengan durung awèh jeneng panganggo kang trep.",
        "loginsuccesstitle": "Kasil mlebu log",
        "loginsuccess": "<strong>Panjenengan saiki wis mlebu log ing {{SITENAME}} minangka \"$1\".</strong>",
        "nosuchuser": "Ora ana panganggo kanthi jeneng \"$1\".\nJeneng panganggo iku sènsitif tumrap gedhé-ciliké huruf.\nJajan priksanen éjaané panjenengan, utawa [[Special:CreateAccount|gawénen akun anyar]].",
        "wrongpasswordempty": "Tembung wadi kosong.\nJajalen manèh.",
        "passwordtooshort": "Tembung sesinglon paling sethithik cacahé {{PLURAL:$1|1 aksara|$1 aksara}}.",
        "passwordtoolong": "Tembung wadi ora kena munjuli {{PLURAL:$1|1 pralambang|$1 pralambang}}.",
-       "passwordtoopopular": "Tembung wadi sing wis kaprah ora kena dianggo. Mangga pilih tembung wadi liya sing mbédani.",
+       "passwordtoopopular": "Tembung wadi kang wis kaprah ora kena dianggo. Mangga pilih tembung wadi liya kang mbédani.",
        "password-name-match": "Tembung wadiné panjenengan kudu béda saka jeneng panganggoné panjenengan.",
        "password-login-forbidden": "Panganggoning jeneng panganggo lan tembung wadi iki dilarang.",
        "mailmypassword": "Balèni gawé tembung wadi",
        "passwordremindertitle": "Tembung wadi sauntara kanggo {{SITENAME}}",
-       "passwordremindertext": "Ana wong (mbokmanawa panjenengan dhéwé, saka alamat IP $1) nyuwun supaya dikirimi tembung wadi anyar kanggo {{SITENAME}} ($4). Tembung wadi sawetara kanggo panganggo \"$2\" wis digawé lan saiki \"$3\". Yèn panjenengan pancèn nggayuh iki, mangga énggal mlebu log lan ngganti tembung wadi saiki.\nTembung wadi sawetara mau bakal kadaluwarsa ing {{PLURAL:$5|sadina|$5 dina}}.\nYèn wong liya sing nglakoni panyuwunan iki, utawa panjenengan éling tembung wadi panjenengan, lan ora kepéngin ngowahi, panjenengan ora usah nggubris pesen iki lan bisa tetep nganggo tembung wadi lawas.",
-       "noemail": "Ora ana alamat layang-èl sing kacathet tumrap ing panganggo \"$1\".",
-       "noemailcreate": "Panjenengan kudu maringi alamat e-mail sing absah",
+       "passwordremindertext": "Ana wong (mbokmanawa panjenengan dhéwé, saka alamat IP $1) nyuwun supaya dikirimi tembung wadi anyar kanggo {{SITENAME}} ($4). Tembung wadi sawetara kanggo panganggo \"$2\" wis digawé lan saiki \"$3\". Yèn panjenengan pancèn nggayuh iki, mangga énggal mlebu log lan ngganti tembung wadi saiki.\nTembung wadi sawetara mau bakal kadaluwarsa ing {{PLURAL:$5|sadina|$5 dina}}.\nYèn wong liya kang nglakoni panyuwunan iki, utawa panjenengan éling tembung wadi panjenengan, lan ora kepéngin ngowahi, panjenengan ora usah nggubris pesen iki lan bisa tetep nganggo tembung wadi lawas.",
+       "noemail": "Ora ana alamat layang-èl kang kacathet tumrap ing panganggo \"$1\".",
+       "noemailcreate": "Panjenengan kudu maringi alamat e-mail kang trep",
        "passwordsent": "Tembung sandi anyar wis dikirim menyang alamat layang èlèktronik tumrap \"$1\". \nMangga mlebu log manèh sawisé panjenengan nampa iku.",
-       "blocked-mailpassword": "Alamat IP-né panjenengan diblokir saka mbesut. Kanggo ngéndhani tumindak salah-guna, ora diparengaké nganggo pamulihan tembung wadi saka alamat IP iki.",
-       "eauthentsent": "Layang-èl konfirmasi wis dikirim menyang alamat layang-èl sing diisèkaké. Sadurungé ana layang-èl liyané sing dikirim menyang akun iku, panjenengan kudu nuruti arahan ana ing layang-èl iku saperlu ngonfirmasi yèn akun iku pancèn duwèké panjenengan.",
-       "throttled-mailpassword": "Layang kanggo mbalèkaké tembung wadi wis dikirim sasuwené ing {{PLURAL:$1|jam|$1 jam}}.\nKanggo nyegah ananing tumindhak culika, namung sak layang kanggo mbalèkaké tembung wadi sing bakal dikirim sasuwéné ing {{PLURAL:$1|jam|$1 jam}}.",
+       "blocked-mailpassword": "Alamat IP-né panjenengan kablokir saka mbesut. Kanggo ngéndhani laku salah-guna, ora kena nganggo pamulih tembung wadi saka alamat IP iki.",
+       "eauthentsent": "Layang-èl konfirmasi wis dikirim menyang alamat layang-èl kang diisèkaké. Sadurungé ana layang-èl liyané kang dikirim menyang akun iku, panjenengan kudu nuruti arahan ana ing layang-èl iku saperlu ngonfirmasi yèn akun iku pancèn duwèké panjenengan.",
+       "throttled-mailpassword": "Layang kanggo mbalèkaké tembung wadi wis dikirim sasuwené ing {{PLURAL:$1|jam|$1 jam}}.\nKanggo nyegah ananing tumindhak culika, namung sak layang kanggo mbalèkaké tembung wadi kang bakal dikirim sasuwéné ing {{PLURAL:$1|jam|$1 jam}}.",
        "mailerror": "Masalah pangirim layang: $1",
-       "acct_creation_throttle_hit": "Para neneka menyang wiki iki sing nganggo alamat IP-né panjenengan wis gawé {{PLURAL:$1|akun cacah 1|akun cacah $1}} sajeroné $2 pungkasan, sing cacahé nyandhak cacah maksimum sing diidinaké.\nTemahané, para neneka sing nganggo alamat IP iki ora bisa gawé akun manèh sauntara iki.",
+       "acct_creation_throttle_hit": "Para neneka menyang wiki iki kang nganggo alamat IP-né panjenengan wis gawé {{PLURAL:$1|akun cacah 1|akun cacah $1}} sajeroné $2 pungkasan, kang cacahé nyandhak cacah maksimum kang diidinaké.\nTemahané, para neneka kang nganggo alamat IP iki ora bisa gawé akun manèh sauntara iki.",
        "emailauthenticated": "Alamat layang-èlé panjenengan wis dikonfirmasi ing tanggal $2 pukul $3.",
        "emailnotauthenticated": "Alamat layang-èlé panjenengan durung dikonfirmasi.\nLayang-èl ora bakal dikirim yèn gegayutan karo fitur-fitur iki.",
        "noemailprefs": "Panjenengan kudu milih alamat e-mail supaya bisa nganggo fitur iki.",
        "emailconfirmlink": "Ndhedhes (konfirmasi) alamat e-mail panjenengan",
-       "invalidemailaddress": "Alamat e-mail iki ora bisa ditampa amarga formaté ora bener. Tulung lebokna alamat mawa format sing bener utawa kosongaké waé isèn kasebut.",
+       "invalidemailaddress": "Alamat e-mail iki ora bisa ditampa amarga formaté ora bener. Tulung lebokna alamat mawa format kang bener utawa kosongaké waé isèn mau.",
        "cannotchangeemail": "Alamat layang-èl akun ora bisa diowah ing wiki iki.",
        "emaildisabled": "Situs iki ora bisa ngirim layang èlèktronik.",
        "accountcreated": "Akun wis kagawé",
        "accountcreatedtext": "Akun panganggo [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|rembug]]) wis digawé.",
        "createaccount-title": "Gawé akun kanggo {{SITENAME}}",
-       "createaccount-text": "Ana sing nggawé akun nganggo alamat layang-èlé panjenengan ing {{SITENAME}} ($4) kanthi aran \"$2\", mawa tembung wadi \"$3\".\nPanjenengan kudu mlebu log lan ngowahi tembung wadiné panjenengan saiki.\n\nPanjenengan kena nglirwakaké layang iki, manawa akun iki digawé awit kaluputan.",
+       "createaccount-text": "Ana kang nggawé akun nganggo alamat layang-èlé panjenengan ing {{SITENAME}} ($4) kanthi aran \"$2\", mawa tembung wadi \"$3\".\nPanjenengan kudu mlebu log lan ngowahi tembung wadiné panjenengan saiki.\n\nPanjenengan kena nglirwakaké layang iki, manawa akun iki ginawé awit kaluputan.",
        "login-throttled": "Panjenengan wis ping akèh njajal mlebu log.\nTulung nunggu dhisik $1 sadurungé njajal manèh.",
        "login-abort-generic": "Panjenengan ora bisa mlebu log - Kawurungan",
        "login-migrated-generic": "Akuné panjenengan wis dimigrasi, lan jeneng panganggoné wis ora ana manèh ing wiki iki.",
        "botpasswords": "Tembung wadi bot",
        "botpasswords-disabled": "Tembung wadiné bot dipatèni.",
        "botpasswords-no-central-id": "Saperlu nganggo tembung wadiné bot, panjenengan kudu mlebu log menyang akun séntral.",
-       "botpasswords-existing": "Tembung wadiné bot sing cumepak",
+       "botpasswords-existing": "Tembung wadiné bot kang cumepak",
        "botpasswords-createnew": "Gawé anyar tembung wadiné bot",
-       "botpasswords-editexisting": "Besut tembung wadiné bot sing anyar",
+       "botpasswords-editexisting": "Besut tembung wadiné bot kang anyar",
+       "botpasswords-label-needsreset": "(tembung wadi kudu panjenengan ambali setèl)",
        "botpasswords-label-appid": "Jeneng bot:",
        "botpasswords-label-create": "Gawé",
        "botpasswords-label-update": "Anyari",
        "resetpass-no-info": "Panjenengan kudu mlebu log saperlu langsung ngaksès kaca iki.",
        "resetpass-submit-loggedin": "Ganti tembung wadi",
        "resetpass-submit-cancel": "Wurung",
-       "resetpass-wrong-oldpass": "Tembung wadi saiki utawa sauntara ora trep.\nPanjengen bokmanawa wis ngganti tembung wadiné panjenengan utawa nyuwun tembung wadi sauntara sing anyar.",
+       "resetpass-wrong-oldpass": "Tembung wadi saiki utawa sauntara ora trep.\nPanjengen bokmanawa wis ngganti tembung wadiné panjenengan utawa nyuwun tembung wadi sauntara kang anyar.",
        "resetpass-temp-password": "Tembung wadi sauntara:",
        "resetpass-abort-generic": "Ngowahi tembung wadi kawurungaké déning èkstènsi.",
        "passwordreset": "Balèni gawé tembung wadi",
        "passwordreset-disabled": "Setèl ulang tembung wadi dipatèni ing wiki iki.",
        "passwordreset-emaildisabled": "Fitur layang elektronik wis dipateni ing wiki iki.",
        "passwordreset-username": "Jeneng panganggo:",
-       "passwordreset-domain": "Domain:",
+       "passwordreset-domain": "Dhomain:",
        "passwordreset-email": "Alamat layang-èl:",
        "passwordreset-emailtitle": "Rerincèné akun ing {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Ana wong (bokmanawa panjenengan, saka alamat IP $1) nyuwun tembung wadiné panjenengan disetèl ulang mungguh ing {{SITENAME}} ($4). {{PLURAL:$3|Akun}} ing ngisor iki ana gayutané karo layang-èl iki:\n\n$2\n\n{{PLURAL:$3|Tembung wadi sauntara iki}} bakal kadaluwarsa sawisé {{PLURAL:$5|sadina|$5 dina}}.\nPanjenengan kudu mlebu log lan milih tembung wadi anyar saiki. Yèn wong liya sing nyuwun iki, utawa yèn panjenengan pranyata wis kèlingan tembung wadiné panjenengan sing lawas banjur panjenengan ora nedya ngganti, panjenengan bisa nglirwakaké layang iki lan mbanjuraké nganggo tembung wadiné panjenengan sing lawas.",
-       "passwordreset-emailtext-user": "Panganggo $1 saka {{SITENAME}} nyuwun ganti tembung wadi panjenengan ana ing {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} ngisor iki magepokan karo alamat layang-èl iki:\n\n$2\n\n{{PLURAL:$3|Tembung-wadi-sauntara}} iki bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.\npanjenengan kudu mlebu log lan milih siji tembung wadi anyar saiki. Yèn wong liya sing njaluk iki, utawa yèn panjenengan jebul wis kèlingan tembung wadi sing lawas saéngga ora ana niyat kanggo ngganti, panjenengan bisa ngejaraké wara-wara iki lan bacutaké nganggo tembung wadi lawas panjenengan.",
+       "passwordreset-emailtext-ip": "Ana wong (bokmanawa panjenengan, saka alamat IP $1) nyuwun tembung wadiné panjenengan disetèl ulang mungguh ing {{SITENAME}} ($4). {{PLURAL:$3|Akun}} ing ngisor iki ana gayutané karo layang-èl iki:\n\n$2\n\n{{PLURAL:$3|Tembung wadi sauntara iki}} bakal kadaluwarsa sawisé {{PLURAL:$5|sadina|$5 dina}}.\nPanjenengan kudu mlebu log lan milih tembung wadi anyar saiki. Yèn wong liya kang nyuwun iki, utawa yèn panjenengan pranyata wis kèlingan tembung wadiné panjenengan kang lawas banjur panjenengan ora nedya ngganti, panjenengan bisa nglirwakaké layang iki lan mbanjuraké nganggo tembung wadiné panjenengan kang lawas.",
+       "passwordreset-emailtext-user": "Panganggo $1 saka {{SITENAME}} nyuwun ganti tembung wadi panjenengan ana ing {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} ngisor iki magepokan karo alamat layang-èl iki:\n\n$2\n\n{{PLURAL:$3|Tembung-wadi-sauntara}} iki bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.\npanjenengan kudu mlebu log lan milih siji tembung wadi anyar saiki. Yèn wong liya kang njaluk iki, utawa yèn panjenengan jebul wis kèlingan tembung wadi kang lawas saéngga ora ana niyat kanggo ngganti, panjenengan bisa ngejaraké wara-wara iki lan bacutaké nganggo tembung wadi lawas panjenengan.",
        "passwordreset-emailelement": "Jeneng panganggo: \n$1\n\nTembung wadi sauntara: \n$2",
-       "passwordreset-emailsentemail": "Yèn layang èlèktronik iki nggayut akuning sampéyan, layang kanggo salin tembung wadi bakal dikirim.",
-       "passwordreset-emailsentusername": "Manawa ana alamat layang-èl sing ana gayutané karo jeneng panganggo iki, layang-èl kanggo nyetèl ulang tembung wadi bakal dikirim.",
+       "passwordreset-emailsentemail": "Yèn layang èlèktronik iki nggayut akun panjenengan, layang kanggo salin tembung wadi bakal dikirim.",
+       "passwordreset-emailsentusername": "Manawa ana alamat layang-èl kang ana gayutané karo jeneng panganggo iki, layang-èl kanggo nyetèl ulang tembung wadi bakal dikirim.",
        "changeemail": "Owah utawa busak alamat layang-èl",
        "changeemail-header": "Isi formulir iki saperlu salin alamat layang-èl panjenengan. Manawa panjenengan péngin ngilangi gegayutané alamat layang-èl saka akuné panjenengan, kosongaké waé babagan layang-èl anyar nalika ngirim formuliré.",
-       "changeemail-no-info": "Sampéyan kudu mlebu log kanggo ngaksès kaca iki langsung.",
+       "changeemail-no-info": "Panjenengan kudu mlebu log kanggo ngaksès kaca iki langsung.",
        "changeemail-oldemail": "Alamat layang-èl saiki:",
        "changeemail-newemail": "Alamat layang-èl anyar:",
        "changeemail-none": "(ora ana)",
        "changeemail-password": "Sandi {{SITENAME}} panjenengan:",
        "changeemail-submit": "Ganti layang-èl",
-       "changeemail-nochange": "Mangga isi mawa alamat layang-èl sing anyar tur béda.",
+       "changeemail-nochange": "Mangga isi mawa alamat layang-èl kang anyar tur béda.",
        "resettokens": "Reset token",
        "resettokens-text": "Anda dapat me-reset Token yang memungkinkan akses ke data pribadi tertentu yang terkait dengan akun Anda di sini.\n\nAnda harus melakukannya jika Anda secara tidak sengaja berbagi dengan seseorang atau jika akun Anda telah disusupi.",
-       "resettokens-no-tokens": "Ora ana token sing bisa direset.",
+       "resettokens-no-tokens": "Ora ana token kang bisa direset.",
        "resettokens-tokens": "Token:",
        "resettokens-token-label": "$1 (biji saiki: $2)",
-       "resettokens-watchlist-token": "Token kangge sindikasi web (Atom/RSS) saking [[Special:Watchlist|pangowahan ing daptar pangawasan sampeyan]]",
+       "resettokens-watchlist-token": "Token kangge sindikasi web (Atom/RSS) saking [[Special:Watchlist|pangowahan ing pawawangané panjenengan]]",
        "resettokens-done": "Reset token.",
-       "resettokens-resetbutton": "Reset token sing dipilih",
+       "resettokens-resetbutton": "Reset token kang dipilih",
        "bold_sample": "Tulisan kandel",
        "bold_tip": "Tulisan kandel",
        "italic_sample": "Tulisan dhoyong",
        "savechanges": "Simpen owahan",
        "publishpage": "Babar kaca",
        "publishchanges": "Babar owahan",
+       "savearticle-start": "Simpen kaca...",
+       "savechanges-start": "Simpen owahan...",
+       "publishpage-start": "Babar kaca...",
        "publishchanges-start": "Babar owahan...",
        "preview": "Pratuduh",
        "showpreview": "Deleng pratuduh",
        "missingsummary": "<strong>Pangéling-éling:</strong> Panjenengan ora ngisèni ringkesané besutan.\nManawa panjenengan mencèt \"$1\" manèh, besutané panjengan bakal kasimpen tanpa katerangan.",
        "selfredirect": "<strong>Pepéling:</strong> Panjenengan ngalih kaca iki menyang kaca iki dhéwé.\nPanjenengan mungkin salah wènèh paraning alihan utawa salah mbesut kaca.\nYèn panjenengan ngeklik \"$1\" manèh, kaca alihan bakal digawé.",
        "missingcommenttext": "Mangga awèh tanggepan.",
-       "missingcommentheader": "'''Pangéling:''' Sampéyan durung nyadhiyakaké judhul/jejer kanggo tanggepan iki.\nYèn Sampéyan klik \"$1\" manèh, suntingan Sampéyan bakal kasimpen tanpa kuwi.",
+       "missingcommentheader": "<strong>Pangéling-éling:</strong> Panjenengan durung mènèhi subyèk tumrap tanggapan iki.\nManawa panjenengan ngeklik \"$1\" manèh, besutané panjenengan bakal kasimpen tanpa subyèk.",
        "summary-preview": "Pratuduh ringkesan besutan:",
        "subject-preview": "Pratuduh jejer:",
        "previewerrortext": "Ana masalah nalika njajal mratuduhaké owahané panjenengan.",
        "blockedtitle": "Panganggo kapalangan",
-       "blockedtext": "<b>Asma panganggo utawa alamat IP panjenengan diblokir.</b>\n\nBlokir iki sing nglakoni $1.\nAlesané <i>$2</i>.\n\n* Diblokir wiwit: $8\n* Kadaluwarsa pemblokiran ing: $6\n* Sing arep diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké prakara iki.\n\nPanjenengan ora bisa nggunakaké fitur 'Kirim layang é-mail panganggo iki' kejaba panjenengan wis nglebokaké alamat é-mail sing sah ing [[Special:Preferences|prèferènsi]] panjenengan.\n\nAlamat IP panjenengan iku $3, lan ID pamblokiran iku #$5.\nTulung kabèh informasi ing ndhuwur iki disertakaké ing saben pitakon panjenengan.",
-       "autoblockedtext": "Alamat IP-né panjenangan wis otomatis diblokir amarga dienggo déning panganggo liyané, sing diblokir déning $1.\n\n:<em>$2</em>\n\n* Wiwit diblokir: $8\n* Rampung diblokir: $6\n* Sing diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus]] liyané kanggo ngrembug blokirané.\n\nPanjenengan ora bisa nganggo fitur \"kirim layang-èl panganggo iki\" kajaba panjenengan wis ndhaftaraké alamat layang-èl sing trep ing [[Special:Preferences|pilalan panganggoné]] panjenengan lan panjenengan durung tau diblokir nalika nganggo iku.\n\nAlamat IP-né panjenengan sing saiki ya iku $3, lan ID blokirané ya iku $5. \nMangga wuwuhen kabèh rerincèn ing ndhuwur sajeroné samubarang pitakoné panjenengan.",
-       "blockednoreason": "ora ana alesan sing diwènèhaké",
+       "blockedtext": "<b>Asma panganggo utawa alamat IP panjenengan diblokir.</b>\n\nBlokir iki kang nglakoni $1.\nAlesané <i>$2</i>.\n\n* Diblokir wiwit: $8\n* Kadaluwarsa pemblokiran ing: $6\n* Kang arep diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus liyané]] kanggo ngomongaké prakara iki.\n\nPanjenengan ora bisa nggunakaké fitur 'Kirim layang é-mail panganggo iki' kejaba panjenengan wis nglebokaké alamat é-mail kang trep ing [[Special:Preferences|prèferènsi]] panjenengan.\n\nAlamat IP panjenengan iku $3, lan ID pamblokiran iku #$5.\nTulung kabèh informasi ing ndhuwur iki disertakaké ing saben pitakon panjenengan.",
+       "autoblockedtext": "Alamat IP-né panjenangan wis otomatis diblokir amarga dienggo déning panganggo liyané, kang diblokir déning $1.\n\n:<em>$2</em>\n\n* Wiwit diblokir: $8\n* Rampung diblokir: $6\n* Kang diblokir: $7\n\nPanjenengan bisa ngubungi $1 utawa [[{{MediaWiki:Grouppage-sysop}}|pangurus]] liyané kanggo ngrembug blokirané.\n\nPanjenengan ora bisa nganggo fitur \"kirim layang-èl panganggo iki\" kajaba panjenengan wis ndhaftaraké alamat layang-èl kang trep ing [[Special:Preferences|pilalan panganggoné]] panjenengan lan panjenengan durung tau diblokir nalika nganggo iku.\n\nAlamat IP-né panjenengan kang saiki ya iku $3, lan ID blokirané ya iku $5. \nMangga wuwuhen kabèh rerincèn ing ndhuwur sajeroné samubarang pitakoné panjenengan.",
+       "blockednoreason": "ora ana alesan kang diwènèhaké",
        "whitelistedittext": "Mangga $1 dhisik yèn arep mbesut kaca.",
-       "confirmedittext": "Panjenengan kudu ndhedhes alamat e-mail dhisik sadurungé pareng nyunting sawijining kaca. Mangga nglebokaké lan validasi alamat e-mail panjenengan sadurungé nglakoni panyuntingan. Alamat e-mail sawisé bisa diowahi liwat [[Special:Preferences|kaca préférènsi]]",
+       "confirmedittext": "Panjenengan kudu ndhedhes alamat e-mail dhisik sadurungé pareng mbesut kaca. Mangga nglebokaké lan validasi alamat e-mail panjenengan sadurungé nggawé besutan. Alamat e-mail sawisé bisa diowahi liwat [[Special:Preferences|kaca préférènsi]]",
        "nosuchsectiontitle": "Pérangan ora katemu",
-       "nosuchsectiontext": "Panjenengan nyoba nyunting sawijining bagéan sing ora ana.\nBagéan iki manawa wis dipindhah utawa dibusak nalika panjenengan buka.",
+       "nosuchsectiontext": "Panjenengan njajal mbesut pérangan kang ora ana.\nPérangan iki bokmanawa wis ingalihaké utawa binusek nalika panjenengan bukak.",
        "loginreqtitle": "Kudu mlebu log",
        "loginreqlink": "mlebu log",
        "loginreqpagetext": "Panjenengan kudu $1 kanggo bisa mirsani kaca liyané.",
        "accmailtitle": "Tembung sandi wis kinirim",
        "accmailtext": "Tembung sandi sembarang kanggo [[User talk:$1|$1]] wis dikirim menyang $2.\n\nTembung sandi iki bisa diganti ing kaca <em>[[Special:ChangePassword|salin tembung sandi]]</em> sawisé mlebu log.",
        "newarticle": "(Anyar)",
-       "newarticletext": "Panjenengan ngetuti pranala sing durung ana.\nKanggo nggawé kaca, gagéa ngetik ing kothak ngisor iki (deleng [$1 kaca pitulung] ngenani katerangané).\nManawa panjenengan tekan kéné awit ora sengaja, kliken tumbul <strong>balik</strong> ana ing pangluruné panjenengan.",
-       "anontalkpagetext": "----\n<em>Iki kaca parembugané panganggo anonim sing durung gawé akun, utawa sing ora nganggo akuné.</em>\nMula, awak dhéwé kudu nganggo alamat IP-né awujud angka kanggo nglacak dhèwèké.\nAlamat IP mangkono bisa dianggo déning sawenèh panganggo.\nManawa panjenengan panganggo anonim lan rumasa yèn ana tanggepan sing ora ilok dieneraké marang panjenengan, mangga [[Special:CreateAccount|gawéa akun]] utawa [[Special:UserLogin|mlebua log]] kanggo ngéndhani salah pangira karo panganggo anonim liyané ing tembé buri.",
-       "noarticletext": "Saiki kaca iki durung ana tulisané.\nPanjenengan bisa (1) [[Special:Search/{{PAGENAME}}|nggolèki sesirahing kaca iki]] ing kaca liyané, (2)\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nggolèki log sing magepokan],\nutawa (3) [{{fullurl:{{FULLPAGENAME}}|action=edit}} nggawé kaca iki]</span>.",
-       "noarticletext-nopermission": "Saiki lagi ora ana tèks ing kaca iki. \nPanjenengan bisa [[Special:Search/{{PAGENAME}}|nggolèk sesirah kaca iki]] ing kaca liyané, \nutawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{urlencode:{{FULLPAGENAME}}}}}} nggolèk ing log sing gegayutan]</span>, nanging panjenengan ora kawogan nggawé kaca iki.",
-       "missing-revision": "Révisi #$1 saka kaca ajeneng \"{{FULLPAGENAME}}\" ora ana.\n\nIki biyasané kasababaké awit nututi pranala sajarah sing wis lawas saka sawijiné kaca sing wis dibusak.\nRerincèné bisa digolèki ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
+       "newarticletext": "Panjenengan ngetuti pranala kang durung ana.\nKanggo nggawé kaca, gagéa ngetik ing kothak ngisor iki (deleng [$1 kaca pitulung] ngenani katerangané).\nManawa panjenengan tekan kéné awit ora sengaja, kliken tumbul <strong>balik</strong> ana ing pangluruné panjenengan.",
+       "anontalkpagetext": "----\n<em>Iki kaca parembugané panganggo anonim kang durung gawé akun, utawa kang ora nganggo akuné.</em>\nMula, awak dhéwé kudu nganggo alamat IP-né awujud angka kanggo nglacak dhèwèké.\nAlamat IP mangkono bisa dianggo déning sawenèh panganggo.\nManawa panjenengan panganggo anonim lan rumasa yèn ana tanggepan kang ora ilok dieneraké marang panjenengan, mangga [[Special:CreateAccount|gawéa akun]] utawa [[Special:UserLogin|mlebua log]] kanggo ngéndhani salah pangira karo panganggo anonim liyané ing tembé buri.",
+       "noarticletext": "Saiki kaca iki durung ana tulisané.\nPanjenengan bisa (1) [[Special:Search/{{PAGENAME}}|nggolèki sesirahing kaca iki]] ing kaca liyané, (2)\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} nggolèki log kang magepokan],\nutawa (3) [{{fullurl:{{FULLPAGENAME}}|action=edit}} nggawé kaca iki]</span>.",
+       "noarticletext-nopermission": "Saiki lagi ora ana tèks ing kaca iki. \nPanjenengan bisa [[Special:Search/{{PAGENAME}}|nggolèk sesirah kaca iki]] ing kaca liyané, \nutawa <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{urlencode:{{FULLPAGENAME}}}}}} nggolèk ing log kang gegayutan]</span>, nanging panjenengan ora kawogan nggawé kaca iki.",
+       "missing-revision": "Révisi #$1 saka kaca aran \"{{FULLPAGENAME}}\" ora ana.\n\nIki biyasané kasababaké awit nututi pranala sajarah kang wis lawas saka kaca kang wis binusek.\nRerincèné bisa digolèki ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log besakan].",
        "userpage-userdoesnotexist": "Akun panganggo \"$1\" ora kadhaftar.\nMangga pesthèkaké dhisik yèn panjenengan péngin nggawé/mbesut kaca iki.",
        "userpage-userdoesnotexist-view": "Akun panganggo \"$1\" ora kadhaftar.",
        "blocked-notice-logextract": "Panganggo iki saiki lagi diblokir.\nLog pamblokiran pungkasan dituduhaké ing ngisor iki minangka bahan rujukan:",
-       "clearyourcache": "<strong>Cathetan:</strong> Nalika rampung nyimpen, panjenengan kudu mbusak telihing pangluruné panjenengan supaya owahané katon.\n* <strong>Firefox / Safari:</strong> Pencèt <em>Shift</em> nalika ngeklik <em>Reload</em>, utawa pencèt <em>Ctrl-F5</em> utawa <em>Ctrl-R</em> (<em>⌘-R</em> ing Mac)\n* <strong>Google Chrome:</strong> Pencèt <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> ing Mac)\n* <strong>Internet Explorer:</strong> Pencèt <em>Ctrl</em> nalika ngeklik <em>Refresh</em>, utawa pencèt <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Menyang <em>Menu → Settings</em> (<em>Opera → Preferences</em> ing Mac) nuli menyang <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
+       "clearyourcache": "<strong>Cathetan:</strong> Nalika rampung nyimpen, panjenengan kudu mbusek telihing pangluruné panjenengan supaya owahané katon.\n* <strong>Firefox / Safari:</strong> Pencèt <em>Shift</em> nalika ngeklik <em>Reload</em>, utawa pencèt <em>Ctrl-F5</em> utawa <em>Ctrl-R</em> (<em>⌘-R</em> ing Mac)\n* <strong>Google Chrome:</strong> Pencèt <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> ing Mac)\n* <strong>Internet Explorer:</strong> Pencèt <em>Ctrl</em> nalika ngeklik <em>Refresh</em>, utawa pencèt <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Menyang <em>Menu → Settings</em> (<em>Opera → Preferences</em> ing Mac) nuli menyang <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
        "usercssyoucanpreview": "'''Tips:''' Gunakna tombol \"{{int:showpreview}}\" kanggo ngetès CSS anyar panjenengan sadurungé disimpen.",
        "userjsyoucanpreview": "'''Tips:''' Gunakna tombol \"{{int:showpreview}}\" kanggo ngetès JavaScript anyar panjenengan sadurungé disimpen.",
        "usercsspreview": "'''Pèngeten yèn panjenengan namung mirsani pratilik CSS panjenengan.''''\n'''Pratilik iku durung kasimpen!'''",
-       "userjspreview": "'''Pèngeten yèn sing panjenengan pirsani namung pratilik JavaScript panjenengan, lan menawa pratilik iku dèrèng kasimpen!'''",
-       "sitecsspreview": "<strong>Élinga yèn Sampéyan mung mratuduh CSS iki.\nIki durung kasimpen!</strong>",
-       "sitejspreview": "<strong>Élinga yèn Sampéyan mung mratuduh kodhé JavaScript iki.\nIki durung kasimpen!</strong>",
+       "userjspreview": "<strong>Élinga yèn panjenengan mung njajal/mratuduh JavaScript panganggo panjenengan. Kacané durung kasimpen!</strong>",
+       "sitecsspreview": "<strong>Élinga yèn panjenengan mung mratuduh CSS iki.\nIki durung kasimpen!</strong>",
+       "sitejspreview": "<strong>Élinga yèn panjenengan mung mratuduh kodhé JavaScript iki.\nIki durung kasimpen!</strong>",
        "userinvalidconfigtitle": "<strong>Pènget:</strong> Ora ana ules \"$1\".\nKaca .css lan .js padatan nganggo sesirah mawa huruf cilik, contoné {{ns:user}}:Foo/vector.css, dudu {{ns:user}}:Foo/Vector.css.",
        "updated": "(Kaanyaran)",
        "note": "<strong>Cathetan:</strong>",
        "continue-editing": "Menyang pambesutan",
        "previewconflict": "Pratuduh iki nuduhaké tèksé ing pérangan ndhuwur kothak besutan tèks lan nuduhaké wujudé kaya déné yèn wis disimpen.",
        "session_fail_preview": "Ngapunten! Kita ora bisa ngayahi besutané panjenengan amarga ilangé sèsi dhata.\n\nPanjenengan bokmanawa wis metu log. <strong>Mangga vèrifikasi manawa panjenengan isih mlebu log lan jajalen manèh</strong>.\nManawa isih durung kena, jajalen [[Special:UserLogout|metu log]] lan mlebu log manèh, banjur priksanen apa pangluruné panjenengan ngidinaké kuki saka situs iki.",
-       "session_fail_preview_html": "'''Nuwun sèwu! Kita ora bisa prosès suntingan panjenengan amerga data sési ilang.'''\n\n''Amerga wiki iki ngidinaké panrapan HTML mentah, pratayang didelikaké minangka penggakan marang serangan Javascript.''\n\n'''Yèn iki sawijining upaya suntingan sing absah, mangga dicoba manèh. Yèn isih tetep ora kasil, cobanen metu log utawa oncat lan mlebua manèh.'''",
-       "token_suffix_mismatch": "<strong>Besutané panjenengan ditulak amarga aplikasi klièné panjenengan ngowahi karakter tandha waca ing token besutané.</strong>\nBesutané wis ditulak kanggo nyegah rusaké tèks kaca.\nSing kaya mangkono biyasané kadadéan nalika panjenengan nganggo paladenan proksi anonim sing lelandhesan jaringan.",
+       "session_fail_preview_html": "'''Nuwun sèwu! Kita ora bisa prosès suntingan panjenengan amarga data sési ilang.'''\n\n''Amarga wiki iki ngidinaké panrapan HTML mentah, pratayang didelikaké minangka penggakan marang serangan Javascript.''\n\n'''Yèn iki upaya suntingan kang trep, mangga dicoba manèh. Yèn isih tetep ora kasil, cobanen metu log utawa oncat lan mlebua manèh.'''",
+       "token_suffix_mismatch": "<strong>Besutané panjenengan ditulak amarga aplikasi klièné panjenengan ngowahi karakter tandha waca ing token besutané.</strong>\nBesutané wis ditulak kanggo nyegah rusaké tèks kaca.\nKang mangkono biyasané kadadéan nalika panjenengan nganggo paladenan proksi anonim kang lelandhesan jaringan.",
        "edit_form_incomplete": "<strong>Sawenèh pérangan formulir besut ora nyandhak paladèné; priksanen manèh yèn besutané panjenengan isih wutuh banjur jajalen manèh.</strong>",
        "editing": "Mbesut $1",
        "creating": "Nggawé $1",
        "editingsection": "Mbesut $1 (pérangan)",
        "editingcomment": "Mbesut $1 (pérangan anyar)",
        "editconflict": "Cengkah besutan: $1",
-       "explainconflict": "Wong liya wis nyunting kaca iki wiwit panjenengan mau nyunting.\nBagian dhuwur tèks iki ngamot tèks kaca vèrsi saiki.\nPangowahan sing panjenengan lakoni dituduhaké ing bagian ngisor tèks.\nPanjenengan namung prelu nggabungaké pangowahan panjenengan karo tèks sing wis ana.\n'''Namung''' tèks ing bagian dhuwur kaca sing bakal kasimpen menawa panjenengan mencèt \"$1\".",
+       "explainconflict": "Wong liya wis mbesut kaca iki wiwit panjenengan lekas mbesut.\nBagian dhuwur tèks iki ngamot tèks kaca vèrsi saiki.\nPangowahan kang panjenengan lakoni dituduhaké ing bagian ngisor tèks.\nPanjenengan namung prelu nggabungaké pangowahan panjenengan karo tèks kang wis ana.\n'''Namung''' tèks ing bagian dhuwur kaca kang bakal kasimpen manawa panjenengan mencèt \"$1\".",
        "yourtext": "Tèksé panjenengan",
        "storedversion": "Owahan kasimpen",
-       "editingold": "'''PÈNGET:''' Panjenengan nyunting revisi lawas sawijining kaca. Yèn versi iki panjenengan simpen, mengko pangowahan-pangowahan sing wis digawé wiwit revisi iki bakal ilang.",
+       "editingold": "'''PÈNGET:''' Panjenengan mbesut revisi lawas saka siji kaca. Yèn versi iki panjenengan simpen, mengko pangowahan-pangowahan kang wis digawé wiwit revisi iki bakal ilang.",
        "yourdiff": "Béda",
-       "copyrightwarning": "Tulung dipun-gatèkaké menawa kabèh sumbangsih utawa kontribusi kanggo {{SITENAME}} iku dianggep wis diluncuraké miturut $2 GNU (mangga priksanen $1 kanggo ditèlé).\nMenawa panjenengan ora kersa menawa tulisan panjenengan bakal disunting karo disebar, aja didokok ing kéné.<br />\nPanjenengan uga janji menawa apa-apa sing katulis ing kéné, iku karyané panjenengan dhéwé, utawa disalin saka sumber bébas. '''AJA NDOKOK KARYA SING DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
-       "copyrightwarning2": "Mangga digatèkaké yèn kabèh kontribusi marang  {{SITENAME}} bisa disunting, diowahi, utawa dibusak déning penyumbang liyané. Yèn panjenengan ora kersa yèn tulisan panjenengan bisa disunting wong liya, aja ngirim artikel panjenengan ing kéné.<br />Panjenengan uga janji yèn tulisan panjenengan iku kasil karya panjenengan dhéwé, utawa disalin saka sumber umum utawa sumber bébas liyané (mangga delengen $1 kanggo informasi sabanjuré). '''AJA NGIRIM KARYA SING DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
-       "longpageerror": "'''Kasalahan: Tèks sing Sampéyan lebokaké dawané {{PLURAL:$1|sak kilobita|$1 kilobita}}, luwih dawa saka maksimal {{PLURAL:$2|sak kilobita|$2 kilobita}}.'''\nKuwi ora bisa disimpen.",
-       "readonlywarning": "'''PÈNGET: Basis data lagi dikunci amerga ana pangopènan, dadi saiki panjenengan ora bisa nyimpen kasil panyuntingan panjenengan. Panjenengan mbokmenawa prelu mindhahaké kasil panyuntingan panjenengan iki menyang panggonan liya kanggo disimpen bésuk.'''\n\nPangurus sing ngunci basis data mènèhi katrangan kaya mengkéné: $1",
-       "protectedpagewarning": "<strong>Pélik: Kaca iki wis direksa, mula mung panganggo mawa hak mirunggan pangurus sing bisa mbesut.</strong>\nÈntri log sing pungkasan ana ing ngisor iki minangka rujukan:",
-       "semiprotectedpagewarning": "<strong>Cathetan:</strong> Kaca iki pinuju direksa, mula mung panganggo sing kadhaftar sing bisa mbesut.\nÈntri log pungkasan cumepak ana ing ngisor kanggo rujukan:",
-       "cascadeprotectedwarning": "<strong>Pènget:</strong> Kaca iki wis direksa saéngga mung panganggo kanthi hak pangurus waé sing bisa mbesut amarga kaca iki katranklusi ing {{PLURAL:$1|kaca|kaca-kaca}} sing kareksa runut ngisor iki:",
+       "copyrightwarning": "Tulung dipun-gatèkaké manawa kabèh sumbangsih utawa kontribusi kanggo {{SITENAME}} iku dianggep wis diluncuraké miturut $2 GNU (mangga priksanen $1 kanggo ditèlé).\nManawa panjenengan ora karsa manawa tulisan panjenengan bakal disunting karo disebar, aja didokok ing kéné.<br />\nPanjenengan uga janji manawa apa-apa kang katulis ing kéné, iku karyané panjenengan dhéwé, utawa disalin saka sumber bébas. '''AJA NDOKOK KARYA KANG DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
+       "copyrightwarning2": "Mangga digatèkaké yèn kabèh kontribusi marang {{SITENAME}} bisa disunting, diowahi, utawa dibusek penyumbang liyané. Yèn panjenengan ora karsa yèn tulisan panjenengan bisa disunting wong liya, aja ngirim artikel panjenengan ing kéné.<br />Panjenengan uga janji yèn tulisan panjenengan iku kasil karya panjenengan dhéwé, utawa disalin saka sumber umum utawa sumber bébas liyané (mangga delengen $1 kanggo informasi sabanjuré). '''AJA NGIRIM KARYA KANG DIREKSA DÉNING UNDHANG-UNDHANG HAK CIPTA TANPA IDIN!'''",
+       "longpageerror": "'''Masalah: Tèks kang panjenengan lebokaké dawané {{PLURAL:$1|sak kilobita|$1 kilobita}}, luwih dawa saka maksimal {{PLURAL:$2|sak kilobita|$2 kilobita}}.'''\nKang mangkono ora bisa kasimpen.",
+       "readonlywarning": "<strong>Pepéling: Basis dhatah lagi ginembok amarga lagi karukti, mula panjenengan saiki ora bisa nyimpen besutané panjenengan.</strong>\nPanjenengan bokmanawa arep nurun tulisané panjenengan ing barkas tèks lan nyimpen iku kanggo mengko.\n\nPangurus kang nggembok basis dhatahé mènèhi panjlèntrèh mengkéné: $1",
+       "protectedpagewarning": "<strong>Pélik: Kaca iki wis direksa, mula mung panganggo mawa hak mirunggan pangurus kang bisa mbesut.</strong>\nÈntri log kang pungkasan ana ing ngisor iki minangka rujukan:",
+       "semiprotectedpagewarning": "<strong>Cathetan:</strong> Kaca iki pinuju direksa, mula mung panganggo kang kadhaftar kang bisa mbesut.\nÈntri log pungkasan cumepak ana ing ngisor kanggo rujukan:",
+       "cascadeprotectedwarning": "<strong>Pènget:</strong> Kaca iki wis direksa saéngga mung panganggo kanthi hak pangurus waé kang bisa mbesut amarga kaca iki katranklusi ing {{PLURAL:$1|kaca|kaca-kaca}} kang kareksa runut ngisor iki:",
        "titleprotectedwarning": "'''Pènget: Kaca iki wis dikunci saéngga perlu [[Special:ListGroupRights|hak mligi]] kanggo gawéné.'''\nEntri cathetan pungkasan disadiakake ing ngisor kanggo referensi:",
-       "templatesused": "{{PLURAL:$1|Cithakan}} sing dienggo ing kaca iki:",
-       "templatesusedpreview": "{{PLURAL:$1|Cithakan}} sing dienggo ing pratuduh iki:",
-       "templatesusedsection": "{{PLURAL:$1|Cithakan}} sing dienggo ding bagian iki:",
+       "templatesused": "{{PLURAL:$1|Cithakan}} kang kaanggo ing kaca iki:",
+       "templatesusedpreview": "{{PLURAL:$1|Cithakan}} kang kaanggo ing pratuduh iki:",
+       "templatesusedsection": "{{PLURAL:$1|Cithakan}} kang kaanggo ing pérangan iki:",
        "template-protected": "(kareksa)",
        "template-semiprotected": "(semu kareksa)",
        "hiddencategories": "Kaca iki anggotaning {{PLURAL:$1|1 kategori wadi|$1 kategori wadi}}:",
        "edittools": "<!-- Tèks ing ngisor iki bakal ditudhuhaké ing ngisoring isènan suntingan lan pangemotan.-->",
-       "nocreatetext": "{{SITENAME}} matesi bisané panjenengan nggawé kaca anyar.\nPanjenengan bisa bali lan mbesut kaca sing ana, utawa [[Special:UserLogin|mlebu log utawa nggawé akun]].",
+       "edittools-upload": "-",
+       "nocreatetext": "{{SITENAME}} matesi bisané panjenengan nggawé kaca anyar.\nPanjenengan bisa bali lan mbesut kaca kang ana, utawa [[Special:UserLogin|mlebu log utawa nggawé akun]].",
        "nocreate-loggedin": "Panjenengan ora kagungan idin kanggo nggawé kaca anyar.",
-       "sectioneditnotsupported-title": "Panyuntingan bagéyan ora kasengkuyungan",
+       "sectioneditnotsupported-title": "Besut pérangan ora kasengkuyung",
        "sectioneditnotsupported-text": "Ora bisa mbesut sapérangan ana ing kaca iki.",
        "permissionserrors": "Masalah idin",
-       "permissionserrorstext": "Panjengan ora kagungan idin kanggo nglakoni sing panjenengan gayuh amerga {{PLURAL:$1|alesan|alesan-alesan}} iki:",
+       "permissionserrorstext": "Panjengan ora kagungan idin kanggo nglakoni kang panjenengan gayuh amarga {{PLURAL:$1|alesan|alesan-alesan}} iki:",
        "permissionserrorstext-withaction": "Panjenengan ora diidinaké $2 amarga {{PLURAL:$1|alasan|alasan}} ing ngisor iki:",
        "recreate-moveddeleted-warn": "<strong>Pélik: Panjenengan nggawé manèh kaca kang tau kabusak.</strong>\n\nPanjenengan kudu nglelimbang apa pantes nerusaké mbesut kaca iki.\nIng isor iki kapacak log pambusak lan pangalih saka kaca iki:",
-       "moveddeleted-notice": "Kaca iki wis dibusak.\nLog busak, reksa, lan alih bab kacané cumepak ing ngisor minangka rujukan.",
+       "moveddeleted-notice": "Kaca iki wis binusek.\nLog busak, reksa, lan alih bab kacané cumepak ing ngisor minangka rujukan.",
        "log-fulllog": "Deleng cathetan wutuh",
        "edit-hook-aborted": "Besutan diwurungaké déning cangkolan.\nOra ana katerangané.",
-       "edit-gone-missing": "Ora bisa nganyari kaca.\nKatoné kaca iki wis dibusak.",
+       "edit-gone-missing": "Ora bisa nganyari kaca.\nKatoné kaca iki wis binusek.",
        "edit-conflict": "Cengkah besutan",
        "edit-no-change": "Besutané panjenengan dilirwakaké amarga ora ana owahan apa-apa tumraping tèksé.",
        "postedit-confirmation-created": "Kaca wis kagawé.",
+       "postedit-confirmation-restored": "Kacané wis kapulihaké.",
        "postedit-confirmation-saved": "Besutané panjenengan wis kasimpen.",
-       "edit-already-exists": "Ora bisa nggawé kaca anyar.\nAmerga wis ana.",
+       "postedit-confirmation-published": "Besutané panjenengan wis kababar.",
+       "edit-already-exists": "Ora bisa nggawé kaca anyar.\nKacané wis ana.",
        "defaultmessagetext": "Tèks layang gawan",
        "content-failed-to-parse": "Gagal menjabarkan konten $2 untuk model $1: $3",
        "invalid-content-data": "Data isi ora trap",
        "content-not-allowed-here": "Konten \"$1\" ora oleh ing kaca [[$2]]",
-       "editwarning-warning": "Yen sampeyan ninggalake kaca niki, pangowahan sampeyan bakal ilang.\nYen sampeyan wis mlebet log, sampeyan saged mateni peringatan niki lewat preferensi \"Panyuntingan\" sampeyan.",
+       "editwarning-warning": "Ninggalake kaca iki bisa njalari ilangé owah-owahané panjenengan.\nManawa panjenengan ing jero log, panjenengan bisa matèni pepéling iki ing pérangan \"{{int:prefs-editing}}\" ing pilalané panjenengan.",
+       "editpage-invalidcontentmodel-title": "Modhèl kontèn ora sinengkuyung",
+       "editpage-invalidcontentmodel-text": "Modhèl kontèn \"$1\" ora sinengkuyung.",
+       "editpage-notsupportedcontentformat-title": "Formal kontèn ora sinengkuyung",
+       "editpage-notsupportedcontentformat-text": "Format kontèn $1 ora disengkuyung modhèl kontèn $2.",
        "content-model-wikitext": "tulisan wiki",
        "content-model-text": "tulisan barès",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "expensive-parserfunction-warning": "Pènget: Kaca iki ngandhut kakèhan panggunan fungsi ''parser'' sing larang.\n\nSajatiné kuduné duwé kurang saka {{PLURAL:$2|panggilan|panggilan}}, saiki ana {{PLURAL:$1|$1 panggilan|$1 panggilan}}.",
-       "expensive-parserfunction-category": "Kaca-kaca mawa panggunan fungsi ''parser'' sing kakèhan",
+       "content-model-json": "JSON",
+       "content-json-empty-object": "Obyèk kosong",
+       "expensive-parserfunction-warning": "Pènget: Kaca iki ngandhut kakèhan panggunan fungsi ''parser'' kang larang.\n\nSajatiné kuduné duwé kurang saka {{PLURAL:$2|panggilan|panggilan}}, saiki ana {{PLURAL:$1|$1 panggilan|$1 panggilan}}.",
+       "expensive-parserfunction-category": "Kaca-kaca mawa panggunan fungsi ''parser'' kang kakèhan",
        "post-expand-template-inclusion-warning": "Pènget: Cithakan klebu ukurané kegedhèn.\nSawetara cithakan bakal dilirwakaké.",
-       "post-expand-template-inclusion-category": "Kaca-kaca kanthi cithakan klebu ukuran sing ngluwihi wates",
-       "post-expand-template-argument-warning": "Pènget: Kaca iki ngandhut saora-orané siji argumen cithakan kanthi ukuran èkspansi sing kegedhèn. Argumèn-argumèn kasebut wis dilirwakaké.",
-       "post-expand-template-argument-category": "Kaca-kaca kanthi argumèn cithakan sing dilirwakaké",
+       "post-expand-template-inclusion-category": "Kaca mawa ukuran cithakan kang munjuli wates",
+       "post-expand-template-argument-warning": "Pènget: Kaca iki ngandhut saora-orané siji argumen cithakan kanthi ukuran èkspansi kang kegedhèn. Argumèn-argumèn kasebut wis dilirwakaké.",
+       "post-expand-template-argument-category": "Kaca mawa argumèn cithakan kang kabusek",
        "parser-template-loop-warning": "Ana ''loop'' cithakan: [[$1]]",
        "parser-template-recursion-depth-warning": "Wates ''recursion depth'' cithakan wis ngliwati ($1)",
        "language-converter-depth-warning": "Wates jeroné pangganti basa wis kapunjulen ($1)",
-       "node-count-exceeded-category": "Kaca sing itungan-nodéné wis punjul",
+       "node-count-exceeded-category": "Kaca kang itungan-nodéné wis punjul",
        "node-count-exceeded-warning": "Kaca munjuli itungan-nodé",
-       "expansion-depth-exceeded-category": "Kaca sing jeroné èkspansi wis punjul",
+       "expansion-depth-exceeded-category": "Kaca kang jeroné èkspansi wis punjul",
        "expansion-depth-exceeded-warning": "Kaca munculi jeroné èkspansi",
        "parser-unstrip-loop-warning": "Unstrip loop detected",
        "unstrip-depth-warning": "Unstrip recursion limit exceeded ($1)",
        "converter-manual-rule-error": "Masalah kapranggul ing aturan konvèrsi basa manual",
-       "undo-success": "Besutan iki kena diwurungaké.\nTiliki bandhingan ngisor iki saperlu mesthèkaké yèn bener iki sing arep kolakoni, nuli simpen owahan ngisor iki kanggo ngiyai yèn besutané diwurungaké.",
+       "undo-success": "Besutan iki kena diwurungaké.\nTiliki bandhingan ngisor iki saperlu mesthèkaké yèn bener iki kang arep kolakoni, banjur simpen owahan ngisor iki kanggo ngiyai yèn besutané diwurungaké.",
        "undo-failure": "Besutan iki ora bisa dipulihaké amarga bisa cengkah besutan antara.",
-       "undo-norev": "Besutan iki ora bisa diwurungaké amarga wis ora ana utawa wis dibusak.",
+       "undo-norev": "Besutan iki ora bisa diwurungaké amarga wis ora ana utawa wis binusek.",
        "undo-summary": "Mbalèkaké owahan $1 déning [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]])",
-       "undo-summary-username-hidden": "Balèkaké owahan $1 déning panganggo sing didhelikaké",
-       "cantcreateaccount-text": "Saka alamat IP iki ('''$1''') ora diparengaké nggawé akun utawa rékening. Sing mblokir utawa ora marengaké iku [[User:$3|$3]].\n\nAlesané miturut $3 yaiku ''$2''",
-       "cantcreateaccount-range-text": "Nggawe akun saking alamat IP \"$1\", sing termasuk IP sampeyan (<strong>$4</strong>), sampun diblokir kaliyan [[User:$3|$3]].\n\nAlesan pamblokiran yaiku \"$2\"",
+       "undo-summary-username-hidden": "Balèkaké owahan $1 déning panganggo kang didhelikaké",
+       "cantcreateaccount-text": "Saka alamat IP iki ('''$1''') ora diparengaké nggawé akun utawa kang. Kang mblokir utawa ora marengaké iku [[User:$3|$3]].\n\nAlesané miturut $3 yaiku ''$2''",
+       "cantcreateaccount-range-text": "Nggawe akun saka alamat IP \"$1\", kang kalebu IP panjenengan (<strong>$4</strong>), wis diblokir kaliyan [[User:$3|$3]].\n\nAlesan pamblokiran yaiku \"$2\"",
        "viewpagelogs": "Deleng cathetaning kaca iki",
        "nohistory": "Babading besutan kaca iki ora ana.",
        "currentrev": "Owahan anyaran",
        "last": "sadurungé",
        "page_first": "kapisan",
        "page_last": "pungkasan",
-       "histlegend": "Kanggo mbandhingaké: Tandhani kothak radhioning révisi-révisi sing arep dibandhingaké lan pencèt ''Enter'' utawa tombol ing ngisor.<br />\nLegéndhah: <strong>({{int:cur}})</strong> = bédané karo révisi pungkasan, <strong>({{int:last}})</strong> = bédané karo révisi sadurungé, <strong>{{int:minoreditletter}}</strong> = besutan cilik.",
+       "histlegend": "Kanggo mbandhingaké: Tandhani kothak radhioning révisi-révisi kang arep dibandhingaké lan pencèt ''Enter'' utawa tombol ing ngisor.<br />\nLegéndhah: <strong>({{int:cur}})</strong> = bédané karo révisi pungkasan, <strong>({{int:last}})</strong> = bédané karo révisi sadurungé, <strong>{{int:minoreditletter}}</strong> = besutan cilik.",
        "history-fieldset-title": "Golèk owahan",
-       "history-show-deleted": "Mligi owahan sing dibusak",
+       "history-show-deleted": "Mligi owahan kang binusek",
        "histfirst": "lawas dhéwé",
        "histlast": "anyar dhéwé",
        "historysize": "($1 {{PLURAL:$1|bét|bét}})",
        "history-feed-title": "Sajarah owahan",
        "history-feed-description": "Sajarah owahaning kaca iki ing wiki",
        "history-feed-item-nocomment": "$1 ing $2",
-       "history-feed-empty": "Kaca sing disuwun ora ditemokaké. Mbokmenawa wis dibusak saka wiki, utawa diwènèhi jeneng anyar. Coba [[Special:Search|golèka ing wiki]] kanggo kaca anyar sing rélevan.",
-       "rev-deleted-comment": "(tingkesaning besutan dibusak)",
-       "rev-deleted-user": "(jeneng panganggo dibusak)",
-       "rev-deleted-event": "(rerincèn log dibusak)",
-       "rev-deleted-user-contribs": "[jeneng panganggo utawa alama IP dibusak - besutan didhelikaké saka pratélaning pasumbang]",
-       "rev-deleted-text-permission": "Révisi kaca iki wis '''dibusak'''.\nPrincèné mbokmanawa kasedyakaké ing  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
-       "rev-deleted-text-unhide": "Révisi kaca iki wis <strong>dibusak</strong>.\nRerincèné bisa digolèki ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].\nPanjenengan isih bisa [$1 ndeleng révisi iki] yèn panjenengan arep.",
+       "history-feed-empty": "Kaca kang panjenengan karsakaké ora ana.\nBokmanawa kacané wis binusek saka wiki, utawa ingalih jeneng anyar.\nJajal [[Special:Search|golèka ing wiki]] bab kaca anyar kang magepokan.",
+       "history-edit-tags": "Besut tenger saka révisi kang pinilih",
+       "rev-deleted-comment": "(ringkesané besutan binusek)",
+       "rev-deleted-user": "(jeneng panganggo binusek)",
+       "rev-deleted-event": "(rerincèn log binusek)",
+       "rev-deleted-user-contribs": "[jeneng panganggo utawa alama IP binusek - besutan dhinelikaké saka pratélan pasumbang]",
+       "rev-deleted-text-permission": "Révisi kaca iki wis <strong>binusek</strong>.\nRerincèné bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busekan].",
+       "rev-deleted-text-unhide": "Révisi kaca iki wis <strong>binusek</strong>.\nRerincèné bisa digolèki ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].\nPanjenengan isih bisa [$1 ndeleng révisi iki] yèn panjenengan arep.",
        "rev-suppressed-text-unhide": "Révisi kaca iki wis <strong>dibrèdhèl</strong>.\nRerincèné bisa digolèki ing [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log brèdhèl].\nPanjenengan isih bisa [$1 ndeleng révisi iki] yèn panjenengan arep.",
-       "rev-deleted-text-view": "Benahan kaca iki wis '''dibusak'''.\nSampéyan bisa ndelok iki; rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
-       "rev-suppressed-text-view": "Benahan kaca iki wis '''dibrèdèl'''.\nSampéyan bisa ndelok iki; rinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].",
-       "rev-deleted-no-diff": "Panjenengan ora bisa mirsani prabédan amarga siji saka révisiné wis '''dibusak'''.\nPricèné mbokmanawa isih ana ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
-       "rev-suppressed-no-diff": "Sampéyan ora bisa ndelok prabédan iki amarga sawiji benahan wis '''dibusak'''.",
-       "rev-deleted-unhide-diff": "Sawiji benahan saka prabédan iki wis '''dibusak'''.\nRincian bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].\nSampéyan uga isih bisa [$1 ndelok prabédan iki] yèn Sampéyan gelem.",
-       "rev-suppressed-unhide-diff": "Sawiji benahan saka prabédan iki wis '''dibrèdèl'''.\nRincian bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].\nSampéyan uga isih bisa [$1 ndelok prabédan iki] yèn Sampéyan gelem.",
-       "rev-deleted-diff-view": "Sawiji benahan saka prabédan iki wis '''dibusak'''.\nSampéyan isih bisa ndelok prabédan iki; rincian bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
-       "rev-suppressed-diff-view": "Sawiji benahan saka prabédan iki wis '''dibrèdèl'''.\nSampéyan isih bisa ndelok prabédan iki; rincian bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].",
+       "rev-deleted-text-view": "Révisi kaca iki wis <strong>binusek</strong>.\nPanjenengan bisa ndeleng iku; rerincèné bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busekan].",
+       "rev-suppressed-text-view": "Révisi kaca iki wis <strong>jinabut</strong>.\nPanjenengan bisa ndeleng iku; rerincèné bisa tinemu ing [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} log jabutan].",
+       "rev-deleted-no-diff": "Panjenengan ora bisa mirsani prabédan amarga siji saka révisiné wis '''binusek'''.\nPricèné mbokmanawa isih ana ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
+       "rev-suppressed-no-diff": "Panjenengan ora bisa ndeleng prabédan iki amarga salah siji révisiné wis '''binusek'''.",
+       "rev-deleted-unhide-diff": "Salah siji révisi saka prabédan iki wis '''dibusak'''.\nRincian bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].\nPanjenengan uga isih bisa [$1 ndeleng prabédan iki] yèn panjenengan gelem.",
+       "rev-suppressed-unhide-diff": "Salah siji révisi saka prabédan iki wis '''dibrèdèl'''.\nRincian bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].\nPanjenengan uga isih bisa [$1 ndeleng prabédan iki] yèn panjenengan gelem.",
+       "rev-deleted-diff-view": "Salah siji révisi saka prabédan iki wis '''dibusak'''.\nPanjenengan isih bisa ndeleng prabédan iki; rincian bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambusakan].",
+       "rev-suppressed-diff-view": "Salah siji révisi saka prabédan iki wis '''dibrèdèl'''.\nPanjenengan isih bisa ndeleng prabédan iki; rincian bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log pambrèdèlan].",
        "rev-delundel": "owah pakatonan",
        "rev-showdeleted": "tuduhaké",
        "revisiondelete": "Busak/wurung busak révisi",
        "revdelete-nooldid-title": "Révisi tujuan ora trep",
        "revdelete-nooldid-text": "Panjenengan durung mènèhi target revisi kanggo nglakoni fungsi iki.",
-       "revdelete-no-file": "Barkas sing dipéngini ora ana.",
-       "revdelete-show-file-confirm": "Apa panjenengan yakin arep mirsani révisi sing wis kabusak saka berkas \"<nowiki>$1</nowiki>\" ing $2, jam $3?",
+       "revdelete-no-file": "Barkas kang panjenengan karsakaké ora ana.",
+       "revdelete-show-file-confirm": "Apa panjenengan yakin arep mriksa révisi kang kabusek saka barkas \"<nowiki>$1</nowiki>\" nalika $2 jam $3?",
        "revdelete-show-file-submit": "Iya",
        "logdelete-selected": "{{PLURAL:$1|Log kapilih|Log kapilih}} kanggo:",
        "revdelete-text-others": "Administrator liya isih bisa ngaksès isian ndhelik lan mulihaké iku saka pambusakan, kajaba rereksan tambahan disetèl.",
-       "revdelete-confirm": "Mangga pesthèkaké yèn Sampéyan pancèn kudu nglakoni iki, yèn Sampéyan ngerti akibaté, lan yèn Sampéyan ngakoni iki cocok karo [[{{MediaWiki:Policy-url}}|kawicakan]].",
-       "revdelete-suppress-text": "Pandhelikan révisi '''mung''' bisa dipigunakaké kanggo kasus ing ngisor:\n* Informasi sing kagolong pitnah\n* Informasi pribadi sing kurang pantes\n*: ''alamat omah lan nomer telepon, nomer kartu idhèntitas, lsp..''",
+       "revdelete-confirm": "Mangga pesthèkaké yèn panjenengan pancèn kudu nglakoni iki, yèn panjenengan ngerti akibaté, lan yèn panjenengan ngakoni iki cocog karo [[{{MediaWiki:Policy-url}}|kawicakan]].",
+       "revdelete-suppress-text": "Pandhelikan révisi '''mung''' bisa dipigunakaké kanggo kasus ing ngisor:\n* Informasi kang kagolong pitnah\n* Informasi pribadi kang kurang pantes\n*: ''alamat omah lan nomer telepon, nomer kartu idhèntitas, lsp..''",
        "revdelete-legend": "Atur watesan:",
        "revdelete-hide-text": "Tulisan owahan",
        "revdelete-hide-image": "Dhelikaké isi barkas",
        "revdelete-hide-name": "Dhelikaké tujuan lan paramèter",
        "revdelete-hide-comment": "Tingkesan besutan",
-       "revdelete-hide-user": "Alamat IPné/jeneng panganggoné sing mbesut",
+       "revdelete-hide-user": "Alamat IPné/jeneng panganggoné kang mbesut",
        "revdelete-hide-restricted": "Uga dhelikna data saka pangurus lan panganggo liyané",
        "revdelete-radio-same": "(aja diowah)",
        "revdelete-radio-set": "Kadhelikan",
        "revdelete-radio-unset": "Katon",
        "revdelete-suppress": "Uga dhelikan saka pangurus",
-       "revdelete-unsuppress": "Busak watesan ing revisi sing dibalèkaké",
+       "revdelete-unsuppress": "Busak watesan ing revisi kang dibalèkaké",
        "revdelete-log": "Alesan:",
        "revdelete-submit": "Trapna ing {{PLURAL:$1|révisi|révisi}} kapilih",
        "revdelete-success": "Kekatonan owahan wis dianyari.",
        "pagehist": "Babading kaca",
        "deletedhist": "Sajarah kabusak",
        "revdelete-hide-current": "Gagal ndhelikaké révisi tanggal $2, $1: iki arupa révisi paling anyar.\nRévisi iki ora bisa didhelikaké.",
-       "revdelete-show-no-access": "Gagal nampilaké révisi tanggal $1, jam $2: révisi iki wis ditandhani \"kawates\".\nPanjenengan ora nduwèni aksès menyang révisi iki.",
+       "revdelete-show-no-access": "Ana masalah nalika nuduhaké wiji mawa titimangsa $1, $2: Wiji iki wis tinandhani \"winates\".\nPanjenengan ora kawogan ngaksès iku.",
        "revdelete-modify-no-access": "Gagal ngowahi révisi tanggal $1, jam $2: révisi iki wis ditandhani \"kawates\".\nPanjenengan ora nduwèni aksès menyang révisi iki.",
-       "revdelete-modify-missing": "Gagal ngowahi révisi ID $1: révisi iki ilang saka basis data!",
+       "revdelete-modify-missing": "Ana masalah nalika ndandani wiji ID $1: Barangé ora ana ing basis dhatah!",
        "revdelete-no-change": "'''Pènget:''' révisi tanggal $1, jam $2 wis nduwèni aturan pandhelikan kasebut.",
        "revdelete-concurrent-change": "Gagal ngowahi révisi tanggal $1, jam $2: statusé mbokmanawa wis diowahi déning panganggo liya bebarengan karo panjenengan.\nMangga priksa cathetan log.",
-       "revdelete-only-restricted": "Ora bisa ndhelikaké siji barang mawa tanggal $1 wanci $2: Sampéyan ora bisa ndhelikaké barang kuwi saka pangurus tanpa milih salah sawiji pilihan kanggo ndhelikaké sing liyané.",
+       "revdelete-only-restricted": "Ora bisa ndhelikaké siji barang mawa tanggal $1 wanci $2: Panjenengan ora bisa ndhelikaké barang iku saka pangurus tanpa milih salah siji pilihan kanggo ndhelikaké kang liyané.",
        "revdelete-reason-dropdown": "*Alasan penghapusan yang umum\n** Pelanggaran hak cipta\n** Komentar atau informasi pribadi yang tidak pantas\n** Nama pengguna yang tidak pantas\n** Berpotensi mencemarkan nama baik",
        "revdelete-otherreason": "Alesan liya/tambahan:",
        "revdelete-reasonotherlist": "Alesan liya",
        "revdelete-edit-reasonlist": "Besut alesané pambusak",
        "revdelete-offender": "Juru pangriptaning owahan:",
-       "suppressionlog": "Log barang-barang sing didelikaké (''oversight'')",
-       "suppressionlogtext": "Ngisor iki daptar apa-apa waé sing wis dibusak lan diblokir kalebu kontèn sing didhelikaké saka para pangurus.\nDelok [[Special:BlockList|daptar blokiran]] sing isiné daptar apa-apa waé sing lagi dilarang lan diblokir.",
+       "suppressionlog": "Log barang-barang kang didelikaké (''oversight'')",
+       "suppressionlogtext": "Ngisor iki pratélan samubarang kang wis dibusak lan diblokir kalebu kontèn kang didhelikaké saka para pangurus.\nDeleng [[Special:BlockList|pratélan blokiran]] kang isiné pratélan samubarang kang lagi dilarang lan diblokir.",
        "mergehistory": "Gabung sajarah kaca",
-       "mergehistory-header": "Ing kaca iki panjenengan bisa nggabung révisi-révisi sajarah saka sawijining kaca sumber menyang kaca anyar.\nPastèkna yèn owah-owahan iki bakal netepaké kasinambungan sajarah kaca.",
+       "mergehistory-header": "Ing kaca iki panjenengan bisa nggabung révisi-révisi sajarah saka kaca sumber menyang kaca anyar.\nPastèkna yèn owah-owahan iki bakal netepaké kasinambungan sajarah kaca.",
        "mergehistory-box": "Gabungna revisi-revisi saka rong kaca:",
        "mergehistory-from": "Kaca sumber:",
        "mergehistory-into": "Kaca paran:",
-       "mergehistory-list": "Sajarah besutan sing bisa digabung",
-       "mergehistory-merge": "Révisi-révisi sing kapacak ing ngisor iki saka [[:$1]] bisa digabungaké menyang [[:$2]].\nGunakna tombol radio kanggo nggabungaké révisi-révisi sing digawé sadurungé wektu tartamtu. Gatèkna, menawa nganggo pranala navigasi bakal ngesèt ulang kolom iki.",
-       "mergehistory-go": "Tuduhaké besutan sing bisa digabung",
+       "mergehistory-list": "Sajarah besutan kang bisa digabung",
+       "mergehistory-merge": "Révisi-révisi kang kapacak ing ngisor iki saka [[:$1]] bisa digabungaké menyang [[:$2]].\nGunakna tombol radio kanggo nggabungaké révisi-révisi kang digawé sadurungé wektu tartamtu. Gatèkna, manawa nganggo pranala navigasi bakal ngesèt ulang kolom iki.",
+       "mergehistory-go": "Tuduhaké besutan kang bisa digabung",
        "mergehistory-submit": "Gabung owahan",
-       "mergehistory-empty": "Ora ana revisi sing bisa digabung.",
+       "mergehistory-empty": "Ora ana revisi kang bisa digabung.",
        "mergehistory-done": "$3 {{PLURAL:$3|owahan}} $1 {{PLURAL:$3|wis}} digabungaké menyang [[:$2]].",
        "mergehistory-fail": "Ora bisa nggabung sajarah, coba dipriksa manèh kacané lan paramèter wektuné.",
        "mergehistory-fail-invalid-source": "Kaca sumber ora trep.",
        "mergehistory-fail-no-change": "Panggabung ing kala kawuri ora kasil nggabungaké révisi babar blas. Mangga priksanen manèh kaca lan paramèter wektuné.",
        "mergehistory-fail-self-merge": "Kaca asal lan kaca paran padha.",
        "mergehistory-fail-timestamps-overlap": "Révisi asal tumpuk-undhung utawa njedhul sawisé révisi tujuan.",
-       "mergehistory-fail-toobig": "Ora bisa nggabungaké sajarah amarga {{PLURAL:$1|révisi}} sing arep dilih munjuli $1.",
+       "mergehistory-fail-toobig": "Ora bisa nggabungaké sajarah amarga {{PLURAL:$1|révisi}} kang arep dilih munjuli $1.",
        "mergehistory-no-source": "Kaca sumber $1 ora ana.",
        "mergehistory-no-destination": "Kaca paran $1 ora ana.",
-       "mergehistory-invalid-source": "Kaca sumber kudu asesirah sing sah.",
-       "mergehistory-invalid-destination": "Kaca tujuan kudu asesirah sing sah.",
+       "mergehistory-invalid-source": "Kaca sumber kudu asesirah kang trep.",
+       "mergehistory-invalid-destination": "Kaca tujuan kudu asesirah kang sah.",
        "mergehistory-autocomment": "Nggabung [[:$1]] menyang [[:$2]]",
        "mergehistory-comment": "Nggabung [[:$1]] menyang [[:$2]]: $3",
        "mergehistory-same-destination": "Kaca sumber lan tujuan ora kena padha",
        "mergehistory-reason": "Alesan:",
+       "mergehistory-revisionrow": "$1 ($2) $3 . . $4 $5 $6",
        "mergelog": "Gabung log",
        "revertmerge": "Wurung gabung",
-       "mergelogpagetext": "Ing ngisor iki kapacak daftar panggabungan sajarah kaca ing kaca liyané.",
+       "mergelogpagetext": "Ing ngisor iki kapacak pratélan panggabungan sajarah kaca ing kaca liyané.",
        "history-title": "Sajarah owahaning \"$1\"",
        "difference-title": "Béda antarané révisi \"$1\"",
        "difference-title-multipage": "Béda antarané kaca \"$1\" lan \"$2\"",
        "difference-multipage": "(Prabédhan antar kaca)",
        "lineno": "Larik $1:",
-       "compareselectedversions": "Bandhingaké révisi sing kapilih",
+       "compareselectedversions": "Bandhingaké révisi kang panjenengan pilih",
        "showhideselectedversions": "Tampilaké/dhelikaké révisi kapilih",
        "editundo": "wurung",
        "diff-empty": "(Ora ana béda)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Sarévisi antara|$1 révisi antara}} déning panganggo sing padha sing ora katuduhaké)",
+       "diff-multi-sameuser": "({{PLURAL:$1|Sarévisi antara|$1 révisi antara}} déning panganggo kang padha kang ora katuduhaké)",
        "diff-multi-otherusers": "({{PLURAL:$1|Siji révisi langsung|$1 révisi langsung}} déning {{PLURAL:$2|siji panganggo liyané|$2 panganggo}} ora dituduhaké)",
        "diff-multi-manyusers": "({{PLURAL:$1|Siji révisi langsung|$1 révisi langsung}} déning {{PLURAL:$2|panganggo|panganggo}} $2 ora katuduhaké)",
-       "difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora ditemokaké|ora ditemokaké}}.\n\nIki biasané kasebab pranala prabedan sing wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa ditemokaké nèng [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
+       "diff-paragraph-moved-tonew": "Paragraf wis ingalih. Klik saperlu lumpat menyang pernah anyar.",
+       "diff-paragraph-moved-toold": "Paragraf wis ingalih. Klik saperlu lumpat menyang pernah lawas.",
+       "difference-missing-revision": "{{PLURAL:$2|Sak pambenahan|$2 pambenahan}} saka prabédan iki ($1) {{PLURAL:$2|ora tinemu|ora tinemu}}.\n\nIki biasané kasebab pranala prabedan kang wis ora kanggo saka kaca isi wis dibusak.\nRinciané bisa tinemu ing [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} log busak].",
        "searchresults": "Kasiling golèk",
-       "searchresults-title": "Kasiling golèk \"$1\"",
+       "search-filter-title-prefix": "Mung golèk kaca kang sesirahé kawiwitan \"$1\"",
+       "search-filter-title-prefix-reset": "Golèk kabèh kaca",
+       "searchresults-title": "Kasil panggolèké \"$1\"",
        "titlematches": "Sesirah kaca cocog",
-       "textmatches": "Tèks artikel sing cocog",
-       "notextmatches": "Ora ana tèks kaca sing cocog",
+       "textmatches": "Tulisan kaca cocog",
+       "notextmatches": "Ora ana tèks kaca kang cocog",
        "prevn": "{{PLURAL:$1|$1}} sadurungé",
        "nextn": "{{PLURAL:$1|$1}} sabanjuré",
        "prev-page": "kaca sadurungé",
        "shown-title": "Tuduhaké $1 {{PLURAL:$1|kasil|kasil}} saben kaca",
        "viewprevnext": "Deleng ($1 {{int:pipe-separator}} $2) ($3)",
        "searchmenu-exists": "'''Ana kaca kanthi jeneng \"[[$1]]\" ing wiki iki'''",
-       "searchmenu-new": "<strong>Gawéa kaca \"[[:$1]]\" ing wiki iki!</strong> {{PLURAL:$2|0=|Uga delenga kaca sing panjenengan temu.|Uga delenga kasiling panggolèk.}}",
+       "searchmenu-new": "<strong>Gawéa kaca \"[[:$1]]\" ing wiki iki!</strong> {{PLURAL:$2|0=|Uga delenga kaca kang panjenengan temu.|Uga delenga kasiling panggolèk.}}",
        "searchprofile-articles": "Kaca isi",
        "searchprofile-images": "Multimédhia",
        "searchprofile-everything": "Kabèh",
        "searchprofile-everything-tooltip": "Golèk kabèh kontèn (kalebu ing kaca parembugan)",
        "searchprofile-advanced-tooltip": "Golèk ing mandala aran tinamtu",
        "search-result-size": "$1 ({{PLURAL:$2|1 tembung|$2 tembung}})",
-       "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkatégori|$2 subkatégori}}, {{PLURAL:$3|1 berkas|$3 berkas}})",
+       "search-result-category-size": "{{PLURAL:$1|1 anggota|$1 anggota}} ({{PLURAL:$2|1 subkategori|$2 subkategori}}, {{PLURAL:$3|1 barkas|$3 barkas}})",
        "search-redirect": "(alihan saka $1)",
        "search-section": "(pérangan $1)",
        "search-category": "(kategori $1)",
        "search-file-match": "(cocog karo isi barkas)",
-       "search-suggest": "Apa sing panjenengan karepaké iki: $1",
+       "search-suggest": "Apa kang panjenengan karsakaké iki: $1",
        "search-rewritten": "Tuduhaké kasilé $1, nanging golèkaké $2.",
        "search-interwiki-caption": "Kasil saka proyèk-proyèk sababon",
        "search-interwiki-default": "Wohing panggolèk $1:",
        "showingresultsinrange": "Nuduhaké nganti {{PLURAL:$1|<strong>1</strong> kasil|<strong>$1</strong> kasil}} sajeroning penthangan #<strong>$2</strong> tekan #<strong>$3</strong>.",
        "search-showingresults": "{{PLURAL:$4|Asil <strong>$1</strong> saka <strong>$3</strong>|Asil <strong>$1 – $2</strong> saka <strong>$3</strong>}}",
        "search-nonefound": "Ora ana asil kang mathuk kuwèri.",
-       "search-nonefound-thiswiki": "Ora ana kasil sing jumbuh karo panjalukan ing situs iki.",
+       "search-nonefound-thiswiki": "Ora ana kasil kang jumbuh karo panjalukan ing situs iki.",
        "powersearch-legend": "Panggolèkan sabanjuré (''advance search'')",
        "powersearch-ns": "Golèk ing mandala aran:",
        "powersearch-togglelabel": "Pilih:",
        "powersearch-toggleall": "Kabèh",
        "powersearch-togglenone": "Ora ana",
-       "powersearch-remember": "Éling-éling sing dipilih kanggo golèkan ing tembé mburi",
+       "powersearch-remember": "Éling-éling kang dipilih kanggo golèkan ing tembé mburi",
        "search-external": "Gegolèkan manca",
        "searchdisabled": "Sawetara wektu iki panjenengan ora bisa nggolèk mawa fungsi golèk {{SITENAME}}. Kanggo saiki mangga panjenengan bisa golèk nganggo Google. Nanging isi indèks Google kanggo {{SITENAME}} bisa waé lawas lan durung dianyari.",
        "search-error": "Ana masalah nalika nggoleki: $1",
        "skin-preview": "Pratuduh",
        "datedefault": "Ora ana pilihan",
        "prefs-labs": "Piranti lab",
-       "prefs-user-pages": "Kacaning sing nganggo",
+       "prefs-user-pages": "Kacaning kang nganggo",
        "prefs-personal": "Profil panganggo",
        "prefs-rc": "Owah-owahan pungkasan",
        "prefs-watchlist": "Pawawangan",
        "prefs-editwatchlist": "Besut pawawangan",
-       "prefs-editwatchlist-label": "Besut isining pawawanganing sampéyan",
-       "prefs-editwatchlist-edit": "Deleng lan busak sesirah ing pawawanganing sampéyan",
+       "prefs-editwatchlist-label": "Besut isiné pawawangané panjenengan",
+       "prefs-editwatchlist-edit": "Deleng lan busek sesirah ing pawawangané panjenengan",
        "prefs-editwatchlist-raw": "Besut pawawangan lakaran",
-       "prefs-editwatchlist-clear": "Resiki pawawanganing sampéyan",
-       "prefs-watchlist-days": "Cacahé dina sing dituduhaké ing dhaftar pangawasan:",
+       "prefs-editwatchlist-clear": "Resiki pawawangané panjenengan",
+       "prefs-watchlist-days": "Cacah dina kanggo tinuduhaké ing pawawangan:",
        "prefs-watchlist-days-max": "Maksimum $1 {{PLURAL:$1|dina|dina}}",
-       "prefs-watchlist-edits": "Cacahé suntingan maksimum sing dituduhaké ing dhaftar pangawasan sing luwih jangkep:",
+       "prefs-watchlist-edits": "Cacah maksimum owahan kang kapacak ing pawawangan:",
        "prefs-watchlist-edits-max": "Gunggung maksimum: 1000",
        "prefs-watchlist-token": "Tokening pawawangan:",
+       "prefs-watchlist-managetokens": "Opèni token",
        "prefs-misc": "Liya-liya",
        "prefs-resetpass": "Ganti tembung wadi",
        "prefs-changeemail": "Owah utawa busak alamat layang-èl",
        "stub-threshold": "Watesan kanggo format pranala rintisan ($1):",
        "stub-threshold-sample-link": "pralampita",
        "stub-threshold-disabled": "Dipatèni",
-       "recentchangesdays": "Cacahé dina sing dituduhaké ing owah-owahan pungkasan:",
+       "recentchangesdays": "Cacahé dina kang dituduhaké ing owah-owahan pungkasan:",
        "recentchangesdays-max": "(maksimum $1 {{PLURAL:$1|dina|dina}})",
-       "recentchangescount": "Cacahing besutan sing dituduhaké kanthi baku:",
+       "recentchangescount": "Cacahing besutan kang dituduhaké kanthi baku:",
        "prefs-help-recentchangescount": "Iki klebu owah-owahan pungkasan, kaca sajarah, lan log.",
-       "prefs-help-watchlist-token2": "Ini adalah kunci rahasia (token) ke web feed dari daftar pantauan Anda.\nSiapa saja yang tahu akan dapat melihat daftar pantauan Anda, jadi jangan dibagikan.\n[[Special:ResetTokens|Klik di sini jika Anda perlu menyetel ulang]].",
+       "prefs-help-watchlist-token2": "Iki minangka kunci wadi menyang ''feed'' wèb ing pawawangané panjenengan.\nSapa baé kang ngerti iku bakal bisa maca pawawangané panjenengan, mula aja panjenengan dum-dum.\nPanjenengan bisa [[Special:ResetTokens|ngambali nyetèl]] yèn kudu.",
        "savedprefs": "Prèferènsi Panjenengan wis disimpen",
        "savedrights": "Golongan panganggo {{GENDER:$1|$1}} wis disimpen.",
        "timezonelegend": "Zona wektu:",
        "youremail": "Layang-èl:",
        "username": "{{GENDER:$1|Jeneng panganggo}}:",
        "prefs-memberingroups": "{{GENDER:$2|Anggota}} saka {{PLURAL:$1|golongan}}:",
+       "prefs-memberingroups-type": "$1",
        "group-membership-link-with-expiry": "$1 (tekan $2)",
        "prefs-registration": "Wektu régistrasi:",
+       "prefs-registration-date-time": "$1",
        "yourrealname": "Jeneng asli:",
-       "yourlanguage": "Basa sing dianggo:",
+       "yourlanguage": "Basa kang dianggo:",
        "yourvariant": "Werna basa isi:",
-       "prefs-help-variant": "Varian utawa ortograpi sing Sampéyan pilih kanggo nampilaké kaca kontèn saka wiki iki.",
+       "prefs-help-variant": "Varian utawa ortografi kang panjenengan pilih supaya kapajang ing kaca kontèn wiki iki.",
        "yournick": "Tapak asma anyar:",
-       "prefs-help-signature": "Tanggepan ing kaca parembugan kudu ditapakasmani mawa \"<nowiki>~~~~</nowiki>\", sing bakal salin dadi tapak asma lan tandha wektuné panjenengan.",
+       "prefs-help-signature": "Tanggepan ing kaca parembugan kudu ditapakasmani mawa \"<nowiki>~~~~</nowiki>\", kang bakal salin dadi tapak asma lan tandha wektuné panjenengan.",
        "badsig": "Tapak astanipun klèntu; cèk rambu HTML.",
        "badsiglength": "Tapak asta panjenengan kedawan.\nAja luwih saka {{PLURAL:$1|karakter|karakter}}.",
        "yourgender": "Kepiyé panjenengan nggambaraké salirané panjenengan?",
-       "gender-unknown": "Nalika nyebut panjenengan, piranti alusé bakal nganggo tembung sing nétral jèndher sabisané",
+       "gender-unknown": "Nalika nyebut panjenengan, piranti alusé bakal nganggo tembung kang nétral jèndher sabisané",
        "gender-male": "Lanang",
        "gender-female": "Wadon",
-       "prefs-help-gender": "Setèlané pilalan iki sipaté manasuka.\nPiranti alusé nganggo ajiné saperlu nyeluk lan nyebut panjenengan tumraping liyan sarana tembung gèndher sing patut sacara paramasastra.\nKaterangan iki bakal kanton marang umum.",
+       "prefs-help-gender": "Setèlané pilalan iki sipaté manasuka.\nPiranti alusé nganggo ajiné saperlu nyeluk lan nyebut panjenengan tumraping liyan sarana tembung gèndher kang patut sacara paramasastra.\nKaterangan iki bakal kanton marang umum.",
        "email": "Layang-èl",
        "prefs-help-realname": "Jeneng asli ora kudu diisi.\nYèn diisi, jeneng asliné panjenengan bakal kanggo atribusi awit karyané panjenengan.",
        "prefs-help-email": "Alamat layang-èl sipaté mung pilihan, nanging dibutuhaké kanggo nyetèl ulang tembung wadi yèn panjenengan lali.",
-       "prefs-help-email-others": "Sampéyan uga bisa milih kanggo ngidinaké wong liya ngubungi Sampéyan liwat layang èlèktronik sing ana ing kaca panganggo utawa kaca guneman.\nAlamat layang èlèktronik Sampéyan ora dituduhaké nalika wong liya ngubungi Sampéyan.",
+       "prefs-help-email-others": "Panjenengan uga bisa milih kanggo ngidinaké wong liya ngubungi panjenengan liwat layang èlèktronik kang ana ing kaca panganggo utawa kaca parembugan.\nAlamat layang èlèktronik panjenengan ora dituduhaké nalika wong liya ngubungi panjenengan.",
        "prefs-help-email-required": "Butuh alamat layang-èl.",
        "prefs-info": "Katerangan pokok",
        "prefs-i18n": "Internasionalisasi",
        "prefs-displaywatchlist": "Opsi pitontonan",
        "prefs-tokenwatchlist": "Token",
        "prefs-diffs": "Prabédan",
-       "prefs-help-prefershttps": "Pamiji iki bakal lumaku mentas sampeyan mbalèni mlebu.",
-       "prefs-tabs-navigation-hint": "Saran: Sampeyan bisa nganggo tombol jemparing kiwa lan tengen saperlu navigasi tab-tab ing pratélan tab.",
+       "prefs-help-prefershttps": "Pilalan iki bakal lumaku nalika panjenengan mlebu log manèh mengko.",
+       "prefs-tabs-navigation-hint": "Saran: Panjenengan bisa nganggo tombol jemparing kiwa lan tengen saperlu navigasi tab-tab ing pratélan tab.",
        "userrights": "Hak panganggo",
        "userrights-lookup-user": "Pilih panganggo",
        "userrights-user-editname": "Isi jeneng panganggo:",
        "saveusergroups": "Simpen golongan {{GENDER:$1|panganggo}}",
        "userrights-groupsmember": "Anggota saka:",
        "userrights-groupsmember-auto": "Anggota implisit saka:",
-       "userrights-groups-help": "Panjenengan bisa ngowahi grup-grup sing ana panganggoné iki.\n* Kothak sing dicenthang tegesé panganggo iki ana sajroné grup iku.\n* Kothak sing ora dicenthang tegesé panganggo iku ora ana ing grup iku.\n* Tandha bintang * tegesé panjenengan ora bisa ngilangi grup iku yèn wis tau nambah, utawa sawalikané.",
+       "userrights-groupsmember-type": "$1",
+       "userrights-groups-help": "Panjenengan bisa ngowahi grup-grup kang ana panganggoné iki.\n* Kothak kang dicenthang tegesé panganggo iki ana sajroné grup iku.\n* Kothak kang ora dicenthang tegesé panganggo iku ora ana ing grup iku.\n* Tandha bintang * tegesé panjenengan ora bisa ngilangi grup iku yèn wis tau nambah, utawa sawalikané.",
        "userrights-reason": "Alesan:",
        "userrights-no-interwiki": "Panjenengan ora ana hak kanggo ngowahi hak panganggo ing wiki liyané.",
-       "userrights-nodatabase": "Basis data $1 ora ana utawa ora lokal.",
-       "userrights-changeable-col": "Grup sing bisa panjenengan owahi",
-       "userrights-unchangeable-col": "Grup sing ora bisa diowahi panjenengan",
+       "userrights-nodatabase": "Basis dhatah $1 ora ana utawa ora enggonan.",
+       "userrights-changeable-col": "Grup kang bisa panjenengan owahi",
+       "userrights-unchangeable-col": "Grup kang ora bisa diowahi panjenengan",
+       "userrights-irreversible-marker": "$1*",
+       "userrights-no-shorten-expiry-marker": "$1#",
        "userrights-expiry-current": "Kadaluwarsa $1",
        "userrights-expiry-none": "Ora kadaluwarsa",
        "userrights-expiry": "Kadaluwarsa:",
-       "userrights-expiry-existing": "Wektu kadaluwarsa sing ana: $3, $2",
+       "userrights-expiry-existing": "Wektu kadaluwarsa kang ana: $3, $2",
        "userrights-expiry-othertime": "Wektu liya:",
        "userrights-expiry-options": "1 dina:1 dina,1 minggu:1 minggu,1 wulan:1 wulan,3 wulan:3 wulan,6 wulan:6 wulan,1 taun:1 taun",
        "userrights-invalid-expiry": "Wektu kadaluwarsa golongan \"$1\" ora trep.",
        "userrights-expiry-in-past": "Wektu kadaluwarsa golongan \"$1\" ana ing kala kawuri.",
-       "userrights-conflict": "Konflik pangowahan hak-hak panganggo! Tulung ditinjau maneh lan konfirmasi Pangowahan sampeyan.",
+       "userrights-conflict": "Konflik pangowahan hak-hak panganggo! Tulung ditinjau maneh lan konfirmasi owah-owahané panjenengan.",
        "group": "Golongan:",
        "group-user": "Para panganggo",
-       "group-autoconfirmed": "Panganggo sing otomatis kakonfirmasi",
+       "group-autoconfirmed": "Panganggo kang otomatis kakonfirmasi",
        "group-bot": "Bot",
        "group-sysop": "Pangurus",
        "group-bureaucrat": "Birokrat",
        "group-bureaucrat-member": "{{GENDER:$1|birokrat}}",
        "group-suppress-member": "{{GENDER:$1|pangawas}}",
        "grouppage-user": "{{ns:project}}:Para panganggo",
-       "grouppage-autoconfirmed": "{{ns:project}}:Panganggo sing otomatis kakonfirmasi",
+       "grouppage-autoconfirmed": "{{ns:project}}:Panganggo kang otomatis kakonfirmasi",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Pangurus",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrat",
        "grouppage-suppress": "{{ns:project}}:Oversight",
        "right-read": "Waca kaca",
        "right-edit": "Besut kaca",
-       "right-createpage": "Gawé kaca (sing dudu kaca parembugan)",
+       "right-createpage": "Gawé kaca (kang dudu kaca parembugan)",
        "right-createtalk": "Gawé kaca parembugan",
        "right-createaccount": "Gawé akun panganggo anyar",
        "right-autocreateaccount": "Otomatis mlebu log nganggo akun panganggo njaba",
        "right-move-rootuserpages": "Ngalih kaca panganggo oyod",
        "right-move-categorypages": "Lih kaca kategori",
        "right-movefile": "Lih barkas",
-       "right-suppressredirect": "Aja nggawé pangalihan saka kaca sing lawas yèn mindhah sawijining kaca",
+       "right-suppressredirect": "Aja nggawé pangalihan saka kaca kang lawas yèn mindhah kaca",
        "right-upload": "Unggah barkas",
-       "right-reupload": "Tindhihana sawijining berkas sing wis ana",
-       "right-reupload-own": "Nimpa sawijining berkas sing wis ana lan diunggahaké déning panganggo sing padha",
-       "right-reupload-shared": "Timpanana berkas-berkas ing khazanah binagi sacara lokal",
-       "right-upload_by_url": "Ngunggahaké berkas saka sawijining alamat URL",
-       "right-purge": "Kosongna ''cache'' situs iki kanggo sawijining kaca tanpa kaca konfirmasi",
+       "right-reupload": "Tindhihana barkas kang ana",
+       "right-reupload-own": "Nimpa barkas kang ana lan diunggah panganggo kang padha",
+       "right-reupload-shared": "Timpanana barkas ing panyimpenan médhiya barengan lokal",
+       "right-upload_by_url": "Ngunggahaké barkas saka alamat URL",
+       "right-purge": "Kosongna ''cache'' situs iki kanggo kaca tanpa konfirmasi",
        "right-autoconfirmed": "Owah kaca-kaca sémi-reksa",
        "right-bot": "Anggepen minangka prosès otomatis",
        "right-nominornewtalk": "Suntingan sithik (''minor'') ora ngwetokaké prompt pesen anyar",
-       "right-apihighlimits": "Nganggo wates sing luwih dhuwur ing kwéri API",
+       "right-apihighlimits": "Nganggo wates kang luwih dhuwur ing kwéri API",
        "right-writeapi": "Nganggo API tulis",
        "right-delete": "Busak kaca",
-       "right-bigdelete": "Busak kaca-kaca mawa sajarah panyuntingan sing gedhé",
+       "right-bigdelete": "Busak kaca mawa sajarah besutan kang gedhé",
        "right-deletelogentry": "Busak lan wurung busak èntri log tartamtu",
        "right-deleterevision": "Busak lan wurung busak owahan tinamtuné kaca",
-       "right-deletedhistory": "Ndeleng sajarah èntri-èntri kabusak, tanpa bisa ndeleng apa sing dibusak",
-       "right-deletedtext": "Deleng tèks sing dibusak lan owah-owahan antarané révisi sing dibusak",
-       "right-browsearchive": "Golèk kaca-kaca sing wis dibusak",
+       "right-deletedhistory": "Ndeleng sajarah èntri-èntri kabusak, tanpa bisa ndeleng apa kang dibusak",
+       "right-deletedtext": "Deleng tèks kang dibusak lan owah-owahan antarané révisi kang dibusak",
+       "right-browsearchive": "Golèk kaca kang wis kabusek",
        "right-undelete": "Wurung busak kaca",
        "right-suppressrevision": "Deleng, dhelikaké, lan wurung dhelikaké owahan tinamtu kaca-kacané panganggo sembarang",
-       "right-viewsuppressed": "Deleng owahan sing didhelikaké saka panganggo sembarang",
+       "right-viewsuppressed": "Deleng owahan kang didhelikaké saka panganggo sembarang",
        "right-suppressionlog": "Deleng log priangga",
-       "right-block": "Blokir panganggo-panganggo liya saka panyuntingan",
-       "right-blockemail": "Blokir sawijining panganggo saka ngirim e-mail",
+       "right-block": "Blokir panganggo liya saka mbesut",
+       "right-blockemail": "Blokir panganggo saka ngirim e-mail",
        "right-hideuser": "Blokir jeneng panganggo, lan delikna saka umum",
        "right-ipblock-exempt": "Bypass pamblokiran IP, pamblokiran otomatis lan pamblokiran rangkéan",
        "right-unblockself": "Bukak blokirané dhéwéké",
-       "right-protect": "Owahi tataran rereksan lan besut kaca sing direksa-runtun",
-       "right-editprotected": "Besut kaca sing direksa kanthi \"{{int:protect-level-sysop}}\"",
-       "right-editsemiprotected": "Owah kaca-kaca sing direksa dadi \"{{int:protect-level-autoconfirmed}}\"",
+       "right-protect": "Owahi tataran rereksan lan besut kaca kang direksa-runtun",
+       "right-editprotected": "Besut kaca kang kareksa \"{{int:protect-level-sysop}}\"",
+       "right-editsemiprotected": "Owah kaca kang kareksa \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Besut modhèl kontèn kaca",
        "right-editinterface": "Besut antarmuka panganggo",
        "right-editusercss": "Besut barkas-barkas CSS panganggo liya",
        "right-edituserjs": "Besut barkas-barkas JavaScript panganggo liya",
-       "right-editmyusercss": "Owahi berkas CSS panganggo sampeyan",
-       "right-editmyuserjs": "Owahi berkas JavaScript panganggo sampeyan",
+       "right-editmyusercss": "Owahi barkas CSS panganggo panjenengan",
+       "right-editmyuserjs": "Owahi barkas JavaScript panganggo panjenengan",
        "right-viewmywatchlist": "Deleng pawawangané panjenengan",
-       "right-editmywatchlist": "Owahi daftar pangawasan sampeyan. Cathetan: ana cara liyane kanggo nambahi kaca menyang daftar, sanadyan ora duwe hak iki.",
+       "right-editmywatchlist": "Owahi pawawangané panjenengan. Cathetan: ana cara liyane kanggo nambahi kaca menyang pratélan, sanadyan ora duwe hak iki.",
        "right-viewmyprivateinfo": "Deleng dhata prianggané panjenengan dhéwé (kaya ta alamat layang-èl, jeneng asli)",
        "right-editmyprivateinfo": "Besut dhata prianggané panjenengan dhéwé (kaya ta alamat layang-èl, jeneng asli)",
-       "right-editmyoptions": "Owahi preferensi sampeyan",
-       "right-rollback": "Balèkaké kanthi gelis besutaning panganggo pungkasan sing mbesut kaca tinamtu",
-       "right-markbotedits": "Tandhani besutan sing kawurungan yèn besutan bot",
+       "right-editmyoptions": "Owahi pilalané panjenengan",
+       "right-rollback": "Balèkaké kanthi gelis besutaning panganggo pungkasan kang mbesut kaca tinamtu",
+       "right-markbotedits": "Tandhani besutan kang kawurungan yèn besutan bot",
        "right-noratelimit": "Ora dipengaruhi déning wates cacahing suntingan.",
        "right-import": "Impor kaca-kaca saka wiki liya",
        "right-importupload": "Impor kaca saka unggahan barkas",
        "right-patrol": "Tandhani besutané wong liya yèn wis kapriksa",
        "right-autopatrol": "Gawé supaya suntingan-suntingan ditandhani minangka wis dipatroli",
        "right-patrolmarks": "Ndeleng tandha-tandha patroli owah-owahan anyar",
-       "right-unwatchedpages": "Tuduhna daftar kaca-kaca sing ora diawasi",
+       "right-unwatchedpages": "Deleng pratélan kaca kang ora ingawasan",
        "right-mergehistory": "Gabung sajarah kaca",
        "right-userrights": "Besut kabèh hak panganggo",
        "right-userrights-interwiki": "Besut hak-haking panganggo asal wiki jaba",
-       "right-siteadmin": "Kunci lan buka kunci basis data",
+       "right-siteadmin": "Gembok lan bukak gembok basis dhatah",
        "right-override-export-depth": "Èkspor kaca klebu kaca kagandhèng nganti tataran/''depth'' 5",
        "right-sendemail": "Ngirim layang listrik (e-mail) menyang panganggo liya",
        "grant-group-page-interaction": "Srawungan karo kaca",
        "grant-group-file-interaction": "Srawungan karo médhia",
        "grant-group-watchlist-interaction": "Srawungan karo pawawangané panjenengan",
        "grant-group-email": "Kirim layang-èl",
-       "grant-group-high-volume": "Ngayahi kagiyatan sing akih",
+       "grant-group-high-volume": "Ngayahi kagiyatan kang akih",
        "grant-group-customization": "Panglarasan lan pilalan",
-       "grant-group-administration": "Ngayahi tumindak administratif",
+       "grant-group-administration": "Ngayahi laku administratif",
        "grant-group-private-information": "Ngaksès dhata pribadhi ngenani panjenengan",
        "grant-group-other": "Kagiyatan rena-rena",
        "grant-blockusers": "Blokir lan uculaké blokirané panganggo",
        "grant-editmycssjs": "Besut CSS/JavaScript panganggomu",
        "grant-editmyoptions": "Besut préferènsi panganggomu",
        "grant-editmywatchlist": "Besut pawawangané panjenengan",
-       "grant-editpage": "Besut kaca sing ana",
-       "grant-editprotected": "Besut kaca sing direksa",
+       "grant-editpage": "Besut kaca kang ana",
+       "grant-editprotected": "Besut kaca kang kareksa",
        "grant-highvolume": "Besutan gedhi",
        "grant-oversight": "Dhelikaké panganggo dalah révisiné",
        "grant-patrol": "Awasi owahané kaca",
        "grant-uploadeditmovefile": "Unggah, ganti, lan lih barkas",
        "grant-uploadfile": "Unggah barkas anyar",
        "grant-basic": "Hak pokok",
-       "grant-viewdeleted": "Deleng barkas lan kaca sing dibusak",
+       "grant-viewdeleted": "Deleng barkas lan kaca kang kabusek",
        "grant-viewmywatchlist": "Deleng pawawangané panjenengan",
-       "grant-viewrestrictedlogs": "Deleng isian log sing winates",
+       "grant-viewrestrictedlogs": "Deleng isian log kang winates",
        "newuserlogpage": "Log panganggo anyar",
        "newuserlogpagetext": "Ing ngisor iki kapacak log pandaftaran panganggo anyar.",
        "rightslog": "Log hak panganggo",
        "action-createtalk": "gawé kaca parembugan iki",
        "action-createaccount": "gawé akun panganggo iki",
        "action-autocreateaccount": "otomatis nggawé akun panganggo njaba iki",
-       "action-history": "deleng sujarahé kaca iki",
+       "action-history": "deleng sajarahé kaca iki",
        "action-minoredit": "tandhani besutan iki yèn besutan cilik",
        "action-move": "alih kaca iki",
        "action-move-subpages": "lih kaca iki, lan anak-kacané",
        "action-move-categorypages": "alih kaca kategori",
        "action-movefile": "alih barkas iki",
        "action-upload": "ngunggah barkas iki",
-       "action-reupload": "nindhih berkas sing wis ana",
-       "action-reupload-shared": "nindhih berkas sing wis ana ing papan panyimpanan berkas sing dianggo bebarengan",
-       "action-upload_by_url": "unggahna berkas iki saka sawijining alamat URL",
+       "action-reupload": "nindhih barkas kang wis ana",
+       "action-reupload-shared": "nindhih barkas kang wis ana ing papan panyimpanan barkas kang dianggo bebarengan",
+       "action-upload_by_url": "unggahna barkas iki saka alamat URL",
        "action-writeapi": "migunakaké API panulisan",
        "action-delete": "busak kaca iki",
        "action-deleterevision": "busak révisi",
        "action-deletelogentry": "busak isian log",
-       "action-deletedhistory": "deleng sajarah sing dibusak sawijiné kaca",
-       "action-deletedtext": "deleng tèks révisi sing dibusak",
-       "action-browsearchive": "nggolèki kaca-kaca sing wis dibusak",
+       "action-deletedhistory": "deleng sajarah kaca kang dibusak",
+       "action-deletedtext": "deleng tèks révisi kang dibusak",
+       "action-browsearchive": "golèk kaca kang wis kabusek",
        "action-undelete": "wurung busak kaca",
-       "action-suppressrevision": "tinjo lan balèkaké révisi sing didhelikaké",
+       "action-suppressrevision": "tinjo lan balèkaké révisi kang didhelikaké",
        "action-suppressionlog": "deleng log priangga iki",
        "action-block": "malang panganggo iki mbesut",
        "action-protect": "owahi tataran rereksané kaca iki",
-       "action-rollback": "gelis mbalèkaké suntingané panganggo pungkasan nèng sawijining saca",
+       "action-rollback": "gelis mbalèkaké suntingané panganggo pungkasan ing kaca tinamtu",
        "action-import": "impor kaca saka wiki liyané",
-       "action-importupload": "impor kaca iki saka pamunggahan berkas",
+       "action-importupload": "impor kaca iki saka pamunggahan barkas",
        "action-patrol": "nandhani besutan wong liya yèn wis kapriksa",
        "action-autopatrol": "nandhani besutané panjenengan dhéwé yèn wis kapriksa",
-       "action-unwatchedpages": "deleng pratélan kaca sing ingawasan",
+       "action-unwatchedpages": "deleng pratélan kaca kang ingawasan",
        "action-mergehistory": "nggabungaké sajarah kaca iki",
        "action-userrights": "besut kabèh hak panganggo",
        "action-userrights-interwiki": "besut hak aksès panganggo ing wiki liyané",
-       "action-siteadmin": "ngunci utawa mbukak kunci basis data",
+       "action-siteadmin": "nggembok utawa mbukak gembok basis dhatah",
        "action-sendemail": "kirim layang-èl",
        "action-editmyoptions": "besut pilalané panjenengan",
-       "action-editmywatchlist": "owahi daftar pantauan sampeyan",
-       "action-viewmywatchlist": "dheleng daftar pantauan sampeyan",
+       "action-editmywatchlist": "owahi pawawangané panjenengan",
+       "action-viewmywatchlist": "deleng pawawangané panjenengan",
        "action-viewmyprivateinfo": "deleng katerangan prianggané panjenengan",
        "action-editmyprivateinfo": "besut katerangan prianggané panjenengan",
-       "action-editcontentmodel": "besut modhèl kontèné sawijiné kaca",
+       "action-editcontentmodel": "besut modhèl kontèné kaca",
        "action-managechangetags": "gawé lan patèni tag",
-       "action-applychangetags": "pasang tenger sing mbarengi owahané panjenengan",
+       "action-applychangetags": "pasang tenger kang mbarengi owahané panjenengan",
        "action-changetags": "tambah lan busak tag arbitrèr ing saben révisi lan isian log",
        "action-deletechangetags": "busak tag saka sasana dhata",
        "action-purge": "buwang kaca iki",
        "nchanges": "$1 {{PLURAL:$1|pangowahan|owah-owahan}}",
+       "ntimes": "$1×",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|saka keri dhewe mrene}}",
        "enhancedrc-history": "sajarah",
        "recentchanges": "Owahan-owahan anyar",
        "recentchanges-legend": "Opsi owah-owahan anyar",
        "recentchanges-summary": "Lacak owah-owahan anyar wiki iki ing kaca iki.",
-       "recentchanges-noresult": "Ora ana owahan ing kalamangsa sing mathuk karo pranatan iki.",
+       "recentchanges-noresult": "Ora ana owahan ing kalamangsa iku kang mathuk karo pranatan iki.",
        "recentchanges-feed-description": "Urutna owah-owahan anyar ing wiki ing ''feed'' iki.",
        "recentchanges-label-newpage": "Besutan iki nggawé kaca anyar",
        "recentchanges-label-minor": "Iki besutan cilik",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (uga delengen [[Special:NewPages|pratélané kaca-kaca anyar]])",
        "recentchanges-legend-plusminus": "(''±123'')",
        "recentchanges-submit": "Tuduhaké",
+       "rcfilters-tag-remove": "Busek '$1'",
        "rcfilters-legend-heading": "<strong>Pratélané cekakan:</strong>",
        "rcfilters-other-review-tools": "Piranti pamriksa liyané",
        "rcfilters-group-results-by-page": "Golongaké kasilé miturut kacané",
        "rcfilters-activefilters": "Saringan murub",
+       "rcfilters-activefilters-hide": "Dhelikaké",
+       "rcfilters-activefilters-show": "Tuduhaké",
        "rcfilters-advancedfilters": "Saringan lanjutan",
        "rcfilters-limit-title": "Kasil kang arep dituduhaké",
-       "rcfilters-days-title": "Dina-dina sing mentas waé",
-       "rcfilters-hours-title": "Jam-jam sing mentas waé",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|owahan|owahan}}, $2",
+       "rcfilters-date-popup-title": "Dawané wektu kang arep panjenengan golèki",
+       "rcfilters-days-title": "Dina-dina iki",
+       "rcfilters-hours-title": "Jam-jam iki",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|dina|dina}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|jam|jam}}",
+       "rcfilters-highlighted-filters-list": "Kasuwur: $1",
        "rcfilters-quickfilters": "Saringan sumimpen",
        "rcfilters-quickfilters-placeholder-title": "Durung ana saringan kang kasimpen",
        "rcfilters-quickfilters-placeholder-description": "Saperlu nyimpen setèlaning saringan lan nganggo setèlan iku manèh ing tembé, kliken ikon markah buku ing babagan Saringan Murub ing ngisor.",
        "rcfilters-savedqueries-unsetdefault": "Wutung ndadèkaké baku",
        "rcfilters-savedqueries-remove": "Busak",
        "rcfilters-savedqueries-new-name-label": "Jeneng",
+       "rcfilters-savedqueries-new-name-placeholder": "Wedharaké ancasé saringané",
        "rcfilters-savedqueries-apply-label": "Gawé saringan",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "Gawé saringan baku",
        "rcfilters-savedqueries-cancel-label": "Wurung",
-       "rcfilters-savedqueries-add-new-title": "Simpen setèlané saringan sing saiki",
+       "rcfilters-savedqueries-add-new-title": "Simpen setèlané saringan kang saiki",
+       "rcfilters-savedqueries-already-saved": "Saringan iki wis kasimpen. Ganti setèlané panjenengan saperlu nggawé Saringan Kasimpen kang anyar.",
        "rcfilters-restore-default-filters": "Pulihaké saringan gawan",
        "rcfilters-clear-all-filters": "Resiki kabèh saringan",
+       "rcfilters-show-new-changes": "Deleng owah-owahan anyar dhéwé",
        "rcfilters-search-placeholder": "Owah-owahan saringan (anggo menu utawa golèk jeneng saringan)",
        "rcfilters-invalid-filter": "Saringan ora sah",
-       "rcfilters-empty-filter": "Ora ana saringan sing aktif. Kabèh sumbangan katuduhaké.",
+       "rcfilters-empty-filter": "Ora ana saringan kang aktif. Kabèh sumbangan katuduhaké.",
        "rcfilters-filterlist-title": "Saringan",
        "rcfilters-filterlist-whatsthis": "Kapiyé cara nganggo iki?",
        "rcfilters-filterlist-feedbacklink": "Kandhani awak dhéwé panemumu bab piranti saringan iki",
        "rcfilters-filter-editsbyself-description": "Pisumbangé panjenengan dhéwé.",
        "rcfilters-filter-editsbyother-label": "Owah-owahané liyan",
        "rcfilters-filter-editsbyother-description": "Kabèh owahan kajaba duwèké panjenengan.",
-       "rcfilters-filtergroup-userExpLevel": "Tataran pangalaman (mung kanggo panganggo kadhaftar)",
+       "rcfilters-filtergroup-userExpLevel": "Pandhaftaran lan pangalaman pangguna",
        "rcfilters-filter-user-experience-level-registered-label": "Kadhaftar",
-       "rcfilters-filter-user-experience-level-registered-description": "Pambesut sing mlebu log.",
+       "rcfilters-filter-user-experience-level-registered-description": "Pambesut kang mlebu log.",
        "rcfilters-filter-user-experience-level-unregistered-label": "Ora kadhaftar",
-       "rcfilters-filter-user-experience-level-unregistered-description": "Pambesut sing ora mlebu log.",
+       "rcfilters-filter-user-experience-level-unregistered-description": "Pambesut kang ora mlebu log.",
        "rcfilters-filter-user-experience-level-newcomer-label": "Wong neneka anyar",
-       "rcfilters-filter-user-experience-level-newcomer-description": "Kurang saka 10 besutan lan 4 dina kagiyatan.",
+       "rcfilters-filter-user-experience-level-newcomer-description": "Pambesut kadhartar mawa besutan kurang saka 10 utawa aktif kurang saka 4 dina.",
        "rcfilters-filter-user-experience-level-learner-label": "Wong sinau",
        "rcfilters-filter-user-experience-level-learner-description": "Luwih akèh pangalamané tinimbang \"Wong neneka anyar\" nanging durung ngèmperi \"Panganggo kawakan\".",
        "rcfilters-filter-user-experience-level-experienced-label": "Panganggo kawakan",
        "rcfilters-filter-reviewstatus-unpatrolled-label": "Uculi pangawasan",
        "rcfilters-filtergroup-significance": "Kawigatèn",
        "rcfilters-filter-minor-label": "Besutan cilik",
-       "rcfilters-filter-minor-description": "Besutan sing ditandhani pangriptané minangka besutan cilik.",
+       "rcfilters-filter-minor-description": "Besutan kang ditandhani pangriptané minangka besutan cilik.",
        "rcfilters-filter-major-label": "Besutan ora cilik",
-       "rcfilters-filter-major-description": "Besutan sing ora ditandhani minangka besutan cilik.",
-       "rcfilters-filtergroup-watchlist": "Kaca sing ana ing pawawangan",
+       "rcfilters-filter-major-description": "Besutan kang ora ditandhani minangka besutan cilik.",
+       "rcfilters-filtergroup-watchlist": "Kaca ing pawawangan",
        "rcfilters-filter-watchlist-watched-label": "Ana ing Pawawangan",
        "rcfilters-filter-watchlist-watched-description": "Owahané kaca-kaca ing Pawawangané panjenengan.",
        "rcfilters-filter-watchlist-watchednew-label": "Owah-owahané Pawawangan anyar",
-       "rcfilters-filter-watchlist-watchednew-description": "Owah-owahan ngenani kaca-kaca ing Pawawangané panjenengan sing durung ditiliki.",
+       "rcfilters-filter-watchlist-watchednew-description": "Owah-owahan ngenani kaca-kaca ing Pawawangané panjenengan kang durung ditiliki.",
        "rcfilters-filter-watchlist-notwatched-label": "Ora ana ing Pawawangan",
        "rcfilters-filter-watchlist-notwatched-description": "Samubarang kajaba owah-owahané kaca-kaca ing ana ing Pawawangané panjenengan.",
        "rcfilters-filtergroup-changetype": "Jinisé owahan",
        "rcfilters-filter-pageedits-label": "Besutan kaca",
        "rcfilters-filter-pageedits-description": "Besutan marang kontèn wiki, parembugan, wedharan kategori....",
        "rcfilters-filter-newpages-label": "Gawéan kaca",
-       "rcfilters-filter-newpages-description": "Besutan sing nggawé kaca anyar.",
+       "rcfilters-filter-newpages-description": "Besutan kang nggawé kaca anyar.",
        "rcfilters-filter-categorization-label": "Owah-owahan kategori",
        "rcfilters-filter-categorization-description": "Cathethan ngenani mlebu-metuné kaca saka kategori.",
-       "rcfilters-filter-logactions-label": "Tumindak njeron log",
-       "rcfilters-filter-logactions-description": "Tumindak administratif, gawéan akun, busakan kaca, unggahan....",
+       "rcfilters-filter-logactions-label": "Laku ing jero log",
+       "rcfilters-filter-logactions-description": "Laku administratif, panggawé akun, pambusak kaca, unggahan...",
        "rcfilters-filtergroup-lastRevision": "Révisi pungkasan",
        "rcfilters-filter-lastrevision-label": "Révisi pungkasan",
        "rcfilters-filter-lastrevision-description": "Mung owahan paling anyar marang kacané.",
        "rcfilters-filter-previousrevision-label": "Dudu révisi pungkasan",
-       "rcfilters-filter-previousrevision-description": "Kabèh owahan sing dudu \"révisi pungkasan\".",
-       "rcfilters-view-tags": "Besutan sing tinengeran",
+       "rcfilters-filter-previousrevision-description": "Kabèh owahan kang dudu \"révisi pungkasan\".",
+       "rcfilters-view-tags": "Besutan kang tinengeran",
        "rcfilters-view-namespaces-tooltip": "Saring kasilé miturut mandala-arané",
        "rcfilters-view-tags-tooltip": "Saring kasilé nganggo tengering besutan",
-       "rcnotefrom": "Ing ngisor iki {{PLURAL:$5|owah-owahan}} kawit <strong>$3, $4</strong> (sing kapacak nganti <strong>$1</strong> owah-owahan).",
+       "rcnotefrom": "Ing ngisor iki {{PLURAL:$5|owah-owahan}} kawit <strong>$3, $4</strong> (kang kapacak nganti <strong>$1</strong> owah-owahan).",
        "rclistfrom": "Tuduhaké owah-owahan anyar kawit $2, $3",
        "rcshowhideminor": "$1 besutan cilik",
        "rcshowhideminor-show": "Tuduhaké",
        "minoreditletter": "c",
        "newpageletter": "A",
        "boteditletter": "b",
-       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|cacahé sing ngawasi|cacahé sing ngawasi}}]",
+       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|cacahé kang ngawasi|cacahé kang ngawasi}}]",
        "rc-change-size-new": "$1 {{PLURAL:$1|bèt|bèt}} sawisé kaowahan",
        "newsectionsummary": "/* $1 */ pérangan anyar",
        "rc-enhanced-expand": "Tuduhaké princèn",
        "recentchangeslinked-feed": "Owah-owahan kang magepokan",
        "recentchangeslinked-toolbox": "Owahan magepokan",
        "recentchangeslinked-title": "Owah-owahan kang magepokan \"$1\"",
-       "recentchangeslinked-summary": "Iki pratélaning owah-owahan sing mentas digawé tumrap ing kaca-kaca sing nggayut sawijining kaca (utawa kaca-kaca anggotaning sawijining kategori).\nKaca ing [[Special:Watchlist|pawawangané panjenegan]] <strong>dikandeli</strong>.",
+       "recentchangeslinked-summary": "Iki pratélan owah-owahan kang mentas digawé tumrap ing kaca-kaca kang nggayut kaca (utawa kaca-kaca anggotané siji kategori).\nKaca ing [[Special:Watchlist|pawawangané panjenegan]] <strong>dikandeli</strong>.",
        "recentchangeslinked-page": "Jeneng kaca:",
        "recentchangeslinked-to": "Tuduhaké owahané kaca kang nggayut kaca iki",
        "recentchanges-page-added-to-category": "[[:$1]] ditambahaké ing kategori",
        "upload": "Unggah barkas",
        "uploadbtn": "Unggah barkas",
        "reuploaddesc": "Wurung ngunggah lan bali menyang formulir unggahan",
-       "upload-tryagain": "Kirim déskripsi berkas sing wis diowah",
+       "upload-tryagain": "Kirim déskripsi barkas kang wis diowah",
        "uploadnologin": "Durung mlebu log",
        "uploadnologintext": "Mangga $1 saperlu ngunggah barkas.",
-       "upload_directory_missing": "Direktori pamunggahan ($1) ora ditemokaké lan ora bisa digawé déning server wèb.",
+       "upload_directory_missing": "Dhirèktori unggahan ($1) ora tinemu lan ora bisa digawé déning server wèb.",
        "upload_directory_read_only": "Dhirèktori pangunggahan ($1) ora bisa ditulis déning paladèn jaringan.",
-       "uploaderror": "Kaluputan pangunggahan berkas",
-       "upload-recreate-warning": "'''Pèngetan: Berkas mawa jeneng kuwi wis dibusak utawa disingkiraké.'''\n\nLog pambusakan lan panyingkiran saka kaca iki sumadhiya nèng kéné:",
-       "uploadtext": "Anggonen formulir ngisor iki saperlu ngunggah barkas.\nKanggo ndeleng utawa nggolèki barkas sing wis diunggah sadurungé, panjenengan menyanga [[Special:FileList|pratélan barkas unggahan]]. Barkas unggahan ulang uga kacathet ing [[Special:Log/upload|log unggah]], déné barkas busakan ing [[Special:Log/delete|log busak]].\n\nKanggo muwuhi barkas ing kaca, anggonen pranala kanthi formulir ing ngisor iki, pilih salah siji:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> saperlu nganggo barkasé kanthi vèrsi sing wutuh\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> saperlu nganggo barkasé kanthi amba 200 piksel déné ana ing njeron kothak lan kapacak ing sisih kiwané kaca mawa \"alt text\" minangka katerangané\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> saperlu nggayutaké langsung barkasé tanpa mitontonaké barkasé dhéwé",
-       "upload-permitted": "{{PLURAL:$2|Jinis}} barkas sing diidinaké: $1.",
-       "upload-preferred": "{{PLURAL:$2|Jinis}} barkas sing diprayogakaké: $1.",
-       "upload-prohibited": "{{PLURAL:$2|Jinis}} barkas sing dilarang: $1.",
+       "uploaderror": "Masalah pangunggah",
+       "upload-recreate-warning": "'''Pèngetan: Barkas mawa jeneng iku wis dibusak utawa disingkiraké.'''\n\nLog pambusakan lan panyingkiran saka kaca iki sumadhiya ing kéné:",
+       "uploadtext": "Anggonen formulir ngisor iki saperlu ngunggah barkas.\nKanggo ndeleng utawa nggolèki barkas kang wis diunggah sadurungé, panjenengan menyanga [[Special:FileList|pratélan barkas unggahan]]. Barkas unggahan ulang uga kacathet ing [[Special:Log/upload|log unggah]], déné barkas busakan ing [[Special:Log/delete|log busak]].\n\nKanggo muwuhi barkas ing kaca, anggonen pranala kanthi formulir ing ngisor iki, pilih salah siji:\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.jpg]]</nowiki></code></strong> saperlu nganggo barkasé kanthi vèrsi kang wutuh\n* <strong><code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:File.png|200px|thumb|left|alt text]]</nowiki></code></strong> saperlu nganggo barkasé kanthi amba 200 piksel déné ana ing njeron kothak lan kapacak ing sisih kiwané kaca mawa \"alt text\" minangka katerangané\n* <strong><code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:File.ogg]]</nowiki></code></strong> saperlu nggayutaké langsung barkasé tanpa mitontonaké barkasé dhéwé",
+       "upload-permitted": "{{PLURAL:$2|Jinis}} barkas kang kaolèhaké: $1.",
+       "upload-preferred": "{{PLURAL:$2|Jinis}} barkas kang kaprayogakaké: $1.",
+       "upload-prohibited": "{{PLURAL:$2|Jinis}} barkas kang kalarang: $1.",
        "uploadlogpage": "Log unggah",
-       "uploadlogpagetext": "Ing ngisor iki kapacak log pangunggahan berkas sing anyar dhéwé.\nMangga mirsani [[Special:NewFiles|galeri berkas-berkas anyar]] kanggo pratélan visual.",
+       "uploadlogpagetext": "Ing ngisor iki kapacak log pangunggahan barkas kang anyar dhéwé.\nMangga mirsani [[Special:NewFiles|galeri barkas anyar]] kanggo pratélan visual.",
        "filename": "Jeneng barkas",
        "filedesc": "Ringkesan",
        "fileuploadsummary": "Ringkesan:",
-       "filereuploadsummary": "Owah-owahan berkas:",
+       "filereuploadsummary": "Owah-owahan barkas:",
        "filestatus": "Status hak cipta",
        "filesource": "Sumber",
        "ignorewarning": "Lirwakaké pepéling lan simpen langsung barkasé.",
        "ignorewarnings": "Lirwakaké samubarang pepéling",
-       "minlength1": "Jeneng berkas paling ora minimal kudu awujud saaksara.",
-       "illegalfilename": "Jeneng berkas \"$1\" ngandhut aksara sing ora diparengaké ana sajroning irah-irahan kaca. Mangga owahana jeneng berkas iku lan cobanen  diunggahaké manèh.",
-       "filename-toolong": "Jeneng berkas ora olèh luwih dawa saka 240 bita.",
+       "minlength1": "Jeneng barkas saorané ngemu sakurup.",
+       "illegalfilename": "Jeneng barkas \"$1\" ngandhut aksara kang ora diparengaké ana sajroning irah-irahan kaca. Mangga owahana jeneng barkas iku lan cobanen  diunggahaké manèh.",
+       "filename-toolong": "Jeneng barkas ora kena munjuli 240 bèt.",
        "badfilename": "Jeneng barkas wis diowah dadi \"$1\".",
-       "filetype-mime-mismatch": "Èkstènsi berkas \".$1\" ora cocok karo jinis MIME sing kadètèk saka berkas ($2).",
-       "filetype-badmime": "Berkas mawa tipe MIME \"$1\" ora pareng diunggahaké.",
-       "filetype-bad-ie-mime": "Ora bisa ngunggahaké berkas iki amarga Internet Explorer ndhétèksi minangka \"$1\", sing ora diidinaké lan minangka tipe berkas sing nduwèni potènsi mbebayani.",
-       "filetype-unwanted-type": "'''\".$1\"''' klebu jenis berkas sing ora diidinaké.\nLuwih becik {{PLURAL:$3|jinis berkas|Jinis-jinis berkas}} $2.",
-       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|dudu jinis barkas sing diidinaké}}.\n{{PLURAL:$3|Jinis barkas}} sing diidinaké $2.",
-       "filetype-missing": "Berkas ini ora duwé ekstènsi (contoné \".jpg\").",
-       "empty-file": "Barkas sing panjenengan kirim kosong.",
-       "file-too-large": "Barkas sing panjenengan kirim kagedhèn.",
+       "filetype-mime-mismatch": "Èkstènsi barkas \".$1\" ora cocog karo jinis MIME kang kadètèk saka barkas ($2).",
+       "filetype-badmime": "Barkas jinis MIME \"$1\" ora kena kaunggah.",
+       "filetype-bad-ie-mime": "Ora bisa ngunggahaké barkas iki amarga Internet Explorer ndhétèksi minangka \"$1\", kang ora diidinaké lan minangka tipe barkas kang nduwèni potènsi mbebayani.",
+       "filetype-unwanted-type": "<strong>\".$1\"</strong> iku jinis barkas kang ora kapéngini.\nAluwung {{PLURAL:$3|jinis barkasé}} $2.",
+       "filetype-banned-type": "<strong>\".$1\"</strong> {{PLURAL:$4|dudu jinis barkas kang diidinaké}}.\n{{PLURAL:$3|Jinis barkas}} kang diidinaké $2.",
+       "filetype-missing": "Barkas ini ora duwé ekstènsi (contoné \".jpg\").",
+       "empty-file": "Barkas kang panjenengan lebokaké kosong.",
+       "file-too-large": "Barkas kang panjenengan lebokaké kagedhèn.",
        "filename-tooshort": "Jeneng barkas kecendhèken.",
        "filetype-banned": "Barkas jinis iki dilarang.",
        "verification-error": "Barkas iki ora lulus vèrifikasi.",
-       "hookaborted": "Owahan sing panjenengan ayahi diwurungaké déning èkstènsi.",
+       "hookaborted": "Owahan kang panjenengan ayahi diwurungaké déning èkstènsi.",
        "illegal-filename": "Jeneng barkas ora diidinaké.",
-       "overwrite": "Nibani berkas sing wis ana ora dililakaké.",
-       "unknown-error": "Ana masalah sing ora dingertèni.",
-       "tmp-create-error": "Ora bisa nggawé berkas sawetara.",
-       "tmp-write-error": "Ora bisa nulis berkas sawetara.",
-       "large-file": "Ukuran berkas disaranaké supaya ora ngluwihi $1 bita; berkas iki ukurané $2 bita.",
-       "largefileserver": "Barkas iki luwih gedhé tinimbang sing diidinaké ing paladèn.",
-       "emptyfile": "Berkas sing panjenengan unggahaké katoné kosong. Mbokmenawa iki amerga anané salah ketik ing jeneng berkas. Mangga dipastèkaké apa panjenengan pancèn kersa ngunggahaké berkas iki.",
+       "overwrite": "Nibani barkas kang wis ana ora dililakaké.",
+       "unknown-error": "Ana masalah kang ora dingertèni.",
+       "tmp-create-error": "Ora bisa nggawé barkas sauntara.",
+       "tmp-write-error": "Ora bisa nulis barkas sauntara.",
+       "large-file": "Ukuran barkas disaranaké supaya ora ngluwihi $1 bita; barkas iki ukurané $2 bita.",
+       "largefileserver": "Barkas iki luwih gedhé tinimbang kang diidinaké ing paladèn.",
+       "emptyfile": "Barkas kang panjenengan unggahaké katoné kosong. Bokmanawa iki amarga anané salah ketik ing jeneng barkas. Mangga dipastèkaké apa panjenengan pancèn kersa ngunggahaké barkas iki.",
        "windows-nonascii-filename": "Wiki iki ora nyengkuyung jeneng berkas mawa karakter kusus.",
-       "fileexists": "Sawijining berkas mawa jeneng iku wis ana, mangga dipriksa <strong>[[:$1]]</strong> yèn panjenengan ora yakin sumedya ngowahiné.\n[[$1|thumb]]",
-       "filepageexists": "Kaca dèskripsi kanggo berkas iki wis digawé ing <strong>[[:$1]]</strong>, nanging saiki iki ora ditemokaké berkas mawa jeneng iku. Ringkesan sing panjenengan lebokaké ora bakal metu ing kaca dèskripsi. Kanggo ngetokaké dèskripsi iki, panjenengan kudu nyunting sacara manual. [[$1|thumb]]",
-       "fileexists-extension": "Berkas mawa jeneng sing padha wis ana: [[$2|thumb]]\n* Jeneng berkas sing bakal diunggahaké: <strong>[[:$1]]</strong>\n* Jeneng berkas sing wis ana: <strong>[[:$2]]</strong>\nMangga milih jeneng liya.",
-       "fileexists-thumbnail-yes": "Berkas iki katoné gambar mawa ukuran sing luwih cilik ''(thumbnail)''. [[$1|thumb]]\nTulung dipriksa berkas <strong>[[:$1]]</strong>.\nYèn berkas sing wis dipriksa iku padha, ora perlu panjenengan ngunggahaké vèrsi cilik liyané manèh.",
-       "file-thumbnail-no": "Jeneng berkas diwiwiti kanthi <strong>$1</strong>. Katoné berkas iki sawijining gambar mawa ukuran sing dicilikaké <em>(thumbnail)</em>.\nYèn panjenengan kagungan vèrsi mawa résolusi kebak saka gambar iki, mangga diunggahaké. Yèn ora, tulung jeneng berkas diganti.",
-       "fileexists-forbidden": "Sawijining berkas mawa jeneng iki wis ana, lan ora bisa ditindhes.\nYèn panjenengan isih arep ngunggahaké berkas panjenengan, supaya\nmbalik lan gunakna jeneng liya.\n[[File:$1|thumb|center|$1]]",
-       "fileexists-shared-forbidden": "Wis ana berkas liyané mawa jeneng sing padha ing gudhang berkas sing dianggo bebarengan.\nYèn isih ngersakaké ngunggahaké, mangga berkas diunggahaké manèh mawa jeneng liya. [[File:$1|thumb|center|$1]]",
+       "fileexists": "Barkas mawa jeneng iku wis ana, mangga dipriksa <strong>[[:$1]]</strong> yèn panjenengan ora yakin sumedya ngowahiné.\n[[$1|thumb]]",
+       "filepageexists": "Kaca dhèskripsi kanggo berkas iki wis digawé ing <strong>[[:$1]]</strong>, nanging saiki iki ora tinemu berkas mawa jeneng iku. Ringkesan kang panjenengan lebokaké ora bakal metu ing kaca dhèskripsi. Kanggo ngetokaké dhèskripsi iki, panjenengan kudu mbesut kanthi manual. [[$1|thumb]]",
+       "fileexists-extension": "Berkas mawa jeneng kang padha wis ana: [[$2|thumb]]\n* Jeneng berkas kang bakal diunggahaké: <strong>[[:$1]]</strong>\n* Jeneng berkas kang wis ana: <strong>[[:$2]]</strong>\nMangga milih jeneng liya.",
+       "fileexists-thumbnail-yes": "Berkas iki katoné gambar mawa ukuran kang luwih cilik ''(thumbnail)''. [[$1|thumb]]\nTulung dipriksa berkas <strong>[[:$1]]</strong>.\nYèn berkas kang wis dipriksa iku padha, ora perlu panjenengan ngunggahaké vèrsi cilik liyané manèh.",
+       "file-thumbnail-no": "Jeneng berkas diwiwiti kanthi <strong>$1</strong>. Katoné berkas iki wujud gambar mawa ukuran kang dicilikaké <em>(thumbnail)</em>.\nYèn panjenengan kagungan vèrsi mawa résolusi kebak saka gambar iki, mangga diunggahaké. Yèn ora, tulung jeneng berkas diganti.",
+       "fileexists-forbidden": "Barkas mawa jeneng iki wis ana, lan ora bisa ditindhes.\nYèn panjenengan isih arep ngunggahaké berkas panjenengan, supaya\nmbalik lan gunakna jeneng liya.\n[[File:$1|thumb|center|$1]]",
+       "fileexists-shared-forbidden": "Wis ana berkas liyané mawa jeneng kang padha ing gudhang berkas kang dianggo bebarengan.\nYèn isih ngersakaké ngunggahaké, mangga berkas diunggahaké manèh mawa jeneng liya. [[File:$1|thumb|center|$1]]",
        "file-exists-duplicate": "Barkas iki dhuplikaté {{PLURAL:$1|barkas}} iki:",
-       "file-deleted-duplicate": "Sawijining berkas persis berkas iki ([[:$1]]) wis tau dibusak. Mangga panjenengan priksani sajarah pambusakan berkas kasebut sadurungé nerusaké ngunggahaké berkas kuwi manèh.",
+       "file-deleted-duplicate": "Ana siji barkas kang mèmper barkas iki ([[:$1]]) wis binusek. Mangga panjenengan priksani sajarah pambusakan berkas kasebut sadurungé nerusaké ngunggahaké berkas iku manèh.",
        "uploadwarning": "Pèngetan pangunggahan berkas",
-       "uploadwarning-text": "Mangga owah katrangan berkas ng ngisor lan coba manèh.",
+       "uploadwarning-text": "Mangga owah katrangan berkas ing ngisor lan coba manèh.",
        "savefile": "Simpen barkas",
        "uploaddisabled": "Nuwun sèwu, fasilitas pangunggahan dipatèni.",
        "copyuploaddisabled": "Ngunggah mawa URL dipatèni.",
        "uploaddisabledtext": "Pangunggahan berkas ora diidinaké.",
        "php-uploaddisabledtext": "Pangunggahan berkas dipatèni ing PHP.\nMangga priksa panyetèlan pangunggahan berkas.",
-       "uploadscripted": "Berkas iki ngandhut HTML utawa kode sing bisa diinterpretasi salah déning panjlajah wèb.",
+       "uploadscripted": "Berkas iki ngandhut HTML utawa kode kang bisa diinterpretasi salah déning panjlajah wèb.",
        "uploadvirus": "Berkas iki ngamot virus! Détil: $1",
-       "uploadjava": "Barkasé barkas ZIP sing ngemu barkas .class Java.\nNgunggah barkas Java ora diidinaké amarga bisa njalari dilanggaré watesan kaamanan.",
+       "uploadjava": "Barkasé barkas ZIP kang ngemu barkas .class Java.\nNgunggah barkas Java ora diidinaké amarga bisa njalari dilanggaré watesan kaamanan.",
        "upload-source": "Barkas sumber",
        "sourcefilename": "Jeneng barkas sumber:",
        "sourceurl": "URL sumber:",
        "upload-description": "Katerangan barkas",
        "upload-options": "Opsi unggahan",
        "watchthisupload": "Awasi barkas iki",
-       "filewasdeleted": "Sawijining berkas mawa jeneng iki wis tau diunggahaké lan sawisé dibusak.\nMangga priksanen $1 sadurungé ngunggahaké berkas iku manèh.",
-       "filename-bad-prefix": "Jeneng berkas sing panjenengan unggahaké, diawali mawa '''\"$1\"''', sing sawijining jeneng non-dèskriptif sing biasané diwènèhaké sacara otomatis déning kamera digital. Mangga milih jeneng liyané sing luwih dèskriptif kanggo berkas panjenengan.",
+       "filewasdeleted": "Barkas mawa jeneng iki wis tau diunggahaké lan sawisé dibusak.\nMangga priksanen $1 sadurungé ngunggahaké berkas iku manèh.",
+       "filename-bad-prefix": "Jeneng berkas kang panjenengan unggahaké, diawali mawa '''\"$1\"''', ya iku jeneng non-dèskriptif kang biasané diwènèhaké sacara otomatis déning kamera digital. Mangga milih jeneng liyané kang luwih dèskriptif kanggo berkas panjenengan.",
        "upload-proto-error": "Protokol ora bener",
-       "upload-proto-error-text": "Pangunggahan jarah adoh mbutuhaké URL sing diawali karo <code>http://</code> utawa <code>ftp://</code>.",
-       "upload-file-error": "Kaluputan internal",
-       "upload-file-error-text": "Ana kaluputan internal nalika nyoba ngunggahaké berkas sauntara ing server.\nMangga kontak [[Special:ListUsers/sysop|pangurus]].",
-       "upload-misc-error": "Kaluputan pamunggahan sing ora dimangertèni",
-       "upload-misc-error-text": "Ana kaluputan sing ora diweruhi kadadéyan nalika pangunggahan. Mangga dipasthèkaké yèn URL kasebut iku absah lan bisa diaksès lan sawisé iku cobanen manèh. Yèn masalah iki isih ana, mangga kontak [[Special:ListUsers/sysop|pangurus sistem]].",
+       "upload-proto-error-text": "Pangunggahan jarah adoh mbutuhaké URL kang diawali karo <code>http://</code> utawa <code>ftp://</code>.",
+       "upload-file-error": "Masalah njero",
+       "upload-file-error-text": "Ana masalah njero nalika njajal nggawé barkas sauntara ing paladèn.\nSumangga sesambungan karo [[Special:ListUsers/sysop|pangurus]].",
+       "upload-misc-error": "Masalah pangunggah kang ora kaweruhan",
+       "upload-misc-error-text": "Ana masalah kang ora kaweruhan nalika ngunggah.\nSumangga vèrifikasi yèn URLé trep lan kena ingaksès lan jajala manèh. \nYèn masalah iki isih muncul, sumangga sesambungan karo [[Special:ListUsers/sysop|pangurus]].",
        "upload-too-many-redirects": "URL ngandhut kakèhan pengalihan",
        "upload-http-error": "Ana masalah HTTP: $1",
-       "upload-copy-upload-invalid-domain": "Unggahan salinan ora sumadhiya ng domain iki.",
+       "upload-copy-upload-invalid-domain": "Unggahan salinan ora sumadhiya ing domain iki.",
        "upload-dialog-title": "Unggah barkas",
        "upload-dialog-button-cancel": "Wurung",
        "upload-dialog-button-back": "Balik",
        "upload-form-label-own-work": "Iki karyaku dhéwé",
        "upload-form-label-infoform-categories": "Kategori",
        "upload-form-label-infoform-date": "Tanggal",
-       "backend-fail-stream": "Ora bisa milikaké berkas \"$1\".",
-       "backend-fail-backup": "Ora bisa nyadangaké berkas \"$1\".",
+       "backend-fail-stream": "Ora bisa ngilèkaké barkas \"$1\".",
+       "backend-fail-backup": "Ora bisa nyadhangaké barkas \"$1\".",
        "backend-fail-notexists": "Barkas $1 ora ana.",
-       "backend-fail-hashes": "Ora bisa ngéntukaké has berkas kanggo mbandingaké.",
-       "backend-fail-notsame": "Berkas nonidèntik wis ana nèng \"$1\".",
-       "backend-fail-invalidpath": "\"$1\" dudu jurusan nyimpen sing sah.",
-       "backend-fail-delete": "Ora bisa mbusak berkas \"$1\".",
-       "backend-fail-describe": "Gagal mengubah metadata untuk berkas \"$1\".",
-       "backend-fail-alreadyexists": "Berkas \"$1\" wis ana.",
-       "backend-fail-store": "Ora bisa nyèlèhaké berkas \"$1\" nèng \"$2\".",
-       "backend-fail-copy": "Ora bisa nyalin berkas \"$1\" nèng \"$2\".",
-       "backend-fail-move": "Ora bisa mindhahaké berkas \"$1\" nèng \"$2\".",
-       "backend-fail-opentemp": "Ora bisa mbukak berkas sawetara.",
-       "backend-fail-writetemp": "Ora bisa nulis berkas sawetara.",
-       "backend-fail-closetemp": "Ora bisa nutup berkas sawetara.",
-       "backend-fail-read": "Ora bisa maca berkas \"$1\".",
-       "backend-fail-create": "Ora bisa nulis berkas \"$1\".",
-       "backend-fail-maxsize": "Ora bisa nulis berkas \"$1\" amarga luwih gedhé saka {{PLURAL:$2|sak bita|$2 bita}}.",
+       "backend-fail-hashes": "Ora bisa ngolèhaké has barkas kanggo mbandhingaké.",
+       "backend-fail-notsame": "Barkas nonidèntik wis ana ing \"$1\".",
+       "backend-fail-invalidpath": "\"$1\" dudu jurusan nyimpen kang trep.",
+       "backend-fail-delete": "Ora bisa mbusek barkas \"$1\".",
+       "backend-fail-describe": "Ora bisa ngowahi métahdhatah barkas \"$1\".",
+       "backend-fail-alreadyexists": "Barkas \"$1\" wis ana.",
+       "backend-fail-store": "Ora bisa ndokok barkas \"$1\" ing \"$2\".",
+       "backend-fail-copy": "Ora bisa nurun barkas \"$1\" ing \"$2\".",
+       "backend-fail-move": "Ora bisa ngalih barkas \"$1\" menyang \"$2\".",
+       "backend-fail-opentemp": "Ora bisa mbukak barkas sauntara.",
+       "backend-fail-writetemp": "Ora bisa nulis barkas sauntara.",
+       "backend-fail-closetemp": "Ora bisa nutup barkas sauntara.",
+       "backend-fail-read": "Ora bisa maca barkas \"$1\".",
+       "backend-fail-create": "Ora bisa nulis barkas \"$1\".",
+       "backend-fail-maxsize": "Ora bisa nulis barkas \"$1\" amarga munjuli {{PLURAL:$2|siji bèt|$2 bèt}}.",
        "backend-fail-readonly": "Backend penyimpanan \"$1\" ini saat ini hanya bisa dibaca. Alasan yang diberikan adalah: \"''$2''\"",
-       "backend-fail-synced": "Berkas \"$1\" dalam keadaan yang tidak konsisten dalam backends penyimpanan internal",
+       "backend-fail-synced": "Barkas \"$1\" ing kaanan kang ora ajeg ing backend panyimpenan njero.",
        "backend-fail-connect": "Tidak dapat menyambung ke penyimpanan backend \"$1\".",
        "backend-fail-internal": "Ana masalah ing backend panyimpenan \"$1\".",
-       "backend-fail-contenttype": "Ora bisa nemtokaké jinisé kontèn saka berkas sing arep disimpen nèng \"$1\".",
-       "backend-fail-batchsize": "Penyimpanan backend diberikan batch $1 berkas {{PLURAL:$1||}}operasi; batasnya adalah $2 {{PLURAL:$2||}}operasi.",
-       "backend-fail-usable": "Ora bisa maca utawa nulis berkas \"$1\" amarga idin durung nyukupi utawa ilang dirèktori/kontaineré.",
+       "backend-fail-contenttype": "Ora bisa nemtokaké jinisé kontèn saka barkas kang arep kasimpen ing \"$1\".",
+       "backend-fail-batchsize": "Backend panyimpenan olèh batch {{PLURAL:$1|operasi|operasi}} barkas $2; watesé $2 {{PLURAL:$2|operasi|operasi}}.",
+       "backend-fail-usable": "Ora bisa maca utawa nulis barkas \"$1\" amarga idin durung nyukupi utawa ilang dirèktori/kontaineré.",
        "filejournal-fail-dbconnect": "Tidak dapat menyambung ke database jurnal untuk penyimpanan backend \"$1\".",
        "filejournal-fail-dbquery": "Tidak bisa update database jurnal untuk penyimpanan backend \"$1\".",
-       "lockmanager-notlocked": "Ora bisa mbukak gembok \"$1\"; kuwi ora kagembok.",
-       "lockmanager-fail-closelock": "Ora bisa nutup berkas gembok kanggo \"$1\".",
-       "lockmanager-fail-deletelock": "Ora bisa mbusak berkas gembok kanggo \"$1\".",
+       "lockmanager-notlocked": "Ora bisa mbukak gembok \"$1\"; iku ora kagembok.",
+       "lockmanager-fail-closelock": "Ora bisa nutup barkas gembok tumrap \"$1\".",
+       "lockmanager-fail-deletelock": "Ora bisa mbusek barkas gembok tumrap \"$1\".",
        "lockmanager-fail-acquirelock": "Ora bisa njaluk gembok kanggo \"$1\".",
-       "lockmanager-fail-openlock": "Ora bisa mbukak berkas gembok kanggo \"$1\".",
+       "lockmanager-fail-openlock": "Ora bisa mbukak barkas gembok tumrap \"$1\".",
        "lockmanager-fail-releaselock": "Ora bisa ngetokaké gembok kanggo \"$1\".",
-       "lockmanager-fail-db-bucket": "Ora bisa ngubungi cukup basis data gembok nèng èmbèr $1.",
-       "lockmanager-fail-db-release": "Ora bisa nguculaké gembok neng basis data $1.",
-       "lockmanager-fail-svr-acquire": "Ora bisa ngentokaké gembok ng sasana $1.",
-       "lockmanager-fail-svr-release": "Ora bisa nguculaké gembok neng sasana $1.",
+       "lockmanager-fail-db-bucket": "Ora bisa ngubungi cukup basis dhatah gembok ing èmbèr $1.",
+       "lockmanager-fail-db-release": "Ora bisa nguculaké gembok ing basis dhatah $1.",
+       "lockmanager-fail-svr-acquire": "Ora bisa ngentokaké gembok ing sasana $1.",
+       "lockmanager-fail-svr-release": "Ora bisa nguculaké gembok ing paladèn $1.",
        "zip-file-open-error": "Ana masalah nalika mbukak barkas kanggo pamriksan ZIP.",
-       "zip-wrong-format": "Barkas sing diisèkaké dudu barkas ZIP.",
-       "zip-bad": "Berkas rusak utawa berkas ZIP sing ora bisa diwaca.\nKuwi ora bisa kapriksa kanthi patut kanggo kamanan.",
-       "zip-unsupported": "Berkasé kuwi berkas ZIP sing nganggo piranti ZIP sing ora kasengkuyung déning MediaWiki.\nKuwi ora bisa kapriksa kanthi patut kanggo kamanan.",
+       "zip-wrong-format": "Barkas kang panjenengan lebokaké dudu barkas ZIP.",
+       "zip-bad": "Barkas rusak utawa barkas ZIP kang ora bisa diwaca.\nKang mangkono ora bisa kapriksa kanthi patut kanggo kamanan.",
+       "zip-unsupported": "Barkasé iku barkas ZIP kang nganggo piranti ZIP kang ora disengkuyung MediaWiki.\nKang mangkono ora bisa kapriksa kanthi patut kanggo kamanan.",
        "uploadstash": "Unggah pandhelikan",
-       "uploadstash-summary": "Kaca iki nyadhiyakaké dalan nèng berkas-berkas sing wis diunggah (utawa lagi diunggah) naning durung diterbitaké nèng wiki. Berkas-berkas iki ora katon kanggo sapa waé nanging namung kanggo panganggo sing ngunggah waé.",
-       "uploadstash-clear": "Busak berkas kadhelikaké",
+       "uploadstash-summary": "Kaca iki nyadhiyakaké dalan ing barkas-barkas kang wis diunggah (utawa lagi diunggah) naning durung kababar ing wiki. Barkas-barkas iki ora katon kanggo sapa baé nanging namung kanggo panganggo kang ngunggah baé.",
+       "uploadstash-clear": "Busek barkas kadhelikaké",
        "uploadstash-nofiles": "Panjenengan ora duwé barkas simpenan.",
-       "uploadstash-badtoken": "Nglakoni iki ora suksès, mungkin amarga hak panyuntingan Sampéyan wis kedaluwarsa. Jajal manèh.",
+       "uploadstash-badtoken": "Nglakoni iki ora dadi, bokamanawa amarga hak besut panjenengan wis kadaluwarsa. Sumangga jajal manèh.",
        "uploadstash-errclear": "Wurung ngresiki barkasé.",
-       "uploadstash-refresh": "Segeraké daptar berkas",
+       "uploadstash-refresh": "Segeraké pratélan barkas",
        "invalid-chunk-offset": "Ganti rugi kethoka ora sah",
        "img-auth-accessdenied": "Aksès ditulak",
-       "img-auth-nopathinfo": "Kélangan PATH_INFO.\nSasana Sampéyan durung disetèl kanggo ngliwati inpormasi iki.\nMungkin amarga abasis-CGI lan ora bisa nyengkuyung img_auth.\nDelok https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
-       "img-auth-notindir": "Alur sing dijaluk dudu dirèktori unggah kakonpigurasi.",
-       "img-auth-badtitle": "Ora bisa ngyasa sesirah sing sah saka \"$1\".",
-       "img-auth-nologinnWL": "Sampéyan durung mlebu log lan \"$1\" ora nèng daptar putih.",
-       "img-auth-nofile": "Berkas \"$1\" ora ana.",
-       "img-auth-isdir": "Sampéyan lagi njajal ngaksès dirèktori \"$1\".\nNamung aksès berkas sing dililakaké.",
+       "img-auth-nopathinfo": "Kélangan PATH_INFO.\nSasana panjenengan durung disetèl kanggo ngliwati inpormasi iki.\nMungkin amarga abasis-CGI lan ora bisa nyengkuyung img_auth.\nWaca https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization.",
+       "img-auth-notindir": "Alur kang dijaluk dudu dirèktori unggah kakonpigurasi.",
+       "img-auth-badtitle": "Ora bisa ngyasa sesirah kang trep saka \"$1\".",
+       "img-auth-nologinnWL": "Panjenengan durung mlebu log lan \"$1\" ora ing pratélan putih.",
+       "img-auth-nofile": "Barkas \"$1\" ora ana.",
+       "img-auth-isdir": "Panjenengan lagi njajal ngaksès dirèktori \"$1\".\nNamung aksès barkas kang dililakaké.",
        "img-auth-streaming": "Striming \"$1\".",
-       "img-auth-public": "Pungsi img_auth.php yakuwi ngetokaké berkas saka wiki pribadi.\nWiki iki ditata minangka wiki umum.\nKanggo kamanan paling apik, img_auth.php dipatèni.",
+       "img-auth-public": "Fungsi img_auth.php iku ngetokaké barkas saka wiki pribadi.\nWiki iki ditata minangka wiki umum.\nKanggo kamanan paling apik, img_auth.php dipatèni.",
        "img-auth-noread": "Panganggo ora nduwé aksès kanggo maca \"$1\".",
        "http-invalid-url": "URL ora absah: $1",
        "http-invalid-scheme": "URL mawa skéma \"$1\" ora disengkuyung.",
-       "http-request-error": "Panyuwunan HTTP wurung amarga masalah sing ora dingertèni.",
+       "http-request-error": "Panyuwunan HTTP wurung amarga masalah kang ora dingertèni.",
        "http-read-error": "Masalah pamaca HTTP.",
        "http-timed-out": "Panjalukan HTTP kliwat wates wektu.",
        "http-curl-error": "Masalah njupuk URL: $1",
        "http-bad-status": "Ana masalah nalika njaluk HTTP: $1 $2",
        "upload-curl-error6": "URL-é ora bisa dihubungi",
-       "upload-curl-error6-text": "URL sing diwènèhaké ora bisa dihubungi.\nMangga dipriksa manèh yèn URL iku pancèn bener lan situs iki lagi aktif.",
+       "upload-curl-error6-text": "URL kang diwènèhaké ora bisa dihubungi.\nMangga dipriksa manèh yèn URL iku pancèn bener lan situs iki lagi aktif.",
        "upload-curl-error28": "Pangunggahan ngliwati wektu",
-       "upload-curl-error28-text": "Situsé kesuwèn sadurungé réaksi.\nMangga dipriksa menawa situsé aktif, nunggu sedélok lan coba manèh.\nMbok-menawa panjenengan bisa nyoba manèh ing wektu sing luwih longgar.",
+       "upload-curl-error28-text": "Situsé kesuwèn sadurungé réaksi.\nMangga dipriksa manawa situsé aktif, nunggu sedélok lan coba manèh.\nBokmanawa panjenengan bisa nyoba manèh ing wektu kang luwih longgar.",
        "license": "Lisènsi:",
        "license-header": "Lisènsi",
-       "nolicense": "Durung ana sing dipilih",
+       "nolicense": "Durung ana kang dipilih",
        "licenses-edit": "Besut pilihan lisènsi",
        "license-nopreview": "(Pratuduh ora ana)",
-       "upload_source_url": "(barkas sing panjenengan pilih saka URL sing trep tur bisa diaksès umum)",
-       "upload_source_file": "(barkas sing panjenengan pilih saka komputeré panjenengan)",
+       "upload_source_url": "(barkas kang panjenengan pilih saka URL kang trep tur bisa diaksès umum)",
+       "upload_source_file": "(barkas kang panjenengan pilih saka komputer)",
        "listfiles-delete": "busak",
-       "listfiles-summary": "Kaca mirunggan iki nuduhaké kabèh barkas sing kaunggah.",
+       "listfiles-summary": "Kaca mirunggan iki nuduhaké kabèh barkas kang kaunggah.",
        "listfiles_search_for": "Golèk jeneng gambar:",
        "listfiles-userdoesnotexist": "Akun panganggo \"$1\" ora kadhaftar.",
        "imgfile": "barkas",
        "listfiles_size": "Ukuran (bita)",
        "listfiles_description": "Dèskripsi",
        "listfiles_count": "Vèrsi",
-       "listfiles-show-all": "Lebokaké barkasé sing vèrsi lawas",
+       "listfiles-show-all": "Lebokaké barkasé kang vèrsi lawas",
        "listfiles-latestversion": "Versi saiki",
        "listfiles-latestversion-yes": "Iya",
        "listfiles-latestversion-no": "Ora",
        "filehist-comment": "Tanggepan",
        "imagelinks": "Panggunaning barkas",
        "linkstoimage": "{{PLURAL:$1|Kaca|$1 kaca}} ngisor iki nggayut barkas iki:",
-       "linkstoimage-more": "Luwih saka $1 {{PLURAL:$1|kaca|kaca-kaca}} nduwèni pranala menyang berkas iki.\nDhaftar ing ngisor nuduhaké {{PLURAL:$1|kaca pisanan kanthi pranala langsung|$1 kaca kanthi pranala langsung}} menyang berkas iki.\n[[Special:WhatLinksHere/$2|dhaftar pepak]] uga ana.",
+       "linkstoimage-more": "Luwih saka $1 {{PLURAL:$1|kaca|kaca-kaca}} nduwèni pranala menyang berkas iki.\nPratélan ing ngisor nuduhaké {{PLURAL:$1|kaca pisanan kanthi pranala langsung|$1 kaca kanthi pranala langsung}} menyang berkas iki.\n[[Special:WhatLinksHere/$2|pratélan pepak]] uga ana.",
        "nolinkstoimage": "Ora ana kaca kang nganggo barkas iki.",
        "morelinkstoimage": "Ndeleng [[Special:WhatLinksHere/$1|luwih akèh pranala]] menyang berkas iki.",
        "linkstoimage-redirect": "$1 (alihan barkas) $2",
        "sharedupload": "Barkas iki saka $1 lan bisa kanggo proyèk-proyèk liyané.",
        "sharedupload-desc-there": "Berkas iki asal saka $1 lan bisa dipigunakaké déning proyèk liya.\nMangga pirsani [$2 kaca dhèskripsi berkas] kanggo informasi sabanjuré.",
        "sharedupload-desc-here": "Barkas iki saka $1 lan kena kanggo proyèk liya.\nPanyandraning [$2 kaca panyandra barkas]é kapacak ing ngisor.",
-       "sharedupload-desc-edit": "Berkas iki saka $1 lan mungkin dianggo nèng proyèk liya.\nMungkin Sampéyan pingin nyunting katrangan nèng [$2 kaca katrangan berkasé] nèng kono.",
-       "sharedupload-desc-create": "Berkas iki saka $1 lan mungkin dianggo nèng proyèk liya.\nMungkin Sampéyan pingin nyunting katrangan nèng [$2 kaca katrangan berkasé] nèng kono.",
+       "sharedupload-desc-edit": "Barkas iki saka $1 lan mungkin dianggo ing proyèk liya.\nBokamanawa panjenengan arep mbesut katrangan ing [$2 kaca katrangan berkasé] ing kono.",
+       "sharedupload-desc-create": "Berkas iki saka $1 lan mungkin dianggo ing proyèk liya.\nBokamanawa panjenengan arep mbesut katrangan ing [$2 kaca katrangan berkasé] ing kono.",
        "filepage-nofile": "Ora ana barkas kanthi jeneng kaya mangkéné.",
        "filepage-nofile-link": "Ora ana berkas nganggo jeneng iki, nanging panjenengan bisa [$1 ngunggahaké].",
        "uploadnewversion-linktext": "Unggah vèrsi anyar saka barkas iki",
        "shared-repo-from": "saka $1",
-       "shared-repo": "sawijining panyimpenan kanggo bebarengan",
+       "shared-repo": "panyimpenan kanggo bebarengan",
        "upload-disallowed-here": "Panjenengan ora kena ngeblegi barkas iki.",
        "filerevert": "Balèkna $1",
        "filerevert-legend": "Pulihaké barkas",
        "filerevert-defaultcomment": "Dibalèkaké menyang vèrsi ing $2, $1 ($3)",
        "filerevert-submit": "Balèkna",
        "filerevert-success": "'''[[Media:$1|$1]]''' wis dibalèkaké menyang [vèrsi $4 ing $3, $2].",
-       "filerevert-badversion": "Ora ana vèrsi lokal sadurungé saka berkas iki mawa stèmpel wektu sing dikarepaké.",
-       "filerevert-identical": "Vèrsi barkasé sing saiki padha plek karo sing dipilih.",
-       "filedelete": "Mbusak $1",
+       "filerevert-badversion": "Ora ana vèrsi lokal sadurungé saka berkas iki mawa stèmpel wektu kang dikarepaké.",
+       "filerevert-identical": "Vèrsi barkasé kang saiki padha plek karo kang dipilih.",
+       "filedelete": "Mbusek $1",
        "filedelete-legend": "Busak barkas",
-       "filedelete-intro": "Panjenengan bakal mbusak berkas '''[[Media:$1|$1]]''' sekaliyan kabèh riwayaté.",
-       "filedelete-intro-old": "Panjenengan mbusak vèrsi '''[[Media:$1|$1]]''' per [$4 $3, $2].",
+       "filedelete-intro": "Panjenengan arep mbusek barkas <strong>[[Media:$1|$1]]</strong> sisan karo kabèh sajarahé.",
+       "filedelete-intro-old": "Panjenengan mbusek vèrsi <strong>[[Media:$1|$1]]</strong> per [$4 $3, $2].",
        "filedelete-comment": "Alesan:",
        "filedelete-submit": "Busak",
        "filedelete-success": "'''$1''' wis dibusak.",
        "filedelete-success-old": "Berkas '''[[Media:$1|$1]]''' vèrsi $3, $2 wis dibusak.",
        "filedelete-nofile": "'''$1''' ora ana.",
-       "filedelete-nofile-old": "Ora ditemokaké arsip vèrsi saka '''$1''' mawa atribut sing diwènèhaké.",
+       "filedelete-nofile-old": "Ora tinemu arsip vèrsi saka <strong>$1</strong> mawa atribut kang diwènèhaké.",
        "filedelete-otherreason": "Alesan tambahan/liya:",
        "filedelete-reason-otherlist": "Alesan liya",
        "filedelete-reason-dropdown": "*Alesan pambusakan\n** Nglanggar hak cipta\n** Berkas duplikat",
-       "filedelete-edit-reasonlist": "Besut alesané mbusak",
+       "filedelete-edit-reasonlist": "Besut alesané mbusek",
        "filedelete-maintenance": "Pambusakan lan pambalikan berkas kanggo sawetara dipatèni salawas ana pangruwatan.",
-       "filedelete-maintenance-title": "Ora bisa mbusak barkas",
+       "filedelete-maintenance-title": "Ora bisa mbusek barkas",
        "mimesearch": "Gegolèkan MIME",
        "mimesearch-summary": "Kaca iki nyedyaké fasilitas nyaring berkas miturut tipe MIME-né. Lebokna: contenttype/subtype, contoné <code>image/jpeg</code>.",
        "mimetype": "Tipe MIME:",
        "download": "undhuh",
-       "unwatchedpages": "Kaca sing ora diawasi",
-       "listredirects": "Daftar pengalihan",
-       "unusedtemplates": "Cithakan sing ora kanggo",
-       "unusedtemplatestext": "Kaca iki ngamot kabèh kaca ing bilik jeneng {{ns:template}} sing ora dianggo ing kaca ngendi waé.\nPriksanen dhisik pranala-pranala menyang cithakan iki sadurungé mbusak.",
+       "unwatchedpages": "Kaca kang ora ingawasan",
+       "listredirects": "Pratélan alihan",
+       "unusedtemplates": "Cithakan kang ora kanggo",
+       "unusedtemplatestext": "Kaca iki isi kabèh kaca ing mandala aran {{ns:template}} kang ora kaanggo ing kaca liya.\nAja lali mesthèkaké ana-orané pranala liya kang ngener cithakané sadurungé panjenengan mbusek.",
        "unusedtemplateswlh": "pranala liya-liyané",
        "randompage": "Kaca sembarang",
        "randompage-nopages": "Ora ana kaca ing {{PLURAL:$2||}}bilik jeneng iki:$1.",
        "randomincategory": "Sembarang kaca ing kategori",
-       "randomincategory-invalidcategory": "\"$1\" dudu jeneng kategori sing apik.",
+       "randomincategory-invalidcategory": "\"$1\" dudu jeneng kategori kang trep.",
        "randomincategory-nopages": "Ora ana kaca ing kategori [[:Category:$1|$1]].",
        "randomincategory-category": "Kategori:",
        "randomincategory-legend": "Sembarang kaca ing kategori",
        "statistics-edits-average": "Besutan rata-rata saben kaca",
        "statistics-users": "Panganggo kadhaftar",
        "statistics-users-active": "Para panganggo aktif",
-       "statistics-users-active-desc": "Panganggo sing ngayahi aktivitas jroning {{PLURAL:$1|dia|$1 dina}} pungkasan",
+       "statistics-users-active-desc": "Panganggo kang ngayahi aktivitas jroning {{PLURAL:$1|dia|$1 dina}} pungkasan",
        "pageswithprop": "Kaca mawa properti kaca",
        "pageswithprop-legend": "Kaca mawa properti kaca",
-       "pageswithprop-text": "Kaca iki mratélakaké kaca-kaca sing nganggo properti kaca mirunggan.",
+       "pageswithprop-text": "Kaca iki ngemu pratélan kaca kang nganggo properti kaca kang mirunggan.",
        "pageswithprop-prop": "Arané ubarampé:",
        "pageswithprop-submit": "Nuju",
        "pageswithprop-prophidden-long": "nilai properti teks dawa didhelikake ($1 kilobita)",
        "pageswithprop-prophidden-binary": "nilai properti biner didhelikake ($1 kilobita)",
-       "doubleredirects": "Alihan sing dhobel",
-       "doubleredirectstext": "Kaca iki ngandhut daftar kaca sing ngalih ing kaca pangalihan liyané.\nSaben baris ngandhut pranala menyang pangalihan kapisan lan kapindho, sarta tujuan saka pangalihan kapindho, sing biasané kaca tujuan sing \"sajatiné\", yakuwi pangalihan kapisan kuduné dialihaké menyang kaca tujuan iku.\nJeneng sing wis <del>dicorèk</del> tegesé wis rampung didandani.",
+       "doubleredirects": "Alihan kang dhobel",
+       "doubleredirectstext": "Kaca iki ngemu pratélan kaca kang ngener kaca alihan liyané.\nSaben larik ngemu pranala menyang kaca alihan kapisan lan kapindho, sarta jujuganing kaca alihan kapindho, kang adaté minagka kaca jujugan kang \"sajatiné\", ya iku kaca kang kuduné dadi jujugané kaca alihan kapisan.\nÈntri kang <del>kacorèk</del> tegesé wis kadandani.",
        "double-redirect-fixed-move": "[[$1]] wis kapindhahaké, saiki dadi kaca peralihan menyang [[$2]]",
-       "double-redirect-fixed-maintenance": "Otomatis ndandani lih-lihan dhobel saka [[$1]] nyang [[$2]] nalika ana opèn-opènan.",
+       "double-redirect-fixed-maintenance": "Otomatis ndandani lih-lihan dhobel saka [[$1]] menyang [[$2]] nalika ana opèn-opènan.",
        "double-redirect-fixer": "Révisi pangalihan",
-       "brokenredirects": "Alihan sing rusak",
-       "brokenredirectstext": "Pengalihan ing ngisor iki tumuju menyang kaca sing ora ana:",
+       "brokenredirects": "Alihan kang rusak",
+       "brokenredirectstext": "Kaca alihan ing isor iki ngener kaca kang ora ana:",
        "brokenredirects-edit": "besut",
        "brokenredirects-delete": "busak",
-       "withoutinterwiki": "Kaca sing tanpa pranala basa",
-       "withoutinterwiki-summary": "Kaca-kaca ing ngisor iki ora nggayut nyang vèrsi basa liyané.",
+       "withoutinterwiki": "Kaca kang tanpa pranala basa",
+       "withoutinterwiki-summary": "Kaca-kaca ing ngisor iki ora nggayut menyang vèrsi basa liyané.",
        "withoutinterwiki-legend": "Préfiks",
        "withoutinterwiki-submit": "Tuduhna",
-       "fewestrevisions": "Artikel sing owahé sithik dhéwé",
+       "fewestrevisions": "Artikel kang owahé sithik dhéwé",
        "nbytes": "$1 {{PLURAL:$1|bét|bét}}",
        "ncategories": "$1 {{PLURAL:$1|kategori|kategori}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwiki}}",
        "nmembers": "$1 {{PLURAL:$1|isi}}",
        "nmemberschanged": "$1 → $2 {{PLURAL:$2|anggota|anggota}}",
        "nrevisions": "$1 {{PLURAL:$1|revisi|revisi}}",
-       "nimagelinks": "Kanggo ng {{PLURAL:$1|kaca|kaca}}",
-       "ntransclusions": "kanggo ng $1 {{PLURAL:$1|kaca|kaca}}",
-       "specialpage-empty": "Ora ana sing perlu dilaporaké.",
-       "lonelypages": "Kaca sing lola",
-       "lonelypagestext": "Kaca-kaca ing ngisor iki ora ana sing nyambung menyang kaca liyané ing {{SITENAME}}.",
-       "uncategorizedpages": "Kaca sing tanpa kategori",
-       "uncategorizedcategories": "Kategori sing tanpa kategori",
-       "uncategorizedimages": "Barkas sing tanpa kategori",
-       "uncategorizedtemplates": "Cithakan sing durung diwèhi kategori",
-       "unusedcategories": "Kategori sing ora kanggo",
-       "unusedimages": "Barkas sing ora kanggo",
-       "wantedcategories": "Kategori sing dipéngini",
-       "wantedpages": "Kaca sing dipéngini",
+       "nimagelinks": "Kanggo ing {{PLURAL:$1|kaca|kaca}}",
+       "ntransclusions": "kanggo ing $1 {{PLURAL:$1|kaca|kaca}}",
+       "specialpage-empty": "Ora ana kang perlu dilaporaké.",
+       "lonelypages": "Kaca kang lola",
+       "lonelypagestext": "Kaca-kaca ing isor iki ora ana kang nyambung menyang kaca liyané ing {{SITENAME}}.",
+       "uncategorizedpages": "Kaca kang tanpa kategori",
+       "uncategorizedcategories": "Kategori kang tanpa kategori",
+       "uncategorizedimages": "Barkas kang tanpa kategori",
+       "uncategorizedtemplates": "Cithakan kang durung kawènèhan kategori",
+       "unusedcategories": "Kategori kang ora kanggo",
+       "unusedimages": "Barkas kang ora kanggo",
+       "wantedcategories": "Kategori kang kapéngini",
+       "wantedpages": "Kaca kang kapéngini",
        "wantedpages-badtitle": "Sesirah ora sah ing omboyakan kasil: $1",
-       "wantedfiles": "Barkas sing dipéngini",
-       "wantedfiletext-cat": "Berkas iki dianggo nanging ora ana. Berkas saka panyimpenan asing mungkin kadaptar tinimbang ana kasunyatan. Saben ''positip salah'' bakal <del>diorèk</del>. Lan, kaca sing nyartakaké berkas sing ora ana bakal kadaptar nèng [[:$1]].",
+       "wantedfiles": "Barkas kang kapéngini",
+       "wantedfiletext-cat": "Barkas iki kaanggo, nanging ora ana. Barkas saka panyimpenan manca bokamanawa kacathet, sanajan ora ana. Saben ayahan kang salah, sanajan saka niyat kang becik, bakal <del>kacorèk</del>. Kaca kang ngemu barkas kang ora ana bakal kacathet ing [[:$1]].",
        "wantedfiletext-nocat": "Berkas iki dianggo nanging ora ana. Berkas saka panyimpenan asing mungkin kadaptar tinimbang ana kasunyatan. Saben ''positip salah'' bakal <del>diorèk</del>.",
-       "wantedtemplates": "Cithakan sing dipéngini",
-       "mostlinked": "Kaca sing kerep dhéwé dituju",
-       "mostlinkedcategories": "Kategori sing kerep dhéwé dienggo",
+       "wantedtemplates": "Cithakan kang kapéngini",
+       "mostlinked": "Kaca kang akèh kajujug",
+       "mostlinkedcategories": "Kategori kang kerep dhéwé kajujug",
        "mostlinkedtemplates": "Kaca paling akèh transklusi",
-       "mostcategories": "Kaca sing kategoriné akèh dhéwé",
+       "mostcategories": "Kaca kang kategoriné akèh dhéwé",
        "mostimages": "Barkas akèh dhéwé dienggo pranala",
        "mostinterwikis": "Kaca mawa interwiki paling akèh",
-       "mostrevisions": "Kaca mawa pangowahan sing akèh dhéwé",
+       "mostrevisions": "Kaca mawa pangowahan kang akèh dhéwé",
        "prefixindex": "Kabèh kaca mawa ater-ater",
        "prefixindex-namespace": "Kabèh kaca mawa ater-ater (bilik jeneng $1)",
        "prefixindex-submit": "Tuduhaké",
        "prefixindex-strip": "Busak ater-ater saka pratélan",
-       "shortpages": "Kaca sing cekak",
-       "longpages": "Kaca sing dawa",
-       "deadendpages": "Kaca sing buntu",
-       "deadendpagestext": "Kaca-kaca ing ngisor iki ora nggayut nyang kaca liya ing {{SITENAME}}.",
-       "protectedpages": "Kaca sing direksa",
+       "shortpages": "Kaca kang cendhak",
+       "longpages": "Kaca kang dawa",
+       "deadendpages": "Kaca kang buntu",
+       "deadendpagestext": "Kaca-kaca ing ngisor iki ora nggayut menyang kaca liya ing {{SITENAME}}.",
+       "protectedpages": "Kaca kang kareksa",
        "protectedpages-indef": "Namung rereksan tanpa watesan wektu",
        "protectedpages-cascade": "Amung kaca rineksan kang runtut",
        "protectedpages-noredirect": "Dhelikna alihan",
        "protectedpages-submit": "Tuduhaké kaca",
        "protectedpages-unknown-timestamp": "Ora dingertèni",
        "protectedpages-unknown-performer": "Panganggo ora dingertèni",
-       "protectedtitles": "Sesirah sing direksa",
-       "protectedtitlesempty": "Ora ana sesirah sing saiki kareksa mawa paramèter iki.",
+       "protectedtitles": "Sesirah kang direksa",
+       "protectedtitlesempty": "Ora ana sesirah kang saiki kareksa mawa paramèter iki.",
        "protectedtitles-submit": "Tuduhaké sesirah",
        "listusers": "Pratélaning panganggo",
-       "listusers-editsonly": "Mligi tuduhaké panganggo sing duwé pasumbang",
+       "listusers-editsonly": "Mligi tuduhaké panganggo kang duwé pasumbang",
        "listusers-creationsort": "Urut miturut tanggal digawé",
        "listusers-desc": "Urutna mudhun",
        "usereditcount": "$1 {{PLURAL:$1|besutan|besutan}}",
        "newpages": "Kaca anyar",
        "newpages-submit": "Tuduhaké",
        "newpages-username": "Jeneng panganggo:",
-       "ancientpages": "Kaca sing lawas dhéwé",
+       "ancientpages": "Kaca kang lawas dhéwé",
        "move": "Lih",
        "movethispage": "Lih kaca iki",
-       "unusedimagestext": "Berkas-berkas sing kapacak iki ana nanging ora dienggo ing kaca apa waé.\nTulung digatèkaké yèn situs wèb liyané mbok-menawa bisa nyambung ing sawijining berkas sacara langsung mawa URL langsung, lan berkas-berkas kaya mengkéné iku mbok-menawa ana ing daftar iki senadyan ora dienggo aktif manèh.",
-       "unusedcategoriestext": "Kategori iki ana senadyan ora ana artikel utawa kategori liyané sing nganggo.",
+       "unusedimagestext": "Barkas-barkas kang kapacak iki ana nanging ora dienggo ing kaca apa waé.\nTulung digatèkaké yèn situs wèb liyané bokmanawa bisa nyambung ing barkas sacara langsung mawa URL langsung, lan barkas-barkas mengkéné iku bokmanawa ana ing pratélan iki sanajan ora dienggo aktif manèh.",
+       "unusedcategoriestext": "Kaca kategori iki ana sanajan ora ana artikel utawa kategori liyané kang nganggo.",
        "notargettitle": "Ora ana sasaran",
        "notargettext": "Panjenengan ora nemtokaké kaca utawa panganggo tujuan fungsi iki.",
-       "nopagetitle": "Kaca tujuan ora ditemokaké",
-       "nopagetext": "Kaca sing panjenengan tuju ora ditemokaké.",
+       "nopagetitle": "Kaca jujugan mangkono ora ana",
+       "nopagetext": "Kaca jujugan kang panjenengan karsakaké ora ana.",
        "pager-newer-n": "{{PLURAL:$1|1 luwih anyar|$1 luwih anyar}}",
        "pager-older-n": "{{PLURAL:$1|1 luwih lawas|$1 luwih lawas}}",
        "suppress": "Dhelikaké",
        "apihelp-no-such-module": "Modhul \"$1\" ora katemu.",
        "apisandbox": "Kothak wedhi API",
        "apisandbox-jsonly": "JavaScript dibutuhaké saperlu nganggo bak wedhi API.",
-       "apisandbox-api-disabled": "API dipatèni ng situs iki.",
-       "apisandbox-intro": "Anggo kaca iki kanggo njajal-njajal '''API layanan wèb MediaWiki'''.\nRujuk [https://www.mediawiki.org/wiki/API:Main_page the dhokumèntasi API] kanggo panganggoan API luwih rinci. Conto: [https://www.mediawiki.org/wiki/API#A_simple_example ngéntukaké kontèn Kaca Utama]. Pilih laku kanggo ndelok conto luwih akèh.",
+       "apisandbox-api-disabled": "API dipatèni ing situs iki.",
+       "apisandbox-intro": "Anggo kaca iki kanggo njajal-njajal '''API layanan wèb MediaWiki'''.\nRujuk [https://www.mediawiki.org/wiki/API:Main_page the dhokumèntasi API] kanggo panganggoan API luwih rinci. Conto: [https://www.mediawiki.org/wiki/API#A_simple_example ngéntukaké kontèn Kaca Utama]. Pilih laku kanggo ndeleng conto luwih akèh.",
        "apisandbox-submit": "Gawé panjalukan",
        "apisandbox-reset": "Resiki",
        "apisandbox-retry": "Jajal manèh",
        "apisandbox-dynamic-error-exists": "Paramèter aran \"$1\" wis ana.",
        "apisandbox-deprecated-parameters": "Paramèter lawas",
        "apisandbox-fetch-token": "Isi otomatis tokené",
+       "apisandbox-add-multi": "Wuwuh",
        "apisandbox-submit-invalid-fields-title": "Sawenèh babagan ora trep",
-       "apisandbox-submit-invalid-fields-message": "Jajal dandanana babagan sing ditandhani lan jajalen manèh.",
+       "apisandbox-submit-invalid-fields-message": "Jajal dandanana babagan kang ditandhani lan jajalen manèh.",
        "apisandbox-results": "Kasil",
        "apisandbox-sending-request": "Ngirim panyuwuné API...",
        "apisandbox-loading-results": "Nampa kasilé API...",
        "apisandbox-results-error": "Ana masalah nalika ngamot wangsulan kanggo panyuwuné API: $1.",
        "apisandbox-request-selectformat-label": "Tuduhaké dhata suwunan minangka:",
        "apisandbox-request-url-label": "URL dikarepaké:",
+       "apisandbox-request-format-json-label": "JSON",
        "apisandbox-request-json-label": "Nyuwun JSON:",
        "apisandbox-request-time": "Suwéné panyuwunan: {{PLURAL:$1|$1 ms}}",
        "apisandbox-results-fixtoken": "Dandanana tokené lan balènana numpuk",
        "apisandbox-alert-field": "Ajiné babagan iki ora trep.",
        "apisandbox-continue": "Banjuraké",
        "apisandbox-continue-clear": "Resiki",
-       "apisandbox-continue-help": "{{int:apisandbox-continue}} bakal [https://www.mediawiki.org/wiki/API:Query#Continuing_queries mbanjuraké] panyuwunané sing pungkasan; {{int:apisandbox-continue-clear}} bakal ngresiki paramèter sing gegayutan karo tumindak panglanjutané.",
+       "apisandbox-continue-help": "{{int:apisandbox-continue}} bakal [https://www.mediawiki.org/wiki/API:Query#Continuing_queries mbanjuraké] panyuwunané kang pungkasan; {{int:apisandbox-continue-clear}} bakal ngresiki paramèter kang magepokan.",
        "apisandbox-param-limit": "Isinen <kbd>max</kbd> saperlu nganggo watesan maksimum.",
        "apisandbox-multivalue-all-namespaces": "$1 (Kabèh mandala aran)",
        "apisandbox-multivalue-all-values": "$1 (Kabèh aji)",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Golèk sumber buku",
+       "booksources-isbn": "ISBN:",
        "booksources-search": "Golèk",
-       "booksources-text": "Ing ngisor iki kapacak daftar pranala menyang situs liyané sing ngadol buku anyar lan bekas, lan mbok-menawa uga ndarbèni informasi sabanjuré ngenani buku-buku sing lagi panjenengan golèki:",
-       "booksources-invalid-isbn": "ISBN sing diwènèhaké katonané ora trep; priksanen bokmanawa ana masalah nalika nurun sumber asli.",
-       "magiclink-tracking-rfc": "Kaca sing nganggo pranala ajaib RFC",
+       "booksources-text": "Ing ngisor iki kapacak pratélan pranala menyang situs liyané kang ngadol buku anyar lan bekas, lan bokmanawa uga ndarbèni informasi sabanjuré ngenani buku-buku kang lagi panjenengan golèki:",
+       "booksources-invalid-isbn": "ISBN kang diwènèhaké katonané ora trep; priksanen bokmanawa ana masalah nalika nurun sumber asli.",
+       "magiclink-tracking-rfc": "Kaca kang nganggo pranala RFC",
        "magiclink-tracking-rfc-desc": "Kaca iki nganggo pranala ajaib RFC. Delengen [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] ngenani carané boyongan.",
-       "magiclink-tracking-pmid": "Kaca sing nganggo pranala ajaib PMID",
-       "magiclink-tracking-isbn": "Kaca sing nganggo pranala ajaib ISBN",
+       "magiclink-tracking-pmid": "Kaca kang nganggo pranala PMID",
+       "magiclink-tracking-isbn": "Kaca kang nganggo pranala ISBN",
        "specialloguserlabel": "Panampil:",
        "speciallogtitlelabel": "Paran (sesirah utawa {{ns:user}}:jeneng panganggo):",
        "log": "Log",
        "logeventslist-submit": "Tuduhaké",
+       "logeventslist-tag-log": "Log tenger",
        "all-logs-page": "Kabèh log umum",
-       "alllogstext": "Pitontonan gabungan log-log sing ana ing {{SITENAME}}.\nPanjenengan bisa nyiyutaké sesawangané kanthi milih sawijining jinis log, jeneng panganggo (sènsitif-case), utawa kaca sing gegayutan (uga sènsitif-case).",
+       "alllogstext": "Pitontonan gabungan log-log ing {{SITENAME}}.\nPanjenengan bisa nyiyutaké sesawangané kanthi milih siji jinis log, jeneng panganggo (sènsitif kapitalisasi), utawa kaca kang kaprabawan (uga sènsitif kapitalisasi).",
        "logempty": "Ora tinemu wiji kang cocog ing log",
-       "log-title-wildcard": "Golèk sesirah sing diwiwiti tulisan iki",
-       "showhideselectedlogentries": "Owah pakatonané èntri log sing dipilih",
-       "log-edit-tags": "Besut tag saka isian log sing dipilih",
+       "log-title-wildcard": "Golèk sesirah kang diwiwiti tulisan iki",
+       "showhideselectedlogentries": "Owah pakatonané èntri log kang dipilih",
+       "log-edit-tags": "Besut tenger saka isian log kang dipilih",
        "checkbox-select": "Pilih: $1",
        "checkbox-all": "Kabèh",
        "checkbox-none": "Ora ana",
        "allpages": "Kabèh kaca",
        "nextpage": "Kaca sabanjuré ($1)",
        "prevpage": "Kaca sadurungé ($1)",
-       "allpagesfrom": "Pitontonaké kaca sing diwiwiti:",
+       "allpagesfrom": "Pitontonaké kaca kang kawiwitan:",
        "allpagesto": "Tampilaké kaca dipungkasi ing:",
        "allarticles": "Kabèh kaca",
        "allinnamespace": "Kabèh kaca (mandala aran $1)",
        "allpagesbadtitle": "Irah-irahan (judhul) ingkang dipun-gunaaken boten sah utawi nganggé ater-ater (awalan) antar-basa utawi antar-wiki. Irah-irahan punika saged ugi nganggé setunggal aksara utawi luwih ingkang boten saged kagunaaken dados irah-irahan.",
        "allpages-bad-ns": "{{SITENAME}} ora duwé mandala aran \"$1\".",
        "allpages-hide-redirects": "Dhelikaké alihan",
-       "cachedspecial-viewing-cached-ttl": "Sampéyan lagi ndelok vèrsi cadhangan saka kaca iki, sing bisa dadi lawasé wis $1.",
-       "cachedspecial-viewing-cached-ts": "Sampéyan lagi ndelok vèrsi cadhangan saka kaca iki, sing bisa dadi ora padha karo kasunyatan.",
-       "cachedspecial-refresh-now": "Deleng sing paling anyar.",
+       "cachedspecial-viewing-cached-ttl": "Panjenengan lagi ndeleng vèrsi cadhangan saka kaca iki, kang bisa dadi lawasé wis $1.",
+       "cachedspecial-viewing-cached-ts": "Panjenengan lagi ndeleng vèrsi cadhangan saka kaca iki, kang bisa dadi ora padha karo kasunyatan.",
+       "cachedspecial-refresh-now": "Deleng kang paling anyar.",
        "categories": "Kategori",
        "categories-submit": "Tuduhaké",
-       "categoriespagetext": "{{PLURAL:$1|kategori ing ngisor iki ngandhut|kategori ing ngisor iki ngandhut}} kaca utawa media.\n[[Special:UnusedCategories|Kategori sing ora dianggo]] ora ditampilaké ing kéné.\nDeleng uga [[Special:WantedCategories|kategori sing diperlokaké]].",
-       "categoriesfrom": "Tuduhaké kategori-kategori sing diwiwiti:",
-       "deletedcontributions": "Pisumbanging panganggo sing dibusak",
-       "deletedcontributions-title": "Pisumbanging panganggo sing dibusak",
+       "categoriespagetext": "{{PLURAL:$1|kategori ing ngisor iki ngandhut|kategori ing ngisor iki ngandhut}} kaca utawa media.\n[[Special:UnusedCategories|Kategori kang ora dianggo]] ora ditampilaké ing kéné.\nDeleng uga [[Special:WantedCategories|kategori kang diperlokaké]].",
+       "categoriesfrom": "Tuduhaké kategori kang kawiwitan:",
+       "deletedcontributions": "Pisumbanging panganggo kang dibusak",
+       "deletedcontributions-title": "Pisumbanging panganggo kang dibusak",
        "sp-deletedcontributions-contribs": "pasumbang",
        "linksearch": "Golèkan pranala njaba",
        "linksearch-pat": "Polah ing gegolèkan:",
        "linksearch-text": "Tanda bintang seperti \"*.wikipedia.org\" dapat digunakan.\nPerlu sedikitnya satu domain tingkat atas, misalnya \"*.org\".<br />\n{{PLURAL:$2|Protokol|Protokol}} yang didukung: $1 (menggunakan http:// bila protokol tidak ditentukan)",
        "linksearch-line": "$1 disambung saka $2",
        "linksearch-error": "''Wildcards'' namung bisa dienggo ing bagéyan awal saka jeneng host.",
-       "listusersfrom": "Tuduhna panganggo sing diawali karo:",
+       "listusersfrom": "Tuduhna panganggo kang diawali karo:",
        "listusers-submit": "Tuduhna",
        "listusers-noresult": "Panganggo ora ana.",
        "listusers-blocked": "(diblokir)",
        "activeusers": "Pratélan panganggo aktif",
-       "activeusers-intro": "Iki daptar panganggo sing katon lakuné ing $1 {{PLURAL:$1|dina|dina}} kapungkur.",
-       "activeusers-count": "$1 {{PLURAL:$1|tumindak|tumindak}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan",
+       "activeusers-intro": "Iki pratélan panganggo kang katon lakuné ing $1 {{PLURAL:$1|dina|dina}} kapungkur.",
+       "activeusers-count": "$1 {{PLURAL:$1|laku|laku}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan",
        "activeusers-from": "Tampilna panganggo wiwit saka:",
-       "activeusers-groups": "Tuduhaké panganggo sing mlebu golongan:",
-       "activeusers-excludegroups": "Aja lebokaké panganggo sing kalebu golongan:",
+       "activeusers-groups": "Tuduhaké panganggo kang mlebu golongan:",
+       "activeusers-excludegroups": "Aja lebokaké panganggo kang kalebu golongan:",
        "activeusers-noresult": "Panganggo ora ana.",
        "activeusers-submit": "Tuduhaké panganggo aktif",
        "listgrouprights": "Hak-hak grup panganggo",
-       "listgrouprights-summary": "Ing ngisor iki kapacak dhaftar grup panganggo sing didéfinisi ing wiki iki, kanthi hak-hak aksès gandhèngané.\nInformasi tambahan perkara hak-hak individual bisa ditemokaké ing [[{{MediaWiki:Listgrouprights-helppage}}|kéné]].",
-       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Hak sing diidinaké</span>\n* <span class=\"listgrouprights-revoked\">Hak sing dijabel</span>",
+       "listgrouprights-summary": "Ing ngisor iki kapacak pratélan grup panganggo kang didéfinisi ing wiki iki, kanthi hak-hak aksès gandhèngané.\nInformasi tambahan perkara hak-hak individual bisa tinemu ing [[{{MediaWiki:Listgrouprights-helppage}}|kéné]].",
+       "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Hak kang diidinaké</span>\n* <span class=\"listgrouprights-revoked\">Hak kang dijabel</span>",
        "listgrouprights-group": "Grup",
        "listgrouprights-rights": "Hak-hak",
        "listgrouprights-helppage": "Help:Hak-hak grup",
        "listgrouprights-members": "(pratélaning anggota)",
        "listgrouprights-addgroup": "Tambah {{PLURAL:$2|golongan}}: $1",
        "listgrouprights-removegroup": "Busak {{PLURAL:$2|golongan}}: $1",
-       "listgrouprights-addgroup-all": "Bisa nambahaké kabèh klompok",
-       "listgrouprights-removegroup-all": "Bisa mbusak kabèh klompok",
-       "listgrouprights-addgroup-self": "Nambahaké {{PLURAL:$2|klompok|klompok}} menyang akuné dhéwé: $1",
-       "listgrouprights-removegroup-self": "Mbusak {{PLURAL:$2|klompok|klompok}} saka akuné dhéwé: $1",
+       "listgrouprights-addgroup-all": "Wuwuh kabèh golongan",
+       "listgrouprights-removegroup-all": "Busak kabèh golongan",
+       "listgrouprights-addgroup-self": "Muwuh {{PLURAL:$2|golongan|golongan}} menyang akuné dhéwé: $1",
+       "listgrouprights-removegroup-self": "Mbusek {{PLURAL:$2|golongan|golongan}} saka akuné dhéwé: $1",
        "listgrouprights-addgroup-self-all": "Nambahaké kabèh grup menyang akuné dhéwé",
-       "listgrouprights-removegroup-self-all": "Mbusak kabèh klompok saka akuné dhéwé",
+       "listgrouprights-removegroup-self-all": "Busak kabèh golongan saka akuné dhéwé",
        "listgrouprights-namespaceprotection-header": "Watesan mandala aran",
        "listgrouprights-namespaceprotection-namespace": "Mandala aran",
-       "listgrouprights-namespaceprotection-restrictedto": "Hak sing ngidinaké panganggo mbesut",
+       "listgrouprights-namespaceprotection-restrictedto": "Hak kang ngidinaké panganggo mbesut",
        "listgrants": "Idin",
        "listgrants-grant": "Idin",
        "listgrants-rights": "Hak",
+       "listgrants-grant-display": "$1 <code>($2)</code>",
        "trackingcategories": "Kategori panglacak",
        "trackingcategories-msg": "Kategori panglacak",
        "trackingcategories-name": "Jeneng layang",
+       "trackingcategories-nodesc": "Ora ana wedharané.",
+       "trackingcategories-disabled": "Kategori ora kaurubaké",
        "mailnologin": "Ora ana alamat kirim",
-       "mailnologintext": "Panjenengan kudu [[Special:UserLogin|mlebu log]] lan duwé alamat layang-èl sing trep ing [[Special:Preferences|pilalané]] panjenengan kanggo nglayangi panganggo liyané.",
+       "mailnologintext": "Panjenengan kudu [[Special:UserLogin|mlebu log]] lan duwé alamat layang-èl kang trep ing [[Special:Preferences|pilalané]] panjenengan kanggo nglayangi panganggo liyané.",
        "emailuser": "Kirimi panganggo iki layang-èl",
        "emailuser-title-target": "Kirim surel ke {{GENDER:$1|pengguna}} ini",
        "emailuser-title-notarget": "Kirimi panganggo layang-èl",
-       "emailpagetext": "Panjenengan bisa migunakaké formulir ing ngisor kanggo ngirim layang-e marang {{GENDER:$1|panganggo}} iki.\nAlamat layang-e sing panjenengan lebokaké ing [[Special:Preferences|préferèsi panjenengan]] bakal dadi alamat \"Saka\" jroning layang-e kasebut, mula panampa layang-e bakal bisa mbalesi langsung menyang panjenengan.",
+       "emailpagetext": "Panjenengan bisa migunakaké formulir ing ngisor kanggo ngirim layang-e marang {{GENDER:$1|panganggo}} iki.\nAlamat layang-e kang panjenengan lebokaké ing [[Special:Preferences|préferèsi panjenengan]] bakal dadi alamat \"Saka\" jroning layang-e kasebut, mula panampa layang-e bakal bisa mbalesi langsung menyang panjenengan.",
        "defemailsubject": "{{SITENAME}} layang èlèktronik saka panganggo \"$1\"",
        "usermaildisabled": "Layang-èl panganggo dipatèni",
-       "usermaildisabledtext": "Sampéyan ora bisa ngirim layang èlèktronik nèng panganggo liya nèng wiki iki",
+       "usermaildisabledtext": "Panjenengan ora bisa ngirim layang èlèktronik marang panganggo liya ing wiki iki",
        "noemailtitle": "Ora ana alamat layang-èl",
-       "noemailtext": "Panganggo iki ora mènèhi alamat layang-e sing absah.",
+       "noemailtext": "Panganggo iki ora mènèhi alamat layang-e kang trep.",
        "nowikiemailtext": "Panganggo iki wis milih ora nampa layang-e saka panganggo liya.",
        "emailnotarget": "Jeneng panganggo panampa ora ana utawa ora sah.",
        "emailtarget": "Lebokaké jeneng panganggo panampa",
        "emailuserfooter": "Layang-e iki dikirimaké déning $1 marang $2 migunakaké fungsi \"Layangpanganggo\" ing {{SITENAME}}.",
        "usermessage-summary": "Tinggalaké layang sistem.",
        "usermessage-editor": "Pawartaning layang sistem",
+       "usermessage-template": "MediaWiki:UserMessage",
        "watchlist": "Pawawangan",
        "mywatchlist": "Pawawangan",
        "watchlistfor2": "Kanggo $1 $2",
-       "nowatchlist": "Ora ana apa-apa ing pawawanganing sampéyan.",
+       "nowatchlist": "Ora ana apa-apa ing pawawangané panjenengan.",
        "watchlistanontext": "Sumangga mlebu log saperlu ndeleng utawa mbesut barang ing pawawangané panjenengan.",
        "watchnologin": "Durung mlebu log",
-       "addwatch": "Tambah nèng daptar pangawasan",
-       "addedwatchtext": "Kaca \"[[:$1]]\" wis ditambahaké menyang [[Special:Watchlist|daftar pangawasan]].\nOwah-owahan sing dumadi ing tembé ing kaca iku lan kaca dhiskusi sing kagandhèng, bakal dipacak ing kéné.",
-       "removewatch": "Singkiraké saka daptar pangawasan",
-       "removedwatchtext": "Kaca \"[[:$1]]\" wis dibusak saka [[Special:Watchlist|daftar pangawasan]].",
+       "addwatch": "Tambah ing pawawangan",
+       "addedwatchtext": "Kaca \"[[:$1]]\" wis ditambahaké menyang [[Special:Watchlist|pawawangan]].\nOwah-owahan kang dumadi ing tembé ing kaca iku lan kaca dhiskusi kang kagandhèng, bakal dipacak ing kéné.",
+       "removewatch": "Singkiraké saka pawawangan",
+       "removedwatchtext": "Kaca \"[[:$1]]\" wis dibusak saka [[Special:Watchlist|pawawangan]].",
        "watch": "Awasi",
        "watchthispage": "Periksa kaca iki",
        "unwatch": "Aja ngawasaké manèh",
        "notvisiblerev": "Révisi wis dibusak",
        "watchlist-details": "{{PLURAL:$1|Kaca cacah $1|Kaca cacah $1}} ana ing Pawawangané panjenengan (kalebu kaca-kaca parembugan).",
        "wlheader-enotif": "Wara-wara layang-èl diurubaké.",
-       "wlheader-showupdated": "Kaca-kaca sing wis owah wiwit ditiliki panjenengan kaping pungkasan, dituduhaké mawa '''aksara kandel'''",
+       "wlheader-showupdated": "Kaca kang wis owah kawit wektu pungkasan panjenengan priksa katuduhaké mawa <strong>hurup kandel</strong>.",
        "wlnote": "Ing ngisor iki {{PLURAL:$1|owahan pungkasan|<strong>$1</strong> owahan pungkasan}} ing dalem {{PLURAL:$2|jam|<strong>$2</strong> jam}} pungkasan, rikala $3, $4.",
        "wlshowlast": "Tuduhaké $1 jam $2 dina pungkasan",
        "watchlist-hide": "Dhelikaké",
        "wlshowhidebots": "bot",
        "wlshowhideliu": "panganggo kadhaftar",
        "wlshowhideanons": "panganggo anonim",
-       "wlshowhidepatr": "besutan sing diawasi",
+       "wlshowhidepatr": "besutan kang diawasi",
        "wlshowhidemine": "besutanku",
        "wlshowhidecategorization": "kategorisasi kaca",
        "watchlist-options": "Pilihaning pawawangan",
        "watching": "Ngawasi...",
        "unwatching": "Ngilangi pangawasan...",
        "watcherrortext": "Ana masalah nalika ngganti setèlan pawawangané panjenengan tumrap \"$1\".",
-       "enotif_reset": "Tandhanana kabèh kaca sing wis ditiliki",
+       "enotif_reset": "Tandhani kabèh kaca kang wis daktiliki",
        "enotif_impersonal_salutation": "Panganggo {{SITENAME}}",
        "enotif_subject_deleted": "Halaman $1 di {{SITENAME}} telah dihapus oleh {{gender:$2|$2}}",
        "enotif_subject_created": "Halaman $1 di {{SITENAME}} telah dibuat oleh {{gender:$2|$2}}",
        "enotif_lastvisited": "Deleng $1 kanggo kabèh owah-owahan wiwit pungkasan panjenengan niliki.",
        "enotif_lastdiff": "Saperlu ndeleng owahan iki, tilikana $1",
        "enotif_anon_editor": "panganggo anonim $1",
-       "enotif_body": "Sing minulya $WATCHINGUSERNAME,\n\nKaca $PAGETITLE ing {{SITENAME}} wis $CHANGEDORCREATED ing $PAGEEDITDATE déning $PAGEEDITOR, mangga mirsani $PAGETITLE_URL kanggo vèrsi pungkasan.\n\n$NEWPAGE\n\nSajarah suntingan: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungana panyunting:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKita ora bakal ngandhani manèh yèn diowahi manèh, kejaba panjenengan wis mirsani kaca iku. Panjenengan uga bisa mbusak tandha notifikasi kanggo kabèh kaca pangawasan ing daftar pangawasan panjenengan.\n\n             Sistém notifikasi {{SITENAME}}\n\n--\nKanggo ngowahi préferènsi ing daftar pangawasan panjenengan, mangga mirsani\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUmpan balik lan pitulung sabanjuré:\n$HELPPAGE",
+       "enotif_body": "Kang minulya $WATCHINGUSERNAME,\n\nKaca $PAGETITLE ing {{SITENAME}} wis $CHANGEDORCREATED ing $PAGEEDITDATE déning $PAGEEDITOR, mangga mirsani $PAGETITLE_URL kanggo vèrsi pungkasan.\n\n$NEWPAGE\n\nSajarah suntingan: $PAGESUMMARY $PAGEMINOREDIT\n\nHubungana panyunting:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nKita ora bakal ngandhani manèh yèn diowahi manèh, kejaba panjenengan wis mirsani kaca iku. Panjenengan uga bisa mbusak tandha notifikasi kanggo kabèh kaca pangawasan ing pawawangané panjenengan.\n\n             Sistém notifikasi {{SITENAME}}\n\n--\nKanggo ngowahi préferènsi ing pawawangané panjenengan, mangga mirsani\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nUmpan balik lan pitulung sabanjuré:\n$HELPPAGE",
+       "enotif_minoredit": "Iki besutan cilik",
        "created": "kadamel",
        "changed": "kaubah",
        "deletepage": "Busak kaca",
        "confirm": "Dhedhes (konfirmasi)",
        "excontent": "isi sadurungé: '$1'",
-       "excontentauthor": "isiné: \"$1\", lan sing nyumbang mung \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|parembugan]])",
+       "excontentauthor": "isiné: \"$1\", lan kang nyumbang mung \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|parembugan]])",
        "exbeforeblank": "isi sadurungé dikosongaké: '$1'",
        "delete-confirm": "Busak \"$1\"",
        "delete-legend": "Busak",
-       "historywarning": "'''Pènget''': Kaca sing bakal panjenengan busak ana sajarahé kanthi $1 {{PLURAL:$1|révisi|révisi}}:",
+       "historywarning": "'''Pènget''': Kaca kang bakal panjenengan busak ana sajarahé kanthi $1 {{PLURAL:$1|révisi|révisi}}:",
        "historyaction-submit": "Tuduhaké",
-       "confirmdeletetext": "Panjenengan nedya mbusak kaca dalah kabèh sujarahé.\nMangga konfirmasi yèn panjenengan pancèn nedya ngayahi iki, ngerti kabèh temahané, lan tumindaké panjenengan miturut [[{{MediaWiki:Policy-url}}|pranatan]].",
+       "confirmdeletetext": "Panjenengan arep mbusek kaca dalah kabèh sajarahé.\nSumangga konfirmasi yèn panjenengan pancèn arep ngayahi iki, ngerti temahané, lan panjenengan tumindak miturut [[{{MediaWiki:Policy-url}}|pranatan]].",
        "actioncomplete": "Kasil diayahi",
        "actionfailed": "Tindakan gagal",
-       "deletedtext": "\"$1\" wis dibusak. \nDelenga $2 minangka cathetan ngenani sing pungkasan kabusak.",
+       "deletedtext": "\"$1\" wis dibusak. \nDelenga $2 minangka cathetan ngenani kang pungkasan kabusak.",
        "dellogpage": "Log busak",
-       "dellogpagetext": "Ing ngisor iki kapacak log pambusakan kaca sing anyar dhéwé.",
+       "dellogpagetext": "Ing ngisor iki kapacak log pambusakan kaca kang anyar dhéwé.",
        "deletionlog": "log busak",
+       "log-name-create": "Log panggawéning kaca",
+       "log-description-create": "Ing isor iki pratélan kaca kang mentas kagawé.",
+       "logentry-create-create": "$1 {{GENDER:$2|nggawé}} kaca $3",
        "reverted": "Dibalèkaké ing revisi sadurungé",
        "deletecomment": "Alesan:",
        "deleteotherreason": "Alesan liya utawa tambahan:",
        "deletereasonotherlist": "Alesan liya",
-       "deletereason-dropdown": "*Alesan pambusakan\n** Spam\n** Vandhalisme\n** Terakan hak cipta\n** Panyuwun sing nulis\n** Alihan rusak",
+       "deletereason-dropdown": "*Alesan pambusakan\n** Spam\n** Vandhalisme\n** Terakan hak cipta\n** Panyuwun kang nulis\n** Alihan rusak",
        "delete-edit-reasonlist": "Besut alesané pambusak",
-       "delete-toobig": "Kaca iki darbé sajarah besutan sing dawa, punjul $1 {{PLURAL:$1|owahan}}.\nMbusak kaca sing kaya mangkono wis ora diidinaké kanggo njagani supaya ora ana sing rusak ing {{SITENAME}}.",
-       "delete-warning-toobig": "Kaca iki duwé sajarah besut sing dawa, punjul $1 {{PLURAL:$1|révisi}}.\nMbusak kaca iki bisa ngrusak lakuné basis dhata ing {{SITENAME}};\nkudu diayahi kanthi ngati-ati.",
+       "delete-toobig": "Kaca iki duwé sajarah besutan kang dawa, punjul $1 {{PLURAL:$1|owahan}}.\nMbusek kaca mangkéné wis winates kanggo ngéndhani prakara kang ora ingarepaké {{SITENAME}}.",
+       "delete-warning-toobig": "Kaca iki duwé sajarah besutan kang dawa, punjul $1 {{PLURAL:$1|révisi}}.\nMbusak kaca iki bisa ngrusak lakuné basis dhata ing {{SITENAME}};\nkudu diayahi kanthi ngati-ati.",
        "deleteprotected": "Panjenengan ora bisa mbusak kaca iki amarga direksa.",
-       "deleting-backlinks-warning": "'''Awas:''' Kaca liyane mungkin ana sing nautake ing kaca sing arep sampeyan busak.",
+       "deleting-backlinks-warning": "<strong>Pepéling:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Ana kaca liya]] kang nggayut utawa tranklud marang kaca kang arep panjenengan busek.",
        "rollback": "Pulihaké besutan",
        "rollbacklink": "balèkaké",
        "rollbacklinkcount": "balèkaké $1 {{PLURAL:$1|besutan|besutan}}",
        "rollbacklinkcount-morethan": "balèkaké luwih saka $1 {{PLURAL:$1|suntingan|suntingan}}",
        "rollbackfailed": "Pambalèkan gagal dilakoni",
        "cantrollback": "Ora bisa mbalèkaké suntingan; panganggo pungkasan iku siji-sijiné penulis artikel iki.",
-       "alreadyrolled": "Ora bisa mulihaké besutan pungkasan [[:$1]] déning [[User:$2|$2]] ([[User talk:$2|rembug]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); ana wong liya sing wis mbesut utawa mulihaké kaca iki.\n\nBesutan pungkasan kaca iku garapané [[User:$3|$3]] ([[User talk:$3|rembug]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
+       "alreadyrolled": "Ora bisa mulihaké besutan pungkasan [[:$1]] déning [[User:$2|$2]] ([[User talk:$2|rembug]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); ana wong liya kang wis mbesut utawa mulihaké kaca iki.\n\nBesutan pungkasan kaca iku garapané [[User:$3|$3]] ([[User talk:$3|rembug]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Ringkesan suntingan yaiku: <em>$1</em>.",
        "revertpage": "Besutané [[Special:Contributions/$2|$2]] ([[User talk:$2|rembugan]]) dipulihaké ing révisi pungkasan garapané [[User:$1|$1]]",
        "revertpage-nouser": "Besutané panganggo peteng dipulihaké ing révisi pungkasan garapané {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Suntingan dibalèkaké déning $1;\ndiowahi bali menyang vèrsi pungkasan déning $2.",
        "sessionfailure-title": "Sèsi gagal",
-       "sessionfailure": "Katoné ana masalah nalika panjenengan mlebu log; \ntumindak iki diwurungaké kanggo jaga-jaga yèn ana sing mbajag.\nBalia menyang kaca sadurungé, momota manèh kacané lan tumuli jajalen manèh.",
+       "sessionfailure": "Katoné ana masalah nalika panjenengan mlebu log; \nlaku iki kawurungaké kanggo jaga-jaga yèn ana kang mbajag.\nSumangga balèni kirim formuliré.",
        "changecontentmodel-title-label": "Sesirahé kaca",
        "changecontentmodel-model-label": "Modhèl kontèn anyar",
        "changecontentmodel-reason-label": "Alesan:",
        "logentry-contentmodel-change-revertlink": "pulihaké",
        "logentry-contentmodel-change-revert": "pulihaké",
        "protectlogpage": "Log reksa",
-       "protectlogtext": "Ngisor iki daptar owahan saka panjagan kaca.\nDelok [[Special:ProtectedPages|daptar kaca sing dijaga]] kanggo daptar panjagan kaca paling anyar.",
+       "protectlogtext": "Ngisor iki pratélan owahan saka panjagan kaca.\nDeleng [[Special:ProtectedPages|pratélan kaca kang dijaga]] kanggo pratélan panjagan kaca paling anyar.",
        "protectedarticle": "ngreksa \"[[$1]]\"",
        "modifiedarticleprotection": "ngowahi tataran rereksané \"[[$1]]\"",
        "unprotectedarticle": "nyingkiraké panjagan saka \"[[$1]]\"",
        "protect-title": "Owahi tataran rereksané \"$1\"",
        "protect-title-notallowed": "Deleng tataran rereksan saka \"$1\"",
        "prot_1movedto2": "$1 dialihaké menyang $2",
-       "protect-badnamespace-title": "Bilik jeneng sing ora bisa dijagani",
-       "protect-badnamespace-text": "Kaca ng bilik jeneng iki ora bisa dijagani.",
+       "protect-badnamespace-title": "Bilik jeneng kang ora bisa dijagani",
+       "protect-badnamespace-text": "Kaca ing bilik jeneng iki ora bisa dijagani.",
        "protect-norestrictiontypes-text": "Kaca iki ora isa diproteksi.",
-       "protect-norestrictiontypes-title": "Kaca sing ora bisa diproteksi",
+       "protect-norestrictiontypes-title": "Kaca kang ora bisa diproteksi",
        "protect-legend": "Konfirmasi rereksan",
        "protectcomment": "Alesan:",
        "protectexpiry": "Kadaluwarsa:",
        "protect_expiry_invalid": "Wektu kadaluwarsa ora sah.",
-       "protect_expiry_old": "Wektu kadaluwarsané kuwi ana ing jaman biyèn.",
+       "protect_expiry_old": "Wektu kadaluwarsané ana ing kala kawuri.",
        "protect-unchain-permissions": "Urubaké opsi rereksan lanjutan",
-       "protect-text": "Ing kéné, sampéyan bisa ndeleng lan ngganti tataran kareksan tumrap kaca <strong>$1</strong>.",
+       "protect-text": "Ing kéné, panjenengan bisa ndeleng lan ngganti tataran kareksan tumrap kaca <strong>$1</strong>.",
        "protect-locked-blocked": "Panjenengan ora bisa ngowahi tataran rereksan nalika diblokir.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
        "protect-locked-dblock": "Tataran rereksan ora bisa diowahi amarga sasana dhatané digembok.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
        "protect-locked-access": "Akuné panjenengan ora kawogan ngowahi tataran rereksan kaca.\nMangkéné setèlan saiki tumrap kaca <strong>$1</strong>:",
-       "protect-cascadeon": "Kaca iki lagi direksa amerga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} sing wis direksa mawa pilihan pangreksan runtun diaktifaké. Panjenengan bisa ngganti tingkat pangreksan kanggo kaca iki, nanging perkara iku ora awèh pengaruh pangreksan runtun.",
+       "protect-cascadeon": "Kaca iki lagi direksa amarga disertakaké ing {{PLURAL:$1|kaca|kaca-kaca}} kang wis direksa mawa pilihan pangreksan runtun diaktifaké. Panjenengan bisa ngganti tingkat pangreksan kanggo kaca iki, nanging perkara iku ora awèh pengaruh pangreksan runtun.",
        "protect-default": "Idinaké kabèh panganggo",
        "protect-fallback": "Perlu idin hak aksès \"$1\"",
-       "protect-level-autoconfirmed": "Mung idinaké panganggo sing otomatis kadhaftar",
+       "protect-level-autoconfirmed": "Mung idinaké panganggo kang otomatis kadhaftar",
        "protect-level-sysop": "Namung opsis (operator sistem)",
        "protect-summary-cascade": "runtun",
        "protect-expiring": "kadaluwarsa $1 (UTC)",
        "protect-expiring-local": "kedaluwarsa $1",
        "protect-expiry-indefinite": "salawasé",
-       "protect-cascade": "Reksa kaca sing kalebu ing kaca iki (rereksan runtun).",
+       "protect-cascade": "Reksa kaca kang kalebu ing kaca iki (rereksan runtun).",
        "protect-cantedit": "Panjenengan ora bisa ngowahi tataran rereksan kaca iki amarga panjenengan ora kawogan mbesut.",
        "protect-othertime": "Wektu liyané:",
        "protect-othertime-op": "wektu liyané",
        "protect-existing-expiry": "Wektu kadaluwarsa saiki: $3, $2",
        "protect-otherreason": "Alesan tambahan/liyané:",
        "protect-otherreason-op": "Alesan liyané",
-       "protect-dropdown": "*Alesan umum pangreksa\n** Vandalisme makaping-kaping\n** Spam makaping-kaping\n** Perang besutan ora prodhuktif\n** Kaca sing dhuwur trafiké",
+       "protect-dropdown": "*Alesan umum pangreksa\n** Vandalisme makaping-kaping\n** Spam makaping-kaping\n** Perang besutan ora prodhuktif\n** Kaca kang dhuwur trafiké",
        "protect-edit-reasonlist": "Besut alesané ngreksa",
        "protect-expiry-options": "1 jam:1 hour,1 dina:1 day,1 minggu:1 week,2 minggu:2 weeks,1 wulan:1 month,3 wulan:3 months,6 wulan:6 months,1 taun:1 year,tanpa wates:infinite",
        "restriction-type": "Palilah:",
        "restriction-level-sysop": "kareksa sawutuhé",
        "restriction-level-autoconfirmed": "semu kareksa",
        "restriction-level-all": "kabèh tingkatan",
-       "undelete": "Deleng kaca sing dibusak",
+       "undelete": "Deleng kaca kang dibusak",
        "undeletepage": "Deleng lan pulihaké kaca kabusak",
-       "undeletepagetitle": "'''Ing ngisor iki kapacak daftar révisi sing dibusak saka [[:$1]]'''.",
-       "viewdeletedpage": "Deleng kaca sing wis dibusak",
+       "undeletepagetitle": "'''Ing ngisor iki kapacak pratélan révisi kang dibusak saka [[:$1]]'''.",
+       "viewdeletedpage": "Deleng kaca kang wis dibusak",
        "undeletepagetext": "{{PLURAL:$1|kaca iki wis dibusak nanging isih|$1 kaca iki wis dibusak nanging isih}} ana ing arsip lan bisa dibalèkaké.\nArsip bisa diresiki sakala-kala.",
        "undelete-fieldset-title": "Pulihaké révisi",
-       "undeleteextrahelp": "Saperlu mulihaké kabèh surajah kaca, jaraké kothak cèk kosong banjur klik <strong><em>{{int:undeletebtn}}</em></strong>.\nSaperlu ngayahi réstorasi sèlèktif, cèk kothak sing magepokan karo révisi sing arep dipulihaké, banjur klik <strong><em>{{int:undeletebtn}}</em></strong>.",
+       "undeleteextrahelp": "Saperlu mulihaké kabèh surajah kaca, jaraké kothak cèk kosong banjur klik <strong><em>{{int:undeletebtn}}</em></strong>.\nSaperlu ngayahi réstorasi sèlèktif, cèk kothak kang magepokan karo révisi kang arep dipulihaké, banjur klik <strong><em>{{int:undeletebtn}}</em></strong>.",
        "undeleterevisions": "$1 {{PLURAL:$1|révisi|révisi}} diarsipaké",
-       "undeletehistory": "Yèn panjenengan mbalèkaké kaca, kabèh révisi bakal dibalèkaké jroning sajarah.\nYèn sawijining kaca anyar kanthi jeneng sing padha wis digawé wiwit nalika pambusakan, révisi sing wis dibalèkaké bakal katon jroning sajarah sadurungé.",
-       "undeleterevdel": "Pambatalan pambusakan ora bakal dilakokaké yèn bab iku bakal ngakibataké révisi pungkasan kaca dadi sabagéyan kabusak.\nIng kasus kaya mengkono, panjenengan kudu ngilangaké cèk utawa mbusak pandelikan révisi kabusak sing anyar dhéwé.",
-       "undeletehistorynoadmin": "Kaca iki wis dibusak.\nAlesané dituduhaké ing ringkesan ing ngisor iki, karo détail para panganggo sing wis nyunting kaca iki sadurungé dibusak.\nIsi pungkasan tèks iki wis dibusak lan namung bisa dideleng para pangurus.",
-       "undelete-revision": "Révisi sing wis dibusak saka $1 (ing $5, $4) déning $3:",
-       "undeleterevision-missing": "Revisi salah utawa ora ditemokaké.\nPanjenengan mbokmenawa ngetutaké pranala sing salah, utawa revisi iku wis dipulihaké utawa diguwang saka arsip.",
-       "undelete-nodiff": "Ora ditemokaké révisi sing luwih lawas.",
+       "undeletehistory": "Yèn panjenengan mbalèkaké kaca, kabèh révisi bakal dibalèkaké jroning sajarah.\nYèn kaca anyar kanthi jeneng kang padha wis digawé wiwit nalika pambusakan, révisi kang wis dibalèkaké bakal katon jroning sajarah sadurungé.",
+       "undeleterevdel": "Pambatalan pambusakan ora bakal dilakokaké yèn bab iku bakal ngakibataké révisi pungkasan kaca dadi sabagéyan kabusak.\nIng kasus kaya mengkono, panjenengan kudu ngilangaké cèk utawa mbusak pandelikan révisi kabusak kang anyar dhéwé.",
+       "undeletehistorynoadmin": "Kaca iki wis dibusak.\nAlesané dituduhaké ing ringkesan ing ngisor iki, karo détail para panganggo kang wis mbesut kaca iki sadurungé dibusak.\nIsi pungkasan tèks iki wis dibusak lan namung bisa dideleng para pangurus.",
+       "undelete-revision": "Révisi kang wis dibusak saka $1 (ing $5, $4) déning $3:",
+       "undeleterevision-missing": "Revisi salah utawa ora tinemu.\nPanjenengan bokmanawa ngetutaké pranala kang salah, utawa revisi iku wis dipulihaké utawa diguwang saka arsip.",
+       "undelete-nodiff": "Ora tinemu révisi kang luwih lawas.",
        "undeletebtn": "Balèkna!",
        "undeletelink": "pirsani/balèkna",
        "undeleteviewlink": "pirsani",
        "undeletecomment": "Alesan:",
        "cannotundelete": "Olèhé mbatalaké pambusakan gagal;\n$1",
        "undeletedpage": "'''$1 bisa dibalèkaké'''\n\nDelengen [[Special:Log/delete|log pambusakan]] kanggo data pambusakan lan pambalèkan.",
-       "undelete-header": "Mangga mirsani [[Special:Log/delete|log pambusakan]] kanggo daftar kaca sing lagi waé dibusak.",
+       "undelete-header": "Mangga mirsani [[Special:Log/delete|log pambusakan]] kanggo pratélan kaca kang lagi waé dibusak.",
        "undelete-search-title": "Golèk kaca kabusak",
-       "undelete-search-box": "Golèk kaca-kaca sing wis dibusak",
-       "undelete-search-prefix": "Tuduhna kaca sing diwiwiti karo:",
+       "undelete-search-box": "Golèk kaca-kaca kang wis dibusak",
+       "undelete-search-prefix": "Tuduhna kaca kang diwiwiti karo:",
        "undelete-search-submit": "Golèk",
-       "undelete-no-results": "Ora ditemokaké kaca sing cocog ing arsip pambusakan.",
+       "undelete-no-results": "Ora tinemu kaca kang cocog ing arsip pambusakan.",
        "undelete-filename-mismatch": "Ora bisa mulihaké révisi barkas mawa tandha wektu $1: Jeneng barkas ora padha",
        "undelete-bad-store-key": "Ora bisa mbatalaké pambusakan révisi berkas mawa tandha wektu $1: berkas ilang sadurungé dibusak.",
-       "undelete-cleanup-error": "Ana kaluputan nalika mbusak arsip berkas \"$1\" sing ora dienggo.",
-       "undelete-missing-filearchive": "Ora bisa mulihaké arsip barkas ID $1 amarga ora ana ing basis data.\nBarkas iku bokmenawa wis dibusak.",
+       "undelete-cleanup-error": "Masalah nalika mbusak barkas arsip \"$1\" kang ora kanggo.",
+       "undelete-missing-filearchive": "Ora bisa mulihaké arsip barkas ID $1 amarga ora ana ing basis dhatah.\nBarkas iku bokmanawa wis binusek.",
        "undelete-error": "Masalah mulihaké kaca",
-       "undelete-error-short": "Kaluputan olèhé mbatalaké pambusakan: $1",
-       "undelete-error-long": "Ana kaluputan nalika mbatalaké pambusakan berkas:\n\n$1",
-       "undelete-show-file-confirm": "Apa panjenengan yakin arep mirsani révisi berkas \"<nowiki>$1</nowiki>\" sing wis kabusak ing $2 jam $3?",
+       "undelete-error-short": "Masalah nalika wurung mbusak barkas: $1",
+       "undelete-error-long": "Masalah nalika wurung mbusak barkas:\n\n$1",
+       "undelete-show-file-confirm": "Apa panjenengan yakin arep mirsani révisi berkas \"<nowiki>$1</nowiki>\" kang wis kabusak ing $2 jam $3?",
        "undelete-show-file-submit": "Ya",
        "namespace": "Mandala aran:",
        "invert": "Balèkaké pilihan",
-       "tooltip-invert": "Centhang kothak iki kanggo ndhelikaké owahan saka kaca-kaca ng njero bilik jeneng kapilih (lan bilik jeneng kakait yèn dicenthang)",
+       "tooltip-invert": "Centhang kothak iki kanggo ndhelikaké owahan saka kaca-kaca ing njero bilik jeneng kapilih (lan bilik jeneng kakait yèn dicenthang)",
        "namespace_association": "Mandala aran magepokan",
-       "tooltip-namespace_association": "Centhang kothak iki kanggo nglebokaké uga bilik jeneng gumenan utawa subyèk sing kakait karo bilik jeneng kapilih",
+       "tooltip-namespace_association": "Centhang kothak iki kanggo nglebokaké uga bilik jeneng gumenan utawa subyèk kang kakait karo bilik jeneng kapilih",
        "blanknamespace": "(Pokok)",
        "contributions": "Pisumbanging {{GENDER:$1|panganggo}}",
        "contributions-title": "Pisumbanging panganggo $1",
        "mycontris": "Pasumbang",
        "anoncontribs": "Pasumbang",
        "contribsub2": "Kanggo {{GENDER:$3|$1}} ($2)",
-       "nocontribs": "Ora tinemu Owah-owahan sing cocog karo wewaton mangkono.",
+       "nocontribs": "Owah-owahan kang cocog karo wewaton mangkono ora tinemu.",
        "uctop": "(saiki)",
        "month": "Saka wulan (lan sadurungé):",
        "year": "Saka taun (lan sadurungé):",
        "sp-contributions-newbies-sub": "Kanggo panganggo anyar",
        "sp-contributions-newbies-title": "Pisumbanging panganggo anyar",
        "sp-contributions-blocklog": "log blokir",
-       "sp-contributions-deleted": "pisumbangé {{GENDER:$1|panganggo}} sing dibusak",
+       "sp-contributions-deleted": "pisumbangé {{GENDER:$1|panganggo}} kang dibusak",
        "sp-contributions-uploads": "unggahan",
        "sp-contributions-logs": "log",
        "sp-contributions-talk": "rembug",
        "sp-contributions-userrights": "panataning hak {{GENDER:$1|panganggo}}",
-       "sp-contributions-blocked-notice": "Panganggo iki lagi diblokir.\nÈntri log blokiran pungkasan sumadhiya ng ngisor kanggo rujukan:",
-       "sp-contributions-blocked-notice-anon": "Alamat IP iki lagi diblokir.\nÈntri log blokiran pungkasan sumadhiya ng ngisor kanggo rujukan:",
+       "sp-contributions-blocked-notice": "Panganggo iki lagi diblokir.\nÈntri log blokiran pungkasan sumadhiya ing ngisor kanggo rujukan:",
+       "sp-contributions-blocked-notice-anon": "Alamat IP iki lagi diblokir.\nÈntri log blokiran pungkasan sumadhiya ing ngisor kanggo rujukan:",
        "sp-contributions-search": "Golèk pasumbang",
        "sp-contributions-username": "Alamat IP utawa jeneng panganggo:",
        "sp-contributions-toponly": "Tuduhaké besutan mligi révisi anyaran",
        "whatlinkshere-title": "Kaca mawa pranala nggayut \"$1\"",
        "whatlinkshere-page": "Kaca:",
        "linkshere": "Kaca-kaca ing ngisor iki nggayut menyang <strong>$2</strong>:",
-       "nolinkshere": "Ora ana kaca sing nduwé pranala menyang '''$2'''.",
-       "nolinkshere-ns": " Ora ana kaca sing nduwé pranala menyang '''$2''' ing bilik jeneng sing kapilih.",
+       "nolinkshere": "Ora ana kaca kang nduwé pranala menyang '''$2'''.",
+       "nolinkshere-ns": " Ora ana kaca kang nduwé pranala menyang '''$2''' ing bilik jeneng kang kapilih.",
        "isredirect": "kaca lih-lihan",
        "istemplate": "tranklusi",
        "isimage": "pranala barkas",
        "block": "Blokir panganggo",
        "unblock": "Uculaké blokirané panganggo",
        "blockip": "Palang {{GENDER:$1|panganggo}}",
-       "blockiptext": "Enggonen formulir ing ngisor iki saperlu mblokir aksès nulis lumantar alamat IP utawa panganggo mirunggan.\nIki kudu diayahi kanggo ngéndhani vandhalisme, lan minangkani [[{{MediaWiki:Policy-url}}|pranatan]].\nIsinen alesan sing mirunggan ing ngisor iki (contoné, nyitir kaca mirunggan sing dirusak).\nPanjenengan bisa mblokir saprangkat alamat IP lumantar sintaksis [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; kèhé prangkat sing diidinaké ya iku /$1 kanggo IPv4 lan /$2 kanggo IPv6.",
+       "blockiptext": "Enggonen formulir ing ngisor iki saperlu mblokir aksès nulis lumantar alamat IP utawa panganggo mirunggan.\nIki kudu diayahi kanggo ngéndhani vandhalisme, lan minangkani [[{{MediaWiki:Policy-url}}|pranatan]].\nIsinen alesan kang mirunggan ing ngisor iki (contoné, nyitir kaca mirunggan kang dirusak).\nPanjenengan bisa mblokir saprangkat alamat IP lumantar sintaksis [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; kèhé prangkat kang diidinaké ya iku /$1 kanggo IPv4 lan /$2 kanggo IPv6.",
        "ipaddressorusername": "Alamat IP utawa jeneng panganggo",
        "ipbexpiry": "Kadaluwarsa",
        "ipbreason": "Alesan:",
-       "ipbreason-dropdown": "*Alesan umum mblokir\n** Mènèhi informasi palsu\n** Mbusak isi kaca\n** Spam pranala menyang situs njaba\n** Nglebokaké tulisan ngawur ing kaca\n** Tumindak nglècèhaké\n** Ngujar-ujari sawenèh akun\n** Jeneng panganggo ora patut",
-       "ipb-hardblock": "Wurungaké panganggo sing wis mlebu log mbesut saka alamat IP iki",
+       "ipbreason-dropdown": "*Alesan kang lumrah blokiran\n** Mènèhi informasi palsu\n** Mbusak isi kaca\n** Nguwuh pranala menyang situs njaba\n** Nglebokaké tulisan ngawur ing kaca\n** Ngasoraké liyan\n** Nganggo sawenèh akun kanggo laku ala\n** Jeneng panganggo ora patut",
+       "ipb-hardblock": "Wurungaké panganggo kang wis mlebu log mbesut saka alamat IP iki",
        "ipbcreateaccount": "Penggak panggawéné akun",
        "ipbemailban": "Penggak panganggo saka ngirim layang-èl",
-       "ipbenableautoblock": "Otomatis blokir alamat IP pungkasan sing dienggo panganggo iki, lan samubarang alamat IP ing tembé sing arep dienggo mbesut.",
+       "ipbenableautoblock": "Otomatis blokir alamat IP pungkasan kang dienggo panganggo iki, lan samubarang alamat IP ing tembé kang arep dienggo mbesut.",
        "ipbsubmit": "Blokir panganggo iki",
        "ipbother": "Wektu liya",
        "ipboptions": "2 jam:2 hours,1 dina:1 day,3 dina:3 days,1 minggu:1 week,2 minggu:2 weeks,1 wulan:1 month,3 wulan:3 months,6 wulan:6 months,1 taun:1 year,tanpa wates:infinite",
        "badipaddress": "Alamat IP klèntu",
        "blockipsuccesssub": "Suksès mblokir",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] wis diblokir.<br />\nDeleng [[Special:BlockList|pratélan blokir]] saperlu mriksa blokiran.",
-       "ipb-blockingself": "Panjenengan arep mblokir panjenengan dhéwé! Panjenengan yakin arep nglakoni kuwi?",
-       "ipb-confirmhideuser": "Sampéyan arep mblokir panganggo mawa piranti \"dhelikaké panganggo\" isih murub. Iki bakal nyegah jeneng panganggo ana ing kabèh daptar lan èntri log. Sampéyan yakin arep nglakoni kuwi?",
+       "ipb-blockingself": "Panjenengan arep mblokir panjenengan dhéwé! Panjenengan yakin arep nglakoni iku?",
+       "ipb-confirmhideuser": "Panjenengan arep mblokir panganggo mawa piranti \"dhelikaké panganggo\" isih murub. Iki bakal nyegah jeneng panganggo ana ing kabèh pratélan lan èntri log. Panjenengan yakin arep nglakoni iku?",
        "ipb-edit-dropdown": "Besut alesané mblokir",
        "ipb-unblock-addr": "Copot blokiran tumrap $1",
        "ipb-unblock": "Copot blokiran tumrap jeneng panganggo utawa alamat IP",
-       "ipb-blocklist": "Deleng blokiran sing ana",
+       "ipb-blocklist": "Deleng blokiran kang ana",
        "ipb-blocklist-contribs": "Pasumbanging {{GENDER:$1|$1}}",
        "ipb-blocklist-duration-left": "Kari $1",
        "unblockip": "Copot blokiran panganggo",
-       "unblockiptext": "Nggonen formulir ing ngisor iki kanggo mbalèkaké aksès nulis sawijining alamt IP utawa panganggo sing sadurungé diblokir.",
+       "unblockiptext": "Nggonen formulir ing ngisor iki kanggo mbalèkaké aksès nulis alamat IP utawa panganggo kang sadurungé diblokir.",
        "ipusubmit": "Copot blokiran iki",
        "unblocked": "Blokir marang [[User:$1|$1]] wis dijabel",
        "unblocked-range": "$1 ora diblokir manèh",
        "autoblocklist-localblocks": "{{PLURAL:$1|Swablokir}} enggonan",
        "autoblocklist-empty": "Pratélan swablokir kosong.",
        "ipblocklist": "Panganggo diblokir",
-       "ipblocklist-legend": "Golèk panganggo sing diblokir",
+       "ipblocklist-legend": "Golèk panganggo kang diblokir",
        "blocklist-userblocks": "Dhelikaké blokiran akun",
        "blocklist-tempblocks": "Dhelikaké blokiran sawetara",
        "blocklist-addressblocks": "Dhelikaké blokiran IP tunggal",
        "emailblock": "layang-èl dipatèni",
        "blocklist-nousertalk": "ora kena mbesut kaca parembugané dhéwé",
        "ipblocklist-empty": "Pratélan blokir kosong.",
-       "ipblocklist-no-results": "alamat IP utawa panganggo sing disuwun ora diblokir.",
+       "ipblocklist-no-results": "alamat IP utawa panganggo kang disuwun ora diblokir.",
        "blocklink": "palang",
        "unblocklink": "copot blokiran",
        "change-blocklink": "owahi blokiran",
        "emaillink": "kirim layang-èl",
        "autoblocker": "Panjenengan otomatis dipun-blok amargi nganggé alamat protokol internet (IP) ingkang sami kaliyan \"[[User:$1|$1]]\". Alesanipun $1 dipun blok inggih punika \"'''$2'''\"",
        "blocklogpage": "Log blokir",
-       "blocklog-showlog": "Panganggo iki wis tau diblokir sakdurungé.\nLog blokiran sumadhiya ng ngisor kanggo rujukan:",
-       "blocklog-showsuppresslog": "Panganggo iki wis tau diblokir lan didhelikaké sakdurungé.\nLog brèdèlan sumadhiya ng ngisor kanggo rujukan:",
+       "blocklog-showlog": "Panganggo iki wis tau diblokir sakdurungé.\nLog blokiran sumadhiya ing ngisor kanggo rujukan:",
+       "blocklog-showsuppresslog": "Panganggo iki wis tau diblokir lan didhelikaké sakdurungé.\nLog brèdèlan sumadhiya ing ngisor kanggo rujukan:",
        "blocklogentry": "mblokir [[$1]] kanthi wektu kadaluwarsa $2 $3",
        "reblock-logentry": "ngowah setèlan blokir tumrap [[$1]] kanthi wektu kadaluwarsa $2 $3",
-       "blocklogtext": "Ing ngisor iki kapacak log pamblokiran lan panjabelan blokir panganggo.\nAlamat IP sing diblokir sacara otomatis ora ana ing daftar iki.\nMangga mirsani [[Special:BlockList|daftar panganggo sing diblokir]] kanggo daftar blokir pungkasan.",
+       "blocklogtext": "Ing ngisor iki kapacak log pamblokiran lan panjabelan blokir panganggo.\nAlamat IP kang diblokir sacara otomatis ora ana ing pratélan iki.\nMangga mirsani [[Special:BlockList|pratélan panganggo kang diblokir]] kanggo pratélan blokiran pungkasan.",
        "unblocklogentry": "njabel blokir \"$1\"",
        "block-log-flags-anononly": "namung panganggo anonim",
        "block-log-flags-nocreate": "panggawéné akun dipatèni",
        "range_block_disabled": "Fungsi pamblokir blok IP kanggo para opsis dipatèni.",
        "ipb_expiry_invalid": "Wektu kadaluwarsa ora absah.",
        "ipb_expiry_old": "Wektu kadaluwarsa ana ing nguni.",
-       "ipb_expiry_temp": "Pamblokiran tumrap jeneng panganggo sing didhelikaké kudu permanèn.",
+       "ipb_expiry_temp": "Pamblokiran tumrap jeneng panganggo kang didhelikaké kudu permanèn.",
        "ipb_hide_invalid": "Ora bisa ndhelikaké akun iki; manawa wis kakèhan suntingan.",
        "ipb_already_blocked": "\"$1\" wis diblokir",
        "ipb-needreblock": "$1 wis diblokir. Apa panjenengan sedya ngowahi patrapan blokiran kasebut?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Blokiran|Blokiran}} liya",
-       "unblock-hideuser": "Sampéyan ora bisa mbukak blokiran panganggo iki amarga jeneng panganggoné didhelikaké.",
-       "ipb_cant_unblock": "Kaluputan: Blokir mawa ID $1 ora ditemokaké. Blokir iku mbok-menawa wis dibuka.",
-       "ipb_blocked_as_range": "Kaluputan: IP $1 ora diblokir sacara langsung lan ora bisa dijabel blokiré. IP $1 diblokir mawa bagéyan saka pamblokiran kelompok IP $2, sing bisa dijabel pamblokirané.",
+       "unblock-hideuser": "Panjenengan ora bisa mbukak blokiran panganggo iki amarga jeneng panganggoné didhelikaké.",
+       "ipb_cant_unblock": "Masalah: ID blokiran $1 ora tinemu. Blokiran iku bokmanawa wis kabukak.",
+       "ipb_blocked_as_range": "Masalah: Alamat IP $1 ora langsung kablokir lan ora bisa kabukak blokirané.\nMangkonoa, alamat IP-né kablokir awit saka pérangané $2, kang bisa kabukak blokirané.",
        "ip_range_invalid": "Blok IP ora absah.",
        "ip_range_toolarge": "Jangkahé blokiran luwih gedhé saka /$1 ora dililakaké.",
        "proxyblocker": "Pamblokir proxy",
-       "proxyblockreason": "Alamat IP panjenengan wis diblokir amerga alamat IP panjenengan iku ''open proxy''.\nMangga ngubungi sing nyedyakaké dines internèt panjenengan utawa pitulungan tèknis lan aturana masalah kaamanan sérius iki.",
+       "proxyblockreason": "Alamat IP panjenengan wis diblokir amarga alamat IP panjenengan iku ''open proxy''.\nMangga ngubungi kang nyedyakaké dines internèt panjenengan utawa pitulungan tèknis lan aturana masalah kaamanan sérius iki.",
        "sorbsreason": "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL.",
        "sorbs_create_account_reason": "Alamat IP panjenengan didaftar minangka ''open proxy'' ing DNSBL. Panjenengan ora bisa nggawé akun utawa rékening.",
        "xffblockreason": "Sebuah alamat IP di kepala X-Forwarded-For, entah milik Anda atau server proxy yang Anda pakai, telah diblokir. Alasan pemblokirannya adalah: $1",
-       "cant-see-hidden-user": "Panganggo sing Sampéyan coba blokir wis kablokir lan didhelikaké.\nAmarga Sampéyan ora nduwé hak ndhelikaké panganggo, Sampéyan ora bisa ndelok utawa nyunting blokiran panganggo.",
-       "ipbblocked": "Sampéyan ora bisa mblokir utawa mbukak blokiran panganggo liya amarga Sampéyan dhéwé diblokir",
-       "ipbnounblockself": "Sampéyan ora dililakaké mbukak blokirané Sampéyan",
-       "lockdb": "Kunci basis data",
-       "unlockdb": "Buka kunci basis data",
-       "lockdbtext": "Ngunci basis data bakal menggak kabèh panganggo kanggo nyunting kaca, ngowahi prèferènsi panganggo, nyunting daftar pangawasan, lan prekara-prekara liyané sing merlokaké owah-owahan basis data. Pastèkna yèn iki pancèn panjenengan gayuh, lan yèn panjenengan ora lali mbuka kunci basis data sawisé pangopènan rampung.",
-       "unlockdbtext": "Mbuka kunci basis data bakal mbalèkaké kabèh panganggo bisa nyunting kaca manèh, ngowahi prèferènsi panganggo, nyunting daftar pangawasan, lan prekara-prekara liyané sing merlokaké pangowahan marang basis data.\nTulung pastèkna yèn iki pancèn sing panjenengan gayuh.",
+       "cant-see-hidden-user": "Panganggo kang panjenengan coba blokir wis kablokir lan didhelikaké.\nAmarga panjenengan ora nduwé hak ndhelikaké panganggo, panjenengan ora bisa ndeleng utawa mbesut blokiran panganggo.",
+       "ipbblocked": "Panjenengan ora bisa mblokir utawa mbukak blokiran panganggo liya amarga panjenengan dhéwé diblokir",
+       "ipbnounblockself": "Panjenengan ora dililakaké mbukak blokirané panjenengan",
+       "lockdb": "Gembok basis dhatah",
+       "unlockdb": "Bukak gembok basis dhatah",
+       "lockdbtext": "Ngunci basis data bakal menggak kabèh panganggo kanggo mbesut kaca, ngowahi prèferènsi panganggo, mbesut pawawangan, lan prekara-prekara liyané kang merlokaké owah-owahan basis data. Pastèkna yèn iki pancèn panjenengan gayuh, lan yèn panjenengan ora lali mbuka kunci basis data sawisé pangopènan rampung.",
+       "unlockdbtext": "Mbukak kunci basis data bakal mbalèkaké kabèh panganggo bisa mbesut kaca manèh, ngowahi prèferènsi panganggo, mbesut pawawangan, lan prekara-prekara liyané kang merlokaké pangowahan marang basis data.\nTulung pastèkna yèn iki pancèn kang panjenengan gayuh.",
        "lockconfirm": "Iya, aku pancèn péngin ngunci basis data.",
        "unlockconfirm": "Iya, aku pancèn péngin tmbuka kunci basis data.",
        "lockbtn": "Kunci basis data",
        "lockedbyandtime": "(déning {{GENDER:$1|$1}} tanggal $2 wanci $3)",
        "move-page": "Ngalih $1",
        "move-page-legend": "Mindhah kaca",
-       "movepagetext": "Formulir ing ngisor iki bakal ngganti jeneng kaca lan ngalihaké kabèh sajarahé nyang jeneng anyar.\nJeneng lawas bakal dadi kaca alihan marang jeneng anyar.\nPanjenengan bisa ndandani kaca alihan sing otomatis nggayut nyang kaca asliné.\nYèn ora, pesthèkaké yèn panjenengan wis mriksa ana-orané kaca alihan [[Special:DoubleRedirects|dhobel]] utawa [[Special:BrokenRedirects|rusak]].\nPanjenengan kudu tanggon saperlu mesthèkaké yèn pranalané menyang kaca sing samesthiné.\n\nÉling-élingen yèn kacané <strong>ora</strong> bakal dilih yèn jeneng sing dituju wis ana kacané, kajaba isiné kaca alihan sing ora ana sajarah besutané.\nIki ateges panjenengan bisa ngganti jeneng kaca bali nyang asliné manawa ana salah, lan panjenengan ora bisa ngamblegi kaca sing wis ana.\n\n<strong>Cathetan:</strong>\nTumindak iki bisa dadi owahan sing ora kinira lan gedhé mungguh ing kaca sing misuwur;\nmangga pesthèkaké dhisik yèn panjenengan mudheng temahané sadurungé mbacutaké.",
-       "movepagetext-noredirectfixer": "Formulir ing ngisor iki bakal ngganti jeneng kaca lan ngalihaké kabèh sajarahé nyang jeneng anyar.\nJeneng lawas bakal dadi kaca alihan marang jeneng anyar.\nPanjenengan kudu yakin yèn wis mriksa ana-orané kaca alihan [[Special:DoubleRedirects|dhobel]] utawa [[Special:BrokenRedirects|rusak]].\nPanjenengan kudu tanggon saperlu mesthèkaké yèn pranalané menyang kaca sing samesthiné.\n\nÉling-élingen yèn kacané <strong>ora</strong> bakal dilih yèn jeneng sing dituju wis ana kacané, kajaba isiné kaca alihan sing ora ana sajarah besutané.\nIki ateges panjenengan bisa ngganti jeneng kaca bali nyang asliné manawa ana salah, lan panjenengan ora bisa ngamblegi kaca sing wis ana.\n\n<strong>Cathetan:</strong>\nTumindak iki bisa dadi owahan sing ora kinira lan gedhé mungguh ing kaca sing misuwur;\nmangga pesthèkaké dhisik yèn panjenengan mudheng temahané sadurungé mbacutaké.",
-       "movepagetalktext": "Menawa sampéyan nyénthang kothak iki, kaca parembugan sing magepokan bakal otomatis dilih nyang sesirah anyar, kajaba kaca parembugané sing dituju wis ana isiné.\n\nYèn mangkéné, sampéyan kudu ngalih utawa nggabung kaca-kaca iku kanthi manual.",
-       "moveuserpage-warning": "<strong>Pènget:</strong> Panjenengan iki arep ngalih kaca panganggo. Mangga èlingana yèn mung kacané waé sing bakal dilih, déné panganggoné <em>ora</em> bakal ganti jeneng.",
-       "movecategorypage-warning": "<strong>Pélik:</strong> Panjenengan arep ngalih kaca kategori. Tulung gatèkaké yèn mung kacané thok sing bakal dilih déné samubarang kaca sing ana ing kategori lawas <em>ora</em> bakal mèlu dilih nyang kaca kategori anyar.",
-       "movenologintext": "Panjenengan kudu dadi panganggo sing kadhaftar lan wis [[Special:UserLogin|mlebu log]] yèn arep ngalihaké kaca.",
+       "movepagetext": "Formulir ing ngisor iki bakal ngganti jeneng kaca lan ngalihaké kabèh sajarahé menyang jeneng anyar.\nJeneng lawas bakal dadi kaca alihan marang jeneng anyar.\nPanjenengan bisa ndandani kaca alihan kang otomatis nggayut menyang kaca asliné.\nYèn ora, pesthèkaké yèn panjenengan wis mriksa ana-orané kaca alihan [[Special:DoubleRedirects|dhobel]] utawa [[Special:BrokenRedirects|rusak]].\nPanjenengan kudu tanggung jawab mesthèkaké yèn pranalané menyang kaca kang samesthiné.\n\nÉling-élinga yèn kacané <strong>ora</strong> bakal ingalih yèn jeneng kang kaener wis ana kacané, kajaba isiné kaca alihan kang ora ana sajarah besutané.\nIki ateges panjenengan bisa ngganti jeneng kaca bali menyang asliné manawa kaluputan, lan panjenengan ora bisa ngamblegi kaca kang wis ana.\n\n<strong>Cathetan:</strong>\nLaku iki bisa dadi owahan kang ora kinira lan gedhé mungguh ing kaca kang misuwur;\nsumangga pesthèkaké dhisik yèn panjenengan mudheng temahané sadurungé mbacutaké.",
+       "movepagetext-noredirectfixer": "Formulir ing ngisor iki bakal ngganti jeneng kaca lan ngalihaké kabèh sajarahé menyang jeneng anyar.\nJeneng lawas bakal dadi kaca alihan marang jeneng anyar.\nPanjenengan kudu yakin yèn wis mriksa ana-orané kaca alihan [[Special:DoubleRedirects|dhobel]] utawa [[Special:BrokenRedirects|rusak]].\nPanjenengan kudu tanggung jawab mesthèkaké yèn pranalané menyang kaca kang samesthiné.\n\nÉling-élinga yèn kacané <strong>ora</strong> bakal ingalih yèn jeneng kang kaener wis ana kacané, kajaba isiné kaca alihan kang ora ana sajarah besutané.\nIki ateges panjenengan bisa ngganti jeneng kaca bali menyang asliné manawa ana salah, lan panjenengan ora bisa ngamblegi kaca kang wis ana.\n\n<strong>Cathetan:</strong>\nLaku iki bisa dadi owahan kang ora kinira lan gedhé mungguh ing kaca kang misuwur;\nsumangga pesthèkaké dhisik yèn panjenengan mudheng temahané sadurungé mbacutaké.",
+       "movepagetalktext": "Manawa panjenengan nyénthang kothak iki, kaca parembugan kang magepokan bakal otomatis dilih menyang sesirah anyar, kajaba kaca parembugané kang dituju wis ana isiné.\n\nYèn mangkéné, panjenengan kudu ngalih utawa nggabung kaca-kaca iku kanthi manual.",
+       "moveuserpage-warning": "<strong>Pènget:</strong> Panjenengan iki arep ngalih kaca panganggo. Mangga èlingana yèn mung kacané waé kang bakal dilih, déné panganggoné <em>ora</em> bakal ganti jeneng.",
+       "movecategorypage-warning": "<strong>Pélik:</strong> Panjenengan arep ngalih kaca kategori. Tulung gatèkaké yèn mung kacané kang bakal dilih déné samubarang kaca kang ana ing kategori lawas <em>ora</em> bakal mèlu dilih menyang kaca kategori anyar.",
+       "movenologintext": "Panjenengan kudu dadi panganggo kang kadhaftar lan wis [[Special:UserLogin|mlebu log]] yèn arep ngalihaké kaca.",
        "movenotallowed": "Panjenengan ora pareng ngalihaké kaca.",
        "movenotallowedfile": "Panjenengan ora duwé hak kanggo mindhahaké berkas.",
        "cant-move-user-page": "Panjenengan ora nduwèni hak aksès kanggo mindhahaké kaca panganggo (kapisah saka anak-kaca).",
-       "cant-move-to-user-page": "Panjenengan ora nduwèni hak aksès kanggo mindhahaké kaca menyang sawijining kaca panganggoa (kajaba menyang anak-kaca panganggo).",
+       "cant-move-to-user-page": "Panjenengan ora nduwèni hak aksès kanggo mindhahaké kaca menyang kaca panganggo (kajaba menyang anak-kaca panganggo).",
        "newtitle": "Sesirah anyar:",
        "move-watch": "Awasna kaca iki",
        "movepagebtn": "Ngalih kaca",
        "movepage-moved": "<strong>\"$1\" wis dilih menyang \"$2\"</strong>",
        "movepage-moved-redirect": "Kaca alihan wis kagawé.",
        "movepage-moved-noredirect": "Kanggo gawé pengalihan wis ditahan.",
-       "articleexists": "Kaca mawa jeneng mangkono wis ana utawa jeneng sing kokpilih ora valid.\nMangga pilih jeneng liya.",
-       "cantmove-titleprotected": "Panjenengan ora bisa mindhahaké kaca iki menyang lokasi iki, amerga irah-irahan tujuan lagi direksa; ora olèh digawé",
-       "movetalk": "Lih kaca parembugan sing magepokan",
+       "articleexists": "Kaca mawa jeneng mangkono wis ana utawa jeneng kang kokpilih ora valid.\nMangga pilih jeneng liya.",
+       "cantmove-titleprotected": "Panjenengan ora bisa mindhahaké kaca iki menyang lokasi iki, amarga irah-irahan tujuan lagi direksa; ora olèh digawé",
+       "movetalk": "Lih kaca parembugan kang magepokan",
        "move-subpages": "Lih anak kaca (tekan $1)",
        "move-talk-subpages": "Lih anak kaca saka kaca parembugan (tekan $1)",
        "movepage-page-exists": "Kaca $1 wis ana lan ora bisa ditindhes sacara otomatis.",
        "movepage-page-moved": "Kaca $1 wis dilih menyang $2.",
        "movepage-page-unmoved": "Kaca $1 ora bisa dialihaké menyang $2.",
-       "movepage-max-pages": "Paling akèh $1 {{PLURAL:$1|kaca|kaca}} wis dialihaké lan ora ana manèh sing bakal dialihaké sacara otomatis.",
+       "movepage-max-pages": "Paling akèh $1 {{PLURAL:$1|kaca|kaca}} wis dialihaké lan ora ana manèh kang bakal dialihaké sacara otomatis.",
        "movelogpage": "Log alih",
        "movelogpagetext": "Ing ngisor iki kapacak log pangalihan kaca.",
        "movesubpage": "{{PLURAL:$1|Anak-kaca|Anak-kaca}}",
        "delete_and_move_text": "Kaca paran \"[[:$1]]\" wis ana.\nApa panjenengan péngin mbusak iku supaya kacané bisa dilih?",
        "delete_and_move_confirm": "Ya, busak kaca iku.",
        "delete_and_move_reason": "Dibusak kanggo sarana ngalihaké saka \"[[$1]]\"",
-       "selfmove": "Sesirah sumber lan tujuan padha;\nora bisa ngalih nyang tujuan sing padha.",
+       "selfmove": "Sesirah sumber lan tujuan padha;\nora bisa ngalih menyang tujuan kang padha.",
        "immobile-source-namespace": "Ora bisa mindhahaké kaca jroning bilik jeneng \"$1\"",
        "immobile-target-namespace": "Ora bisa mindhahaké kaca menyang bilik jeneng \"$1\"",
-       "immobile-target-namespace-iw": "Pranala interwiki dudu tujuan sing trep tumrap pangalihé kaca.",
+       "immobile-target-namespace-iw": "Pranala interwiki dudu tujuan kang trep tumrap pangalihé kaca.",
        "immobile-source-page": "Kaca iki ora bisa dilih-lih.",
        "immobile-target-page": "Ora bisa mindhahaké menyang irah-irahan tujuan kasebut.",
-       "bad-target-model": "Tujuan sing diarepaké nganggo gagrag isi sing béda. Ora bisa ngganti $1 dadi $2.",
+       "bad-target-model": "Tujuan kang diarepaké nganggo gagrag isi kang béda. Ora bisa ngganti $1 dadi $2.",
        "imagenocrossnamespace": "Ora bisa mindhahaké gambar menyang bilik nama non-gambar",
-       "nonfile-cannot-move-to-file": "Ora bisa ngalih non-barkas nyang mandala aran barkas.",
+       "nonfile-cannot-move-to-file": "Ora bisa ngalih non-barkas menyang mandala aran barkas.",
        "imagetypemismatch": "Èkstènsi anyar berkas ora cocog karo jenisé",
        "imageinvalidfilename": "Jeneng barkas tujuan ora trep.",
-       "fix-double-redirects": "Dandani kabèh pangalihan gandha sing tumuju marang irah-irahan asli",
+       "fix-double-redirects": "Dandani kabèh pangalihan gandha kang tumuju marang irah-irahan asli",
        "move-leave-redirect": "Ungkur kaca alihan",
-       "protectedpagemovewarning": "'''Pènget:''' Kaca iki wis dikunci dadi mung panganggo sing nduwé hak aksès pangurus baé sing bisa mindhahaké.\nCathetan entri pungkasan disadiakaké ing ngisor kanggo referensi:",
-       "semiprotectedpagemovewarning": "<strong>Cathetan:</strong> Kaca iki wis direksa saéngga mung panganggo kadhaftar sing bisa ngalihaké.\nÈntri log pungkasan cumepak ing ngisor kanggo rujukan:",
+       "protectedpagemovewarning": "'''Pènget:''' Kaca iki wis dikunci dadi mung panganggo kang nduwé hak aksès pangurus baé kang bisa mindhahaké.\nCathetan entri pungkasan disadiakaké ing ngisor kanggo referensi:",
+       "semiprotectedpagemovewarning": "<strong>Cathetan:</strong> Kaca iki wis direksa saéngga mung panganggo kadhaftar kang bisa ngalihaké.\nÈntri log pungkasan cumepak ing ngisor kanggo rujukan:",
        "move-over-sharedrepo": "[[:$1]] ana ing panyimpenan barengan. Ngalih barkas mawa sesirah iki bakal ngamblegi barkas barengan iku.",
-       "file-exists-sharedrepo": "Jeneng berkas kapilih wis ana kanggo ng panyimpenan bebarengan.\nMangga pilih jeneng liya.",
+       "file-exists-sharedrepo": "Jeneng berkas kapilih wis ana kanggo ing panyimpenan bebarengan.\nMangga pilih jeneng liya.",
        "export": "Èspor kaca",
-       "exporttext": "Panjenengan bisa ngèkspor tèks lan sajarah panyuntingan sawijining kaca tartamtu utawa sawijining sèt kaca awujud XML tartamtu. Banjur iki bisa diimpor ing wiki liyané nganggo MediaWiki nganggo fasilitas [[Special:Import|impor kaca]].\n\nKanggo ngèkspor kaca-kaca artikel, lebokna irah-irahan utawa judhul sajroning kothak tèks ing ngisor iki, irah-irahan utawa judhul siji per baris, lan pilihen apa panjenengan péngin ngèkspor jangkep karo vèrsi sadurungé, utawa namung vèrsi saiki mawa cathetan panyuntingan pungkasan.\n\nYèn panjenengan namun péngin ngimpor vèrsi pungkasan, panjenengan uga bisa nganggo pranala kusus, contoné [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] kanggo ngèkspor artikel \"[[{{MediaWiki:Mainpage}}]]\".",
+       "exporttext": "Panjenengan bisa ngèkspor tèks lan sajarah panyuntingan kaca tartamtu utawa sèt kaca awujud XML tartamtu. Banjur iki bisa diimpor ing wiki liyané nganggo MediaWiki nganggo fasilitas [[Special:Import|impor kaca]].\n\nKanggo ngèkspor kaca-kaca artikel, lebokna irah-irahan utawa judhul sajroning kothak tèks ing ngisor iki, irah-irahan utawa judhul siji per baris, lan pilihen apa panjenengan péngin ngèkspor jangkep karo vèrsi sadurungé, utawa namung vèrsi saiki mawa cathetan panyuntingan pungkasan.\n\nYèn panjenengan namun péngin ngimpor vèrsi pungkasan, panjenengan uga bisa nganggo pranala kusus, contoné [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] kanggo ngèkspor artikel \"[[{{MediaWiki:Mainpage}}]]\".",
        "exportall": "Ngèkspor kabèh kaca",
        "exportcuronly": "Namung èkspor révisi saiki, dudu kabèh vèrsi lawas",
        "exportnohistory": "----\n'''Cathetan:''' Ngèkspor kabèh sajarah suntingan kaca ngliwati formulir iki wis dinon-aktifaké déning alesan kinerja.",
-       "exportlistauthors": "Lebokaké daptar jangkep kontributor kanggo pendhak kaca",
+       "exportlistauthors": "Lebokaké pratélan jangkep kontributor kanggo pendhak kaca",
        "export-submit": "Èkspor",
        "export-addcattext": "Tambahna kaca saka kategori:",
        "export-addcat": "Tambahna",
        "export-addns": "Tambah",
        "export-download": "Simpen dadi barkas",
        "export-templates": "Lebokaké cithakan",
-       "export-pagelinks": "Lebokaké kaca sing kagayut ing sajeroning:",
+       "export-pagelinks": "Lebokaké kaca kang kagayut ing sajeroning:",
        "export-manual": "Tambah kaca kanthi manual:",
        "allmessages": "Layang sistem",
        "allmessagesname": "Jeneng",
        "allmessagesdefault": "Tèks baku",
        "allmessagescurrent": "Tèks saiki",
-       "allmessagestext": "Iki pratélan layang sistem sing ana ing mandala aran MediaWiki.\nMangga manjing [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Panglokalan MediaWiki] lan [https://translatewiki.net translatewiki.net] manawa panjenengan arep nyumbang ing panglokalan MediaWiki sing asli.",
-       "allmessagesnotsupportedDB": "Kaca iki ora bisa dienggo amerga '''$wgUseDatabaseMessages''' dipatèni.",
+       "allmessagestext": "Iki pratélan layang sistem kang ana ing mandala aran MediaWiki.\nMangga manjing [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation Panglokalan MediaWiki] lan [https://translatewiki.net translatewiki.net] manawa panjenengan arep nyumbang ing panglokalan MediaWiki kangasli.",
+       "allmessagesnotsupportedDB": "Kaca iki ora bisa dienggo amarga '''$wgUseDatabaseMessages''' dipatèni.",
        "allmessages-filter-legend": "Penyaring",
        "allmessages-filter": "Saring nganggo kahanan kustomisasi:",
        "allmessages-filter-unmodified": "Ora diowahi",
        "allmessages-filter-translate": "Pertal",
        "thumbnail-more": "Gedhèkaké",
        "filemissing": "Barkas ilang",
-       "thumbnail_error": "Kaluputan nalika nggawé gambar cilik (''thumbnail''): $1",
+       "thumbnail_error": "Masalah nalika nggawé gambar mini: $1",
        "thumbnail_error_remote": "Layang masalah saka $1:\n$2",
        "djvu_page_error": "Kaca DjVu ana ing sajabaning ranggèhan (''range'')",
        "djvu_no_xml": "Ora bisa njupuk XML kanggo berkas DjVu",
        "thumbnail-temp-create": "Ora bisa nggawé berkas gambar mini sawetara",
-       "thumbnail-dest-create": "Ora bisa nyimpen bambar mini ng papan patujon",
+       "thumbnail-dest-create": "Ora bisa nyimpen bambar mini ing papan patujon",
        "thumbnail_invalid_params": "Paramèter gambar cilik (''thumbnail'') ora absah",
        "thumbnail_toobigimagearea": "Barkas kanthi alang-ujur luwih gedhé saka $1",
        "thumbnail_dest_directory": "Ora bisa nggawé dirèktori tujuan",
        "thumbnail_image-type": "Tipe gambar ora didhukung",
        "thumbnail_gd-library": "Konfigurasi pustaka GD ora pepak: fungsi $1 ilang",
-       "thumbnail_image-missing": "Barkas sing kayané ilang: $1",
+       "thumbnail_image-missing": "Barkasé kayané ora ana: $1",
        "import": "Impor kaca",
        "importinterwiki": "Impor saka wiki liya",
-       "import-interwiki-text": "Pilih sawijining wiki lan irah-irahan kaca sing arep diimpor.\nTanggal révisi lan jeneng panyunting bakal dilestarèkaké.\nKabèh aktivitas impor transwiki bakal dilog ing [[Special:Log/import|log impor]].",
+       "import-interwiki-text": "Pilih wiki lan irah-irahan kaca kang arep diimpor.\nTanggal révisi lan jeneng panyunting bakal dilestarèkaké.\nKabèh aktivitas impor transwiki bakal dilog ing [[Special:Log/import|log impor]].",
        "import-interwiki-sourcewiki": "Wiki sumber:",
        "import-interwiki-sourcepage": "Kaca sumber:",
        "import-interwiki-history": "Tuladen kabèh vèrsi lawas saka kaca iki",
        "import-mapping-subpage": "Impor minangka anak kaca iki:",
        "import-upload-filename": "Jeneng barkas:",
        "import-comment": "Komentar:",
-       "importtext": "Mangga èkspor berkas saka wiki sumber nganggo [[Special:Export|prangkat èkspor]].\nSimpen nèng komputer Sampéyan lan unggaha nèng kéné.",
+       "importtext": "Mangga èkspor berkas saka wiki sumber nganggo [[Special:Export|prangkat èkspor]].\nSimpen ing komputer panjenengan lan unggaha ing kéné.",
        "importstart": "Ngimpor kaca...",
        "import-revision-count": "$1 {{PLURAL:$1|révisi|révisi-révisi}}",
        "importnopages": "Ora ana kaca kanggo diimpor.",
        "importcantopen": "Berkas impor ora bisa dibukak",
        "importbadinterwiki": "Pranala interwiki rusak",
        "importsuccess": "Ngimpor rampung!",
-       "importnosources": "Ora ana sumber impor transwiki sing wis digawé lan pangunggahan sajarah sacara langsung wis dinon-aktifaké.",
-       "importnofile": "Ora ana berkas sumber impor sing wis diunggahaké.",
-       "importuploaderrorsize": "Unggahan barkas impor ora dadi.\nBarkasé gedhéné ngluwihi ukuran sing diidinaké.",
-       "importuploaderrorpartial": "Pangunggahan berkas impor gagal. Namung sabagéyan berkas sing kasil bisa diunggahaké.",
-       "importuploaderrortemp": "Pangunggahan berkas gagal. Sawijining dirèktori sauntara sing dibutuhaké ora ana.",
+       "importnosources": "Ora ana sumber impor transwiki kang wis digawé lan pangunggahan sajarah sacara langsung wis dinon-aktifaké.",
+       "importnofile": "Ora ana berkas sumber impor kang wis diunggahaké.",
+       "importuploaderrorsize": "Unggahan barkas impor ora dadi.\nBarkasé gedhéné ngluwihi ukuran kang diidinaké.",
+       "importuploaderrorpartial": "Pangunggahan berkas impor gagal. Namung sabagéyan berkas kang kasil bisa diunggahaké.",
+       "importuploaderrortemp": "Pangunggahan berkas gagal. Map sauntara kang dibutuhaké ora ana.",
        "import-parse-failure": "Prosès impor XML gagal",
-       "import-noarticle": "Ora ana kaca sing bisa diimpor!",
+       "import-noarticle": "Ora ana kaca kang bisa diimpor!",
        "import-nonewrevisions": "Kabèh révisi sadurungé wis tau diimpor.",
        "xml-error-string": "$1 ing baris $2, kolom $3 (bita $4): $5",
        "import-upload": "Ngunggahaké data XML",
        "import-token-mismatch": "Kélangan data sèsi. Mangga dijajal manèh.",
-       "import-invalid-interwiki": "Ora bisa ngimport saka wiki sing kapilih.",
+       "import-invalid-interwiki": "Ora bisa ngimpor saka wiki kang kapilih.",
        "import-error-edit": "Kaca \"$1\" ora kaimpor amarga panjenengan ora kawogan mbesut iku.",
-       "import-error-create": "Kaca \"$1\" ora diimpor amarga Sampéyan ora dililakaké nggawé kuwi.",
+       "import-error-create": "Kaca \"$1\" ora diimpor amarga panjenengan ora dililakaké nggawé iku.",
        "import-error-interwiki": "Kaca \"$1\" ora diimpor amarga jenengé dicadhangaké kango pranala njaba (interwiki).",
-       "import-error-special": "Kaca \"$1\" ora diimpor amarga darbèké mandala aran mirunggan sing ora nglilakaké anané kaca.",
+       "import-error-special": "Kaca \"$1\" ora diimpor amarga darbèké mandala aran mirunggan kang ora nglilakaké anané kaca.",
        "import-error-invalid": "Kaca \"$1\" ora diimpor amarga jenengé ora trep kanggo wiki iki.",
-       "import-error-unserialize": "Révisi $2 saka kaca \"$1\" ora bisa diurutaké. Révisi iku dilapuraké supaya nganggo modhèl kontèn $3 sing diurutaké minangka $4.",
+       "import-error-unserialize": "Révisi $2 saka kaca \"$1\" ora bisa diurutaké. Révisi iku dilapuraké supaya nganggo modhèl kontèn $3 kang diurutaké minangka $4.",
        "import-options-wrong": "{{PLURAL:$2|Opsi|Opsi}} salah: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Kaca wod iki sesirahé ora sah.",
        "import-rootpage-nosubpage": "Ruang nama \"$1\" di halaman turunan tidak mengizinkan subhalaman.",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|révisi}} diimpor",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|révisi}} diimpor saka $2",
        "javascripttest": "Panjajalan JavaScript",
-       "javascripttest-pagetext-unknownaction": "Tumindak ora dingertèni: $1",
+       "javascripttest-pagetext-unknownaction": "Laku ora kaweruhan: \"$1\"",
        "javascripttest-qunit-intro": "Deleng [$1 dhokumèntasi uji-coba] ing mediawiki.org.",
        "tooltip-pt-userpage": "Kaca {{GENDER:|panganggoné panjenengan}}",
        "tooltip-pt-anonuserpage": "Kaca panganggo IP panjenengan",
        "tooltip-pt-mytalk": "Kaca parembugané {{GENDER:|panjenengan}}",
        "tooltip-pt-anontalk": "Parembug ing besutan-besutan saka alamat IP iki",
        "tooltip-pt-preferences": "Pilalané {{GENDER:|panjenengan}}",
-       "tooltip-pt-watchlist": "Pratélaning kaca sing panjenengan awasi owah-owahané",
+       "tooltip-pt-watchlist": "Pratélan kaca kang panjenengan awasi owah-owahané",
        "tooltip-pt-mycontris": "Pratélaning pisumbangé {{GENDER:|panjenengan}}",
        "tooltip-pt-anoncontribs": "Pratélan besutané alamat IP iki",
        "tooltip-pt-login": "Panjenengan prayogané mlebu log, sanajan ora kudu",
        "tooltip-feed-rss": "''RSS feed'' kanggo kaca iki",
        "tooltip-feed-atom": "Pakan atom tumrap kaca iki",
        "tooltip-t-contributions": "Pratélaning pisumbanging {{GENDER:$1|panganggo iki}}",
-       "tooltip-t-emailuser": "Kirimi layang-èl nyang {{GENDER:$1|panganggo iki}}",
+       "tooltip-t-emailuser": "Kirimi layang-èl menyang {{GENDER:$1|panganggo iki}}",
        "tooltip-t-info": "Katerangan liyané ngenani kaca iki",
        "tooltip-t-upload": "Unggah barkas",
        "tooltip-t-specialpages": "Pratélaning kabèh kaca mirunggan",
        "tooltip-publish": "Babar owahané panjenengan",
        "tooltip-preview": "Pratuduhana owah-owahaning panjenengan. Tulung ayahana iku sadurungé nyimpen.",
        "tooltip-diff": "Tuduhaké owahan endi kang panjenengan gawé tumrap tulisané",
-       "tooltip-compareselectedversions": "Delengen prabédan antara rong vèrsi kaca iki sing dipilih.",
+       "tooltip-compareselectedversions": "Delengen prabédan antara rong vèrsi kaca iki kang dipilih.",
        "tooltip-watch": "Wuwuh kaca iki menyang pawawangané panjenengan",
        "tooltip-watchlistedit-normal-submit": "Busak sesirah",
-       "tooltip-watchlistedit-raw-submit": "Anyari daptar pangawasan",
-       "tooltip-recreate": "Gawéa kaca iki manèh senadyan tau dibusak",
+       "tooltip-watchlistedit-raw-submit": "Anyari pawawangan",
+       "tooltip-recreate": "Gawéa manèh kaca iki sanajan tau dibusak",
        "tooltip-upload": "Wiwit ngunggah",
        "tooltip-rollback": "\"Balèkaké\" bakal murungaké besutané kang nyumbang pungkasan ing kaca iki sarana ngeklik pisan",
        "tooltip-undo": "\"Wurung\" mbalèkaké besutan iki lan mbukak blangko besutan sarana modhe pratuduh. Alesan kena diwuwuhaké ing babagan ringkesan.",
        "creditspage": "Informasi para panulis kaca",
        "nocredits": "Ora ana informasi ngenani para panulis ing kaca iki.",
        "spamprotectiontitle": "Filter anti-spam",
-       "spamprotectiontext": "Kaca sing arep panjenengan simpen diblokir déning filter spam.\nMbokmanawa iki disebabaké anané pranala jaba sing klebu daftar ireng.",
-       "spamprotectionmatch": "Tèks sing kapacak iki mancing filter spam kita: $1",
+       "spamprotectiontext": "Kaca kang arep panjenengan simpen diblokir déning filter spam.\nMbokmanawa iki disebabaké anané pranala jaba kang klebu pratélan ireng.",
+       "spamprotectionmatch": "Tèks kang kapacak iki mancing filter spam kita: $1",
        "spambot_username": "Resik-resik spam MediaWiki",
-       "spam_reverting": "Mbalèkaké menyang vèrsi pungkasan sing ora ana pranalané menyang $1",
-       "spam_blanking": "Kabèh révisi sing duwé pranala menyang $1, pangosongan",
-       "spam_deleting": "Kabèh benahan sing nduwé pranala nèng $1, dibusaki",
+       "spam_reverting": "Mbalèkaké menyang vèrsi pungkasan kang ora ana pranalané menyang $1",
+       "spam_blanking": "Kabèh révisi kang duwé pranala menyang $1, pangosongan",
+       "spam_deleting": "Kabèh révisi kang ngemu pranala menyang $1 binusek",
        "simpleantispam-label": "Pamariksa anti-spam.\nIki <strong>aja</strong> diisi!",
        "pageinfo-title": "Katerangan bab \"$1\"",
        "pageinfo-not-current": "Maaf, tidak mungkin memberikan informasi ini ke revisi lama.",
        "pageinfo-robot-policy": "Diindhèks déning robot",
        "pageinfo-robot-index": "Éntuk",
        "pageinfo-robot-noindex": "Ora éntuk",
-       "pageinfo-watchers": "Cacahing sing ngawasi kaca",
-       "pageinfo-visiting-watchers": "Cacahé pandeleng kaca sing nekani besutan anyar",
+       "pageinfo-watchers": "Cacahé kang ngawasi kaca",
+       "pageinfo-visiting-watchers": "Cacahé pandeleng kaca kang nekani besutan anyar",
        "pageinfo-few-watchers": "{{PLURAL:$1|Kang ndeleng|Kang ndeleng}} kurang saka $1",
-       "pageinfo-redirects-name": "Cacahing alihan menyang kaca iki",
+       "pageinfo-redirects-name": "Cacahé alihan menyang kaca iki",
        "pageinfo-subpages-name": "Cacahing anak kaca saka kaca iki",
        "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|alihan|alihan}}; $3 {{PLURAL:$3|non-alihan|non-alihan}})",
        "pageinfo-firstuser": "Kang nggawé kaca",
        "pageinfo-edits": "Gunggunging besutan",
        "pageinfo-authors": "Gunggung kang nganggit",
        "pageinfo-recent-edits": "Cacahé besutan saiki (ing dalem $1 pungkasan)",
-       "pageinfo-recent-authors": "Cacahing sing nganggit dinané iki",
+       "pageinfo-recent-authors": "Cacahé kang nulis sawatara wektu iki",
        "pageinfo-magic-words": "{{PLURAL:$1|Tembung|Tembung}} mujarab ($1)",
        "pageinfo-hidden-categories": "{{PLURAL:$1|Kategori}} ndhelik ($1)",
        "pageinfo-templates": "{{PLURAL:$1|Cithakan|Cithakan}} transklusi ($1)",
-       "pageinfo-transclusions": "{{PLURAL:$1|Kaca|Kaca}} sing ditransklusi ing ($1)",
+       "pageinfo-transclusions": "{{PLURAL:$1|Kaca|Kaca}} kang ditransklusi ing ($1)",
        "pageinfo-toolboxlink": "Katerangan kaca",
        "pageinfo-redirectsto": "Dialihaké dhateng",
        "pageinfo-redirectsto-info": "info",
        "markaspatrolleddiff": "Tandhanana wis dipatroli",
        "markaspatrolledtext": "Tandhanana artikel iki wis dipatroli",
        "markedaspatrolled": "Ditandhani wis dipatroli",
-       "markedaspatrolledtext": "Révisi sing dipilih ngenani [[:$1]] wis ditandhani minangka dipatroli.",
+       "markedaspatrolledtext": "Révisi kang dipilih ngenani [[:$1]] wis ditandhani minangka dipatroli.",
        "rcpatroldisabled": "Patroli owah-owahan pungkasan dipatèni",
        "rcpatroldisabledtext": "Fitur patroli owah-owahan pungkasan lagi dipatèni.",
        "markedaspatrollederror": "Ora bisa awèh tandha wis dipatroli",
-       "markedaspatrollederrortext": "Panjenengan kudu nentokaké sawijining révisi kanggo ditandhani minangka sing dipatroli.",
+       "markedaspatrollederrortext": "Panjenengan kudu nentokaké révisi kanggo ditandhani minangka kang dipatroli.",
        "markedaspatrollederror-noautopatrol": "Panjenengan ora kena nandhani besutané panjenengan dhéwé minangka kapriksa.",
        "markedaspatrollednotify": "Owahan $1 wis dipatroli.",
        "markedaspatrollederrornotify": "Penanda patroli gagal dibuat.",
        "patrol-log-page": "Log patroli",
-       "patrol-log-header": "Iki log revisi sing wis dipatroli.",
+       "patrol-log-header": "Iki log revisi kang wis dipatroli.",
        "confirm-markpatrolled-button": "YA",
-       "deletedrevision": "Revisi lawas sing dibusak $1.",
-       "filedeleteerror-short": "Kaluputan nalika mbusak berkas: $1",
-       "filedeleteerror-long": "Ana kaluputan nalika mbusak berkas:\n\n$1",
-       "filedelete-missing": "Berkas \"$1\" ora bisa dibusak amerga ora ditemokaké.",
-       "filedelete-old-unregistered": "Révisi berkas \"$1\" sing diwènèhaké ora ana sajroning basis data.",
-       "filedelete-current-unregistered": "Berkas sing dispésifikasi \"$1\" ora ana sajroning basis data.",
+       "deletedrevision": "Revisi lawas kang dibusak $1.",
+       "filedeleteerror-short": "Masalah nalika mbusak barkas: $1",
+       "filedeleteerror-long": "Ana masalah nalika mbusek barkas:\n\n$1",
+       "filedelete-missing": "Barkas \"$1\" ora bisa dibusek amarga ora tinemu.",
+       "filedelete-old-unregistered": "Révisi berkas \"$1\" kang diwènèhaké ora ana sajroning basis data.",
+       "filedelete-current-unregistered": "Berkas kang dispésifikasi \"$1\" ora ana sajroning basis data.",
        "filedelete-archive-read-only": "Dirèktori arsip \"$1\" ora bisa ditulis déning server wèb.",
        "previousdiff": "← Besutan sadurungé",
        "nextdiff": "Besutan sawisé →",
-       "mediawarning": "'''Pèngetan''': Jinis berkas iki mungkin isiné kodhé mbebayani.\nYèn dilakokaké, sistem Sampéyan bisa kaserang.",
+       "mediawarning": "'''Pèngetan''': Jinis berkas iki mungkin isiné kodhé mbebayani.\nYèn dilakokaké, sistem panjenengan bisa kaserang.",
        "imagemaxsize": "Wates ukuran gambar:<br />''(kanggo kaca dhèskripsi berkas)''",
        "thumbsize": "Ukuran gambar cilik (thumbnail):",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|kaca|kaca}}",
        "file-no-thumb-animation": "'''Catatan: Karena keterbatasan teknis, cuplikan berkas ini tidak akan teranimasikan.'''",
        "file-no-thumb-animation-gif": "'''Catatan: Karena keterbatasan teknis, cuplikan gambar GIF beresolusi tinggi seperti yang satu ini tidak akan teranimasikan.'''",
        "newimages": "Galeri berkas anyar",
-       "imagelisttext": "Ing ngisor iki kapacak daftar '''$1''' {{PLURAL:$1|berkas|berkas}} sing diurutaké $2.",
-       "newimages-summary": "Kaca astaméwa utawa kusus iki nuduhaké daftar berkas anyar dhéwé sing diunggahaké.",
+       "imagelisttext": "Ing ngisor iki kapacak pratélan '''$1''' {{PLURAL:$1|berkas|berkas}} kang diurutaké $2.",
+       "newimages-summary": "Kaca astaméwa utawa kusus iki nuduhaké pratélan berkas anyar dhéwé kang diunggahaké.",
        "newimages-legend": "Filter",
        "newimages-label": "Jeneng barkas (utawa pérangané):",
-       "noimages": "Ora ana sing dideleng.",
+       "noimages": "Ora ana kang dideleng.",
        "ilsubmit": "Golek",
        "bydate": "miturut tanggal",
        "sp-newimages-showfrom": "Tuduhna gambar anyar wiwit saka $2, $1",
        "saturday-at": "Septu jam $1",
        "sunday-at": "Minggu jam $1",
        "yesterday-at": "Dhek wingi jam $1",
-       "bad_image_list": "Formaté kaya mengkéné:\n\nNamung butir daftar (baris sing diawali mawa tandha *) sing mèlu diitung. Pranala kapisan ing sawijining baris kudu pranala ing berkas sing ala.\nPranala-pranala sabanjuré ing baris sing padha dianggep minangka ''pengecualian'', yaiku artikel sing bisa nuduhaké berkas iku.",
+       "bad_image_list": "Formaté mengkéné:\n\nNamung butir pratélan (baris kang diawali mawa tandha *) kang mèlu diitung. Pranala kapisan ing larik kudu pranala ing berkas kang ala.\nPranala-pranala sabanjuré ing baris kang padha dianggep minangka ''pengecualian'', yaiku artikel kang bisa nuduhaké berkas iku.",
        "metadata": "Métadhatah",
-       "metadata-help": "Barkas iki ngemu katerangan tambahan, bokmanawa asalé saka kodhak dhigital utawa sekèner sing dienggo metha utawa ndhigitalisasi barkas iku. \nYèn barkasé wis diowahi saka asliné, sawenèh rerincèn mungkin ora sawutuhé mèmper karo barkas owahané.",
+       "metadata-help": "Barkas iki ngemu katerangan tambahan, bokmanawa asalé saka kodhak dhigital utawa sekèner kang dienggo metha utawa ndhigitalisasi barkas iku. \nYèn barkasé wis diowahi saka asliné, sawenèh rerincèn mungkin ora sawutuhé mèmper karo barkas owahané.",
        "metadata-expand": "Tuduhaké rerincèn tambahan",
        "metadata-collapse": "Dhelikaké rerincèn tambahan",
        "metadata-fields": "Babagan-babagan métadhata gambar kang kapacak ing layang iki bakal kamot menyang pitontonan kaca gambar nalika métadhata diciyutaké.\nLiyané bakal kadhelikaké kanthi gawan.\n* panggawé\n* gagrag\n* tanggalwayahasli\n* wayahpaparan\n* angkaf\n* bijibanteriso\n* dawafocal\n* artis\n* hakcipta\n* pratélangambar\n* latitudgps\n* longitudgps\n* altitudgps",
        "exif-model": "Modhèl kaméra",
        "exif-software": "Piranti alus kang kaanggo",
        "exif-artist": "Prodhusèn",
-       "exif-copyright": "Sing ndarbèni hak cipta",
+       "exif-copyright": "Kang duwé hak cipta",
        "exif-exifversion": "Vèrsi Exif",
        "exif-flashpixversion": "Dukungan versi Flashpix",
        "exif-colorspace": "Lowah warna",
        "exif-fixtureidentifier": "Jeneng pikstur",
        "exif-locationdest": "Panggon digambaraké",
        "exif-locationdestcode": "Kodhe dhaérah kagambaraké",
-       "exif-objectcycle": "Wektu katujon mèdia kuwi",
+       "exif-objectcycle": "Wektu katujon mèdia iku",
        "exif-contact": "Inpormasi kontak",
        "exif-writer": "Panulis",
        "exif-languagecode": "Basa",
        "exif-datetimereleased": "Dimetukaké ing",
        "exif-originaltransmissionref": "Kodhe panggon transmisi asli",
        "exif-identifier": "Pangenal",
-       "exif-lens": "Lénsa sing dianggo",
+       "exif-lens": "Lénsa kang dianggo",
        "exif-serialnumber": "Nomer seri kaméra",
-       "exif-cameraownername": "Sing nduwé kaméra",
+       "exif-cameraownername": "Kang duwé kaméra",
        "exif-label": "Labèl",
        "exif-datetimemetadata": "Tanggal pungkasan metadata diowah",
        "exif-nickname": "Jeneng ora resminé gambar",
        "exif-rating": "Biji (saka 5)",
        "exif-rightscertificate": "Sertipikat pranata hak",
        "exif-copyrighted": "Status hak cipta",
-       "exif-copyrightowner": "Sing ndarbèni hak cipta",
+       "exif-copyrightowner": "Kang duwé hak cipta",
        "exif-usageterms": "Katemton panganggoan",
        "exif-webstatement": "Pranyatan hak cipta online",
        "exif-originaldocumentid": "ID unik dokumèn asli",
        "exif-licenseurl": "URL kanggo lisènsi hak cipta",
        "exif-morepermissionsurl": "Inpormasi lisènsi alternatip",
-       "exif-attributionurl": "Nalika nganggo manèh karya iki, mangga ubungaké nèng",
+       "exif-attributionurl": "Nalika nganggo manèh karya iki, tulung gayutaké marang",
        "exif-preferredattributionname": "Nalika nganggo manèh karya iki, mangga awèhi krèdit",
        "exif-pngfilecomment": "Tanggepan barkas PNG",
        "exif-disclaimer": "Sélakan",
        "exif-urgency-normal": "Sedhengan ($1)",
        "exif-urgency-low": "Cendhèk ($1)",
        "exif-urgency-high": "Dhuwur ($1)",
-       "exif-urgency-other": "Prioritas sing ditetepaké panganggo ($1)",
+       "exif-urgency-other": "Prioritas kang ditetepaké panganggo ($1)",
        "namespacesall": "kabèh",
        "monthsall": "kabèh",
        "confirmemail": "Konfirmasi alamat layang-èl",
-       "confirmemail_noemail": "Panjenengan ora maringi alamat é-mail sing absah ing [[Special:Preferences|prèferènsi]] panjenengan.",
-       "confirmemail_text": "{{SITENAME}} ngwajibaké panjenengan ndhedhes utawa konfirmasi alamat e-mail panjenengan sadurungé bisa nganggo fitur-fitur e-mail.\nPencèten tombol ing ngisor iki kanggo ngirim sawijining kode konfirmasi arupa sawijining pranala;\nTuladen pranala iki ing panjlajah wèb panjenengan kanggo ndhedhes yèn alamat e-mail panjenengan pancèn bener.",
-       "confirmemail_pending": "Sawijining kode konfirmasi wis dikirim menyang alamat e-mail panjenengan;\nyèn panjenengan lagi waé nggawé akun utawa rékening panjenengan, mangga nunggu sawetara menit nganti layang iku tekan sadurungé nyuwun kode anyar manèh.",
+       "confirmemail_noemail": "Panjenengan ora maringi alamat é-mail kang trep ing [[Special:Preferences|prèferènsi]] panjenengan.",
+       "confirmemail_text": "{{SITENAME}} ngwajibaké panjenengan ndhedhes utawa konfirmasi alamat e-mail panjenengan sadurungé bisa nganggo fitur-fitur e-mail.\nPencèten tombol ing ngisor iki kanggo ngirim kodhe konfirmasi arupa pranala;\nTuladen pranala iki ing panjlajah wèb panjenengan kanggo ndhedhes yèn alamat e-mail panjenengan pancèn bener.",
+       "confirmemail_pending": "Kodhe konfirmasi wis dikirim menyang alamat e-mail panjenengan;\nyèn panjenengan lagi waé nggawé akun utawa rékening panjenengan, mangga nunggu sawetara menit nganti layang iku tekan sadurungé nyuwun kode anyar manèh.",
        "confirmemail_send": "Kirim kode konfirmasi",
        "confirmemail_sent": "E-mail mawa kode konfirmasi wis dikirim.",
-       "confirmemail_oncreate": "Sawijining kode pandhedhesan (konfirmasi) wis dikirim menyang alamat e-mail panjenengan.\nKode iki ora dibutuhaké kanggo log mlebu, nanging dibutuhaké sadurungé nganggo kabèh fitur sing nganggo e-mail ing wiki iki.",
-       "confirmemail_sendfailed": "{{SITENAME}} ora bisa ngirim layang e-mail konfirmaside.\nMangga dipriksa mbok-menawa ana aksara ilegal ing alamat e-mail panjenengan.\n\nPangirim mènèhi informasi: $1",
-       "confirmemail_invalid": "Kode konfirmasi salah. Kode iku mbok-menawa wis kadaluwarsa.",
+       "confirmemail_oncreate": "Kodhe konfirmasi wis dikirim menyang alamat e-mail panjenengan.\nKode iki ora dibutuhaké kanggo log mlebu, nanging dibutuhaké sadurungé nganggo kabèh fitur kang nganggo e-mail ing wiki iki.",
+       "confirmemail_sendfailed": "{{SITENAME}} ora bisa ngirim layang e-mail konfirmaside.\nMangga dipriksa bokmanawa ana aksara ilegal ing alamat e-mail panjenengan.\n\nPangirim mènèhi informasi: $1",
+       "confirmemail_invalid": "Kode konfirmasi salah. Kode iku bokmanawa wis kadaluwarsa.",
        "confirmemail_needlogin": "Panjenengan kudu ndhedhes (konfirmasi) $1 alamat layang e-mail panjenengan.",
        "confirmemail_success": "Alamat e-mail panjenengan wis dikonfirmasi.\nSaiki panjenengan bisa log mlebu lan wiwit nganggo wiki.",
        "confirmemail_loggedin": "Alamat e-mail panjenengan wis dikonfirmasi.",
        "confirmemail_subject": "Konfirmasi alamat layang-èl ing {{SITENAME}}",
        "confirmemail_body": "Ana wong, bokmanawa panjenengan, saka alamat IP $1, wis ndhaftar kanthi akun \"$2\" mawa alamat layang-èl iki ing {{SITENAME}}.\n\nSaperlu ngonfirmasi yèn akun iki temenan duwèké panjenengan lan ngaktivasi fitur layang-èl ing {{SITENAME}}, bukaken pranala iki ing pangluruné panjenengan:\n\n$3\n\nYèn panjenengan *ora tau* ndhaftar mawa akun iki, turuten pranala ngisor iki saperlu murungaké konfirmasi lumantar alamat layang-èl iki:\n\n$5\n\nKodhe konfirmasi iki bakal kadaluwarsa nalika $4.",
        "confirmemail_body_changed": "Ana wong, bokmanawa panjenengan, saka alamat IP $1, wis ngganti alamat layang-èl ing akun \"$2\" dadi nganggo alamat iki ing {{SITENAME}}. \n\nSaperlu ngonfirmasi yèn akun iki temenan duwèké panjenengan, bukaken pranala iki ing pangluruné panjenengan:\n\n$3\n\nYèn akun iku *dudu* duwèké panjenengan, turuten pranala iki saperlu murungaké konfirmasi lumantar alamat layang-èl iki:\n\n$5\n\nKodhe konfirmasi iki bakal kadaluwarsa nalika $4.",
-       "confirmemail_body_set": "Sawijining wong, mbokmenawa panjenengan dhéwé, saka alamat IP $1, wis ndaftaraké akun \"$2\" mawa alamat e-mail iki ing {{SITENAME}}. Bukaka pranala iki ing panjlajah wèb panjenengan.\n\n$3\n\nYèn panjenengan *ora tau* ndaftar akun iki, tutna pranala ing ngisor iki kanggo mbatalaké konfirmasi alamat e-mail:\n\n$5\n\nKonfirmasi iki bakal kadaluwarsa ing $4.",
+       "confirmemail_body_set": "Ana wong, bokmanawa panjenengan dhéwé, saka alamat IP $1, wis ndhaftaraké akun \"$2\" mawa alamat e-mail iki ing {{SITENAME}}. Bukaka pranala iki ing panjlajah wèb panjenengan.\n\n$3\n\nYèn panjenengan *ora tau* ndhaftar akun iki, tutna pranala ing ngisor iki kanggo mbatalaké konfirmasi alamat e-mail:\n\n$5\n\nKonfirmasi iki bakal kadaluwarsa ing $4.",
        "confirmemail_invalidated": "Konfirmasi alamat layang-èl wurung",
        "invalidateemail": "Wurung konfirmasi layang-èl",
        "scarytranscludedisabled": "[Transklusi cithakan interwiki dipatèni]",
        "scarytranscludefailed-httpstatus": "[Pengambilan templat $1 gagal: HTTP $2]",
        "scarytranscludetoolong": "[URL-é kedawan]",
        "deletedwhileediting": "<strong>Pélik:</strong> Kaca iki wis dibusak kawit pisanan panjenengan mbesut!",
-       "confirmrecreate": "Panganggo [[User:$1|$1]] ([[User talk:$1|Wicara]]) wis mbusak kaca iki nalika panjenengan miwiti panyuntingan mawa alesan:\n: ''$2''\nMangga didhedhes (dikonfirmasi) menawa panjenengan kersa nggawé ulang kaca iki.",
+       "confirmrecreate": "Panganggo [[User:$1|$1]] ([[User talk:$1|Wicara]]) wis mbusak kaca iki nalika panjenengan miwiti panyuntingan mawa alesan:\n: ''$2''\nMangga didhedhes (dikonfirmasi) manawa panjenengan kersa nggawé ulang kaca iki.",
        "confirmrecreate-noreason": "Panganggo [[User:$1|$1]] ([[User talk:$1|rembug]]) {{GENDER:$1|mbusak}} kaca iki sawisé panjenengan wiwit mbesut. Sumangga konfirmasi yèn panjenengan temen arep nggawé manèh kaca iki.",
        "recreate": "Gawé ulang",
        "confirm-purge-title": "Buwang kaca iki",
        "confirm_purge_button": "OK",
        "confirm-purge-top": "Busak ''cache'' kaca iki?",
-       "confirm-purge-bottom": "Ngresiki kaca bakal sekaligus mbusak singgahan lan nampilaké vèrsi kaca pungkasan.",
+       "confirm-purge-bottom": "Mbusak kaca bakal ngresiki telih lan meksa supaya révisi kang anyar dhéwé muncul.",
        "confirm-watch-button": "Oké",
-       "confirm-watch-top": "Tambahaké kaca iki nènh daptar pangawasan Sampéyan?",
+       "confirm-watch-top": "Tambahaké kaca iki ing pawawangané panjenengan?",
        "confirm-unwatch-button": "Oké",
-       "confirm-unwatch-top": "Singkiraké kaca iki saka daptar pangawasan Sampéyan?",
+       "confirm-unwatch-top": "Singkiraké kaca iki saka pawawangané panjenengan?",
        "confirm-rollback-button": "YA",
        "confirm-rollback-top": "Pulihaké besutan menyang kaca iki?",
        "quotation-marks": "\"$1\"",
        "autosumm-replace": "←Ngganti kaca karo '$1'",
        "autoredircomment": "Ngeneraké kaca menyang [[$1]]",
        "autosumm-changed-redirect-target": "Ngowahi jujuganing alihan saka [[$1]] menyang [[$2]]",
-       "autosumm-new": "Gawé kaca sing isi '$1'",
+       "autosumm-new": "Nggawé kaca mawa \"$1\"",
        "autosumm-newblank": "Nggawé kaca barès",
-       "lag-warn-normal": "Owah-owahan pungkasan sing luwih anyar tinimbang $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing pratélan iki.",
-       "lag-warn-high": "Amarga gedhéné ''lag'' basis data server, owah-owahan pungkasan sing luwih anyar saka $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing daftar iki.",
+       "lag-warn-normal": "Owah-owahan pungkasan kang luwih anyar tinimbang $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing pratélan iki.",
+       "lag-warn-high": "Amarga gedhéné ''lag'' basis data server, owah-owahan pungkasan kang luwih anyar saka $1 {{PLURAL:$1|detik|detik}} mbokmanawa ora metu ing pratélan iki.",
        "watchlistedit-normal-title": "Besut pawawangan",
        "watchlistedit-normal-legend": "Busak sesirah saka pawawangan",
-       "watchlistedit-normal-explain": "Irah-irahan utawa judhul ing daftar pangawasan panjenengan kapacak ing ngisor iki.\nKanggo mbusak sawijining irah-irahan, kliken kothak ing pinggiré, lan banjur kliken \"Busak judhul\".\nPanjenengan uga bisa [[Special:EditWatchlist/raw|nyunting daftar mentah]].",
+       "watchlistedit-normal-explain": "Irah-irahan utawa judhul ing pawawangané panjenengan kapacak ing ngisor iki.\nKanggo mbusak irah-irahan, kliken kothak ing pinggiré, lan banjur kliken \"Busak judhul\".\nPanjenengan uga bisa [[Special:EditWatchlist/raw|mbesut pratélan mentah]].",
        "watchlistedit-normal-submit": "Busak sesirah",
-       "watchlistedit-normal-done": "Irah-irahan {{PLURAL:$1|siji|$1}} wis dibusak saka daftar pangawasan panjenengan:",
+       "watchlistedit-normal-done": "Irah-irahan {{PLURAL:$1|siji|$1}} wis dibusak saka pawawangané panjenengan panjenengan:",
        "watchlistedit-raw-title": "Besut pawawangan wantahan",
        "watchlistedit-raw-legend": "Besut pawawangan wantahan",
-       "watchlistedit-raw-explain": "Irah-irahan ing daftar pangawasan panjenengan kapacak ing ngisor iki, lan bisa diowahi mawa nambahaké utawa mbusak daftar; sairah-irahan saban barisé.\nYèn wis rampung, anyarana kaca daftar pangawasan iki.\nPanjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan]].",
+       "watchlistedit-raw-explain": "Irah-irahan ing pawawangané panjenengan kapacak ing ngisor iki, lan bisa diowahi mawa nambahaké utawa mbusak pratélan; sairah-irahan saban barisé.\nYèn wis rampung, anyarana kaca pawawangan iki.\nPanjenengan uga bisa [[Special:EditWatchlist|nganggo éditor standar panjenengan]].",
        "watchlistedit-raw-titles": "Sesirah:",
        "watchlistedit-raw-submit": "Anyari pawawangan",
-       "watchlistedit-raw-done": "Pawawanganing sampéyan wis dianyari.",
+       "watchlistedit-raw-done": "Pawawangané panjenengan wis dianyari.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 sesirah|$1 sesirah}} ditambahaké:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 sesirah|$1 sesirah}} dibusak:",
        "watchlistedit-clear-title": "Resiki pawawangan",
        "watchlistedit-clear-submit": "Resiki pawawangan (Iki permanèn!)",
        "watchlistedit-clear-done": "Pawawangané panjenengan wis diresiki.",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 sesirah|$1 sesirah}} wis dibusak:",
-       "watchlistedit-too-many": "Kaca sing arep dipitontonaké ing kéné kakèhan.",
+       "watchlistedit-too-many": "Kaca kang arep dipitontonaké ing kéné kakèhan.",
        "watchlisttools-clear": "Resiki pawawangané",
-       "watchlisttools-view": "Tuduhna owah-owahan sing ana gandhèngané",
+       "watchlisttools-view": "Tuduhna owah-owahan kang ana gandhèngané",
        "watchlisttools-edit": "Deleng lan besut pawawangan",
        "watchlisttools-raw": "Besut pawawangan wantahan",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|rembugan]])",
        "timezone-local": "Lokal",
        "duplicate-defaultsort": "Pènget: Kunci pilih asal (''Default sort key'') \"$2\" nggantèkaké kunci pilih asal sadurungé \"$1\".",
-       "duplicate-displaytitle": "<strong>Pélik:</strong> Sesirah \"$2\" sing dipitontonaké nutupi sesirah \"$1\" sing sadurungé dipitontonaké.",
+       "duplicate-displaytitle": "<strong>Pélik:</strong> Sesirah \"$2\" kang dipitontonaké nutupi sesirah \"$1\" kang sadurungé dipitontonaké.",
        "version": "Versi",
-       "version-extensions": "Èkstènsi sing wis diinstalasi",
-       "version-skins": "Ules sing dipasang",
+       "version-extensions": "Èkstènsi kang wis diinstalasi",
+       "version-skins": "Ules kang dipasang",
        "version-specialpages": "Kaca mirunggan",
        "version-parserhooks": "Canthèlan parser",
        "version-variables": "Variabel",
        "version-entrypoints": "URL tithik lebon",
        "version-entrypoints-header-entrypoint": "Tithik lebon",
        "version-entrypoints-header-url": "URL",
-       "version-libraries": "Kapustakan sing kapasang",
+       "version-libraries": "Kapustakan kang kapasang",
        "version-libraries-library": "Kapustakan",
        "version-libraries-version": "Vèrsi",
        "version-libraries-license": "Lisènsi",
        "version-libraries-description": "Wedharan",
        "version-libraries-authors": "Pangarang",
        "redirect": "Lih-lihan miturut barkas, panganggo, kaca, owahan, utawa cathetan",
-       "redirect-summary": "Kaca mirunggan iki ngener ing sawijining barkas (jeneng gambar diwenehi), kaca (ID revisi utama ID kaca diwenehi), utawa kaca panganggo (ID panganggo diwenehi). Cara nganggo: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
+       "redirect-summary": "Kaca mirunggan iki ngener ing barkas (jeneng gambar diwenehi), kaca (ID revisi utama ID kaca diwenehi), utawa kaca panganggo (ID panganggo diwenehi). Cara nganggo: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], or [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Menyang",
        "redirect-lookup": "Luru:",
        "redirect-value": "Aji:",
        "redirect-revision": "Révisi kaca",
        "redirect-file": "Jeneng barkas",
        "redirect-logid": "ID log",
-       "redirect-not-exists": "Nilai ora ditemokaké",
+       "redirect-not-exists": "Aji ora ana",
        "fileduplicatesearch": "Golèk berkas duplikat",
        "fileduplicatesearch-summary": "Golèk duplikat berkas adhedhasar biji hash-é.",
        "fileduplicatesearch-filename": "Jeneng barkas:",
        "specialpages-group-changes": "Owah-owahan pungkasan lan log",
        "specialpages-group-media": "Lapuran média lan pangunggahan",
        "specialpages-group-users": "Panganggo lan hak-haké",
-       "specialpages-group-highuse": "Kaca-kaca sing akèh dienggo",
+       "specialpages-group-highuse": "Kaca-kaca kang akèh dienggo",
        "specialpages-group-pages": "Pratélan kaca",
        "specialpages-group-pagetools": "Piranti-piranti kaca",
        "specialpages-group-wiki": "Data lan piranti wiki",
        "specialpages-group-developer": "Piranti déveloper",
        "blankpage": "Kaca kosong",
        "intentionallyblankpage": "Kaca iki disengajakaké kosong",
-       "external_image_whitelist": " #Umbarna larikan iki apa anané<pre>\n#Pigunakaké fragmèn èksprèsi regular (mung bagéyan ing antara //) ing ngisor\n#Fragmèn ini bakal dicocogaké karo URL saka gambar-gambar èksternal\n#Fragmèn sing cocog bakal ditampilaké minangka gambar, yèn ora mung pranala menyang gambar waé sing ditampilaké\n#Larikan sing diwiwiti nganggo # dianggep minangka komentar\n#Iki ora mbédakaké aksara gedhé/cilik\n#Dèlèhna kabèh fragmèn èksprèsi regular sadhuwuré larikan iki. Umbarna larikan iki apa anané</pre>",
-       "tags": "Tag pangowahan sing absah",
+       "external_image_whitelist": " #Umbarna larikan iki apa anané<pre>\n#Pigunakaké fragmèn èksprèsi regular (mung bagéyan ing antara //) ing ngisor\n#Fragmèn ini bakal dicocogaké karo URL saka gambar-gambar èksternal\n#Fragmèn kang cocog bakal ditampilaké minangka gambar, yèn ora mung pranala menyang gambar waé kang ditampilaké\n#Larikan kang diwiwiti nganggo # dianggep minangka komentar\n#Iki ora mbédakaké aksara gedhé/cilik\n#Dèlèhna kabèh fragmèn èksprèsi regular sadhuwuré larikan iki. Umbarna larikan iki apa anané</pre>",
+       "tags": "Tag pangowahan kang absah",
        "tag-filter": "Panyaringan [[Special:Tags|tenger]]:",
        "tag-filter-submit": "Penyaring",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tenger|Tenger}}]]: $2)",
        "tag-mw-new-redirect": "Alihan anyar",
        "tag-mw-blank": "Ngosongaké",
        "tags-title": "Tag",
-       "tags-intro": "Kaca iki isi pratélan tenger sing dienggo nandhani besutan déning piranti alus, sinartan tegesé.",
+       "tags-intro": "Kaca iki isi pratélan tenger kang dienggo nandhani besutan déning piranti alus, sinartan tegesé.",
        "tags-tag": "Jeneng tag",
        "tags-display-header": "Cakrik ing pratélan owahan",
        "tags-description-header": "Dhèskripsi pepak saka makna",
        "tags-source-header": "Sumber",
        "tags-active-header": "Aktif?",
        "tags-hitcount-header": "Owah-owahan mawa tag",
-       "tags-actions-header": "Tumindak",
+       "tags-actions-header": "Laku",
        "tags-active-yes": "Iya",
        "tags-active-no": "Ora",
        "tags-source-extension": "Dikukuhaké déning piranti alus",
        "tags-hitcount": "$1 {{PLURAL:$1|pangowahan|pangowahan}}",
        "tags-manage-no-permission": "Panjenengan ora kawogan ngemunah tenger owahan.",
        "tags-create-heading": "Gawé tenger anyar",
-       "tags-create-explanation": "Bakuné, tenger sing mentas digawé bakal bisa dianggo déning panganggo lan bot.",
+       "tags-create-explanation": "Bakuné, tenger kang mentas digawé bakal bisa dianggo déning panganggo lan bot.",
        "tags-create-tag-name": "Jeneng tenger:",
        "tags-create-reason": "Alesan:",
        "tags-create-submit": "Gawé",
        "tags-create-no-name": "Panjenengan kudu ngisi jeneng tenger.",
        "tags-create-invalid-chars": "Jenengé tengeré isiné ora kena komah (<code>,</code>) utawa garis miring maju (<code>/</code>).",
-       "tags-create-invalid-title-chars": "Jenengé tengeré isiné ora kena karakter sing ora bisa dianggo ing sesirah kaca.",
+       "tags-create-invalid-title-chars": "Jenengé tengeré isiné ora kena karakter kang ora bisa dianggo ing sesirah kaca.",
        "tags-create-already-exists": "Tenger \"$1\" wis ana.",
        "tags-create-warnings-above": "{{PLURAL:$2|Pélik}} ngisor iki muncul nalika lagi nggawé tenger \"$1\":",
        "tags-create-warnings-below": "Panjenengan yakin arep mbacutaké nggawé tenger?",
        "tags-delete-title": "Busak tenger",
        "tags-delete-reason": "Alesan:",
        "tags-delete-submit": "Temenan busak tenger iki",
-       "tags-delete-not-allowed": "Tenger sing diwedharaké lumantar èkstènsi ora bisa dibusak kajaba èkstènsiné ngidinaké.",
+       "tags-delete-not-allowed": "Tenger kang diwedharaké lumantar èkstènsi ora bisa dibusak kajaba èkstènsiné ngidinaké.",
        "tags-delete-not-found": "Tenger \"$1\" ora ana.",
-       "tags-delete-too-many-uses": "Tenger \"$1\" dicakaké nyang punjul $2 {{PLURAL:$2|révisi}}, sing tegesé ora bisa dibusak.",
+       "tags-delete-too-many-uses": "Tenger \"$1\" dicakaké menyang punjul $2 {{PLURAL:$2|révisi}}, kang tegesé ora bisa dibusak.",
        "tags-delete-warnings-after-delete": "Tenger \"$1\" wis dibusak, nanging ana {{PLURAL:$2|pélik}} mangkéné:",
        "tags-delete-no-permission": "Panjenengan ora kawogan mbusak tenger owahan.",
        "tags-activate-title": "Urubaké tenger",
        "tags-apply-no-permission": "Panjenengan ora kawogan ngecakaké tenger owahan bebarengan karo owahané panjenengan.",
        "tags-apply-blocked": "Panjenengan ora bisa ngecakaké tenger owahan bebarengan karo owahané panjenengan manawa {{GENDER:$1|panjenengan}} diblokir.",
        "tags-apply-not-allowed-one": "Tenger \"$1\" ora kena dicakaké kanthi manual.",
-       "tags-edit-existing-tags": "Tenger sing ana:",
+       "tags-edit-existing-tags": "Tenger kang ana:",
        "tags-edit-existing-tags-none": "<em>Ora ana</em>",
        "tags-edit-new-tags": "Tenger anyar:",
        "tags-edit-add": "Tambah tenger iki:",
        "tags-edit-remove": "Busak tenger iki:",
        "tags-edit-remove-all-tags": "(busak kabèh tenger)",
        "tags-edit-chosen-placeholder": "Pilih sawenèh tenger",
-       "tags-edit-chosen-no-results": "Ora ana tenger sing cocog",
+       "tags-edit-chosen-no-results": "Ora ana tenger kang cocog",
        "tags-edit-reason": "Alesan:",
-       "tags-edit-revision-submit": "Cakaké owahan nyang {{PLURAL:$1|révisi iki|$1 révisi}}",
-       "tags-edit-logentry-submit": "Cakaké owahan nyang {{PLURAL:$1|èntri log iki|$1 èntri log}}",
+       "tags-edit-revision-submit": "Cakaké owahan menyang {{PLURAL:$1|révisi iki|$1 révisi}}",
+       "tags-edit-logentry-submit": "Cakaké owahan menyang {{PLURAL:$1|èntri log iki|$1 èntri log}}",
        "tags-edit-success": "Owahané wis dicakaké.",
        "tags-edit-failure": "Owahané ora bisa dicakaké:\n$1",
        "tags-edit-nooldid-title": "Révisi tujuan ora trep",
        "compare-rev1": "Révisi 1",
        "compare-rev2": "Révisi 2",
        "compare-submit": "Bandingaké",
-       "compare-invalid-title": "Sesirah sing kokawèhaké ora sah.",
-       "compare-title-not-exists": "Sesirah sing kokawèhaké ora ana.",
-       "compare-revision-not-exists": "Benahan sing Sampéyan jaluk ora ana.",
+       "compare-invalid-title": "Sesirah kang kokawèhaké ora sah.",
+       "compare-title-not-exists": "Sesirah kang kokawèhaké ora ana.",
+       "compare-revision-not-exists": "Révisi kang panjenengan karsakaké ora ana.",
        "diff-form": "Béda",
        "dberr-problems": "Nyuwun ngapura! Situs iki ngalami masalah tèknis.",
        "dberr-again": "Coba nunggu sawetara menit lan unggahna manèh.",
        "dberr-info-hidden": "(Ora bisa nggayut basis dhata)",
        "dberr-usegoogle": "Panjenengan bisa nyoba nggolèki nganggo Google kanggo sauntara wektu.",
        "dberr-outofdate": "Perlu diweruhi yèn indhèks isi kita manawa wis kadaluwarsa.",
-       "dberr-cachederror": "Iki sawijining salinan kasimpen kaca sing dijaluk, lan manawa dudu sing paling anyar.",
+       "dberr-cachederror": "Iki turunan kasimpen kaca kang dijaluk, lan manawa dudu kang paling anyar.",
        "htmlform-invalid-input": "Ana masalah jroning sawetara input panjenengan",
-       "htmlform-select-badoption": "Aji sing panjenengan lebokaké ora absah",
-       "htmlform-int-invalid": "Aji sing panjenengan lebokaké dudu angka wutuh (integer).",
-       "htmlform-float-invalid": "Sing panjenengan lebokaké dudu angka.",
-       "htmlform-int-toolow": "Aji sing panjenengan lebokaké keciliken ing sangisoré aji minimum $1",
-       "htmlform-int-toohigh": "Aji sing panjenengan lebokaké kegedhèn ngluwihi aji maksimum $1",
+       "htmlform-select-badoption": "Aji kang panjenengan lebokaké ora absah",
+       "htmlform-int-invalid": "Aji kang panjenengan lebokaké dudu angka wutuh (integer).",
+       "htmlform-float-invalid": "Kang panjenengan lebokaké dudu angka.",
+       "htmlform-int-toolow": "Aji kang panjenengan lebokaké keciliken ing sangisoré aji minimum $1",
+       "htmlform-int-toohigh": "Aji kang panjenengan lebokaké kegedhèn ngluwihi aji maksimum $1",
        "htmlform-required": "Nilé iki dibutuhaké",
        "htmlform-submit": "Kirim",
        "htmlform-reset": "Balèkaké owahan",
        "htmlform-date-placeholder": "TTTT-WW-DD",
        "htmlform-time-placeholder": "JJ:MM:SS",
        "htmlform-datetime-placeholder": "TTTT-WW-DD JJ:MM:SS",
-       "htmlform-title-not-creatable": "\"$1\" dudu sesirah kaca sing bisa digawé",
+       "htmlform-title-not-creatable": "\"$1\" dudu sesirah kaca kang bisa digawé",
        "htmlform-title-not-exists": "$1 ora ana.",
        "htmlform-user-not-exists": "<strong>$1</strong> ora ana.",
-       "htmlform-user-not-valid": "<strong>$1</strong> dudu jeneng panganggo sing trep.",
+       "htmlform-user-not-valid": "<strong>$1</strong> dudu jeneng panganggo kang trep.",
        "logentry-delete-delete": "$1 {{GENDER:$2|mbusak}} kaca $3",
        "logentry-delete-delete_redir": "$1 {{GENDER:$2|mbusak}} kaca alihan $3 sarana numpuk-undhung.",
        "logentry-delete-restore": "$1 {{GENDER:$2|mulihaké}} kaca $3 ($4)",
        "restore-count-files": "{{PLURAL:$1|1 barkas|$1 barkas}}",
        "logentry-delete-event": "$1 {{GENDER:$2|ngganti}} parupané {{PLURAL:$5|sak prastawa log|$5 prastawa log}} ana ing $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ngowahi}} pakatonaning {{PLURAL:$5|révisi siji|révisi $5}} ing kaca $3: $4",
-       "logentry-delete-event-legacy": "$1 {{GENDER:$2|ngganti}} patampilan saka kadadéan log ng $3",
-       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|ngganti}} patampilan saka pambenahan ng kaca $3",
+       "logentry-delete-event-legacy": "$1 {{GENDER:$2|ngganti}} patampilan saka kadadéan log ing $3",
+       "logentry-delete-revision-legacy": "$1 {{GENDER:$2|ngganti}} patampilan saka pambenahan ing kaca $3",
        "logentry-suppress-delete": "$1 {{GENDER:$2|neken}} kaca $3",
-       "logentry-suppress-event": "$1 ndhelik-ndhelik {{GENDER:$2|ngganti}} patampilan saka {{PLURAL:$5|sak kadadéan log|$5 kadadéan log}} ng $3: $4",
-       "logentry-suppress-revision": "$1 ndhelik-ndhelik {{GENDER:$2|ngganti}} patampilan saka {{PLURAL:$5|sak pambenahan|$5 pambenahan}} ng kaca $3: $4",
-       "logentry-suppress-event-legacy": "$1 ndhelik-ndhelik {{GENDER:$2|ngganti}} patampilan saka kadadéan log ng $3",
-       "logentry-suppress-revision-legacy": "$1 ndhelik-ndhelik {{GENDER:$2|ngganti}} patampilan saka pambenahan ng kaca $3",
+       "logentry-suppress-event": "$1 ndhelik-ndhelik {{GENDER:$2|ngganti}} patampilan saka {{PLURAL:$5|sak kadadéan log|$5 kadadéan log}} ing $3: $4",
+       "logentry-suppress-revision": "$1 ndhelik-ndhelik {{GENDER:$2|ngganti}} patampilan saka {{PLURAL:$5|sak pambenahan|$5 pambenahan}} ing kaca $3: $4",
+       "logentry-suppress-event-legacy": "$1 ndhelik-ndhelik {{GENDER:$2|ngganti}} patampilan saka kadadéan log ing $3",
+       "logentry-suppress-revision-legacy": "$1 ndhelik-ndhelik {{GENDER:$2|ngganti}} patampilan saka pambenahan ing kaca $3",
        "revdelete-content-hid": "kontèn didhelikaké",
        "revdelete-summary-hid": "tingkesaning besutan kadhelikaké",
        "revdelete-uname-hid": "jeneng panganggo didhelikaké",
        "revdelete-content-unhid": "kontèn dituduhaké",
        "revdelete-summary-unhid": "tingkesaning besutan ora kadhelikaké",
        "revdelete-uname-unhid": "jeneng panganggo dituduhaké",
-       "revdelete-restricted": "watesan sing dicakaké marang pangurus",
+       "revdelete-restricted": "watesan kang dicakaké marang pangurus",
        "revdelete-unrestricted": "rèstriksi marang para opsis dijabel",
        "logentry-block-block": "$1 {{GENDER:$2|mblokir}} {{GENDER:$4|$3}} kanthi wektu kadaluwarsa $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|nyopot blokirané}} {{GENDER:$4|$3}}",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|ngalih}} kaca $3 menyang $4 tanpa ninggal alihan",
        "logentry-move-move_redir": "$1 {{GENDER:$2|ngalih}} kaca $3 menyang $4 kanthi nindhihi alihan",
        "logentry-move-move_redir-noredirect": "$1 {{GENDER:$2|ngalih}} kaca $3 menyang $4 kanthi nindhihi alihan tanpa nginggal alihan",
-       "logentry-patrol-patrol": "$1 {{GENDER:$2|nengeri}} révisi $4 saka kaca $3 sing diawasi",
-       "logentry-patrol-patrol-auto": "$1 otomatis {{GENDER:$2|nandhani}} benahan $4 saka kaca $3 kaawasake",
+       "logentry-patrol-patrol": "$1 {{GENDER:$2|nengeri}} révisi $4 saka kaca $3 kang diawasi",
+       "logentry-patrol-patrol-auto": "$1 otomatis {{GENDER:$2|nandhani}} révisi $4 saka kaca $3 kang diawasi",
        "logentry-newusers-newusers": "Akun panganggo $1 {{GENDER:$2|digawé}}",
        "logentry-newusers-create": "Akun panganggo $1 wis {{GENDER:$2|kagawé}}",
        "logentry-newusers-create2": "Akun panganggo $3 {{GENDER:$2|digawé}} déning $1",
        "logentry-protect-modify-cascade": "$1 {{GENDER:$2|ngowahi}} tataran rereksan tumrap $3 $4 [urut]",
        "logentry-rights-rights": "$1 {{GENDER:$2|ngganti}} golongané {{GENDER:$6|$3}} saka $4 dadi $5",
        "logentry-rights-rights-legacy": "$1 {{GENDER:$2|ngganti}} golongané $3",
-       "logentry-rights-autopromote": "$1 otomatis {{GENDER:$2|dipromosikne}} saka $4 ng $5",
+       "logentry-rights-autopromote": "$1 otomatis {{GENDER:$2|dipromosikne}} saka $4 ing $5",
        "logentry-upload-upload": "$1 {{GENDER:$2|ngunggah}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ngunggah}} vèrsi anyaré $3",
        "logentry-upload-revert": "$1 {{GENDER:$2|ngunggah}} $3",
        "logentry-managetags-create": "$1 {{GENDER:$2|nggawé}} tenger \"$4\"",
        "rightsnone": "(ora ana)",
        "rightslogentry-temporary-group": "$1 (sauntara, tumeka $2)",
-       "feedback-adding": "Nambahaké lebon saran ng kaca...",
+       "feedback-adding": "Nambahaké lebon saran ing kaca...",
        "feedback-back": "Balik",
-       "feedback-bugcheck": "Apik! Pesthèké kuwi dudu sawijining [$1 bug sing dingertèni].",
+       "feedback-bugcheck": "Apik! Pesthèké iku dudu salah siji [$1 ama kang kaweruhan].",
        "feedback-bugnew": "Aku wis mriksa. Kandakaké bug anyar",
-       "feedback-bugornote": "Yèn Sampéyan siap njelasaké masalah tèhnis kanthi rinci mangga [$1 laporaké bug].\nUtawa, Sampéyan bisa nganggo pormulir gampang ngisor. Tanggepan Sampéyan bakal ditambahaké nèng kaca \"[$3 $2]\", bebarengan karo jeneng panganggo Sampéyan lan pramban sing Sampéyan anggo.",
+       "feedback-bugornote": "Yèn panjenengan siyap njelasaké masalah tèhnis kanthi rinci mangga [$1 laporaké bug].\nUtawa, panjenengan bisa nganggo pormulir gampang ngisor. Tanggepan panjenengan bakal ditambahaké ing kaca \"[$3 $2]\", bebarengan karo jeneng panganggo panjenengan lan pramban kang panjenengan anggo.",
        "feedback-cancel": "Wurung",
        "feedback-close": "Rampung",
        "feedback-external-bug-report-button": "Kirim ayahan tèhnis",
        "feedback-message": "Layang:",
        "feedback-subject": "Jejer:",
        "feedback-submit": "Kirim",
-       "feedback-thanks": "Nuwun! Lebon saran Sampéyan wis dipasang nèng kacané \"[$2 $1]\".",
+       "feedback-thanks": "Nuwun! Lebon saran panjenengan wis dipasang ing kacané \"[$2 $1]\".",
        "feedback-thanks-title": "Matur nuwun!",
        "feedback-useragent": "Agèn panganggo:",
        "searchsuggest-search": "Golèk ing {{SITENAME}}",
        "limitreport-expansiondepth": "Highest expansion depth",
        "limitreport-expensivefunctioncount": "Expensive parser function count",
        "expandtemplates": "Cithakan dikembangaké",
-       "expand_templates_intro": "Kaca astaméwa iki njupuk sawetara tèks lan ngembangaké kabèh cithakan sajroning iku sacara rékursif.\nKaca iki uga ngembangaké fungsi parser kaya ta\n<nowiki>{{</nowiki>#language:…}}, lan variabel kaya ta\n<nowiki>{{</nowiki>CURRENTDAY}}&mdash;sajatiné mèh kabèh sing ana ing antara rong tandha kurung akolade.",
+       "expand_templates_intro": "Kaca astaméwa iki njupuk sawetara tèks lan ngembangaké kabèh cithakan sajroning iku sacara rékursif.\nKaca iki uga ngembangaké fungsi parser kaya ta\n<nowiki>{{</nowiki>#language:…}}, lan variabel kaya ta\n<nowiki>{{</nowiki>CURRENTDAY}}&mdash;sajatiné mèh kabèh kang ana ing antara rong tandha kurung akolade.",
        "expand_templates_title": "Sesirah kontèks, kanggo {{FULLPAGENAME}}, lsp.:",
        "expand_templates_input": "Tèks sumber:",
        "expand_templates_output": "Pituwas (kasil)",
        "expand_templates_html_output": "Raw HTML output",
        "expand_templates_ok": "OK",
        "expand_templates_remove_comments": "Busaken komentar",
-       "expand_templates_remove_nowiki": "Brèdèl tag <nowiki> nèng asilé",
+       "expand_templates_remove_nowiki": "Brèdèl tenger <nowiki> ing asilé",
        "expand_templates_generate_xml": "Tuduhna uwit parser XML",
        "expand_templates_generate_rawhtml": "Show raw HTML",
        "expand_templates_preview": "Pratuduh",
        "pagelang-nonexistent-page": "Kaca $1 ora ana.",
        "pagelang-unchanged-language": "Kaca $1 wis disetèl menyang basa $2.",
        "mediastatistics-table-mimetype": "Jinis MIME",
-       "mediastatistics-table-extensions": "Èkstènsi sing mungkin",
+       "mediastatistics-table-extensions": "Èkstènsi kang mungkin",
        "mediastatistics-table-count": "Cacah barkas",
        "mediastatistics-table-totalbytes": "Ukuran gabungan",
        "mediastatistics-header-unknown": "Ora dingertèni",
        "special-characters-group-thai": "Thailand",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
-       "mw-widgets-dateinput-no-date": "Ora ana tanggal sing dipilih",
+       "mw-widgets-dateinput-no-date": "Ora ana tanggal kang dipilih",
        "mw-widgets-mediasearch-input-placeholder": "Golèk médhia",
        "mw-widgets-mediasearch-noresults": "Ora ana wohing panggolèk.",
        "mw-widgets-titleinput-description-new-page": "kaca durung ana",
        "log-action-filter-contentmodel": "Jinis owahan modhèl isi:",
        "log-action-filter-delete": "Jinis busakan:",
        "log-action-filter-import": "Jinis imporan:",
-       "log-action-filter-managetags": "Jinis tumindak pangemunah tenger:",
+       "log-action-filter-managetags": "Jinis laku kanggo ngopèni tenger:",
        "log-action-filter-move": "Jinis lih-lihan:",
        "log-action-filter-newusers": "Jinis gawéan akun:",
        "log-action-filter-patrol": "Jinis patroli:",
        "log-action-filter-newusers-create": "Gawéan déning panganggo anonim",
        "log-action-filter-newusers-create2": "Gawéan déning panganggo kadhaftar",
        "log-action-filter-newusers-autocreate": "Gawéan otomatis",
-       "log-action-filter-newusers-byemail": "Gawéan mawa tembung wadi sing dikirim lumantar layang-èl",
+       "log-action-filter-newusers-byemail": "Gawéan mawa tembung wadi kang dikirim lumantar layang-èl",
        "log-action-filter-patrol-patrol": "Patroli manual",
        "log-action-filter-patrol-autopatrol": "Patroli otomatis",
        "log-action-filter-protect-protect": "Rereksan",
        "authmanager-provider-temporarypassword": "Tembung wadi sauntara",
        "authprovider-resetpass-skip-label": "Langkahi",
        "credentialsform-account": "Jeneng akun:",
-       "cannotlink-no-provider-title": "Ora ana akun sing bisa digayutaké",
-       "cannotlink-no-provider": "Ora ana akun sing bisa digayutaké.",
+       "cannotlink-no-provider-title": "Ora ana akun kang bisa digayutaké",
+       "cannotlink-no-provider": "Ora ana akun kang bisa digayutaké.",
        "linkaccounts": "Gayutaké akun",
        "linkaccounts-success-text": "Akun wis digayutaké.",
        "linkaccounts-submit": "Gayutaké akun",
        "pageid": "ID kaca $1",
        "rawhtml-notallowed": "&lt;html&gt; tenger ora bisa dianggo sajabané kaca adaté.",
        "gotointerwiki": "Metu {{SITENAME}}",
-       "gotointerwiki-invalid": "Sesirah sing diisèkaké ora trep.",
-       "gotointerwiki-external": "Panjenengan arep metu {{SITENAME}} saperlu marani [[$2]], sawijining situs jaringan manca.\n\n'''[$1 Bacutaké nyang $1]'''",
+       "gotointerwiki-invalid": "Sesirah kang diisèkaké ora trep.",
+       "gotointerwiki-external": "Panjenengan arep metu {{SITENAME}} saperlu marani [[$2]], situs jaringan manca.\n\n'''[$1 Bacutaké menyang $1]'''",
        "undelete-cantedit": "Panjenengan ora bisa wurung mbusak kaca iki amarga panjenengan ora kawogan mbesut kaca iki."
 }
index 9776999..bcab4c0 100644 (file)
@@ -5,6 +5,9 @@
                        "Rul1902"
                ]
        },
+       "underline-always": "ကိုဲၜၠင်",
+       "underline-never": "ၮင်းဖိုင့်အေႋ",
+       "editfont-serif": "ခေါဟ်ထိင်ႋပါ့ဖောင့်",
        "sunday": "အ်ုတုက်",
        "monday": "အ်ုစန်",
        "tuesday": "အ်ုညာႋ",
        "oct": "လာထါင့်ခုက်ဖေါဟ်",
        "nov": "လာထါင့်ခုက်ဖါဍောဟ်",
        "dec": "လာထင်းကၠံင်",
+       "january-date": "ထါင့်ခုက်ဖေါဟ် $1",
+       "february-date": "ထါင့်ခုက်ဖါဍောဟ် $1",
+       "march-date": "လါသိုင့် $1",
+       "april-date": "လါတါ $1",
+       "may-date": "လါယါ့ $1",
+       "june-date": "လါနုဲး $1",
+       "july-date": "လါၰိုဝ် $1",
+       "august-date": "လါခုဂ် $1",
+       "september-date": "ဆီ့မူႋ $1",
+       "october-date": "က္တုဂ်ဝဝ်ႋ $1",
+       "november-date": "လါၮင့် $1",
+       "december-date": "လါလိင် $1",
+       "period-am": "ကေၯဝ်",
+       "period-pm": "ကေၯး",
        "pagecategories": "{{PLURAL:$1|အ်ုဆုဂ်တုဂ်|အ်ုဆုဂ်တုဂ်သယ်}}",
        "category_header": "အ်ုဆုဂ် \"$1\" ခဝ့် လိက်မေံလ်ုဖး",
        "subcategories": "ကဏ္ဍကါင်ဖါသယ်",
        "about": "အ်ုကျံင်",
        "newwindow": "(ဝင်းဒိုးသင့်လ်ုၮါင်းဝယ် မ်ုပုဂ်ထုင်း)",
        "cancel": "မာလှ်ေအေး",
+       "moredotdotdot": "ၰိုဲမေံၜၠာ်...",
+       "morenotlisted": "စ်ုရင့်ယိုဝ် ဍုဂ်ပါင်အေ့ယာႋ။",
+       "mypage": "လက်မေံသး",
        "mytalk": "ဆ်ုခၠါန်ကင်ကာ",
+       "anontalk": "ဆ်ုခၠါင်ကင်ကာ",
        "navigation": "ပ်ုယုံ့",
        "and": "&#32;လ်ု",
+       "faq": "ဆ်ုအင်းစာအးသယ်လ်ုဖး",
+       "actions": "ဆ်ုသုဂ်ကၠယ်လ်ုဖး",
        "namespaces": "အ်ုမၠိင်ထိုဝ်",
        "variants": "အးမိင်အးစိင်လုက်ဆိင့်",
        "navigation-heading": "ၮဲဖၠေမီနူး",
+       "errorpagetitle": "ဆ်ုမး",
        "returnto": "$1 အိုဝ် မ်ုက္ဍာထါင်။",
        "tagline": "{{SITENAME}} ခဝ့်",
        "help": "မာၜိုင်မာဆိုင်",
        "search": "အင်းၰူ့",
        "searchbutton": "အင်းၰူ့",
+       "go": "လေဝ်",
        "searcharticle": "လေဝ်",
        "history": "ဃွှာန့်မေင်ႋစိင်",
        "history_short": "မေင်ႋစိင်",
-       "printableversion": "လေဝ်",
+       "history_small": "မေင်ႋစိင်",
+       "updatedmarker": "လေဝ်ယောဝ်ႋဝေ့အ်ုလါင်ခါင့်ခါ့ အင်းတင်ထဝေ့",
+       "printableversion": "ပ်ုရင့်ထင်ႋၮေဝ်ႋ ဗားရှင်း",
        "permalink": "ဆ်ုသုဂ်ကၠယ်သီ့",
+       "print": "ထုဂ်ထင်းလိက်",
        "view": "မ်ုယောဝ်ႋ",
        "view-foreign": "မ်ုယောဝ်ႋ $1 ဝယ်",
        "edit": "အင်ႋတင်ႋ",
+       "edit-local": "အှ်လင်ကၠယ် ဆ်ုတုဂ်ကၠယ် မ်ုအင်းတင်လင်",
        "create": "ပ္တုံထံင်း",
        "create-local": "အှ်လင်ကၠယ် ဆ်ုတုဂ်ကၠယ် မ်ုဆူ့ဍုဂ်လင်",
        "delete": "ထုဂ်ဆိင့်",
+       "undelete_short": "{{PLURAL:$1|ဆ်ုအင်းတင်လ်ုၮါင်း|ဆ်ုအင်းတင် $1 ၮါင်းၮှ်}}အိုဝ် လ်ုထုက်ဆိင့်လိုင်ၜး",
+       "viewdeleted_short": "{{PLURAL:$1|ထုဂ်ဆိင့်ခၞိက်ဆ်ုအင်းတင်လ်ုၮါင်း|ထုဂ်ဆိင့်ခၞိက် ဆ်ုအင်းတင် $1 ၮါင်း}}ၮှ် မ်ုယောဝ်ႋ",
+       "protect": "ခ်ုဝုင်ႋလာႋ",
+       "protect_change": "မ်ုအင်းလယ်",
+       "unprotect": "ဝီးၜါ်ထ မ်ုအင်းလယ်",
        "newpage": "လိက်မေံသင့်",
        "talkpagelinktext": "ဆ်ုခၠါင်ကင်ကာ",
+       "specialpage": "လိက်မေံခေါဟ်",
        "personaltools": "ဟ်ုဆ်ုမာ ဆ်ုဖၠင့်",
        "talk": "လဝ်ထာင်ကင်ကာ",
        "views": "ဟ်ုဍးအ်ုလာၯင်သယ်အး",
        "toolbox": "ခြီခြာ့သယ်",
+       "tool-link-userrights": "{{GENDER:$1|ၮင့်ဆါႋ}}ကုံလွာဲသယ်လ်ုဖး မ်ုအင်းလယ်",
+       "tool-link-userrights-readonly": "{{GENDER:$1|ၮင့်ဆါႋ}}ကုံလွာဲသယ်လ်ုဖး မ်ုယောဝ်ႋ",
+       "tool-link-emailuser": "ယိုဝ်{{GENDER:$1|ၮင့်ဆါႋ}}ၮှ် မ်ုသုံ့အီမေံႋ",
+       "imagepage": "မ်ုယောဝ်ႋဖိုင့်လိက်မေံ",
+       "mediawikipage": "မ်ုယောဝ်ႋလိက်မေံဖိုဟ်",
+       "templatepage": "တာင်ႋပ်ုလိတ်သယ် မ်ုယောဝ်ႋ",
+       "viewhelppage": "မ်ုယောဝ်ႋဖိုင့်လိက်မေံ",
+       "categorypage": "အ်ုဆုဂ်တုဂ်လိက်မေံသယ် မ်ုယောဝ်ႋ",
+       "viewtalkpage": "မ်ုယောဝ်ႋ လဝ်ခၠါင်ဆ်ုခၠါင်",
        "otherlanguages": "လိက်ဆ်ုခၠါင် အ်ုၯာၯံင်သယ်",
        "redirectedfrom": "($1 ခဝ့် ပ်ုယုံ့ထာ့)",
        "redirectpagesub": "ထါင်ၮဲအ်ုထိုဝ် လိက်မေံၜၠါ်",
        "redirectto": "က္ဍာထိုဝ်ၜုဂ် -",
        "lastmodifiedat": "လိက်မေံယိုဝ် $1၊ $2 အ်ုခါ့ ဆ်ုအင်ႋတင်ႋထာ့ဝေ့လှ်။",
+       "viewcount": "လိက်မေံယိုဝ် {{PLURAL:$1|လ်ုၜၠင်|$1 ၜၠင်}} အွးလင်ထ။",
+       "protectedpage": "လိက်မေံဆ်ုဝီးၜါ်",
        "jumpto": "မ်ုၯယ့်ထါင်ယိုဝ်",
        "jumptonavigation": "ပ်ုယုံ့",
        "jumptosearch": "အင်းၯူ့",
        "disclaimers": "တင်ဆ်ုခၠါင်",
        "disclaimerpage": "Project:ကိုဝ်မိင်ကိုဝ်စိင် ၜးတ်ုဒှ်",
        "edithelp": "အင်ႋတင်ႋ ဆ်ုမာၜိုင်",
-       "mainpage": "á\80\9cá\80­á\80\80á\80ºá\80\99á\80±á\80¶á\80\9aá\80¬á\80·",
+       "mainpage": "á\80\9cá\80­á\80\80á\80ºá\80\99á\80±á\80¶á\81\9cá\81 á\80«á\80ºá\80\81á\80±á\80«á\80\9fá\80º",
        "mainpage-description": "လက်မေံယာ့",
        "portal": "အ်ုထိုဝ်အ်ုမေံလင်ႋ",
        "portal-url": "Project:အ်ုထိုဝ်အ်ုမေံလင်ႋ",
        "viewsourcelink": "မ်ုယောဝ်ႋ အ်ုထိုဝ်",
        "editsectionhint": "ကၞါင့်ယိုဝ် မ်ုအင်းတင်: $1",
        "toc": "ပ်ုယုံ့ခေါဟ်တင်",
+       "confirmable-no": "လ်ုမာၜး",
        "site-rss-feed": "RSS feed $1 ဍူ",
        "site-atom-feed": "Atom feed $1ဍူ",
        "page-atom-feed": "Atom feed $1 ဍူ",
        "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> ၏ <strong>$1</strong> အ်ုတင်ၮေဝ်ႋ|<strong>$3</strong> ၏ <strong>$1 - $2</strong> အ်ုတင်ၮေဝ်ႋလ်ုဖး}}",
        "search-nonefound": "အင်းၰူ့ဆ်ုပ်ုယောဝ်ႋလ်ုၜးဍံင်သယ်လ်ုဖး အ်ုတင်ၮေဝ်လ်ုအှ်ၜးႋ။",
        "mypreferences": "မ်ုလုဲႋၯင်းလ်ုဖး",
+       "group-user": "ဆ်ုသုံႋဆာႋလ်ုဖး",
+       "group-autoconfirmed": "အ်ုဆ်ုမာအ်ုလ်ုအ်ု ဆ်ုထီ့ဆာႋထ ဆ်ုသုံႋဆာႋလ်ုဖး",
        "group-bot": "ဘေါႋလ်ုဖး",
        "group-sysop": "ပိုင်ဆ်ုပျာဆ်ုလ်ုဖး",
+       "grouppage-user": "{{ns:project}}:ဆ်ုသုံႋဆာႋလ်ုဖး",
        "grouppage-bot": "{{ns:project}}:ဘော့သယ်",
        "grouppage-sysop": "{{ns:project}}:ပိုင်ဆ်ုပျာဆိုင်လ်ုဖး",
        "right-writeapi": "ဆ်ုကေဝ်လိက် API အိုဝ် မ်ုအင်းသုံ့",
        "proxyblocker": "ပ်ုရောက်ဆီ ဆ်ုခၠာၜိင်း",
        "movelogpage": "အင်းသုံ့လင် မာၮါင်း",
        "export": "လိက်မေံသယ်လ်ဖး Export ထုက်ထုင်း",
+       "export-submit": "မ်ုသုံႋထုင်း",
        "thumbnail-more": "မာဍောဟ်အ်ုလာဟှင်",
        "importlogpage": "ဍုဂ်ဆူ့ စ်ုရင့်",
        "tooltip-pt-userpage": "{{GENDER:|ၮ်ုခဝ့် ဆ်ုသုံ့ဆာ}} လိက်မေံၜၠါ်",
        "tooltip-rollback": "\"မ်ုထါင် ကျးက္ဍာ\" ယိုဝ် လိက်မေံအ်ုယိုဝ် လါင်းခါင့် ဆ်ုအင်းတင်ႋခဝ့် ကလစ် လ်ုထီးအိုဝ် ထါင်က္ဍာဖှ်ေဝေ့လှ်။",
        "tooltip-undo": "\"ထါင်လါင်းခါင့်\" ၮှ် ဆ်ုအင်းတင်ယိုဝ် ထါင်ဆုဂ်ခါင့်ဝေ့ၯံင် လ်ုအ်ုဍံင်ၯင်မဝ့်မ်ှ မ်ုအင်းတင် မ်ုပၠါ်ထါင်းၮင်။ ဆှ်ၜိုဝ် ထါင်ဆုဂ်ခါင့်ယိုဝ် ပ်ုကုံႋဆုဂ် အ်ုခဝ့်ပ်ုယဝ့် ကေဝ်ၮေဝ်လှ်။",
        "tooltip-summary": "အင်းတင်ႋဖူးဆူ့လင်",
+       "anonusers": "{{SITENAME}} အ်ုမၠိင်လ်ုသှ်ယာႋ {{PLURAL:$2|ဆ်ုသုံႋဆာႋ|ဆ်ုသုံႋဆာႋလ်ုဖး}} $1",
        "simpleantispam-label": "Anti-spam အင်းၰူ့ၯင်းဆ်ုပၠယ်တဝ်။ အှ်ယိုဝ်ၮှ် <strong>ဖိုင့်ၰိုဲလ်ုၯေဝ်</strong>!",
        "pageinfo-title": "\"$1\" အ်ုၯင်း ဆ်ုသုဂ်ကၠယ်လ်ုဖး",
        "pageinfo-header-basic": "အ်ုခင်းထါ်ဆ်ုပြိုင့်အ်ုၯာင်ႋအ်ုကျံင်း",
index 9945fe5..e9a7300 100644 (file)
        "botpasswords-invalid-name": "지정된 사용자 이름은 봇 비밀번호 구분자(\"$1\")를 포함하고 있지 않습니다.",
        "botpasswords-not-exist": "\"$1\" 사용자가 이름이 \"$2\"인 봇의 비밀번호를 가지고 있지 않습니다.",
        "botpasswords-needs-reset": "{{GENDER:$1|사용자}} \"$1\"의 봇 이름 \"$2\"의 봇 비밀번호를 재설정해야 합니다.",
+       "botpasswords-locked": "계정이 잠겨있기 때문에 봇 비밀번호로 로그인할 수 없습니다.",
        "resetpass_forbidden": "비밀번호를 바꿀 수 없습니다",
        "resetpass_forbidden-reason": "암호를 변경할 수 없습니다: $1",
        "resetpass-no-info": "이 페이지에 직접 접근하려면 로그인해야 합니다.",
        "undeleteinvert": "선택 반전",
        "undeletecomment": "이유:",
        "cannotundelete": "일부 또는 모든 항목의 되살리기를 실패했습니다:\n$1",
-       "undeletedpage": "<strong>$1 문서가 복구되었습니다.</strong>\n\n[[Special:Log/delete|삭제 기록]]에서 최근의 삭제 및 복구 기록을 볼 수 있습니다.",
+       "undeletedpage": "<strong>$1 문서가 복구되었습니다</strong>\n\n[[Special:Log/delete|삭제 기록]]에서 최근의 삭제 및 복구 기록을 볼 수 있습니다.",
        "undelete-header": "최근에 삭제한 문서에 대한 기록은 [[Special:Log/delete|여기]]에서 볼 수 있습니다.",
        "undelete-search-title": "삭제된 문서 검색",
        "undelete-search-box": "삭제된 문서 검색",
        "confirm-unwatch-top": "이 문서를 주시문서 목록에서 뺄까요?",
        "confirm-rollback-button": "확인",
        "confirm-rollback-top": "이 문서의 편집을 되돌리시겠습니까?",
+       "confirm-mcrrestore-title": "판 복구",
        "confirm-mcrundo-title": "변경사항 취소",
        "mcrundofailed": "실행 취소를 실패했습니다",
        "mcrundo-missingparam": "요청에 필요한 변수가 존재하지 않습니다.",
        "mcrundo-changed": "차이를 본 이후로 문서가 변경되었습니다. 새로운 변경사항을 검토해 주십시오.",
+       "mcrundo-parse-failed": "새 판의 구문 분석을 실패했습니다: $1",
        "quotation-marks": "“$1”",
        "imgmultipageprev": "← 이전 페이지",
        "imgmultipagenext": "다음 페이지 →",
        "redirect-file": "파일 이름",
        "redirect-logid": "기록 ID",
        "redirect-not-exists": "값을 찾을 수 없습니다",
+       "redirect-not-numeric": "값이 숫자가 아닙니다",
        "fileduplicatesearch": "중복된 파일 검색",
        "fileduplicatesearch-summary": "파일 해시값을 이용해 중복 파일을 검색합니다.",
        "fileduplicatesearch-filename": "파일 이름:",
index 2cb3e4c..f78b4f8 100644 (file)
        "redirect-revision": "Versioun vun der Säit",
        "redirect-file": "Numm vum Fichier",
        "redirect-not-exists": "Wäert net fonnt",
+       "redirect-not-numeric": "Wäert ne tnumeresch",
        "fileduplicatesearch": "No duebele Fichiere sichen",
        "fileduplicatesearch-summary": "Sichen no Doublone vu Fichieren op der Basis vun hirem ''Hash-Wäert''.",
        "fileduplicatesearch-filename": "Numm vum Fichier:",
index 5b501c8..3b3a5b8 100644 (file)
@@ -16,7 +16,8 @@
                        "Умар",
                        "아라",
                        "Amire80",
-                       "Stjn"
+                       "Stjn",
+                       "Raa555"
                ]
        },
        "tog-underline": "ЭлячӀунрин кӀаникай цӀар чӀугун",
        "group-autoconfirmed": "Автотестикь хьанвай иштиракчияр",
        "group-bot": "Ботар",
        "group-sysop": "Къавха",
+       "group-interface-admin": "Интерфейсдин администраторар",
        "group-bureaucrat": "Бюрократар",
        "group-suppress": "Ревизорар",
        "group-all": "(вири)",
        "group-user-member": "{{GENDER:$1|иштиракчи}}",
        "group-bot-member": "{{GENDER:$1|бот}}",
        "group-sysop-member": "{{GENDER:$1|администратор}}",
+       "group-interface-admin-member": "{{GENDER:$1|интерфейсдин администратор}}",
        "group-bureaucrat-member": "{{GENDER:$1|бюрократ}}",
        "grouppage-user": "{{ns:project}}:Иштиракчияр",
        "grouppage-bot": "{{ns:project}}:Бот",
        "file-info-size": "$1 × $2 пикселар, файлдин кьадар: $3, MIME жуьре: $4",
        "file-nohires": "Идалайни хъсан ери авайд туш",
        "svg-long-desc": "SVG файл, номилдаказ $1 $2 × пикселяр, файлдин кьадар: $3",
-       "show-big-image": "ЦÓ\80аÑ\80аÑ\84а Ñ\85вена Ñ\82Ñ\83нвай Ð¶ÐµÑ\80гедай",
+       "show-big-image": "Ð\94вÑ\83лдин Ñ\84айл",
        "show-big-image-size": "$1 × $2 пиксел",
        "bad_image_list": "Формат гьихьтинди хьана кlанда:\n\nCиягьда авай анжах (* лишандихъ галаз эгечIзавай цIарарин) элементар гьисабдиз къачуда.\nЦlарцIе авай сад лагьай элячIун ттун патал къадагъа алай шикилдиз элячIун хьана кlанзава.\nГьар са цlарцIе авай гьар са ахпагьан элячIунар кьетIендинбур хьиз кьабулда, мисал яз, суьрет тваз мумкинвал авай ччинар.",
        "metadata": "Метамалуматар",
index d65c445..0fdcede 100644 (file)
        "protectedtitles-submit": "Rodyti pavadinimus",
        "listusers": "Naudotojų sąrašas",
        "listusers-editsonly": "Rodyti tik keitimus atlikusius naudotojus",
+       "listusers-temporarygroupsonly": "Rodyti tik laikinųjų vartotojų grupių naudotojus",
        "listusers-creationsort": "Rodyti pagal paskyros sukūrimo datą",
        "listusers-desc": "Išdėstyti abėcėline tvarka",
        "usereditcount": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}}",
index dcd8560..e2ded5c 100644 (file)
        "mypreferencesprotected": "Jums nav tiesību rediģēt savus iestatījumus.",
        "ns-specialprotected": "Nevar izmainīt īpašās lapas.",
        "titleprotected": "Šī lapa ir aizsargāta pret izveidošanu. To aizsargāja [[User:$1|$1]].\nNorādītais iemesls bija <em>$2</em>.",
+       "invalidtitle": "Nekorekts nosaukums",
        "invalidtitle-knownnamespace": "Nederīgs nosaukums ar vārdtelpu \"$2\" un tekstu \"$3\"",
        "invalidtitle-unknownnamespace": "Nederīgs nosaukums ar nezināmu vārdtelpas numuru \"$1\" un tekstu \"$2\"",
        "exception-nologin": "Neesat pieslēdzies",
        "grouppage-bureaucrat": "{{ns:project}}:Birokrāti",
        "grouppage-suppress": "{{ns:project}}:Cenzētāji",
        "right-read": "Lasīt lapas",
-       "right-edit": "Izmainīt lapas",
+       "right-edit": "Labot lapas",
        "right-createpage": "Izveidot lapas (kuras nav diskusiju lapas)",
        "right-createtalk": "Izveidot diskusiju lapas",
        "right-createaccount": "Izveidot jaunus dalībnieka kontus",
        "rcfilters-other-review-tools": "Citi pārskatīšanas rīki",
        "rcfilters-group-results-by-page": "Grupēt rezultātus pēc lapas",
        "rcfilters-activefilters": "Aktīvie filtri",
+       "rcfilters-activefilters-hide": "Paslēpt",
+       "rcfilters-activefilters-show": "Parādīt",
        "rcfilters-advancedfilters": "Paplašinātie filtri",
        "rcfilters-limit-title": "Rādāmie rezultāti",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|izmaiņas|izmaiņa|izmaiņas}}, $2",
        "rcfilters-savedqueries-rename": "Pārsaukt",
        "rcfilters-savedqueries-setdefault": "Uzstādīt kā noklusēto",
        "rcfilters-savedqueries-unsetdefault": "Noņemt kā noklusēto",
-       "rcfilters-savedqueries-remove": "Noņemt",
+       "rcfilters-savedqueries-remove": "Dzēst",
        "rcfilters-savedqueries-new-name-label": "Nosaukums",
        "rcfilters-savedqueries-new-name-placeholder": "Apraksti filtra būtību",
        "rcfilters-savedqueries-apply-label": "Izveidot filtru",
        "rcfilters-watchlist-edit-watchlist-button": "Labot manu uzraugāmo lapu sarakstu",
        "rcfilters-watchlist-showupdated": "Izmaiņas lapās, kuras nav apmeklētas kopš izmaiņu veikšanas, ir <strong>trekninātā rakstā</strong>.",
        "rcfilters-preference-label": "Paslēpt uzlaboto pēdējo izmaiņu versiju",
+       "rcfilters-target-page-placeholder": "Ievadi lapas nosaukumu (vai kategoriju)",
        "rcnotefrom": "Zemāk {{PLURAL:$5|redzamas izmaiņas|redzama izmaiņa|redzamas izmaiņas}} kopš <strong>$3, $4</strong> (parādītas ne vairāk kā <strong>$1</strong>).",
        "rclistfromreset": "Atiestatīt datuma izvēli",
        "rclistfrom": "Parādīt jaunas izmaiņas kopš $3 $2",
        "filehist-filesize": "Faila izmērs",
        "filehist-comment": "Komentārs",
        "imagelinks": "Faila lietojums",
-       "linkstoimage": "{{PLURAL:$1|Šajās $1 lapās ir saites|Šajā lapā ir saite|Šajās $1 lapās ir saites}} uz šo failu:",
+       "linkstoimage": "Šo failu izmanto {{PLURAL:$1|šajās $1 lapās|šajā $1 lapā|šajās $1 lapās}}:",
        "linkstoimage-more": "Uz šo failu ir saites vairāk nekā $1 {{PLURAL:$1|lapās|lapā|lapās}}.\nŠajā sarakstā ir tikai {{PLURAL:$1|pirmās $1 saistītās lapas|pirmā $1 saistītā lapa|pirmās $1 saistītās lapas}} uz šo failu.\nPieejams arī [[Special:WhatLinksHere/$2|pilns saraksts]].",
-       "nolinkstoimage": "Nevienā lapā nav norāžu uz šo attēlu.",
+       "nolinkstoimage": "Šo failu neizmanto nevienā lapā.",
        "morelinkstoimage": "Skatīt [[Special:WhatLinksHere/$1|vairāk saites]] uz šo failu.",
        "linkstoimage-redirect": "$1 (faila pāradresācija) $2",
        "duplicatesoffile": "{{PLURAL:$1|1=Šis fails ir šī faila dublikāts|Šie $1 faili ir šī faila dublikāti|Šis $1 fails ir šī faila dublikāts|Šie $1 faili ir šī faila dublikāti}} ([[Special:FileDuplicateSearch/$2|vairāk informācijas]]):",
        "expandtemplates": "Izvērst veidnes",
        "expand_templates_output": "Rezultāts",
        "expand_templates_ok": "Labi",
+       "expand_templates_remove_comments": "Noņemt komentārus",
        "expand_templates_remove_nowiki": "Cenzēt <nowiki> iezīmes rezultātā",
        "expand_templates_preview": "Pirmskats",
        "pagelanguage": "Mainīt lapas valodu",
index c3737f4..5649f9b 100644 (file)
        "botpasswords-invalid-name": "Укажаното корисничко име не го содржи одделувачот ботовска лозинка („$1“).",
        "botpasswords-not-exist": "Корисникот „$1“ нема ботовска лозинка „$2“.",
        "botpasswords-needs-reset": "Лозинката на ботот со име „$2“ на {{GENDER:$1|корисникот}} „$1“ мора да се поднови.",
+       "botpasswords-locked": "Не можете да се најавите со ботовска лозинка бидејќи сметката ви е заклучена.",
        "resetpass_forbidden": "Лозинките не може да се менуваат",
        "resetpass_forbidden-reason": "Лозинките не може да се менуваат: $1",
        "resetpass-no-info": "Мора да сте најавени ако сакате да имате директен пристап до оваа страница.",
        "group-bureaucrat": "Бирократи",
        "group-suppress": "Притајувачи",
        "group-all": "(сите)",
-       "group-user-member": "корисник",
-       "group-autoconfirmed-member": "автопотврден корисник",
-       "group-bot-member": "бот",
-       "group-sysop-member": "администратор",
+       "group-user-member": "{{GENDER:$1|корисник}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|автопотврден корисник}}",
+       "group-bot-member": "{{GENDER:$1|бот}}",
+       "group-sysop-member": "{{GENDER:$1|администратор}}",
        "group-interface-admin-member": "{{GENDER:$1|администратор на посредникот}}",
-       "group-bureaucrat-member": "бирократ",
+       "group-bureaucrat-member": "{{GENDER:$1|бирократ}}",
        "group-suppress-member": "{{GENDER:$1|притајувач}}",
        "grouppage-user": "{{ns:project}}:Корисници",
        "grouppage-autoconfirmed": "{{ns:project}}:Автопотврдени корисници",
        "grouppage-interface-admin": "{{ns:project}}:Администратори на посредникот",
        "grouppage-bureaucrat": "{{ns:project}}:Бирократи",
        "grouppage-suppress": "{{ns:project}}:Притајување",
-       "right-read": "Читање страници",
+       "right-read": "Читање на страници",
        "right-edit": "Уредување на страници",
        "right-createpage": "Создавање на страници (кои не се разговорни страници)",
        "right-createtalk": "Создавање на разговорни страници",
        "right-createaccount": "Создавање на нови кориснички сметки",
        "right-autocreateaccount": "Автоматска најава со надворешна корисничка сметка",
        "right-minoredit": "Означување на уредувањата како ситни",
-       "right-move": "Преместување страници",
+       "right-move": "Преместување на страници",
        "right-move-subpages": "Преместување на страници со нивните потстраници",
        "right-move-rootuserpages": "Преместување на основни кориснички страници",
        "right-move-categorypages": "Преместување на категориски страници",
        "right-purge": "Бришење од опслужувачки меѓусклад на страницата без барање потврда за тоа",
        "right-autoconfirmed": "Без ограничувања на стапки за IP-адреса",
        "right-bot": "Третиран како автоматски процес",
-       "right-nominornewtalk": "Ситните уредувања да не поттикнуваат потсетник за нова порака",
+       "right-nominornewtalk": "СиÑ\82ниÑ\82е Ñ\83Ñ\80едÑ\83ваÑ\9aа Ð½Ð° Ñ\80азговоÑ\80ни Ñ\81Ñ\82Ñ\80аниÑ\86и Ð´Ð° Ð½Ðµ Ð¿Ð¾Ñ\82Ñ\82икнÑ\83вааÑ\82 Ð¿Ð¾Ñ\82Ñ\81еÑ\82ник Ð·Ð° Ð½Ð¾Ð²Ð° Ð¿Ð¾Ñ\80ака",
        "right-apihighlimits": "Користење на помалку ограничени барања од извршникот",
        "right-writeapi": "Можност за запишување во извршникот",
        "right-delete": "Бришење страници",
        "right-editinterface": "Уредување на кориснички посредник",
        "right-editusercss": "Уредување на CSS податотеки на други корисници",
        "right-edituserjson": "Уредување на JSON-податотеките на други корисници",
-       "right-edituserjs": "Уредување на JS податотеки на други корисници",
+       "right-edituserjs": "Уредување на JavaScript податотеки на други корисници",
        "right-editsitecss": "Уредување на CSS за цело вики",
        "right-editsitejson": "Уредување на JSON за цело вики",
        "right-editsitejs": "Уредување на JavaScript за цело вики",
        "grant-basic": "Основни права",
        "grant-viewdeleted": "Преглед на избришани податотеки и страници",
        "grant-viewmywatchlist": "Преглед на вашите набљудувања",
-       "grant-viewrestrictedlogs": "Погл. ограничени дневнички ставки",
+       "grant-viewrestrictedlogs": "Преглед на ограничени дневнички ставки",
        "newuserlogpage": "Дневник на регистрирања на корисници",
        "newuserlogpagetext": "Ова е дневник на регистрирани корисници.",
        "rightslog": "Дневник на корисничките права",
        "confirm-unwatch-top": "Да ја отстранам страницава од набљудуваните?",
        "confirm-rollback-button": "ОК",
        "confirm-rollback-top": "Да ги отповикам уредувањата на страницава?",
+       "confirm-mcrrestore-title": "Поврати преработка",
        "confirm-mcrundo-title": "Откажи промена",
        "mcrundofailed": "Откажувањето не успеа",
        "mcrundo-missingparam": "Недостасуваат задолжителни параметри за барањето.",
        "mcrundo-changed": "Страницата е изменета откако ги гледавте разликите. Прегледајте ја новата промена.",
+       "mcrundo-parse-failed": "Не успеав да ја расчленам новата преработка: $1",
        "percent": "$1&#160;%",
        "quotation-marks": "„$1“",
        "imgmultipageprev": "← претходна страница",
        "redirect-file": "Име на податотека",
        "redirect-logid": "Назнака на дневникот",
        "redirect-not-exists": "Вредноста не е најдена",
+       "redirect-not-numeric": "Вредноста не е бројчена",
        "fileduplicatesearch": "Барање на дуплирани податотеки",
        "fileduplicatesearch-summary": "Пребарување на дуплирани податотеки по тарабни вредности.",
        "fileduplicatesearch-filename": "Податотека:",
index 774c4e2..6db8de9 100644 (file)
        "right-editcontentmodel": "താളിന്റെ ഉള്ളടക്ക രീതി തിരുത്തുക",
        "right-editinterface": "ഉപയോക്തൃ സമ്പർക്കമുഖത്തിൽ മാറ്റം വരുത്തുക",
        "right-editusercss": "മറ്റ് ഉപയോക്താക്കളുടെ CSS പ്രമാണങ്ങൾ തിരുത്തുക",
+       "right-edituserjson": "മറ്റ് ഉപയോക്താക്കളുടെ ജെസൺ പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-edituserjs": "മറ്റ് ഉപയോക്താക്കളുടെ JS പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-editmyusercss": "താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ സി.എസ്.എസ്. പ്രമാണങ്ങൾ തിരുത്തുക",
        "right-editmyuserjs": "താങ്കളുടെ സ്വന്തം ഉപയോക്തൃ ജാവാസ്ക്രിപ്റ്റ് പ്രമാണങ്ങൾ തിരുത്തുക",
        "rcfilters-watchlist-showupdated": "മാറ്റങ്ങൾ ഉണ്ടായ ശേഷം താങ്കൾ സന്ദർശിക്കാത്ത താളുകളിലെ മാറ്റങ്ങൾ, തളിക അടയാളത്തോടൊപ്പം <strong>കടുപ്പിച്ച്</strong> കാണിച്ചിരിക്കുന്നു.",
        "rcfilters-preference-label": "സമീപകാലമാറ്റങ്ങളുടെ പുതുക്കിയ പതിപ്പ് പ്രദർശിപ്പിക്കേണ്ട",
        "rcfilters-preference-help": "സമ്പർക്കമുഖത്തിൽ 2017-ൽ വരുത്തിയ രൂപകല്പനാമാറ്റങ്ങളും, അതോടൊപ്പവും പിന്നീടും ചേർത്ത എല്ലാ ഉപകരണങ്ങളും ഒഴിവാക്കുക.",
+       "rcfilters-watchlist-preference-label": "ശ്രദ്ധിക്കുന്നവയുടെ പട്ടികയുടെ പുതുക്കിയ പതിപ്പ് പ്രദർശിപ്പിക്കേണ്ടതില്ല",
+       "rcfilters-watchlist-preference-help": "2017-ലെ സമ്പർക്കമുഖ പുനർരൂപകല്പനയും അതോടൊപ്പവും പിന്നീടും ചേർത്ത എല്ലാ ഉപകരണങ്ങളും ഒഴിവാക്കുക",
        "rcfilters-filter-showlinkedfrom-label": "കണ്ണി ചേർക്കപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
        "rcfilters-filter-showlinkedfrom-option-label": "തിരഞ്ഞെടുത്ത താളിൽ <strong>കണ്ണി ചേർക്കപ്പെട്ട താളുകൾ</strong>",
+       "rcfilters-filter-showlinkedto-label": "കണ്ണി ചേർക്കപ്പെട്ട താളുകളിലെ മാറ്റങ്ങൾ കാണിക്കുക",
+       "rcfilters-filter-showlinkedto-option-label": "തിരഞ്ഞെടുത്ത താളിലേക്ക് <strong>കണ്ണി ചേർക്കപ്പെട്ട താളുകൾ</strong>",
        "rcfilters-target-page-placeholder": "താളിന്റെ (അല്ലെങ്കിൽ വർഗ്ഗത്തിന്റെ) പേര് നൽകുക",
        "rcnotefrom": "<strong>$3, $4</strong> മുതലുള്ള {{PLURAL:$5|മാറ്റം|മാറ്റങ്ങൾ}} ആണ് താഴെയുള്ളത്  (<strong>$1</strong> എണ്ണം വരെ കൊടുക്കുന്നതാണ്).",
        "rclistfromreset": "തീയതി എടുത്തത് പുനഃസജ്ജീകരിക്കുക",
        "http-timed-out": "എച്ച്.റ്റി.റ്റി.പി. അഭ്യർത്ഥന സമയം കഴിഞ്ഞു.",
        "http-curl-error": "യു.ആർ.എൽ. ശേഖരിക്കുന്നതിൽ പിഴവ്: $1",
        "http-bad-status": "എച്ച്.റ്റി.റ്റി.പി. അഭ്യർത്ഥനാ വേളയിൽ ഒരു പിഴവുണ്ടായി: $1 $2",
+       "http-internal-error": "എച്ച്.റ്റി.റ്റി.പി. ആന്തരിക പിഴവ്.",
        "upload-curl-error6": "യൂ.ആർ.എൽ. പ്രാപ്യമല്ല",
        "upload-curl-error6-text": "താങ്കൾ സമർപ്പിച്ച യൂ.ആർ.എൽ. പ്രാപ്യമല്ല‌. ദയവായി യൂ.ആർ.എൽ. സാധുവാണോ എന്നും സൈറ്റ് സജീവമാണോ എന്നും പരിശോധിക്കുക.",
        "upload-curl-error28": "അപ്‌ലോഡ് ടൈംഔട്ട്",
index 28d4714..d826743 100644 (file)
        "postedit-confirmation-saved": "ꯅꯪꯒꯤ ꯁꯦꯝꯒꯠꯄꯗꯨ ꯇꯨꯡꯁꯤꯟꯈꯔꯦ ꯫",
        "postedit-confirmation-published": "ꯅꯪꯒꯤ ꯁꯦꯝꯒꯠꯄꯗꯨ ꯐꯣꯡꯗꯣꯛꯈꯔꯦ ꯫",
        "content-model-wikitext": "ꯋꯤꯀꯤ ꯋꯥꯍꯩ ꯋꯥꯇꯥ",
+       "content-model-javascript": "ꯖꯥꯕꯥ ꯃꯌꯦꯛ",
        "content-json-empty-object": "ꯑꯍꯥꯡꯕꯥ ꯄꯣꯠꯁꯛ",
        "viewpagelogs": "ꯃꯁꯤꯒꯤ ꯂꯥꯃꯥꯏꯁꯤꯒꯤ ꯅꯧꯅ ꯆꯪꯉꯨ",
        "currentrev-asof": "$1 ꯒꯤ ꯅꯧꯅꯥ ꯑꯃꯨꯛꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ ꯃꯤꯠꯌꯦꯡ",
        "nextrevision": "ꯑꯅꯧꯕꯥ ꯑꯃꯨꯛꯍꯟꯅꯥ ꯌꯦꯡꯕꯥ",
        "currentrevisionlink": "ꯈꯋꯥꯏꯗꯒꯤ ꯅꯧꯅꯥ ꯑꯃꯨꯛ ꯌꯦꯡꯕꯥ",
        "cur": "ꯍꯧ",
+       "next": "ꯃꯊꯪ",
        "last": "ꯃꯃꯥꯡꯒꯤ",
        "page_first": "ꯑꯍꯥꯟꯕ",
        "page_last": "ꯑꯔꯣꯏꯕ",
        "history-feed-title": "ꯄꯨꯋꯥꯔꯤ ꯑꯃꯨꯛ ꯍꯟꯅ ꯌꯦꯡꯕ",
        "history-feed-item-nocomment": "$2 ꯗ$1",
        "rev-delundel": "ꯑꯍꯣꯡꯕꯥ ꯎꯍꯟꯂꯤꯕꯥ",
+       "rev-showdeleted": "ꯎꯨꯠꯂꯨ",
+       "revisiondelete": "ꯀꯛꯊꯠꯄ/ꯀꯛꯊꯠꯇꯕ ꯑꯃꯨꯛꯍꯟꯅ ꯌꯦꯡꯕ",
        "revdelete-show-file-submit": "ꯍꯣꯏ",
+       "revdelete-radio-set": "ꯑꯔꯣꯠꯄ",
        "revdelete-radio-unset": "ꯎꯍꯟꯕ",
+       "pagehist": "ꯂꯃꯥꯏꯒꯤ ꯄꯨꯋꯥꯔꯤ",
+       "deletedhist": "ꯀꯛꯊꯠꯈꯤꯕꯒꯤ ꯄꯨꯋꯥꯔꯤ",
        "mergelog": "ꯂꯣꯒ ꯄꯨꯟꯁꯤꯟꯕ",
        "history-title": "Revision history of \"$1\"",
        "difference-title": "$1 ꯒꯤ ꯑꯃꯨꯛꯍꯟꯕꯥ ꯈꯦꯠꯅꯕꯥꯒꯤ ꯃꯔꯛ",
index b51843c..addbfb3 100644 (file)
@@ -2,13 +2,33 @@
        "@metadata": {
                "authors": [
                        "Dr Lotus Black",
-                       "Htawmonzel"
+                       "Htawmonzel",
+                       "Aue Nai"
                ]
        },
        "tog-underline": "လေန် မတာပၞောန်သၟဝ်",
        "tog-hideminor": "ပၞုက် အရာမပလေဝ်ဒါန်လဝ် ကိစ္စဟွံဇၞော် နူကဵု ပြဟ်ဟ်ဏအ်",
        "tog-hidepatrolled": "ပၞုက် အရာမပလေဝ်ဒါန်လဝ် ကိစ္စဇၞော်ဇၞော် နူကဵု ပြဟ်ဟ်ဏအ်",
+       "tog-newpageshidepatrolled": "ဗဒန် မုက်လိက်မဒဒှ်မဂေတ်ကၚ် နူ စရၚ် မုက်လိက် တၟိ",
        "tog-hidecategorization": "ပၞုက် အရာမဖျေဟ်ကဏ္ဍ ကုမုက်လိက်",
+       "tog-extendwatchlist": "သၠဲ စရၚ်မမၚ်မဲ သ္ဂောံ ထ္ၜး အလုံ မုက်လိၚ်ဂမၠိုၚ်, ဆ မတုဲကၠုၚ်လၟုဟ် ဟွံသေၚ်",
+       "tog-showtoolbar": "ထ္ၜး တာန်ကြိယာမဒါန်",
+       "tog-editondblclick": "ဒါန်မုက်လိက်ဂမၠိုၚ် ပွမပ္ဍဵုကေတ်ၜါလ္တန်",
+       "tog-enotifwatchlistpages": "ပြၚ်အီမေလ်ကုအဲ အခိၚ်မုက်လိက် ဟွံသေၚ် ဝှာၚ်မနွံပ္ဍဲစရၚ်မမၚ်မွဲအဲ ဒးဒုၚ်ပြံၚ်",
+       "tog-enotifusertalkpages": "ပြၚ်အဳမေလ်ကုအဲ အခိၚ်မုက်လိက်ဓရီုကျာညးလွပ်အဲ ဒးဒုၚ်ပြံၚ်",
+       "tog-enotifminoredits": "ပြၚ်အဳမေလ်ကုအဲ သွက်မပလေဝ်ဒါန်ညိညဒဒှ်မုက်လိက်ကေုာံဝှာၚ်အဲဂမၠိုၚ်ကီုလေဝ်",
+       "tog-oldsig": "စၟတ်တဲ မၞး မၞုံဒၟံၚ်တုဲတုဲ:",
+       "tog-watchlisthideown": "ဗဒန်ထောံအဲဒါန်လဝ်နူစရၚ်မဗဵုရံၚ်",
+       "tog-watchlisthidebots": "ဗဒန်ထောံ ရုပ်စက်မပလေဝ်ဒါန်   နူ စရၚ်မမၚ်မွဲ",
+       "tog-watchlisthideminor": "ဗဒန်ထောံ ပလေဝ်ဒါန်မညိည နူ စရၚ်မမၚ်မွဲ",
+       "tog-watchlisthidecategorization": "ပၞုက် အရာမဖျေဟ်ကဏ္ဍ ကုမုက်လိက်",
+       "tog-ccmeonemails": "ပြၚ်ကုအဲ ဆာဲကဝ်ပဳဒဒှ်အီမေလ် အဲမပြၚ်ဏာစရၚ်ညးလွပ်တၞဟ်တအ်",
+       "tog-diffonly": "လ္ပထ္ၜး မုက်လိက် မာတိကာ သၟဝ် မတၞဟ်ခြာ",
+       "tog-showhiddencats": "ထ္ၜးကဆံၚ်မပၞုက်လဝ်",
+       "tog-prefershttps": "လၟိုန်သုၚ်စောဲကေတ် လာၚ်မမၞုံဂီုကၠီု အခိၚ်မလုပ်လံက်အေန်",
+       "underline-always": "လၟိုန်အခါ",
+       "underline-never": "မွဲလှေ်ဟွံမွဲ",
+       "editfont-serif": "လိက် Serif",
        "sunday": "တ္ၚဲအဒိုက်",
        "monday": "တ္ၚဲစန်",
        "tuesday": "တ္ၚဲအၚာ",
        "oct": "အံက်",
        "nov": "နဝ်",
        "dec": "ဒဳ",
+       "january-date": "ဇန်နဝါရဳ $1",
+       "february-date": "ဖေဖဝ်ရဳ$1",
+       "march-date": "မာတ် $1\nဒါန်ပေၚ်အာ ၁၀ တုဲ ညတအ်ပလံၚ်နၚ်\nသွက်အခေါၚ်ချူဒါန်ပ္ဍဲမုက်လိက်ဂှ်\nတၚ်ဂုဏ်ရ။",
+       "april-date": "ဨပရဳ $1",
+       "may-date": "မေ $1",
+       "june-date": "ဂျေန် $1",
+       "july-date": "ဂျူလာၚ် $1",
+       "august-date": "သြဂုတ် $1",
+       "september-date": "$1သေပ်တေမ်ပါ",
+       "october-date": "အံက်တိုဘာ $1",
+       "november-date": "နိုဝေန်ဘာ$1",
+       "december-date": "ဒဳဇြေန်ဗာ$1",
+       "period-am": "နူဂယး",
+       "period-pm": "သဝ်တ္ၚဲ",
        "pagecategories": "{{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍဂမၠိုင်}}",
        "category_header": "မုက်လိက်ဂမၠိုင် ပ္ဍဲ ကဏ္ဍ \"$1\"",
        "subcategories": "ကဏ္ဍလစှ်ေဂမၠိုင်",
        "category-media-header": "မဳဒဳယာ စပ်ကဵု ကဏ္ဍ \"$1\"",
        "category-empty": "<em>ကဏ္ဍဏအ် ပြဟ်ဟ်ဏအ် ဟွံမဲ ကု မုက်လိက် ဟွံသေင်မ္ဂး ပရူမွဲမွဲဏီရ</em>",
        "hidden-categories": "{{PLURAL:$1|ကဏ္ဍ မပၞုက်|ကဏ္ဍ မပၞုက်ဂမၠိုင်}}",
+       "hidden-category-category": "ကဆံၚ် မပၞုက်လဝ်",
        "category-subcat-count": "{{PLURAL:$2|ကဏ္ဍဏအ်ဂှ် ကဏ္ဍလစှ်ေ နွံဆ အတိုင်ဗွဲသၟဝ်ဝွံရ၊၊|ကဏ္ဍဏအ် နွံဆအတိုင် ဗွဲသၟဝ်ဝွံရ၊၊ {{PLURAL:$1|ကဏ္ဍလစှ်ေ|$1 ကဏ္ဍလစှ်ေဂမၠိုင်}}, ပၞောဝ်ကဵု $2 သီုဖအိုတ်}}",
+       "category-subcat-count-limited": "ကဆံၚ်(အဇာ)ဝွံ နွံအတိုၚ်ဗွဲသၟဝ် {{PLURAL:$1|ကဆံၚ်ပါ်|$1ကဆံၚ်ပါ်ဂမၠိုၚ်}}",
        "category-article-count": "{{PLURAL:$2|ကဏ္ဍဏအ် နွံဆၜိုတ် အတိုင်ဗွဲသၟဝ်ဏအ်ရ.| ဗွဲသၟဝ်ဏအ်ဂှ် {{PLURAL:$1| ဒှ်လၟိဟ် မုက်လိက်| ဒှ်လၟိဟ် မုက်လိက်ဂမၠိုင် $1 }} စပ် ကုကဏ္ဍဏအ်ရ၊၊ သီုဖအိုတ် နွံ  $2}}",
+       "category-article-count-limited": "အတိုၚ်ဗွဲသၟဝ်{{PLURAL:$1|မုက်ဂှ်|$1 မုက်တအ်}} ပ္ဍဲကဆံၚ်မလၟုဟ်.",
        "category-file-count": "{{PLURAL:$2|ကဏ္ဍဏအ် နွံဆၜိုတ် ဝှာင်|အတိုင် ဗွဲသၟဝ်ဏအ်ရ {{PLURAL:$1|ဝှာင် ဂှ်|$1 ဝှာင်တအ် ဂှ်}} ပ္ဍဲကဏ္ဍဏအ် သီုဖအိုတ် နွံ $2 ၊၊}}",
+       "category-file-count-limited": "အတိုၚ်ဗွဲသၟဝ်{{PLURAL:$1|ဝှာၚ်|$1 ဝှာၚ်ဂမၠိုၚ်}} ပ္ဍဲကဆံၚ်မလၟုဟ်.",
        "listingcontinuesabbrev": "ဆက်",
+       "index-category": "မုက်လိက်မစၞောန်လဝ်",
        "noindex-category": "မုက်လိက် မသက္ကုလိက်",
        "broken-file-category": "မုက်လိက် နကဵုလေန် ဝှာင်မလီုလာ်ဂမၠိုင်",
        "about": "ပရူ",
+       "article": "မုက်လိက် မာတိကာဂမၠိုင်",
        "newwindow": "(ပံက် ပ္ဍဲ မုက်ဗတင် တၟိ)",
-       "cancel": "တးပဲါ",
+       "cancel": "တးပါဲ",
+       "moredotdotdot": "ထပ်...",
+       "morenotlisted": "စရၚ်ဏအ်ဒဒှ်ဍိုက်ပေၚ်မံၚ်ယျ",
+       "mypage": "မုက်လိက်",
        "mytalk": "ဓရီုကျာ",
+       "anontalk": "ဓရီုကျာ",
        "navigation": "သ္ၚိအင်",
        "and": "&#32; ကေုာံ",
+       "faq": "FAQ",
+       "actions": "ကၠောန်",
        "namespaces": "ဒၞာဲယၟု",
        "variants": "မူတၞဟ်",
        "navigation-heading": "သ္ၚိအင် မေန်နူ",
+       "errorpagetitle": "ဗၠေတ်",
        "returnto": "ကလေင်အာ ဇရေင် $1",
        "tagline": "နူ {{SITENAME}}",
        "help": "ရီု",
        "search": "ဂၠာဲ",
        "searchbutton": "ဂၠာဲ",
+       "go": "အာ",
        "searcharticle": "အာ",
        "history": "ဝှာင် လၟေင်အပြံင်အလှာဲ",
        "history_short": "အရာမဗှ်လဝ်တုဲ",
+       "history_small": "လၟေင်မပြံင်လှာဲလဝ်",
        "printableversion": "မူလိက် မပြေန်ပ္တိတ်ဂွံ",
        "permalink": "ဌာန်ဒတန်လေန် လၟိုန်",
+       "print": "ပတိတ်",
        "view": "ဗဗဵု",
        "view-foreign": "ဗဵု ပ္ဍဲ $1",
        "edit": "ပလေဝ်ဒါန်",
+       "edit-local": "စုတ် ပရူပရာဒေသ",
        "create": "ခၞံကၠောန်",
        "create-local": "စုတ် ပရူပရာဒေသ",
        "delete": "ပလီု",
+       "undelete_short": "ပလီု {{PLURAL:$1|ဒါန် မွဲအလန်|$1 ဒါန်ဂၠိုၚ်ကဵုအလန်}}",
+       "viewdeleted_short": "ရံၚ် {{PLURAL:$1|ဒါမပလီုမွဲ|$1 ဒါန်မပလီုဂမၠိုၚ်}}",
+       "protect": "စဵုဒၞာ",
+       "protect_change": "ပြံင်လှာဲ",
+       "unprotect": "ပရေင်စဵုဒၞာ မုက်လိက်",
        "newpage": "မုက်လိက် တၟိ",
        "talkpagelinktext": "ဓရီုကျာ",
+       "specialpage": "မုက်လိက် တၟေင်",
        "personaltools": "ကြိယာ သွက်ပူဂဵု",
        "talk": "သဳကၠဳ",
        "views": "ထ္ၜး",
        "toolbox": "ကြိယာ",
+       "tool-link-userrights": "ပြံၚ်{{GENDER:$1|ညးလွပ်}} ဂကောံဂမၠိုၚ်",
+       "tool-link-userrights-readonly": "ရံၚ်{{GENDER:$1|ညးလွပ်}} ဂကောံဂမၠိုၚ်",
+       "tool-link-emailuser": "ပလံၚ်လိက်ဣဏံ{{GENDER:$1|ညးလွပ်}}",
+       "imagepage": "ဗဵု မုက်လိက် ဝှာင်",
+       "mediawikipage": "ဗဵု မုက်လိက် ဓရီုကျာ",
+       "templatepage": "ဗဵု မုက်လိက် တာန်ပလုက်",
+       "viewhelppage": "ဗဵု မုက်လိက် ရီုဗၚ်",
+       "categorypage": "ဗဵု မုက်လိက်ကဏ္ဍ",
+       "viewtalkpage": "ဗဵု မသဳကၠဳ",
        "otherlanguages": "နကဵု အရေဝ်ဘာသာ တၞဟ်",
        "redirectedfrom": "(ကလေင်ထ္ၜး နူ $1)",
        "redirectpagesub": "မုက်လိက် ကလေင်ပညုင်",
        "redirectto": "ကလေင်စၞောန်ပညုင်လဝ် နူကဵု-",
        "lastmodifiedat": "မုက်လိက်ဏအ် လက္ကရဴအိုတ် ပလေဝ်ဒါန်လဝ် ပ္ဍဲ $1 ပ္ဍဲ $2",
+       "viewcount": "မုက်လိက်ဏအ်ဂှ် ဒ:ဒုၚ်လုပ်လဝ်တုဲ{{PLURAL:$1|မွဲအလန်|$1 ဂၠိုၚ်ကဵုအလန်}}",
+       "protectedpage": "မုက်လိက် စဵုဒၞဲါလဝ်",
        "jumpto": "ဒံင် လုပ်",
        "jumptonavigation": "သ္ၚိအင်",
        "jumptosearch": "ဂၠာဲ",
+       "view-pool-error": "သၠးအခေါၚ်, မုက်ဏအ်ဂှ် ထပ်မံၚ်ယျ ပ္ဍဲအခိၚ်ဏအ်.\nညးလွပ်မဂၠိုၚ်တအ် ဂစာန်မံၚ် သ္ဂောအ်ဗဵုကေတ်မုက်လိက်ဏအ်.\nသ္ပဂုဏ်တုဲ မၚ်မွဲစုတ် ကိုပ်ကၠာနူ မၞးဟွံဂစာန် သ္ဂောံလုပ်မုက်လိက်ဏအ်မွဲလတန်ပၠန်ဂှ်.\n\n$1",
+       "generic-pool-error": "သၠးအခေါၚ်, မုက်ဏအ်ဂှ် ထပ်မံၚ်ယျ ပ္ဍဲအခိၚ်ဏအ်.\nညးလွပ်မဂၠိုၚ်တအ် ဂစာန်မံၚ် သ္ဂောအ်ဗဵုကေတ်မုက်လိက်ဏအ်.\nသ္ပဂုဏ်တုဲ မၚ်မွဲစုတ် ကိုပ်ကၠာနူ မၞးဟွံဂစာန် သ္ဂောံလုပ်တမ်ရိုဟ်ဏအ်မွဲလတန်ပၠန်ဂှ်",
+       "pool-timeout": "အခိၚ်အိုတ်အာယျ မၚ်မံၚ်သွက်ဂွံလုပ်",
+       "pool-queuefull": "ပြေၚ်ရၚ်မဍိုန်လျတအ်ပေၚ်မံၚ်",
+       "pool-errorunknown": "ဟွံတီ ဗီုလဵုဗၠေတ်",
+       "pool-servererror": "ပရေၚ်ကမၠောန်မအောန်ကဵုဆိုက်ဗ္ဒက်ဂှ် ဟွံသၟဟ်အစောန် ($1)",
+       "poolcounter-usage-error": "သုၚ်စောဲ ဗၠေတ်:$1",
        "aboutsite": "ပရူ {{SITENAME}}",
        "aboutpage": "Project:ပရူ",
        "copyright": "လိက်ဂှ် မံက် ပ္ဍဲ $1 ယဝ်ရတင်ယောင်ယာ မွဲမွဲ ဟွံမွဲမ္ဂး၊၊",
        "disclaimers": "ဒဒှ်မဟွံဆက်စပ်",
        "disclaimerpage": "Project:ဒဒှ်မဟွံဆက်စပ် နာနာ",
        "edithelp": "အရီုအဗင် ပ္ဍဲအရာမပလေဝ်ဒါန်",
+       "helppage-top-gethelp": "ရီု",
        "mainpage": "မုက်လိက်တမ်",
        "mainpage-description": "မုက်လိက်တမ်",
+       "policy-url": "Project:မူဝါဒ",
        "portal": "ပါင်မုက် ဂကောံ",
        "portal-url": "Project:ပါင်မုက် ဂကောံ",
        "privacy": "ပဝ်လသဳ မဆေင်ကဵု အခေါင်အရာပူဂဵု",
        "privacypage": "Project:ပဝ်လသဳ အခေါင်ပူဂဵု",
+       "badaccess": "တင်သၠးအခေါင် ဗၠေတ်",
+       "badaccess-group0": "ညးလွဟ် ဟွံကလိဂွံအခေါၚ်သွက်ဂွံပသောၚ်သ္အး ကမၠောန်ညးလွဟ်မအာတ်လဝ်အခေါၚ်ဂှ်",
+       "badaccess-groups": "ပွမၞးမၞုံကဵုမအာတ်လဝ်အခေါၚ်ဂှ် ပိုၚ်ခြာလဝ်သွက်ညးလွပ် ပ္ဍဲ{{PLURAL:$2|မွဲဂကောံ| မွဲ နူဂကောံ}}:$1",
+       "versionrequired": "မူ $1 မဳဒဳယာဝဳကဳ မနွံလဝ်ပၟိက်",
+       "ok": "ခိုဟ်",
        "retrievedfrom": "ကလေင်သီကေတ်လဝ် နူ \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|မၞး ကလိဂွံ}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|မၞး ကလိဂွံ}} $1 နူ {{PLURAL:$3| မဒှ် ညးလွပ်တၞဟ်မွဲ|$3 ညးလွပ်ဂမၠိုင်}} ($2).",
+       "youhavenewmessagesmanyusers": "မၞး မၞုံ$1 မူ ညးလွဟ်ဗွဲမဂၠိုၚ် ($2)",
        "newmessageslinkplural": "{{PLURAL:$1|ပရိုင်မေတ်သုက် တၟိ|999=ပရိုင်မေတ်သုက်တၟိဂမၠိုင်}}",
        "newmessagesdifflinkplural": "လက္ကရဴအိုတ် {{PLURAL:$1|အပြံင်အလှာဲ|999=အပြံင်အလှာဲဂမၠိုင်}}",
+       "youhavenewmessagesmulti": "မၞး မၞုံကဵု ပိုဒ်ဂလာန် မေသုက်မတၟိ ပ္ဍဲ $1",
        "editsection": "ပလေဝ်ဒါန်",
        "editold": "ပလေဝ်ဒါန်",
        "viewsourceold": "ထ္ၜး တမ်ရိုဟ်",
        "viewsourcelink": "ထ္ၜး တမ်ရိုဟ်",
        "editsectionhint": "ဒၞာဲ မပလေဝ်ဒါန် - $1",
        "toc": "မာတိကာ",
+       "showtoc": "ထ္ၜး",
+       "hidetoc": "ဗဒန်",
+       "collapsible-collapse": "ဒေါမ်",
+       "collapsible-expand": "သၠဲ",
+       "confirmable-confirm": "ဒှ်{{GENDER:$1|ညးလွပ်}} ချိုတ်ပၠိုတ်ဟာ",
+       "confirmable-yes": "ယွံ",
+       "confirmable-no": "ဟအှ်ေ",
+       "thisisdeleted": "ဗဵု ဟွံသေၚ် ကလၚ်စွံ $1 ဟာ",
+       "viewdeleted": "ဗဵု $1 ဟာ",
+       "restorelink": "{{PLURAL:$1|ဒါမပလီုမွဲ|$1 ဒါန်မပလီုဂမၠိုၚ်}}",
+       "feedlinks": "တရိုပ်:",
+       "site-rss-feed": "$1 RSS feed",
        "site-atom-feed": "$1 ဒၞာဲ ဗလးပတိတ်",
+       "page-rss-feed": "\"$1\" RSS feed",
        "page-atom-feed": "\"$1\" ဒၞာဲ ဗလးပတိတ်",
        "red-link-title": "$1(မုက်လဝ်ဏအ် ဟွံပြာကတ်)",
+       "sort-descending": "လၟေၚ်မစှေ်ကၠုၚ်ဒၟံၚ်",
+       "sort-ascending": "လၟေၚ်မတိုန်ကၠုၚ်ဒၟံၚ်",
        "nstab-main": "မုက်လိက်",
        "nstab-user": "မုက်လိက် ညးလွပ်",
+       "nstab-media": "မုက်လိက် မဳဒဳယာ",
        "nstab-special": "မုက်လိက် တၟေင်",
        "nstab-project": "မုက်လိက် ပရဝ်ဂျေတ်",
        "nstab-image": "ဝှာင်",
        "nstab-mediawiki": "ပရိုင်မေတ်သုက်",
        "nstab-template": "Template",
+       "nstab-help": "မုက်လိက် မရီုဗင်",
        "nstab-category": "ကဏ္ဍ",
        "mainpage-nstab": "မုက်လိက်တမ်",
+       "nosuchaction": "ဟွံမွဲကဵု ပွမမိက်မွဲမွဲ",
        "nosuchspecialpage": "မုက်လိက် တၟေင် ညံင်ရဴဏအ် ဟွံမဲ",
        "nospecialpagetext": "<strong>မၞး အာတ်မိက်လဝ် မုက်လိက်တၟေင် မဟွံမဲမွဲရ၊၊</strong>\n\nစရင် မုက်လိက်တၟေင် မနွံတအ်ဂှ် ဂွံဆဵုကေတ် ပ္ဍဲ [[Special:SpecialPages|{{int:specialpages}}]].",
+       "error": "ဗၠေတ်",
+       "databaseerror-query": "သၟာန်: $1",
+       "databaseerror-function": "ကမၠောန်: $1",
+       "databaseerror-error": "ဗၠေတ်: $1",
+       "missingarticle-rev": "(ကလၚ်ဖျေံ#:$1)",
+       "missingarticle-diff": "(တၞဟ်ခြာ: $1, $2)",
+       "internalerror": "ဗၠေတ်အပ္ဍဲ",
+       "internalerror_info": "ဗၠောတ်အပ္ဍဲ:$1",
+       "filecopyerror": "ဆာဲစၠောံ ဝှာၚ်  \"$1\" ဏာစရေၚ် \"$2\" ဟွံမာန်",
+       "filerenameerror": "ကလေၚ်ကဵုယၟုဝှာၚ် \"$1\" ဏာ \"$2\" ဟွံမာန်",
+       "filedeleteerror": "ပလီုကေတ်ဝှာၚ် \"$1\" ဟွံမာန်",
+       "directorycreateerror": "ခၞံကၠောန်ကေတ် လိက်အုပ်မစၞောန်ထ္ၜးဌာန်ဒၟံၚ်ကဵုယၟုမၞိဟ် \"$1\" ဟွံမာန်",
+       "directoryreadonlyerror": "အိက်အုပ်မစၞောန်ထ္ၜးဌာန်ဒၟံၚ်ကဵုယၟုမၞိဟ် \"$1\" ဂှ် ဆအယာံမာတ်- ဗှ်ဟေၚ်",
+       "directorynotreadableerror": "လိက်အုပ်မစၞောန်ထ္ၜးဌာန်ဒၟံၚ်ကဵုယၟုမၞိဟ် \"$1\" ဂှ် ဗှ်ကေတ်မာန်ဟွံသေၚ်.",
+       "filenotfound": "ဂၠာဲကေတ် ဝှာၚ် \"$1\" ဟွံမာန်",
+       "unexpected": "ၚုဟ်မး ဟွံစၟဳကေတ်: \"$1\"=\"$2\"",
+       "formerror": "ဗၠောတ်: ပတိုန်တၞးဗပေၚ်ဏအ် ဟွံမာန်.",
+       "cannotdelete-title": "ပလီုကေတ်မုက်လိက်ဟွံဂွံ$1",
        "badtitle": "က္ဍိုပ်လိက် ဟွံခိုဟ်",
        "badtitletext": "မုက်လိက် မအာတ်မိက်လဝ်ဂှ် ဟွံသၟဟ်အစောမ်၊ သၠာတ်သၠးဒၟံင် ဟွံသေင်မ္ဂး ဆက်စၠောအ်လေန်လဝ် ကုအရေဝ်ဘာသာနာနာ ဟွံသေင်မ္ဂး က္ဍိုပ်လိက် အပ္ဍဲအကြာဝဳကဳ ဟွံဒးရ၊၊\nဟိုတ်နူ စကာလဝ် မလိက် နဒဒှ်က္ဍိုပ်လိက်ဟွံဂွံ ပါလုပ်ဒၟံင် မွဲမ ဟွံသေင်မ္ဂး မဂၠိုင် ကုမ လေဝ် ဒှ်မာန်ရ၊၊",
+       "title-invalid-characters": "က္ဍိုပ်လိက် မုက်လိက်မအာတ်လဝ်အခေါၚ် သၚ်္ကေတ ဟွံစှ်ေသၞောတ် မပါလုပ်: \"$1\"",
        "viewsource": "ထ္ၜး တမ်ရိုဟ်",
        "viewsource-title": "ဗဵု တမ်ရိုဟ် သွက် $1",
+       "actionthrottled": "ပွပတ်ကအ်",
        "viewsourcetext": "မၞး ဗဵု ကေုာံ စၠောအ်ကပ်ပဳကေတ် တမ်ရိုဟ် မုက်လိက်ဏအ် ဂွံရ၊၊",
+       "namespaceprotected": "မၞး ဟွဲမွဲကဵု အခေါၚ်အရာ သ္ဂောအ်ပလေဝ်ဒါန် မုက်လိက် ပ္ဍဲ<strong>$1</strong> ဒၞဲါယၟု.",
+       "customcssprotected": "မၞး ဟွံမွဲကဵု အခေါၚ်အရာ သ္ဂောအ် ပလေဝ်ဒါန် မုက်လိက် CSS ဏအ် မုဟိုတ်တှ်ေ ဍေံတအ်ဂှ် မၞုံဒၟံၚ်ကဵု မချိၚ်ထ္ၜတ်ပရၚ်ပူဂိုလ်ညးလွဟ်တၞဟ်တအ်ရ.",
+       "customjsonprotected": "မၞး ဟွံမွဲကဵု အခေါၚ်အရာ သ္ဂောအ် ပလေဝ်ဒါန် မုက်လိက် JSON ဏအ် မုဟိုတ်တှ်ေ ဍေံတအ်ဂှ် မၞုံဒၟံၚ်ကဵု မချိၚ်ထ္ၜတ်ပရၚ်ပူဂိုလ်ညးလွဟ်တၞဟ်တအ်ရ.",
+       "customjsprotected": "မၞး ဟွံမွဲကဵု အခေါၚ်အရာ သ္ဂောအ် ပလေဝ်ဒါန် မုက်လိက် JavaScript ဏအ် မုဟိုတ်တှ်ေ ဍေံတအ်ဂှ် မၞုံဒၟံၚ်ကဵု မချိၚ်ထ္ၜတ်ပရၚ်ပူဂိုလ်ညးလွဟ်တၞဟ်တအ်ရ.",
+       "sitecssprotected": "မၞး ဟွံမွဲကဵု အခေါၚ်အရာ သ္ဂောအ် ပလေဝ်ဒါန် မုက်လိက် CSS ဏအ် မုဟိုတ်တှ်ေ ဇီုကပိုက်အာကဵု ကၟုဲတအ်သီုဖအိုတ်မာန်ဏောၚ်.",
+       "sitejsonprotected": "မၞး ဟွံမွဲကဵု အခေါၚ်အရာ သ္ဂောအ် ပလေဝ်ဒါန် မုက်လိက် JSON ဏအ် မုဟိုတ်တှ်ေ ဇီုကပိုက်အာကဵု ကၟုဲတအ်သီုဖအိုတ်မာန်ဏောၚ်.",
+       "sitejsprotected": "မၞး ဟွံမွဲကဵု အခေါၚ်အရာ သ္ဂောအ် ပလေဝ်ဒါန် မုက်လိက် JavaScript ဏအ် မုဟိုတ်တှ်ေ ဇီုကပိုက်အာကဵု ကၟုဲတအ်သီုဖအိုတ်မာန်ဏောၚ်.",
+       "mycustomcssprotected": "မၞးဟွံမွဲကဵုအခေါၚ်ဂွံဒါန်မုက်လိက်CSSဏအ်.",
+       "mycustomjsonprotected": "မၞးဟွံမွဲကဵုအခေါၚ်ဂွံဒါန်မုက်လိက်JSONဏအ်",
+       "mycustomjsprotected": "မၞးဟွံမွဲကဵုအခေါၚ်ဂွံဒါန်မုက်လိက်JavaScriptဏအ်.",
+       "myprivateinfoprotected": "မၞးအခေါၚ်ဟွံမွဲသ္ဂောအ်ဒါန်တၚ်နၚ်ပရိုၚ်ပူဂိုလ်မၞး.",
+       "mypreferencesprotected": "မၞးဟွံမွဲကဵုအခေါၚ်ဂွံဒါန်ပၟိက်ဒးဂၞပ်မၞး.",
+       "ns-specialprotected": "မုက်လိက်ဗွဲတၟေၚ်မဂပ်ဝ်ဒါန်ဟွံဂွံ.",
+       "titleprotected": "က္ဍိုပ်လိက်ဏအ် ဒးဒုၚ်စဵုဒၞါနူမခၞံကၠောန်နကဵု[[User:$1|$1]].\nဟိုတ်မကဵုလဝ်တအ်တုန် <em>$2</em>.",
+       "filereadonlyerror": "ဟွံသၟဟ်အစောန် သ္ဂောံ ပြုပြေၚ် ဝှာၚ် \"$1\" မုဟိုတ်တှေ် ဝှာၚ်မဒုၚ်လျိုၚ် \" $2\" ဂှ် နွံပ္ဍဲ မဝ်ဒယ် ဆ-ဗှ်ဟေၚ်.\nညးကောပ်ကာဲသၞောတ် ပူဂိုလ်မကၟာတ်လတ် အရာဏအ် ကဵုကၠုၚ်တၚ်သောၚ်ကလး: \"$3\"",
+       "invalidtitle": "က္ဍိုပ်လိက်မဟွံစှေ်ကဵုဗဗွဲဓရ်",
+       "invalidtitle-knownnamespace": "က္ဍိုပ်လိက် မဟွံစှ်ေကဵုဗဗွဲဓရ် နကဵု ဒၞဲါယၟု \"$2\" ကေုာံ လိက် \"$3\"",
+       "invalidtitle-unknownnamespace": "က္ဍိုပ်လိက် မဟွံမွဲကဵုဗဗွဲဓရ် ကေုာံ မဂၞန်ဒၞဲါယၟု မတီကေတ်ဟွံမာန် \"$1\"  ကေုာံ လိက်\"$2\"",
+       "exception-nologin": "ဟွံ လုပ်လံက်အေန်လဝ်",
+       "exception-nologin-text": "သ္ပဂုဏ်တုဲ လုပ်လံက် သ္ဂောံကလိဂွံ သွက်ဂွံလုပ်ကေတ်မုက်လိက်ဏအ် ဟွံသေၚ် ဂွံကၠောန်.",
+       "exception-nologin-text-manual": "သ္ပဂုဏ်တုဲ $1 သ္ဂောံကလိဂွံ တၞဟ်နဂွံလုပ်မုက်လိက်ဏအ် ဟွံသေၚ် ပရေၚ်ချဳဒရာၚ်.",
+       "cannotlogoutnow-title": "လၟုဟ် တိက်ဇၟိက်ဟွံဂွံ",
+       "cannotlogoutnow-text": "တိတ်ဇၟိက်ဂှ် ဂွံကေတ်ဟွံမာန် အဃောသုၚ်စောဲဒၟံၚ်$1.",
+       "welcomeuser": "ဒုၚ်တၠုၚ်,$1",
+       "welcomecreation-msg": "အကံက်မၞးခၞံကၠောန်တုဲယျ.\nမၞးပြံၚ်ကေတ်ဒြပ်မၞး{{SITENAME}}[[Special:Preferences|စိုတ်လုပ်စမဂၠိုၚ်]]ယဝ်မၞးနွံပၟိက်မ္ဂး.",
+       "yourname": "ယၟုညးလွပ်:",
        "userlogin-yourname": "ယၟုညးလွပ်",
        "userlogin-yourname-ph": "စုတ် ယၟုညးလွပ်",
+       "createacct-another-username-ph": "စုတ် ယၟုညးလွပ်",
+       "yourpassword": "မအက္ခရ်ဓလုက်",
        "userlogin-yourpassword": "မလိက်ပၞုက်",
        "userlogin-yourpassword-ph": "စုတ် မလိက်ပၞုက် မၞးညိ",
        "createacct-yourpassword-ph": "စုတ် မလိက်ပၞုက် မွဲညိ",
+       "yourpasswordagain": "ကလေၚ်တက် မအက္ခရ်ဓလုက်:",
        "createacct-yourpasswordagain": "ပဒတန် မလိက်ပၞုက်ညိ",
        "createacct-yourpasswordagain-ph": "စုတ် မလိက်ပၞုက် မွဲဝါပၠန်ညိ",
        "userlogin-remembermypassword": "လုပ်လံက်အေန်လဝ် အဲညိ၊၊",
+       "userlogin-signwithsecure": "သုၚ်စောဲလာၚ်ဆက်စၠောံမနွံကဵုဂီုကၠီုညိ",
+       "cannotlogin-title": "လုပ်လံက်အေန်ဟွံဂွံ",
+       "cannotlogin-text": "လုပ် လံက်အေန်ဂှ် ဒှ်ဟွံမာန်.",
+       "cannotloginnow-title": "လၟုဟ် လုပ်ဇၟိက်ဟွံဂွံ",
+       "cannotloginnow-text": "အဃောသုၚ်စောဲဒၟံၚ်$1ဂှ် လုပ်ဇၟိက်လံက်အေန် ဟွံဂွံ.",
+       "cannotcreateaccount-title": "ခၞံဗဒှ် အကံက် ဟွံဂွံ",
+       "cannotcreateaccount-text": "ခၞံကၠောန်အံက်တၟိဂှ် ဂွံဟွံမာန်ပ္ဍဲဝဳကဳဏအ်.",
+       "yourdomainname": "ဒိုမိန်မၞး :",
+       "password-change-forbidden": "မၞးလှာဲကေတ်မအက္ခရ်ပၞုက်ဂမၠိုၚ်ဟွံဂွံလ္တူဝဳကဳဏအ်.",
        "login": "လုပ်လံက်အေန်",
+       "login-security": "သ္ပဒတန်လက်သဏ်ဇကုညိ",
+       "nav-login-createaccount": "လုပ်ဇၟိက်/ခၞံကၠောန် အကံက်",
+       "logout": "တိတ်",
+       "userlogout": "တိတ်",
+       "notloggedin": "ဟွံ လုပ်လံက်အေန်လဝ်",
        "userlogin-noaccount": "ဟွံကလိဂွံ အကံက်ဏီ?",
        "userlogin-joinproject": "လုပ်ပံင်တောဲ {{SITENAME}}",
        "createaccount": "ခၞံကၠောန် အကံက်",
        "userlogin-resetpassword-link": "ဝိုတ်စ မလိက်ပၞုက် မၞးဟာ?",
        "userlogin-helplink2": "အရီုအဗင် သွက်ဂွံ လုပ်လံက်အေန်",
+       "userlogin-loggedin": "မၞးလုပ်မံၚ်လံက်အေန်တုဲဒၟံၚ်ညံၚ်{{GENDER:$1|$1}}\nသုၚ်စောဲကေတ်ဗီုပြၚ်သၟတ်သ္ဂောံလုပ်လံက်ပ္ဍဲညံၚ်ညးလွဟ်တၞဟ်.",
+       "userlogin-reauth": "မၞးထေက်ကဵုလံက်အေန်မွဲဝါပၠန်သွက်ဂွံသ္ပဒတန်ဒဒှ်ရမၞးဂှ် {{GENDER:$1|$1}}",
+       "userlogin-createanother": "ခၞံကၠောန် အကံက်တၞဟ်",
+       "createacct-emailrequired": "ဌာန်အဳမေလ်တအ်",
        "createacct-emailoptional": "ဌာန်ဒၟံင် အဳမေဝ် (သ္ဒးစုတ်ဟေင်)",
        "createacct-email-ph": "စုတ် ဌာန်ဒၟံင် အဳမေဝ် မၞးညိ",
+       "createacct-another-email-ph": "စုတ် ဌာန်ဒၟံင် အဳမေဝ်",
+       "createaccountmail": "သုၚ်စောဲကေတ်မအက္ခရ်ပၞုက်ဆဆဵုမွဲ တုဲ ပလံၚ်ဏာဍေံသွက်ဌာန်ဒတန်အဳမေလ်မစေအ်ဗိုတ်",
+       "createaccountmail-help": "သုၚ်စောဲကေတ်မာန် သ္ဂောံခၞံကၠောန်အကံက်သွက်ပူဂိုလ်တၞဟ် သီုဟွံမွဲကဵု အက္ခရ်ပၞုက်မကတ်လ္ၚတ်ဒၟံၚ်",
+       "createacct-realname": "ယၟု ဍာံ (optional)",
+       "createacct-reason": "ဟိုတ်",
+       "createacct-reason-ph": "မုဟိုတ်မၞးဂွံခၞံကၠောန်အကံက်တၞဟ်ခြာရော",
        "createacct-submit": "ခၞံကၠောန် အကံက် မၞးညိ",
+       "createacct-another-submit": "ခၞံကၠောန် အကံက်",
+       "createacct-continue-submit": "ဆက်ဒၟံၚ် မခၞံကၠောန်အကံက်",
+       "createacct-another-continue-submit": "ဆက် ခၞံကၠောန် အကံက်",
        "createacct-benefit-heading": "{{SITENAME}} ဂှ် ကၠောန်လဝ် နကဵု မၞိဟ် ညံင်ရဴမၞးကီုရ၊၊",
        "createacct-benefit-body1": "{{PLURAL:$1|တင်ပလေဝ်ဒါန်|တင်ပလေဝ်ဒါန်ဂမၠိုင်}}",
        "createacct-benefit-body2": "{{PLURAL:$1|မုက်လိက်|မုက်လိက်ဂမၠိုင်}}",
        "createacct-benefit-body3": "ခြာဟွံလအ် {{PLURAL:$1|ညးမခၞံကၠောန်|ညးမခၞံကၠောန်ဂမၠိုင်}}",
+       "badretype": "မအက္ခရ်ပၞက် မၞး စုတ်လဝ် ဟွံဒးဏဳ.",
+       "usernameinprogress": "မခၞံကၠောန်အကံက် သွက်ယၟုညးလွပ်ဂှ် အာစိုပ်မံၚ်ပ္ဍဲလၟေၚ်လၟေၚ်ရ.\nသ္ပဂုဏ်တုဲ မၚ်ကဵုညိ.",
+       "userexists": "ယၟုညးလွပ်စုတ်ဂှ် ဒဒှ်သုၚ်စောဲလဝ်တုဲယျ.\nသ္ပဂုဏ်တုဲ ရုဲစှ်ကေတ် ယၟုမတၞဟ်ခြာမွဲ.",
+       "loginerror": "လံက်အေန် ယောၚ်",
+       "createacct-error": "အကံက် မခၞံကၠောန် ယောၚ်",
+       "createaccounterror": "ခၞံဗဒှ် အကံက် ဟွံဂွံ:$1",
+       "loginsuccesstitle": "လံက်အေန်တုဲ",
+       "loginsuccess": "<strong>လၟုဟ်မၞးဂှ်လံက်အေန်လဝ်ပ္ဍဲသွက်{{SITNAME}}ညံၚ်\"$1\" .</strong>",
+       "login-userblocked": "ညးလွပ်ဏအ် ဒးကၟာတ်လဝ်. ဟွံကဵုအခေါၚ်လုပ်ရ.",
+       "wrongpassword": "ယၟုညးလွပ် ဟွံသေၚ် မအက္ခရ်ပၞုက် စုတ်တအ်ဟွံဒးရ.\nသ္ပဂုဏ်တုဲ ကလၚ်ဂစာန်မွဲအလန်ပၠန်.",
+       "wrongpasswordempty": "မက္ခရ်ပၞုက် စုတ်လဝ်ဂှ် မသၠးမံၚ်.\nသ္ပဂုဏ်တုဲ ဂစာန်မွဲဝါပၠန်ညိ.",
+       "passwordtooshort": "မက္ခရ်ပၞုက်တအ်ဂှ် အောန်အိုတ်ဒးနွံကဵု {{PLURAL:$1|သၚ်္ကေတ ၁ မ|$1 သၚ်္ကေတဂမၠိုၚ်}}.",
+       "passwordtoolong": "မက္ခရ်ပၞုက်တအ် ပကဵုဂၠိၚ်အာနူ{{PLURAL:$1|သၚ်္ကေတ ၁ မွဲ|$1 သၚ်္ကေတမဂၠိုၚ်}}",
+       "passwordtoopopular": "မအက္ခရ်ပၞုက် ညးဂမၠိုၚ်မရုဲစှ်တအ်ဂှ် သုၚ်စောဲကေတ်ဟွံဂွံ. သ္ပဂုဏ်တုဲ ရုဲစှ်ကေတ် မအက္ခရ်ပၞုက် မဒှ်ဂွံချိၚ်ဆကေတ် ဝါတ်ဂါတ်ညိတအ်ဂှ်.",
+       "password-name-match": "မအက္ခရ်ပၞုက်မၞးဂှ် ထေက်ကဵုဒးဒှ် ဒးဒှ်မတၞဟ်ခြာနူ ယၟုညးလွပ်မၞး.",
+       "password-login-forbidden": "ပွမသုၚ်စောဲကေတ် ယၟုညးလွပ်ဏအ် ကေုာံ မအက္ခရ်ပၞုက်ဏအ်ဂှ် ဒးဒုၚ်စဵုဒၞဲါလဝ်ရ.",
+       "mailmypassword": "ကလေင်စုတ် မလိက်ပၞုက်",
+       "passwordremindertitle": "မအက္ခရ်ပၞုက် ယာယဳတၟိ သွက် {{SITENAME}}",
+       "accountcreated": "ခၞံကၠောန်အကံက်တုဲ",
+       "accountcreatedtext": "The user account for [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) has been created.",
+       "createaccount-title": "ခၞံကၠောန်အကံက်သွက်{{SITENAME}}",
+       "createaccount-text": "ညးမမိက်ကဵုမွဲခၞံကၠောန်လဝ်အကံက်သွက်အီမေလ်မၞး ပ္ဍဲ {{SITENAME}} ($4) မၞုံလဝ်ယၟု \"$2\", နကဵုအက္ခရ်ပၞုက်\"$3\".\nမၞးထေက်ကဵုလံက်အေန်တုဲ လှာဲထောံမအက္ခရ်ပၞုက်မၞ: လၟုဟ်ညိ.\nမၞးမထေက်ကဵုပမဇ္ဇျဟ်လိက်ဏံရ,ယဝ်အကံက်မခၞံကၠောန်လဝ်မဆောတ်ယောၚ်မ္ဂး.\n\nYou may ignore this message, if this account was created in error.",
+       "login-throttled": "မၞးကၠောန်သ္ပဂစာန်လံက်အေန်တုဲကၠုၚ်ဂှ် အတန်ဗွဲမဂၠိုၚ်ရ.\nသ္ပဂုဏ်တုဲမၚ်$1 ကိုပ်ကၠာနူဟွံဂစာန်မွဲအတန်ပၠန်.",
        "loginlanguagelabel": "အရေဝ်ဘာသာ- $1",
        "pt-login": "လုပ်လံက်အေန်",
        "pt-login-button": "လုပ်လံက်အေန်",
+       "pt-login-continue-button": "ဆက် လုပ်လံက်အေန်",
        "pt-createaccount": "ခၞံကၠောန် အကံက်",
        "pt-userlogout": "တိတ်",
+       "changepassword": "လှာဲအက္ခရ်ပၞုက်",
+       "resetpass_announce": "သ္ဂောံတုဲဒှ် လုပ်လံက်အေန်, မၞးထေက်ဒဆိၚ်ကေတ် မအက္ခရ်ဗၞုက်တၟိ.",
+       "resetpass_header": "လှာဲမက္ခရ်ပၞုက်အကံက်",
+       "oldpassword": "မအက္ခရ်ပၞုက်တြေံ:",
+       "newpassword": "မလိက်ပၞုက် တၟိ",
+       "retypenew": "ကလေၚ်တက် မအက္ခရ်ဓလုက်:",
+       "resetpass_submit": "ချိၚ်မလိက်ပၞုက် တုဲ လုပ်ဇၟိက်",
+       "changepassword-success": "မအက္ခရ်ပၞုက်မၞးဂှ် ပြံၚ်အာတုဲယျ!",
+       "changepassword-throttled": "မၞးကၠောန်သ္ပဂစာန်လံက်အေန်တုဲကၠုၚ်ဂှ် အတန်ဗွဲမဂၠိုၚ်ရ.\nသ္ပဂုဏ်တုဲမၚ်$1 ကိုပ်ကၠာနူဟွံဂစာန်မွဲအတန်ပၠန်.",
+       "botpasswords": "Bot အက္ခရ်ပၞုက်",
+       "botpasswords-disabled": "Bot မက္ခရ်ပၞုက်တအ်ဂှ် ဂွံဟွံမာန်.",
+       "botpasswords-label-needsreset": "(မက္ခရ်ပၞုက် နွံပၟိက် ကလေၚ်ဆိၚ်)",
+       "botpasswords-label-appid": "ယၟု Bot:",
+       "botpasswords-label-create": "ခၞံကၠောန်",
+       "botpasswords-label-update": "ပခိုဟ်လဟဵု",
+       "botpasswords-label-cancel": "တးပါဲ",
+       "botpasswords-label-delete": "ဇိုတ်",
+       "botpasswords-label-resetpassword": "ကလေင်စုတ် မလိက်ပၞုက်",
+       "botpasswords-label-grants": "ဂရမ်မကလိဂွံမာန်:",
+       "botpasswords-bad-appid": "ယၟု bot \"$1\" ဂှ်ဟွံကိတ်ညဳ.",
+       "resetpass_forbidden": "မက္ခရ်ပၞုက်လှာဲကေတ်ဟွံဂွံ",
+       "resetpass_forbidden-reason": "မအက္ခရ်ပၞုက်တအ် လှာဲကေတ်ဟွံဂွံ:$1",
+       "resetpass-no-info": "မၞးထေက်ကဵု ဒးလုပ်လံက်လဝ် သ္ဂောအ်လုပ်မုက်လိက်ဗွဲတိုက်ရိုက်.",
+       "resetpass-submit-loggedin": "လှာဲအက္ခရ်ပၞုက်",
+       "resetpass-submit-cancel": "တးပါဲ",
+       "resetpass-temp-password": "အက္ခရ်ပၞုက် ယာယဳ:",
        "passwordreset": "ကလေင်စုတ် မလိက်ပၞုက်",
+       "passwordreset-username": "ယၟုညးလွပ်:",
+       "passwordreset-domain": "ဒိုမိန်:",
+       "passwordreset-email": "ဌာန်အဳမေလ်တအ်",
+       "passwordreset-emailtitle": "ခၞံကၠောန်အကံက်သွက်{{SITENAME}}",
+       "passwordreset-emailelement": "ယၟုညးလွပ်:\n$1\n\nမက္ခရ်ပၞုက် ယာယဳ:\n$2",
+       "passwordreset-emailsentemail": "ယဝ်ဌာန်ဒတန်အဳမေလ်ဏအ်ဆက်စပ်ကဵုအကံက်မၞး, ဗွဲကြဴ အဳမေလ် မအက္ခရ်ပၞုက်မကလေၚ်ချိၚ် ပလံၚ်ဏာဏောၚ်.",
+       "passwordreset-invalidemail": "အဳမေလ် ဟွံလုပ်အဝေါင်",
+       "changeemail": "လှာဲ ဟွံသေၚ် ပတိတ် ဌာန်ဒတန် အဳမေလ်",
+       "changeemail-oldemail": "ဌာန်ဒတန် အဳမေလ် သုၚ်စောဲလၟုဟ်:",
+       "changeemail-newemail": "ဌာန်ဒတန်အဳမေလ်တၟိ:",
+       "changeemail-none": "(ဟွံမဲ)",
+       "changeemail-password": "အက္ခရ်ပၞုက် {{SITENAME}} မၞး:",
+       "changeemail-submit": "လှာဲ အဳမေလ်",
+       "changeemail-throttled": "မၞးကၠောန်သ္ပဂစာန်လံက်အေန်တုဲကၠုၚ်ဂှ် အတန်ဗွဲမဂၠိုၚ်ရ.\nသ္ပဂုဏ်တုဲမၚ်$1 ကိုပ်ကၠာနူဟွံဂစာန်မွဲအတန်ပၠန်.",
+       "changeemail-nochange": "သ္ပဂုဏ်တုဲ စုတ်အဳမေလ်တၟိမတၞဟ်မွဲ.",
+       "resettokens": "ကလေၚ်ချိၚ် ဟီုတုဲတအ်",
+       "resettokens-tokens": "ဟီုတုဲတအ်:",
+       "resettokens-token-label": "$1 (ၚုဟ်မးလၟုဟ်: $2)",
+       "resettokens-done": "ကလေၚ်ချိၚ်ဟီုတုဲတအ်.",
+       "resettokens-resetbutton": "ကလေၚ်ချိၚ် မဟီုတုဲမရုဲစှ်လဝ်တအ်",
        "bold_sample": "မလိက် တီု",
        "bold_tip": "မလိက် တီု",
        "italic_sample": "မလိက်ဓစေင်",
        "sig_tip": "စၟတ်တဲ မၞး နကဵု တဆိပ်အခိင်",
        "hr_tip": "လာင် ဗွဲလနေင်",
        "summary": "သကေမ်",
+       "subject": "ပရူပရာ\nဒါန်ပေၚ်အာ ၁၀၀၀ တုဲညးပလံၚ်နၚ် အခေါၚ်ခၞံမုက်လိက်ဏအ်။\nတၚ်ဂုဏ်ရ။",
        "minoredit": "ဣဏအ်ဂှ် ဒှ်အရာ မပလေဝ်ဒါန် ညိည",
        "watchthis": "မင်မဲ မုက်လိက်ဏအ်",
        "savearticle": "ဂိုင်သိပ် မုက်လိက်",
+       "savechanges": "သီဂိုၚ်မပြံၚ်လှာဲတအ်",
+       "publishpage": "မုက်လိက်တက်တြး",
+       "publishchanges": "ပတိတ်တြး ပြံင်လှာဲအာ",
+       "savearticle-start": "ဂိုင်သိပ် မုက်လိက်",
+       "savechanges-start": "သီဂိုၚ်မပြံၚ်လှာဲတအ်",
+       "publishpage-start": "ပတိတ်တြး မုက်လိက်...",
+       "publishchanges-start": "ပတိတ်တြး ပြံင်လှာဲအာ",
        "preview": "နမူနာ",
        "showpreview": "ထ္ၜး နမူနာ",
        "showdiff": "ထ္ၜး အရာမပြံင်လှာဲ",
        "anoneditwarning": "<strong>သတိ</strong> မၞး ဟွံဂွံ လုပ်လံက်အေန်လဝ်ရ၊၊ IP address မၞး မံက်ဒၟံင်ရောင် ယဝ်ရ မၞးကၠောန်သ္ပ ပရေင်ပလေဝ်ပလေတ်မွဲမွဲမ္ဂး၊၊ ယဝ်ရ <strong>[$1 လုပ်လံက်အေန်]</strong> ဟွံသေင်မ္ဂး <strong>[$2 ခၞံကၠောန် အကံက်မွဲ]</strong>မ္ဂး၊ ပရေင်ပလေဝ်ဒါန်မၞး တြးပတိတ် နကဵု ယၟုသုင်စောဲ မၞးရောင်၊၊",
+       "missingcommenttext": "သ္ပဂုဏ်တုဲ စုတ် ဂလာန်ဗ္ကန်ညိ.",
+       "summary-preview": "ကလေၚ်ရံၚ်သကေမ်ဒါန်:",
+       "subject-preview": "ကလေၚ်ရံၚ်အရာကပေါတ်:",
+       "blockedtitle": "ညးလွပ်ဂှ်ကၟာတ်အာယျ",
        "blockedtext": "<strong>ယၟုညးလွပ် ဟွံသေင်မ္ဂး ဌာန်ဒၟံင်အာင်ဒဳမၞး ဒးဒုင်ကၟာတ်စဵုဒၞာလဝ်</strong>\n\nပွမကၟာတ်စဵုဒၞာဂှ် ကၠောန်လဝ် နကဵု $1.\nဟိုတ်မဂွံကၟာတ်စဵုဒၞာဂှ် <em>$2</em>.\n\n* အခိင်မစကၟာတ်စဵုဒၞာ- $8\n* အခိင်မကၟာတ်စဵုဒၞာအိုတ်- $6\n* မရန်တၟအ် blockee- $7\n\nမၞး ဆက်ကဵု $1 ဟွံသေင်မ္ဂး ညးတၞဟ်သအာင် [[{{MediaWiki:Grouppage-sysop}}|administrator]] ယဝ်ရ မိက်ဂွံ ပတိုန်ဂလာန် စပ်ကဵု မဒးဒုင်ကၟာတ်စဵုဒၞာဂှ်ဂွံရ၊၊\nမၞး စကာ အဳမေလ် \"{{int:emailuser}}\" ဟွံဂွံရ၊၊ ဆဂး ယဝ်ရ ဌာန်ဒၟံင်အဳမေလ်ဂှ် ဒှ်အရာတၟေင် ပ္ဍဲ [[Special:Preferences|account preferences]] မၞး ကေုာံ မၞးဟွံဒးဒုင် ကၟာတ်စဵုဒၞာလဝ် နကဵုအဳမေဝ်ဂှ်မ္ဂး ဂွံမာန်ရ၊၊\nIP address မၞး လၟုဟ်ဂှ် ဒှ် $3, တုဲ ID မဒးဒုင်ကၟာတ်စဵုဒၞာဂှ် ဒှ် #$5 ရ၊၊ \nယဝ်ရ မၞးမိက်ဂွံ သၟာန်မ္ဂး တင်ဂၞင် ဗွဲလတူတအ် သီုဖအိုတ်ဂှ် ဗၟံက်ထ္ၜးကဵုညိ၊၊",
+       "autoblockedtext": "<strong>ယၟုညးလွပ် ဟွံသေင်မ္ဂး ဌာန်ဒၟံင်အာင်ဒဳမၞး ဒးဒုင်ကၟာတ်စဵုဒၞာလဝ်</strong>\n\nပွမကၟာတ်စဵုဒၞာဂှ် ကၠောန်လဝ် နကဵု $1.\nဟိုတ်မဂွံကၟာတ်စဵုဒၞာဂှ် <em>$2</em>.\n\n* အခိင်မစကၟာတ်စဵုဒၞာ- $8\n* အခိင်မကၟာတ်စဵုဒၞာအိုတ်- $6\n* မရန်တၟအ် blockee- $7\n\nမၞး ဆက်ကဵု $1 ဟွံသေင်မ္ဂး ညးတၞဟ်သအာင် [[{{MediaWiki:Grouppage-sysop}}|administrator]] ယဝ်ရ မိက်ဂွံ ပတိုန်ဂလာန် စပ်ကဵု မဒးဒုင်ကၟာတ်စဵုဒၞာဂှ်ဂွံရ၊၊\nမၞး စကာ အဳမေလ် \"{{int:emailuser}}\" ဟွံဂွံရ၊၊ ဆဂး ယဝ်ရ ဌာန်ဒၟံင်အဳမေလ်ဂှ် ဒှ်အရာတၟေင် ပ္ဍဲ [[Special:Preferences|account preferences]] မၞး ကေုာံ မၞးဟွံဒးဒုင် ကၟာတ်စဵုဒၞာလဝ် နကဵုအဳမေဝ်ဂှ်မ္ဂး ဂွံမာန်ရ၊၊\nIP address မၞး လၟုဟ်ဂှ် ဒှ် $3, တုဲ ID မဒးဒုင်ကၟာတ်စဵုဒၞာဂှ် ဒှ် #$5 ရ၊၊ \nယဝ်ရ မၞးမိက်ဂွံ သၟာန်မ္ဂး တင်ဂၞင် ဗွဲလတူတအ် သီုဖအိုတ်ဂှ် ဗၟံက်ထ္ၜးကဵုညိ၊၊",
+       "blockednoreason": "မုဟွံမွဲကဵုဟိုတ်မကဵုလဝ်",
+       "whitelistedittext": "သ္ပဂုဏ်တုဲ$1 သ္ဂောံဒါန်မုက်လိက်တအ်.",
+       "confirmedittext": "မၞးထေက်ကဵုဒးသ္ပဒတန်ကဵု ဌာန်ဒတန်အဳမေလ်မၞးကိုပ်ကၠာနူဟွံဒါန်မုက်တအ်.\nသ္ပဂုဏ်တုဲ ချိၚ်ကေုာံဒတန် ဌာန်ဒတန်အဳမေလ်မၞး နူမၞး[[Special:Preferences|user| preferences]].",
+       "nosuchsectiontitle": "ဂၠာဲပဆိုက်ဟွံဆဵု",
+       "loginreqtitle": "နွံပၟိက်ကဵု လံက်အေန်",
        "loginreqlink": "လုပ်လံက်အေန်",
+       "loginreqpagetext": " သ္ပဂုဏ်တုဲ $1 သ္ဂောအ်ဗဵုမုက်လိက်တၞဟ်တအ်.",
+       "accmailtitle": "ပြံၚ်ဏာ မအက္ခရ်ဗၞုက်",
+       "newarticle": "(တၟိ)",
        "newarticletext": "မၞး စိုပ်အာ ဇရေင် မုက်လိက်လေန် မဟွံဂွံကၠောန်လဝ်ဏီရ၊၊\nသွက်ဂွံ ခၞံကၠောန် မုက်လိက်ဏအ်ဂှ် ပ္ဍဲခံက်အင် ဗွဲသၟဝ်ဏအ်ဂှ် စတက်စုတ် မလိက်ညိ\n(မိက်ဂွံ ဆက်တီ ပရူဏအ်မ္ဂး ဆက်ကျောဝ် ပ္ဍဲ[$1မုက်လိက်အရီုအဗင်]ညိ)။ ဟိုတ်နူဗၠေတ်တုဲ မၞး စိုပ်ကၠုင် ပ္ဍဲဒၞာဲဏအ်မ္ဂး ဍဵု <strong>back</strong> တုဲ ကလေင်အာ ဒၞာဲတြေံညိ၊၊",
        "anontalkpagetext": "----\n<em>မုက်လိက်ဏအ်ဂှ် ဒှ်ဒၞာဲ သွက်မၞိဟ် မဟွံဗမံက်ယၟု၊ မၞိဟ်ဟွံဂွံကၠောန်လဝ် အကံက်တအ်ဏီ ဂွံပတိုန်လညာတ် ပါ်ပဲါရ၊၊</em>\nဟိုတ်ဂှ်ရ ပိုယ်ဒးစကာ မဂၞန် IP address သွက်ဂွံ တီညးတအ်ရ၊၊ IP address ဗီုဏအ်မွဲမွဲဂှ် ပါ်ပရအ်ဂွံ ညးလွပ် ဗွဲမဂၠိုင်ရ၊၊ ယဝ်ရ မၞးဂှ် ဒှ်ညးလွပ် မဟွံဗမံက်ယၟုမွဲ စှ်ေစိုတ် တင်ဂလာန်တအ်ဏအ်ဂှ် ဒှ်ဟွံထေက်မ္ဂး ပဂုန်တုဲ [[Special:CreateAccount|ခၞံကၠောန် အကံက်မွဲ]] ဟွံသေင်မ္ဂး [[Special:UserLogin|လုပ်လံက်အေန်]] သွက်ဂွံ ဝေင်ပဲါ ညးလွပ် မဟွံဗမံက်ယၟုတအ်တၞဟ်တအ်ရ၊၊",
        "noarticletext": "ပ္ဍဲမုက်လိက်ဏအ် လိက်ဟွံမွဲဏီရ၊၊\nမၞး ဂၠာဲကေတ်  [[Special:Search/{{PAGENAME}}|search for this page title]] ပ္ဍဲမုက်လိက်တၞဟ်မ္ဂး ကလိဂွံမာန်ရောင်၊၊\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs],\nဟွံသေင်မ္ဂး  [{{fullurl:{{FULLPAGENAME}}|action=edit}} ခၞံကၠောန် လိက်မုက်ဏအ်ညိ၊၊]</span>.",
        "noarticletext-nopermission": "ပ္ဍဲမုက်လိက်ဏအ် လိက်ဟွံမဲဏီရ၊၊ မၞး ဂၠာဲကေတ် [[Special:Search/{{PAGENAME}}|search for this page title]] ပ္ဍဲမုက်လိက်တၞဟ်၊ဟွံသေင်မ္ဂး ကလိဂွံမာန်ရ၊၊ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} search the related logs]</span>, ဆဂး မၞးအခေါင် ခၞံကၠောန် မုက်လိက်ဏအ် ဟွံမဲ၊၊",
+       "userpage-userdoesnotexist": "အကံက်ညးလွပ်$1ဂှ်ဟွံသ္ပလဝ်စၟတ်သမ္တီရ.\nသ္ပဂုဏ်တုဲစၟဳစၟတ်ရံၚ် ယဝ်ရမၞးမိက်ဂွံခၞံကၠောန်/ဒါန်မုက်လိက်ဏအ်.",
        "userpage-userdoesnotexist-view": "အကံက် ညးလွပ် \"$1\" ဂှ် ဟွံဂွံပၠောပ်လဝ် စရင်၊၊",
+       "blocked-notice-logextract": "ညးလွပ်ဏအ်ဂှ်လၟုဟ်ဒးဒုၚ်ကၟာတ်လဝ်.\nအရာဒးဒုၚ်ကၟာတ်လဝ်လုပ်လံက်ဂှ် ဒးဒုၚ်စဵုဒၞဲါလဝ်သွက်စၞောန်သၟဝ်:",
        "clearyourcache": "<strong>Note:</strong> After saving, you may have to bypass your browser's cache to see the changes.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> while clicking <em>Reload</em>, or press either <em>Ctrl-F5</em> or <em>Ctrl-R</em> (<em>⌘-R</em> on a Mac)\n* <strong>Google Chrome:</strong> Press <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> on a Mac)\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> while clicking <em>Refresh</em>, or press <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
+       "updated": "(ပဂဵုလဟဵု)",
+       "note": "<strong>စၟတ်သမ္တီ:</strong>",
        "previewnote": "<strong>မုက်ဏအ်ဂှ် ဆကိုပ်ဗဗဵုဟေင်ရောင်ဂှ် ကဵုဂွံသတိညိ</strong>\nအရာမၞး မပြံင်လှာဲလဝ်တအ်ဂှ် ဟွံဂွံ ဂိုင်သိပ် ဏီရ!",
        "continue-editing": "အာ ဇရေင် ဒၞာဲမပလေဝ်ဒါန်",
        "editing": " $1 ပလေဝ်ဒါန်ဒၟံင်",
        "creating": "မခၞံကၠောန်ဒၟံင် $1",
        "editingsection": "ပလေဝ်ဒါန်ဒၟံင် (ဒကုတ်) $1",
+       "editingcomment": "ဒါန်ဒၟံၚ် $1 (အခန် တၟိ)",
+       "editconflict": "ဒါန်ပလေဝ် ဒှ်ဒစဵုဒစး :$1",
+       "yourtext": "လိက်မၞး",
+       "yourdiff": "မတၞဟ်ခြာတအ်",
        "templatesused": "{{PLURAL:$1|Template|Templates}} မသုင်စောဲ ပ္ဍဲ မုက်လိက်ဏအ်:",
        "templatesusedpreview": "{{PLURAL:$1|Template|Templates}} မစကာလဝ် ပ္ဍဲနမူနာဏအ်-",
        "template-protected": "(စဵုဒၞာလဝ်)",
        "permissionserrorstext-withaction": "မၞး ဟွံကလိဂွံလဝ် အခေါင် သွက် $2, အတိုင်ဗွဲသၟဝ်ဏအ်ရ၊၊ {{PLURAL:$1|ဟိုတ်|ဟိုတ်ဂမၠိုင်}}:$1",
        "recreate-moveddeleted-warn": "<strong>သတိ - မုက်လိက် မဒးဒုင်ပလီုလဝ်တုဲ ခြာဟွံလအ်ဂှ် မၞး ကလေင်ခၞံကၠောန်ဒၟံင်ရ၊၊</strong>\nမုက်လိက်ဂှ် မၞးကလေင်ပလေဝ်ဒါန်ကၠောန် ထေက် ဟွံထေက်ဂှ် မၞးထေက် ကဵုဒးဗစာရဏာရ၊၊\n\nသွက်မၞး ဂွံဆဵုကေတ်မာန်ဂှ် တင်စၟတ်သမ္တီ ဒဒှ်မပလီု ကေုာံ မပြံင်ပဆုဲတအ်ဂှ် ထ္ၜးကဵုလဝ် ပ္ဍဲဒၞာဲဏအ်ရ၊၊",
        "moveddeleted-notice": "မုက်လိက်ဏအ် ဒးဒုင် ပလီုထောအ်လဝ်ရ၊၊\nတင်စၟတ်သမ္တီ အရာမပလီု၊ မစဵုဒၞာ၊ မပြံင်လဝ် မုက်လိက်တအ်ဂှ် ဗၟံက်ထ္ၜးလဝ် ဗွဲသၟဝ်ဏအ် သွက်ဂွံနိဿဲ၊၊",
+       "edit-conflict": "ဒါန်ပလေဝ် ဒှ်ဒစဵုဒစး",
+       "postedit-confirmation-created": "မုက်လိက်ဒးဒုၚ်ခၞံကၠောန်တုဲယျ.",
+       "postedit-confirmation-restored": "မုက်လိက်ဒးဒုၚ်ကလေၚ်သီစွံတုဲယျ.",
+       "postedit-confirmation-saved": "မၞးဒါန်လဝ်ဂှ် ဂိုၚ်သိပ်တုဲယျ.",
+       "postedit-confirmation-published": "မၞးဒါန်လဝ်တအ်ဂှ်တြးပတိတ်တုဲယျ.",
+       "edit-already-exists": "ကၠောန်ခၞံကေတ်မုက်လိက်တၟိဂွံဟွံသေၚ်.\nနွံမံၚ်တုဲတုဲယျ.",
+       "defaultmessagetext": "လိက်ဂလာန်ပိုဒ်မဒတန်",
+       "invalid-content-data": "တၚ်နၚ်ဆက်စပ်မဟွံစှေ်ကဵုဗဗွဲဓဝ်",
+       "content-not-allowed-here": "\"$1\" မာတိကာဂှ် ဟွံကဵုအခေါၚ်လ္တူမုက်လိက် [[$2]]",
+       "editpage-invalidcontentmodel-title": "ဗီုပြၚ်မာတိကာဂှ်ဟွံထက်ပံၚ်လဝ်ရ",
+       "editpage-invalidcontentmodel-text": "ဗီုပြၚ်မာတိကာ\"$1\"ဏအ်ဟွံထံက်ပၚ်ရ။",
        "content-model-wikitext": "ဖျုန်လိက်ဝဳကဳ",
+       "content-model-text": "လိက်ပလး",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "ဟွံမွဲကဵု ကပေါတ်",
        "undo-failure": "ပရေင်ပလေဝ်ဒါန်ဂှ် ပတုဲဟွံဂွံ ဟိုတ်တုန် ဒၟာနူ မၞုံ ကုအခက်အခုဲ ပရေင်ပလေဝ်ဒါန် ဗွဲအပ္ဍဲ၊၊",
        "viewpagelogs": "ဗဵု တင်စၟတ်သမ္တီ မုက်လိက်ဏအ်",
+       "currentrev": "မူ ကြဴအိုတ်",
        "currentrev-asof": "မူမဒါန်လဝ် လက္ကရဴအိုတ် နကဵု $1",
        "revisionasof": "မူလိက်မပလေဝ်လဝ် နဒဒှ် $1",
        "revision-info": "မူပလေဝ်ဒါန်လဝ် ပ္ဍဲ စၟတ်တ္ၚဲ နကဵု {{GENDER:$6|$2}}$7",
        "nextrevision": "မူမဒါန်လဝ် တၟိနူဂှ် →",
        "currentrevisionlink": "မူမဒါန်လဝ် လက္ကရဴအိုတ်",
        "cur": "ပစ္စုပ္ပန်",
+       "next": "ဂတ",
        "last": "ကိုပ်ကၠာ",
+       "page_first": "ကိုပ်ကၠာ",
+       "page_last": "ကြဴ",
        "histlegend": "တၞဟ်န ဂွံပတောအ်ၜတ် အကြာမူမပလေဝ်ဒါန်လဝ်တအ်ဂှ် ကဵုစၟတ် ပ္ဍဲခံက်အင်ရေဒဳယော radio boxes တုဲ ဍဵုenter ဟွံသေင်မ္ဂး ဍဵု ကောန်ဍေင် သၟဝ်ဂှ်ညိ၊၊ <br />Legend: <strong>({{int:cur}})</strong> = အရာမတၞဟ်ခြာ ကုမူလက္ကရဴအိုတ် <strong>({{int:last}})</strong> = အရာမတၞဟ်ခြာ ကုမူကၠာနူဂှ်၊၊ <strong>{{int:minoreditletter}}</strong> = မပလေဝ်ဒါန်လဝ် ညိည၊၊",
        "history-fieldset-title": "ဂၠာဲ မူတြေံဂမၠိုင်",
        "histfirst": "တြေံအိုတ်",
        "histlast": "တၟိအိုတ်",
+       "historysize": "({{PLURAL:$1|1 ဘာ်|$1 ဘာ်ဂမၠိုၚ်}})",
+       "historyempty": "(ဟွံမွဲ)",
        "history-feed-title": "လၟေင်အပြံင်အလှာဲ မူလိက်",
        "history-feed-description": "လၟေင်အပြံင်အလှာဲ မပလေဝ်ဒါန်လဝ် ပ္ဍဲမုက်လိက်ဏအ် ပ္ဍဲကဵု ဝဳကဳ",
        "history-feed-item-nocomment": "$1 ပ္ဍဲ $2",
+       "rev-deleted-user": "(ပတိတ်ထောံ ယၟုညးလွပ်)",
        "rev-delundel": "ပြံင်လှာဲ ဗီုပြင်မဂွံညာတ်ကေတ်",
+       "rev-showdeleted": "ထ္ၜး",
+       "revdelete-show-file-submit": "ယွံ",
+       "revdelete-hide-comment": "ဒါန် သကေမ်",
+       "revdelete-hide-user": "ယၟုညးလွပ်/ဌာန်IP ပူဂိုလ်ဒါန်",
+       "revdelete-radio-same": "(လ္ပ ပြံၚ်ကေတ်)",
+       "revdelete-radio-set": "ဗဒန်တုဲ",
+       "revdelete-radio-unset": "မဗဵုဂွံ",
+       "revdelete-log": "ဟိုတ်:",
+       "pagehist": "လၟေၚ်အပြံၚ်အလှာဲ မုက်လိက်",
+       "deletedhist": "လၟေၚ်အပြံၚ်အလှာဲ ပလီုလဝ်",
+       "revdelete-otherreason": "တၞဟ်/မထပ် ဟိုတ်:",
+       "revdelete-reasonotherlist": "ဟိုတ် တၞဟ်",
+       "revdelete-edit-reasonlist": "ဒါန် ဟိုတ်ပလီုဂမၠိုၚ်",
+       "mergehistory-from": "တမ်ရိုဟ် မုက်လိက်:",
+       "mergehistory-reason": "ဟိုတ်:",
        "mergelog": "တင်စၟတ်သမ္တီ အရာမပံင်ပကောံလဝ်",
        "history-title": "လၟေင်အပြံင်အလှာဲ မူမပလေဝ်ဒါန်လဝ် \"$1\"",
        "difference-title": "အရာမတၞဟ်ခြာ အကြာ မူတၞဟ်ဂမၠိုင် \"$1\"",
        "diff-multi-sameuser": "({{PLURAL:$1|မူတၞဟ် မၞုံအကြာ မွဲ|$1 မူတၞဟ် မၞုံအကြာဂမၠိုင်}} မခၞံကၠောန်လဝ် နကဵု ညးလွပ် တုပ်ပ်တအ်ဂှ် ဟွံထ္ၜးလဝ်ရ၊၊)",
        "diff-multi-otherusers": "({{PLURAL:$1|မူတၞဟ် မၞုံအကြာ မွဲ|$1 မူတၞဟ် မၞုံအကြာဂမၠိုင်}} မခၞံကၠောဝန်လဝ် နကဵု{{PLURAL:$2|ညးလွပ်တၞဟ် မွဲ|$2 ညးလွပ်တၞဟ်ဂမၠိုင်}}ဂှ် ဟွံထ္ၜးလဝ်ရ၊၊)",
        "searchresults": "သွဟ် မဂၠာဲ",
+       "search-filter-title-prefix-reset": "ဂၠာဲ မုက်လိက်အလုံဖအိုတ်",
        "searchresults-title": "သွဟ် မဂၠာဲ သွက် \"$1\"",
        "prevn": "ကၠာ {{PLURAL:$1|$1}}",
        "nextn": "ဂတ {{PLURAL:$1|$1}}",
+       "prev-page": "မုက်လိက် ကြဴ",
+       "next-page": "မုက်လိက် ဂတ",
        "prevn-title": "မတုဲကၠုင် $1 {{PLURAL:$1|သွဟ်|သွဟ်ဂမၠိုင်}}",
        "nextn-title": "ဆက်တုဲ $1 {{PLURAL:$1|သွဟ်|သွဟ်ဂမၠိုင်}}",
        "shown-title": "ထ္ၜး $1 {{PLURAL:$1|သွဟ်|သွဟ်ဂမၠိုဟ်}} နကဵု မုက်လိက်",
        "search-result-category-size": "{{PLURAL:$1|1 ကောန်ဂကောံ|$1 ကောန်ဂကောံဂမၠိုင်}} ({{PLURAL:$2|1 ကဏ္ဍလစှ်ေ|$2 ကဏ္ဍလစှ်ေဂမၠိုင်}}, {{PLURAL:$3|1 ဝှာင်|$3 ဝှာင်ဂမၠိုင်}})",
        "search-redirect": "(ကလေင်ထ္ၜး နူ $1)",
        "search-section": "(သကုတ် $1)",
+       "search-category": "(ကဏ္ဍ $1)",
        "search-file-match": "(ဝှာင် မကိတ်ညဳ ကုပရူပရာ)",
        "search-suggest": "မၞး မိက်ဂွံဟီုဂှ် - $1",
+       "search-rewritten": "ထ္ၜးဒၟံၚ် လဂွံဂမၠိုၚ် သွက် $1. စၞးမဂၠာဲသွက် $2.",
+       "search-interwiki-caption": "လဂွံမဂၠိုၚ် နူ ပရဝ်ဂျေတ် ဒေအ်တအ်",
+       "search-interwiki-default": "လဂွံနူ $1:",
+       "search-interwiki-more": "(ဂၠိုၚ်)",
+       "search-interwiki-more-results": "လဂွံမဂၠိုၚ်တအ်",
+       "search-relatedarticle": "မဆက်စပ်တအ်",
+       "searchrelated": "မဆက်စပ်",
        "searchall": "သီုဖအိုတ်",
        "search-showingresults": "{{PLURAL:$4|သွဟ် <strong>$1</strong> ကု <strong>$3</strong>|သွဟ်ဂမၠိုင်<strong>$1 – $2</strong> ကု <strong>$3</strong>}}",
        "search-nonefound": "အရာမဂၠာဲသ္ၚေဝ်တအ်ဂှ် ဟွံဂွံဆဵုကေတ်",
+       "powersearch-legend": "ဂၠာဲမတၟေၚ်",
+       "powersearch-ns": "ဂၠာဲ ပ္ဍဲ ဒၞဲါယၟု:",
+       "powersearch-togglelabel": "စၟတ်:",
+       "powersearch-toggleall": " သီုဖအိုတ်",
+       "powersearch-togglenone": "ဟွံသေၚ်",
+       "powersearch-remember": "သမ္တီကေတ်မရုဲစှ်သွက်ဂွံဂၠာဲအနာဂတ်",
+       "search-external": "ဂၠာဲနူမ္ၚး",
+       "preferences": "မဒးဂၞပ်စိုတ်",
        "mypreferences": "မဒးဂၞပ်စိုတ်",
+       "prefs-edits": "လၟုဟ်မဒါန်တအ်:",
+       "prefsnologintext2": "သ္ပဂုဏ်တုဲ လုပ်လံက်ညိ သွက်ဂွံပြံၚ်လှာဲပၟိက်စိုတ်တအ်.",
+       "prefs-skin": "စၞာမ်",
+       "skin-preview": "ကလေၚ်ရံၚ်",
+       "prefs-user-pages": "မုက်လိက် ညးလွပ်",
+       "prefs-personal": "သ္ၚိညးလွပ်",
+       "prefs-rc": "မပပြံင်လှာဲ လၟုဟ်",
+       "prefs-watchlist": "စရင်မမင်မဲ",
+       "prefs-editwatchlist": "ပလေဝ် စရင်မမင်မဲ",
+       "prefs-editwatchlist-raw": "ပလေဝ် စရင်မမင်မဲ အပြောမ်",
+       "prefs-editwatchlist-clear": "ဖအး စရင်မမင်မွဲဂှ်",
+       "prefs-resetpass": "လှာဲအက္ခရ်ပၞုက်",
+       "prefs-email": "အဳမေလ် (ဒးစုတ်ဟေင်)",
+       "prefs-rendering": "မံက်ပြာကတ်",
+       "saveprefs": "ဂိုင်သိပ်",
+       "prefs-editing": "ဒါန်ဒၟံၚ်",
+       "searchresultshead": "ဂၠာဲ",
+       "stub-threshold-sample-link": "အဝဲ",
+       "stub-threshold-disabled": "ဟွံသၟဟ်အစောံ",
+       "timezonelegend": "ဇြီုအခိၚ်:",
+       "localtime": "အခိၚ်ဒေသ:",
+       "timezoneuseserverdefault": "သုၚ်စောဲဝဳကဳလၟိုန်($1)",
+       "servertime": "အခိၚ်လာၚ်:",
+       "guesstimezone": "ဗပေၚ်ကေတ်နူမုက်လပံက်",
+       "timezoneregion-africa": "အာဖရိက",
+       "timezoneregion-america": "အမေရိက",
+       "timezoneregion-antarctica": "အန္တာတိက",
+       "timezoneregion-asia": "အာယှ",
+       "timezoneregion-atlantic": "မှာသၟိတ် အတ္တလာန်တေတ်",
+       "timezoneregion-australia": "သြစတေလျာ",
+       "timezoneregion-europe": "ဥရောပ",
+       "timezoneregion-indian": "မှာသၟိတ် အိန္ဒိယ",
+       "timezoneregion-pacific": "မှာသၟိတ် ပသဳဖှေတ်",
+       "allowemail": "ကဵုအခေါၚ်ညးလွဟ်တၞဟ်တအ် ပလံၚ်လိက်ကုအဲ",
+       "email-allow-new-users-label": "ကဵုအခေါၚ်ပလံၚ်လိက်နူ ညးလွဟ်မသုၚ်စောဲတၟိတအ်",
+       "email-blacklist-label": "စဵုဒၞါထောအ်နူ ညးလွဟ်တအ် မပလံၚ်လိက်ကုအဲ:",
+       "prefs-searchoptions": "ဂၠာဲ",
+       "prefs-namespaces": "ဒၞာဲယၟု",
+       "default": "မူလ",
+       "prefs-files": "ဝှာၚ်ဂမၠိုၚ်",
+       "prefs-custom-css": "Custom CSS",
+       "prefs-custom-json": "Custom JSON",
+       "prefs-custom-js": "Custom JavaScript",
+       "prefs-common-config": "ပါ်ပရအ်လဝ် CSS/JSON/JavaScript သွက်စၞာံအလုံဖအိုတ်:",
+       "prefs-emailconfirm-label": "ပွမသ္ပဒတန် အီမေး:",
+       "youremail": "အဳမေလ်:",
+       "username": "{{GENDER:$1|ယၟုညးလွပ်}}:",
+       "prefs-memberingroups": "{{GENDER:$2|ကောန်ဂကောံ}} of {{PLURAL:$1|ဌာန်ကောံ|ဌာန်ကောံဂမၠိုၚ်}}:",
+       "group-membership-link-with-expiry": "$1 (စဵုကဵုl $2)",
+       "prefs-registration": "အခိၚ်မသ္ပပတိုန်စၟတ်သမ္တီ:",
+       "yourrealname": "ယၟုဍာံ:",
+       "yourlanguage": "အရေဝ်ဘာသာ :",
+       "yournick": "စၟတ်တဲ တၟိ:",
+       "badsig": "စၟတ်တဲ အပြောံ ဟွံဂွံ.\nစၟတ် HTML ဂျိက်ညိ.",
+       "badsiglength": "စၟတ်တဲမၞးဂၠိၚ်လောန်အာညိ.\nထေက်ကဵုဟွံလောန်လ္တူနူ$1{{PLURAL:$1|သၚ်္ကေတ|သၚ်္ကေတဂမၠိုၚ်}}မဂၠိၚ်.",
+       "yourgender": "ဗီုလဵုပံက်ထ္ၜးတုဲ မၞးဒးပၟိက်ရော?",
+       "gender-male": "နာဲဒါန်မုက်လိက် ဝဳကဳတအ်",
+       "gender-female": "\nမိဒါန်မုက်လိက်ဝဳကဳတအ်",
+       "email": "အဳမေလ်",
+       "prefs-help-email-required": "ယၟုအဳမေလ် ဂပ်ဝ်နွံပၟိက်.",
+       "prefs-info": "ပရိုင်တင်ဂၞင် သဇိုင်",
+       "prefs-i18n": "ပွမလုပ်သ္ပကေတ်ဒဒှ်ကၟိန်ဍုၚ်နာနာ",
+       "prefs-signature": "စၟတ်တဲ",
+       "prefs-dateformat": "နဲကဲကၠောန်ၜိုတ် စၟတ်တ္ၚဲ",
+       "prefs-timeoffset": "အခိၚ်သကဵုဂွံအာတံ",
+       "prefs-advancedediting": "အရာမနွံသွက်ဂွံရုဲစှ်နာနာဂမၠိုၚ်",
+       "prefs-developertools": "ကြိယာ ညးဖန်ကၠောန်တအ်",
+       "prefs-editor": "ညးဒါန်",
+       "prefs-preview": "ကလေၚ်ရံၚ်",
+       "prefs-advancedrc": "အရာမနွံသွက်ဂွံရုဲစှ် မတၟေၚ်တအ်",
+       "prefs-advancedrendering": "အရာမနွံသွက်ဂွံရုဲစှ် မတၟေၚ်ဂမၠိုၚ်",
+       "prefs-advancedsearchoptions": "အရာမနွံသွက်ဂွံရုဲစှ် မတၟေၚ်တအ်",
+       "prefs-advancedwatchlist": "အရာမနွံသွက်ဂွံရုဲစှ် မတၟေၚ်တအ်",
+       "prefs-displayrc": "အရာမနွံသွက်ဂွံရုဲစှ် မထ္ၜးပြး",
+       "prefs-displaywatchlist": "အရာမနွံကဵုသွက်ဂွံရုဲစှ် မထ္ၜးပြးဂမၠိုၚ်",
+       "prefs-tokenwatchlist": "မဟီုတုဲ",
+       "prefs-diffs": "တၞဟ်ခြာ",
+       "userrights": "အခေါၚ်အရာ ညးလွပ်ဂမၠိုၚ်",
+       "userrights-lookup-user": "ရုဲ ညးလွပ်",
+       "userrights-user-editname": "စုတ် ယၟုညးလွပ်",
+       "editinguser": "ပြံၚ်လှာဲဒၟံၚ်အခေါၚ်အရာညးလွဟ်{{GENDER:$1|ညးလွပ်}}<strong>[[User:$1|$1]]<strong>$2",
+       "viewinguserrights": "ရံၚ်ဒၟံၚ်အခေါၚ်အရာညးလွပ် {{GENDER:$1|ညးလွပ်}} <strong>[[User:$1|$1]]</strong> $2",
+       "userrights-editusergroup": "ဒါန် {{GENDER:$1|ညးလွပ်}} ဂကောံဂမၠိုၚ်",
+       "userrights-viewusergroup": "ရံၚ်{{GENDER:$1|ညးလွပ်}} ဂကောံဂမၠိုၚ်",
+       "saveusergroups": "သီဂိုၚ် {{GENDER:$1|ညးလွပ်}} ဂကောံဂမၠိုၚ်",
+       "userrights-groupsmember": "ဒဒှ် ကောန်ဂကောံ:",
+       "userrights-groupsmember-auto": "ဒဒှ် ကောန်ဂကောံ ဟွံမံက်ပြာကတ်:",
+       "userrights-reason": "ဟိုတ်:",
+       "userrights-no-interwiki": "မၞးဟွံမွဲကဵုအခေါၚ်အရာ သွက်ဂွံဒါန်အခေါၚ်အရာညးလွပ်ပ္ဍဲဝဳကဳတၞဟ်ဂမၠိုၚ်.",
+       "userrights-changeable-col": "ဂကောံမၞးပြံၚ်ကေတ်မာန်",
+       "userrights-unchangeable-col": "\nဂကောံမၞးပြံၚ်ကေတ်ဟွံမာန်",
+       "userrights-expiry-current": "လောန်$1",
+       "userrights-expiry-none": "ဟွံလောန်",
+       "userrights-expiry": "အိုတ်အာ:",
+       "userrights-expiry-othertime": "အခိၚ် တၞဟ်:",
+       "userrights-expiry-options": "1 day: ၁ တ္ၚဲ,1 week: ၁ ပက်,1 month:၁ ဂိတု ,3 months: ၃ ဂိတုတအ်,6 months: ၆ ဂိတုဂမၠိုၚ်,1 year:၁ သၞာံ",
+       "group": "ဂကောံ:",
+       "group-user": "ညးလွပ်",
+       "group-autoconfirmed": "မသ္ပဒတန် ညးလွပ်တအ် အလဵုအလဵု",
        "group-bot": "ဗောတ်ဂမၠိုင်",
        "group-sysop": "မၞိဟ်မကောပ်ကာဲဂမၠိုင်",
+       "group-all": "(အလုံ)",
+       "group-user-member": "{{GENDER:$1|ညးလွပ်}}",
+       "group-autoconfirmed-member": "{{GENDER:$1|ညးလွပ် မပလဝ်ဒတန်တုဲ}}",
+       "group-bot-member": "{{GENDER:$1|ရုပ်စက်}}",
+       "group-sysop-member": "{{GENDER:$1|ညးကောပ်ကာဲ}}",
+       "group-bureaucrat-member": "{{GENDER:$1|ဗျူရဳကရေတ်}}",
+       "grouppage-user": "{{ns:project}}:ညးလွပ်ဂမၠိုၚ်",
+       "grouppage-autoconfirmed": "{{ns:project}}:ညးလွပ် မသ္ပဒတန်လဝ်အလဵုအလဵု",
        "grouppage-bot": "{{ns:project}}:ဗောတ်ဂမၠိုင်",
        "grouppage-sysop": "{{ns:project}}:မၞိဟ်မကောပ်ကာဲဂမၠိုင်",
+       "grouppage-bureaucrat": "{{ns:project}}:ဗျူရဳကရေတ်ဂမၠိုၚ်",
+       "right-read": "မုက်လိက်ဍာံတအ်",
+       "right-edit": "မုက်လိက်မဒါန်တအ်",
+       "right-createtalk": "ခၞံကၠောန်မုက်လိက်မသဳကၠဳတအ်",
+       "right-createaccount": "ခၞံကၠောန် အကံက် ညးလွပ်ဏအ်",
+       "right-minoredit": "သမ္တီညးဒါန်ဂမၠိုၚ် နဒဒှ်အပဓာန",
+       "right-move": "ပဆုဲမုက်လိက်ဂမၠိုၚ်",
+       "right-move-subpages": "ပဆုဲမုက်လိက်ဂမၠိုၚ်သီုကဵုမုက်လိက်လစှ်ေဍေံတအ်ဂမၠိုၚ်",
+       "right-move-rootuserpages": "ပဆုဲတမ်ရိုဟ်မုက်လိက်ညးလွပ်",
+       "right-move-categorypages": "ပဆုဲမုက်လိက်ကဏ္ဍတအ်",
+       "right-movefile": "ပဆုဲဝှာၚ်တအ်",
+       "right-upload": "ပတိုန်ပၠောပ် ဝှာင်",
+       "right-upload_by_url": "ပတိုန်ပၠောပ် ဝှာၚ် နူ URL",
        "right-writeapi": "အခေါင်အရာ ညးမချူ API",
+       "right-delete": "မုက်မပလီုလဝ်",
+       "right-userrights": "ဒါန် အခေါၚ်အရာညးလွဟ်တအ်အလုံဖအိုတ်",
+       "grant-group-email": "ပလံၚ် အဳမေလ်",
+       "grant-createaccount": "ခၞံကၠောန် အကံက်",
+       "grant-createeditmovepage": "ခၞံကၠောန်, ဒါန်, ကေုာံ ပဆုဲ မုက်လိက်ဂမၠိုၚ်",
+       "grant-editmyoptions": "ဒါန် ပၟိက်ဂၞပ်မၞး",
+       "grant-editmywatchlist": "ပလေဝ် စရင်မမင်မဲ အပြောမ်",
+       "grant-uploadfile": "ပတိုန်ပၠောပ် ဝှာင်တၟိ",
+       "grant-basic": "အခေါၚ်အရာသ္ဇိုၚ်",
+       "grant-viewmywatchlist": "ရံၚ် စရင်မမင်မွဲ မၞး",
        "newuserlogpage": "စၟတ်သမ္တီ ညးလွပ် မခၞံကၠောန်လဝ်",
        "rightslog": "တင်စၟတ်သမ္တီ အခေါင်အရာ ညးလွပ်",
+       "action-read": "ဗှ်လိက်မုက်လိက်ဏအ်",
        "action-edit": "ပလေဝ်ဒါန် မုက်လိက် ဏအ်",
+       "action-createpage": "ခၞံကၠောန်မုက်လိက်ဏအ်",
+       "action-createtalk": "ခၞံကၠောန်မုက်လိက်သဳကၠဳဏအ်",
        "action-createaccount": "ခၞံကၠောန် အကံက် ညးလွပ်ဏအ်",
+       "action-move": "ပြံင်ပဆုဲ မုက်လိက်ဏအ်",
+       "action-move-rootuserpages": "ပဆုဲတမ်ရိုဟ်မုက်လိက်ညးလွပ်",
+       "action-move-categorypages": "ပဆုဲမုက်လိက်ကဏ္ဍတအ်",
+       "action-movefile": "ပြံင်ပဆုဲ ဝှာၚ်ဏအ်",
+       "action-upload": "ပတိုန် ဝှာၚ်ဏအ်",
+       "action-reupload": "ထပ်ချူလ္တူ ဝှာၚ်မနွံတုဲတုဲဏအ်",
+       "action-writeapi": "သုၚ်စောဲပရၚ်ချူ API",
+       "action-delete": "ပလီု မုက်လိက်ဏအ်",
+       "action-undelete": "ဟွံပလီု မုက်လိက်ဂမၠိုၚ်",
+       "action-userrights": "ဒါန် အခေါၚ်အရာညးလွဟ်တအ်အလုံဖအိုတ်",
+       "action-sendemail": "ပလံၚ် အဳမေလ်တအ်",
+       "action-editmyoptions": "ဒါန် ပၟိက်ဂၞပ်မၞး",
+       "action-editmywatchlist": "ပလေဝ် စရင်မမင်မဲ အပြောမ်",
+       "action-viewmywatchlist": "ရံၚ် စရင်မမင်မွဲ မၞး",
+       "action-purge": "ပဆုဲ မုက်လိက်ဏအ်",
+       "nchanges": "$1 {{PLURAL:$1|ပြံင်လှာဲ|ပြံင်လှာဲဂမၠိုင်}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|နူကၠုၚ်ဝေၚ်လကြဴအိုတ်}}",
        "enhancedrc-history": "လၟေင်မပြံင်လှာဲလဝ်",
        "recentchanges": "မပပြံင်လှာဲ လၟုဟ်",
        "recentchanges-legend": "အရာမရုဲစှ် မပြံင်လှာဲ ပြဟ်ဟ်ဏအ်",
        "recentchanges-label-plusminus": "ဇမၞော် မုက်လိက်ဏအ် သၠာဲအာ နကဵု လၟိဟ်လျိုင်ဗာက်",
        "recentchanges-legend-heading": "<strong>Legend:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (also see [[Special:NewPages|list of new pages]])",
-       "rcfilters-filter-user-experience-level-registered-description": "လော့အင် ဝင်ထားသော တည်းဖြတ်သူများ",
-       "rcfilters-filter-user-experience-level-unregistered-description": "လော့အင် မဝင်ထားသော တည်းဖြတ်သူများ",
+       "recentchanges-submit": "ထ္ၜး",
+       "rcfilters-tag-remove": "ပတိတ် '$1'",
+       "rcfilters-other-review-tools": "ကြိယာ ကလၚ်ရံၚ်တၞဟ်ဂမၠိုၚ်",
+       "rcfilters-activefilters-hide": "ဗဒန်",
+       "rcfilters-activefilters-show": "ထ္ၜး",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|တ္ၚဲ|တ္ၚဲဂမၠိုင်}}",
+       "rcfilters-days-show-hours": "$1{{PLURAL:$1|နာဍဳ|နာဍဳဂမၠိုၚ်}}",
+       "rcfilters-highlighted-filters-list": "Highlighted: $1",
+       "rcfilters-quickfilters": "ဂိုၚ်သိပ်ဖဍိုဟ်ဂမၠိုၚ်",
+       "rcfilters-savedqueries-defaultlabel": "ဂိုၚ်သိပ်လဝ် ဖဍိုဟ်ဂမၠိုၚ်",
+       "rcfilters-savedqueries-rename": "ကဵုယၟုတၟိ",
+       "rcfilters-savedqueries-setdefault": "ချိၚ်ကေတ်နဒဒှ်လၟိုန်",
+       "rcfilters-savedqueries-unsetdefault": "ပတိတ် နဒဒှ်လၟိုန်",
+       "rcfilters-savedqueries-remove": "ပလီု",
+       "rcfilters-savedqueries-new-name-label": "ယၟု",
+       "rcfilters-savedqueries-new-name-placeholder": "ထမံက်ထ္ၜး တၚ်ရန်တၟံဖဍိုဟ်",
+       "rcfilters-savedqueries-apply-label": "ခၞံကၠောန် ဟဍိုဟ်",
+       "rcfilters-savedqueries-apply-and-setdefault-label": "ခၞံကၠောန်ဖဍိုဟ်မလၟိုန်",
+       "rcfilters-savedqueries-cancel-label": "တးပဲါ",
+       "rcfilters-savedqueries-add-new-title": "ဂိုၚ်သိပ် လချိၚ်ဖဍိုဟ်လၟုဟ်တအ်",
+       "rcfilters-filterlist-title": "ဖဍိုဟ်",
+       "rcfilters-highlightmenu-title": "ရုဲ အရံၚ်",
+       "rcfilters-highlightmenu-help": "ရုဲ အရံၚ် သွက်ဂွံဖျောန် ကပေါတ်ဏအ်",
+       "rcfilters-filterlist-noresults": "ဟွံကေတ် ဖဍိုဟ်တအ်",
+       "rcfilters-filtergroup-authorship": "ပရေၚ်ထံက်ပၚ် အ္စာကဝိ",
+       "rcfilters-filter-editsbyself-label": "ပြံၚ်လဝ်နကဵုမၞး",
+       "rcfilters-filter-editsbyother-label": "ညးတၞဟ်တအ် မပြံၚ်လဝ်",
+       "rcfilters-filter-editsbyother-description": "ပြံၚ်အလုံဖအိုတ် မသ္အာၚ်နူမၞးမပိုၚ်.",
+       "rcfilters-filter-user-experience-level-registered-description": "ညဒါန်တအ် လုပ်လံက်အေန်လဝ်",
+       "rcfilters-filter-user-experience-level-unregistered-description": "ညးဒါန် ဟွံလုပ်-လံက်အေန်လဝ်တအ်ဂမၠိုၚ်",
+       "rcfilters-filter-user-experience-level-learner-label": "ညးလ္ၚတ်ဂမၠိုၚ်",
+       "rcfilters-filter-user-experience-level-experienced-label": "ညးလွပ်မဝှ်ကြံၚ်",
+       "rcfilters-filter-bots-label": "ရုပ်စက်",
+       "rcfilters-filter-humans-label": "မၞိဟ်(စက်ဟွံသေၚ်)",
+       "rcfilters-filter-humans-description": "ဒါန်ပလေဝ်လဝ်နကဵုမၞိဟ်ဒါန်ဂမၠိုၚ်.",
+       "rcfilters-filtergroup-reviewstatus": "ကဆံၚ်ကလေၚ်ရံၚ်ဂမၠိုၚ်",
        "rcfilters-filter-minor-label": "အသေးစား တည်းဖြတ်မှုများ",
+       "rcfilters-filter-watchlist-watched-label": "ပ္ဍဲ စရင်မမင်မဲ",
+       "rcfilters-filter-watchlistactivity-seen-label": "သီဂိုၚ်မပြံၚ်လှာဲတအ်",
        "rcfilters-filtergroup-changetype": "ပြောင်းလဲမှု အမျိုးအစား",
        "rcfilters-filter-pageedits-label": "စာမျက်နှာ တည်းဖြတ်မှုများ",
+       "rcfilters-filter-newpages-label": "မခၞံကၠောန် မုက်လိက်",
+       "rcfilters-filter-categorization-label": "လှာဲ ကဏ္ဍ",
+       "rcfilters-filtergroup-lastRevision": "မူမဒါန်လဝ် လက္ကရဴအိုတ်ဂမၠိုၚ်",
+       "rcfilters-filter-lastrevision-label": "မူမဒါန်လဝ် လက္ကရဴအိုတ်",
+       "rcfilters-tag-prefix-namespace-inverted": "<strong>:ဟွံသေၚ်</strong> $1",
+       "rcfilters-target-page-placeholder": "စုတ်ယၟုမုက်လိက် (ဟွံသေၚ် ကဏ္ဍ)",
        "rcnotefrom": "ဗွဲသၟဝ်ဝွံ {{PLURAL:$5|ဒှ် အရာမပြံင်လှာဲ|ဒှ် အရာမပြံင်လှာဲဂမၠိုင်}} စနူ<strong>$3, $4</strong> (စဵုကဵု <strong>$1</strong> ဂှ် ထ္ၜးလဝ်ရ)၊၊",
        "rclistfrom": "ထ္ၜး အရာမပြံင်လှာဲတၟိတၟိ စနူ $2, $3",
        "rcshowhideminor": "$1 ပလေဝ်ဒါန်လဝ် ညိည",
        "rcshowhideanons-show": "ထ္ၜး",
        "rcshowhideanons-hide": "ဗဒန်",
        "rcshowhidepatr": "$1 သွက်ဂွံ ပလေဝ်ဒါန်မင်မဲ",
+       "rcshowhidepatr-show": "ထ္ၜး",
+       "rcshowhidepatr-hide": "ဗဒန်",
        "rcshowhidemine": "$1 ပလေဝ်ဒါန်လဝ် နကဵုအဲ",
        "rcshowhidemine-show": "ထ္ၜး",
        "rcshowhidemine-hide": "ဗဒန်",
+       "rcshowhidecategorization": "$1 မုက်လိက် မသ္ပကၠောန်ကဏ္ဍ",
+       "rcshowhidecategorization-show": "ထ္ၜး",
+       "rcshowhidecategorization-hide": "ဗဒန်",
        "rclinks": "ထ္ၜး အောန်အိုတ် $1 ပြံင်လှာဲလဝ် မတုဲကၠုင် $2 တ္ၚဲ",
        "diff": "တၞဟ်ခြာ",
        "hist": "တင်ဂၞင်မတုဲကၠုင်",
        "newpageletter": "N",
        "boteditletter": "b",
        "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ကြဴနူ ပြံင်ထောအ်တုဲ",
+       "rc-enhanced-expand": "ထ္ၜး တၚ်နၚ်သောဲသောဲဂမၠိုၚ်",
+       "rc-enhanced-hide": "ဗဒန် တၚ်နၚ်သောဲသောဲဂမၠိုၚ်",
        "rc-old-title": "တမ်မူလဂှ် ခၞံကၠောန်လဝ် နကဵုယၟု \"$1\"",
        "recentchangeslinked": "အရာမဆက်စပ် ကု အပြံင်အလှာဲ",
        "recentchangeslinked-feed": "တြးပတိတ် အပြံင်အလှာဲ",
        "recentchangeslinked-summary": "စုတ် ယၟု မိက်လိက်မွဲ သွက်ဂွံဆဵု အရာမပြံင်လှာဲ ပ္ဍဲ လေန်မုက်လိက် ဟွံသေင်မ္ဂး နူကဵု မုက်လိက်ဏအ်၊၊ (သွက်ဂွံ ဆဵု ကောန်ဂကောံဂမၠိုင် ပ္ဍဲကဏ္ဍမွဲ၊ စုတ် {{ns:category}}:ယၟု ကဏ္ဍ). သၠာဲ ပ္ဍဲမုက်လိက် ပ္ဍဲ [[Special:Watchlist|your Watchlist]] ဒှ် ပ္ဍဲ <strong>bold</strong>.",
        "recentchangeslinked-page": "ယၟု မုက်လိက်-",
        "recentchangeslinked-to": "ထ္ၜး အရာပြံင်လှာဲ ပ္ဍဲလေန်မုက်လိက် သွက်ဂွံကဵု မုက်လိက် မၞးဒၞာဲ",
+       "recentchanges-page-added-to-category": "[[:$1]] ထပ်စုတ်ကဵုကဏ္ဍ",
+       "recentchanges-page-removed-from-category": "[[:$1]] တးပဲါလဝ်နူကဏ္ဍ",
        "upload": "ပတိုန်ပၠောပ် ဝှာင်",
+       "uploadbtn": "ပတိုန်ပၠောပ် ဝှာင်",
+       "uploadnologin": "ဟွံ လုပ်လံက်အေန်လဝ်",
+       "uploadnologintext": "သ္ပဂုဏ်တုဲ $1 သ္ဂောံ ပတိုန် ဝှာၚ်တအ်.",
        "uploadlogpage": "တင်စၟတ်သမ္တီ အရာမ Upload ပတိုန်လဝ်",
+       "filename": "ယၟုဝှာင်",
        "filedesc": "သကေမ်",
+       "fileuploadsummary": "သကေမ်:",
+       "filereuploadsummary": "ဝှာၚ် ပြံၚ်ဂမၠိုၚ်:",
+       "filestatus": "ကဆံၚ် တၠမူ:",
+       "filesource": "တမ်ရိုဟ်:",
+       "filename-tooshort": "ယၟုဝှာၚ်ဏအ်ဂှ် ဂၠိကွေအ်ကွေအ်.",
+       "savefile": "ဂိုၚ်သိပ် ဝှာၚ်",
+       "upload-source": "တမ်ရိုဟ် ဝှာၚ်",
+       "sourcefilename": "တမ်ရိုဟ် ယၟုဝှာၚ်:",
+       "sourceurl": "တမ်ရိုဟ် URL:",
+       "upload-description": "ဝှာၚ် မပံက်ထ္ၜး",
+       "watchthisupload": "မင်မဲ ဝှာၚ်ဏအ်",
+       "upload-dialog-title": "ပတိုန်ပၠောပ် ဝှာင်",
+       "upload-dialog-button-cancel": "တးပဲါ",
+       "upload-dialog-button-back": "ကလေင်",
+       "upload-dialog-button-done": "တုဲဒှ်",
+       "upload-dialog-button-save": "ဂိုင်သိပ်",
+       "upload-dialog-button-upload": "ပတိုန်",
+       "upload-form-label-infoform-title": "ဗွဲမစုင်လေင်",
+       "upload-form-label-infoform-name": "ယၟု",
+       "upload-form-label-infoform-description": "မဗမံက်ထ္ၜး",
+       "upload-form-label-usage-title": "ဒၞဲါသုၚ်စောဲ",
+       "upload-form-label-usage-filename": "ယၟု ဝှာၚ်",
+       "upload-form-label-own-work": "ဒှ်ကမၠောန်အဲ",
+       "upload-form-label-infoform-categories": "ကဏ္ဍဂမၠိုင်",
+       "upload-form-label-infoform-date": "စၟတ်တ္ၚဲ",
        "license": "မစၟတ်သမ္တီလာင်ဇြေန်-",
        "license-header": "မသ္ဂုတ်သွာတ်လာင်ဇြေန်",
+       "listfiles-delete": "ပလီု",
        "imgfile": "ဝှာင်",
        "listfiles": "စရင်ဝှာင်",
+       "listfiles_date": "စၟတ်တ္ၚဲ",
+       "listfiles_name": "ယၟု",
+       "listfiles_user": "ညးလွပ်",
+       "listfiles_size": "ဇမၞော်ဇြာက်",
+       "listfiles_description": "မဗမံက်ထ္ၜး",
+       "listfiles_count": "မူ",
+       "listfiles-latestversion": "မူ လၟုဟ်",
+       "listfiles-latestversion-yes": "ယွံ",
+       "listfiles-latestversion-no": "ဟအှ်ေ",
        "file-anchor-link": "ဝှာင်",
        "filehist": "ဝှာင် လၟေင်အပြံင်အလှာဲ",
        "filehist-help": "ဍဵု လတူ စၟတ်တ္ၚဲ/အခိင် မွဲမွဲ သွက်ဂွံ ထ္ၜးကဵု ဝှာင် မကတဵုဒှ်လဝ် ပ္ဍဲအခိင်ဂှ်၊၊",
+       "filehist-deleteall": "ပလီုထောအ် ဖအိုတ်",
+       "filehist-deleteone": "ပလီု",
        "filehist-revert": "ကလေင်ပြံင်",
        "filehist-current": "လၟုဟ်",
        "filehist-datetime": "စၟတ်တ္ၚဲ/အခိင်",
        "linkstoimage-redirect": "$1 (ဝှာင် ကလေင်ပညုင်) $2",
        "sharedupload-desc-here": "ဝှာင်ဏအ် ဒှ်ဝှာင် နူကဵု $1 တုဲ မဒှ်ဝှာင် မသုင်စောဲလဝ် နကဵုပရဝ်ဂျေတ် တၞဟ်လေဝ် ဒှ်မာန်ရ၊၊\nအရာမလဴထ္ၜး ပ္ဍဲဝှာင်တအ်ဂှ် [$2 မုက်လိက် မလဴထ္ၜး ဝှာင်] ထ္ၜးကဵုလဝ် အတိုင်ဗွဲသၟဝ်ဝွံရ၊၊",
        "filepage-nofile": "ဝှာင် နကဵု ယၟုဏအ် ဟွံမွဲ၊၊",
+       "shared-repo-from": "နူ $1",
        "upload-disallowed-here": "မၞး ထပ်ချူစုတ် ပ္ဍဲ ဝှာင်ဏအ် ဟွံဂွံ၊၊",
+       "filerevert-comment": "ဟိုတ်:",
+       "filerevert-submit": "ကလေင်ပြံင်",
+       "filedelete": "ပလီုလဝ် $1",
+       "filedelete-comment": "ဟိုတ်:",
+       "filedelete-submit": "ပလီု",
+       "filedelete-otherreason": "တၞဟ်/မထပ် ဟိုတ်:",
+       "filedelete-reason-otherlist": "ဟိုတ် တၞဟ်",
+       "filedelete-edit-reasonlist": "ဒါန် ဟိုတ်ပလီုဂမၠိုၚ်",
+       "filedelete-maintenance-title": "ဝှာၚ် ပလီု ဟွံဂွံ",
+       "mimesearch": "ဂၠာဲ MIME",
+       "mimetype": "ဂကူ MIME:",
+       "download": "တံင်လုပ်",
+       "unwatchedpages": "မုက်လိက် ဟွံမၚ်မၚ်လဝ်တအ်",
        "randompage": "မုက်လိက် ဇဟောမ်",
+       "randomincategory-category": "ကဏ္ဍ:",
+       "randomincategory-submit": "အာ",
        "statistics": "စရင်အင်",
+       "statistics-articles": "မုက်လိက် မာတိကာဂမၠိုင်",
+       "statistics-pages": "မုက်လိက်ဂမၠိုင်",
+       "statistics-files": "ပတိုန်ပၠောပ် ဝှာင်မဂၠိုၚ်",
+       "statistics-users": " ညးလွပ် မစၟတ်သမ္တီလဝ်တုဲဂမၠိုင်",
+       "statistics-users-active": "ညးလွပ်မချဳဒရာၚ်",
+       "pageswithprop-submit": "အာ",
        "double-redirect-fixer": "ညးမပလေဝ် အရာမကလေင်စၞောန်ပညုင်",
+       "brokenredirects-edit": "ပလေဝ်ဒါန်",
+       "brokenredirects-delete": "ပလီု",
+       "withoutinterwiki-submit": "ထ္ၜး",
        "nbytes": "$1 {{PLURAL:$1|byte|bytes}}",
+       "ncategories": "$1{{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍဂမၠိုင်}}",
+       "ninterwikis": "$1 {{PLURAL:$1|အေန်တာဝဳကဳ|အေန်တာဝဳကဳဂမၠိုၚ်}}",
+       "nlinks": "$1 {{PLURAL:$1|link|links}}",
        "nmembers": "$1 {{PLURAL:$1|ကောန်ဂကောံ|ကောန်ဂကောံဂမၠိုင်}}",
+       "nmemberschanged": "$1 → $2 {{PLURAL:$2|ညးလုပ်ဂကောံ|ညးလုပ်ဂကောံဂမၠိုၚ်}}",
+       "unusedcategories": "ကဏ္ဍ မဟွံသုၚ်စောဲလဝ်ဂမၠိုၚ်",
+       "unusedimages": "ဝှာၚ် မဟွံသုၚ်လဝ်တအ်",
+       "wantedcategories": "ကဏ္ဍ မနွံပၟိက်လဝ်တအ်",
        "prefixindex": "မုက်လိက် သီုဖအိုတ် နကဵု prefix",
+       "prefixindex-submit": "ထ္ၜး",
+       "shortpages": "မုက်လိက် မဂၠိဂမၠိုၚ်",
+       "longpages": "မုက်လိက် မဂၠိၚ်ဂမၠိုၚ်",
+       "protectedpages": "မုက်လိက် စဵုဒၞဲါလဝ်",
+       "protectedpages-filters": "ဖဍိုဟ်",
+       "protectedpages-page": "မုက်လိက်",
+       "protectedpages-expiry": "အိုတ်အာ",
+       "protectedpages-performer": "စဵုဒၞါမံၚ် ညးလွပ်",
+       "protectedpages-reason": "ဟိုတ်",
+       "protectedpages-unknown-timestamp": "တီကေတ်ဟွံမာန်",
+       "protectedpages-unknown-performer": "ညးလွပ် တီကေတ်ဟွံမာန်",
+       "protectedtitles": "က္ဍိုပ်လိက် စဵုဒၞဲါလဝ်",
+       "protectedtitles-submit": "က္ဍိုပ်လိက် မထ္ၜးပျး",
        "listusers": "စရင် ညးလွပ်",
+       "listusers-editsonly": "ထ္ၜးဆညးလွပ်သီုကဵုမဒါန်တအ်",
        "newpages": "မုက်လိက် တၟိ",
+       "newpages-submit": "ထ္ၜး",
+       "newpages-username": "ယၟုညးလွပ်:",
+       "ancientpages": "မုက်လိက် တြေံအိုတ်ဂမၠိုၚ်",
        "move": "ပြံင်ပဆုဲ",
+       "movethispage": "ပြံင်ပဆုဲ မုက်လိက်ဏအ်",
+       "notargettitle": "ဟွံ ပတဝ်ပွန်",
        "pager-newer-n": "{{PLURAL:$1|တၟိနူ 1|တၟိနူ $1}}",
        "pager-older-n": "{{PLURAL:$1|တြေံနူ 1|တြေံနူ $1}}",
+       "apihelp": "ရီု API",
+       "apisandbox-submit": "သ္ပကေတ် မအာတ်",
+       "apisandbox-reset": "ဖအး",
+       "apisandbox-retry": "ကလေင်ကၠောန်",
+       "apisandbox-examples": "ဥပမာဂမၠိုင်",
+       "apisandbox-add-multi": "ထပ်",
+       "apisandbox-results": "လဂွံဂမၠိုၚ်",
+       "apisandbox-request-url-label": "အာတ်အခေါၚ် URL:",
+       "apisandbox-request-json-label": "အာတ်အခေါၚ် JSON:",
+       "apisandbox-request-time": "အခိၚ် မအာတ်: {{PLURAL:$1|$1 ms}}",
+       "apisandbox-continue": "ဆက်",
+       "apisandbox-continue-clear": "ဖအး",
+       "apisandbox-multivalue-all-namespaces": "$1 (အလုံ ဒၞဲါယၟု)",
+       "apisandbox-multivalue-all-values": "$1 (အလုံ ၚုဟ်မးဂမၠိုၚ်)",
        "booksources": "လိက်ကၞပ် မနိဿဲဂမၠိုင်",
        "booksources-search-legend": "ဂၠာဲ သွက် တမ်ရိုဟ် လိက်ကၞပ်",
        "booksources-search": "ဂၠာဲ",
        "specialloguserlabel": "ညးမရေင်တၠုင် -",
        "speciallogtitlelabel": "တင်မရန်တၟအ် (က္ဍိုပ်လိက် ဟွံသေင်မ္ဂး {{ns:user}}:ယၟုညးလွပ် သွက် ညးလွပ်):",
        "log": "လံက်",
+       "logeventslist-submit": "ထ္ၜး",
        "all-logs-page": "တင်စၟတ်သမ္တီ မပတိတ်တြး သီုဖအိုတ်",
        "alllogstext": "{{SITENAME}}ဏအ်ဂှ် ဒှ်တင်သမ္တီ မပံင်ပ္ကောံလဝ် ၜိုတ်မကလိဂွံမာန်ရ၊၊\nနကဵု မရုဲစှ် ဂကူစၟတ်သမ္တီ၊ ယၟုညးလွပ် ဟွံသေင်မ္ဂး မုက်လိက် မစိုပ်တရဴတအ်တုဲ မၞးဖ္ဍန်ဖျေဟ် အရာမထ္ၜးတအ်မာန်ရ၊၊",
        "logempty": "အရာမကိတ်ညဳ ပ္ဍဲ တင်စၟတ်သမ္တီ ဟွံမဲ၊၊",
+       "checkbox-all": " သီုဖအိုတ်",
+       "checkbox-none": "ဟွံသေၚ်",
+       "checkbox-invert": "စုတ်",
        "allpages": "မုက်လိက် သီုဖအိုတ်",
+       "nextpage": "မုက် ဂတး($1)",
+       "prevpage": "မုက် ကြဴ ($1)",
+       "allpagesfrom": "ထ္ၜးမုက်လိက်ဂမၠိုၚ် စနူ:",
+       "allpagesto": "ထ္ၜးမုက်လိက် လအိတ်ကၞောတ်ပ္ဍဲ:",
        "allarticles": "မုက်လိက် သီုဖအိုတ်",
+       "allinnamespace": "မုက်လိက် ဖအိုတ် ($1 ဒၞဲါယၟု)",
        "allpagessubmit": "အာ",
        "allpages-hide-redirects": "ပၞုက် အရာမကလေင်ပညုင်ဂမၠိုင်ညိ",
        "categories": "ကဏ္ဍဂမၠိုင်",
+       "categories-submit": "ထ္ၜး",
+       "sp-deletedcontributions-contribs": "အရာမကၠောန်လဝ်ဂမၠိုင်",
+       "linksearch-ns": "ဒၞာဲယၟု:",
+       "linksearch-ok": "ဂၠာဲ",
+       "listusers-submit": "ထ္ၜး",
+       "activeusers-from": "ထ္ၜးမုက်လိက်ဂမၠိုၚ် စနူ:",
+       "listgrouprights": "အခေါၚ်အရာ ညးလွပ်ဂမၠိုၚ်",
+       "listgrouprights-group": "ဂကောံ",
+       "listgrouprights-rights": "အခေါၚ်အရာဂမၠိုၚ်",
+       "listgrouprights-helppage": "Help: အခေါၚ်အရာ ဂကောံဂမၠိုၚ်",
        "listgrouprights-members": "(စရင် ကောန်ဂကောံ)",
+       "listgrouprights-addgroup": "ထပ် {{PLURAL:$2|ဂကောံ|ဂကောံဂမၠိုၚ်}}:$1",
+       "listgrouprights-removegroup": "ပတိတ်{{PLURAL:$2|ဂကောံ|ဂကောံဂမၠိုၚ်}}: $1",
+       "listgrouprights-addgroup-all": "ထပ် ဂကောံဂမၠိုၚ် သီုဖအိုတ်",
+       "listgrouprights-removegroup-all": "ပတိတ် ဂကောံသီုဖအိုတ်",
+       "listgrouprights-namespaceprotection-namespace": "ဒၞာဲယၟု",
+       "listgrants-rights": "အခေါၚ်အရာဂမၠိုၚ်",
        "emailuser": "ပလံင် အဳမေလ် ကုညးလွပ်ဏအ်",
+       "emailuser-title-target": "ပလံၚ်လိက်ဣဏံ{{GENDER:$1|ညးလွပ်}}",
+       "emailuser-title-notarget": "ညးလွပ် အဳမေလ်",
+       "noemailtitle": "ဌာန်အဳမေလ်ဟွံမွဲ",
+       "emailusername": "ယၟုညးလွပ်:",
+       "emailusernamesubmit": "ဗပေင်",
+       "emailfrom": "နူ:",
+       "emailto": "ဗ္စိုပ်:",
+       "emailsubject": "ပရူပရာ:",
+       "emailmessage": "မေတ်သုက်:",
+       "emailsend": "ပလံင်",
+       "emailsent": "အဳမေလ် ပြၚ်တုဲ",
+       "emailsenttext": "ပိုဒ်လိက်အဳမေလ် မၞး မဒးပြၚ်ဏာတုဲယျ",
        "usermessage-editor": "သၞောတ် ပရိုင်မေတ်သေန်ဂျာ",
        "watchlist": "စရင်မမင်မဲ",
        "mywatchlist": "စရင်မမင်မဲ",
        "watchlistfor2": "သွက် $1 $2",
+       "watchnologin": "ဟွံ လုပ်လံက်အေန်လဝ်",
+       "addwatch": "စုတ် စရၚ် စရၚ်မမၚ်မွဲ",
+       "addedwatchtext-short": "မုက်လိက်\"$1\" ဒးဒုၚ်စုတ်လဝ် စရေၚ် စရၚ်မမၚ်မွဲမၞးရ.",
+       "removewatch": "ပတိတ်  နူ စရၚ်မမၚ်မွဲ",
+       "removedwatchtext-short": "မုက်လိက်\"$1\" ဒးဒုၚ်ပတိတ်နူ စရၚ် မၞ မမၚ်မွဲရ.",
        "watch": "မင်မဲ",
+       "watchthispage": "မင်မဲ မုက်လိက်ဏအ်",
        "unwatch": "ဟွံမင်မဲ",
        "watchlist-details": "{{PLURAL:$1|$1 မုက်လိက်ဂှ် နွံ|$1 မုက်လိက်တအ်ဂှ် နွံ}} ပ္ဍဲ စရင်မမင်မဲ မၞး (သီုကဵု မုက်လိက် ဓရီုကျာဂမၠိုင်).",
        "wlheader-showupdated": "မုက်လိက် မပြံင်လှာဲလဝ် ကြဴနူ မၞးမလုပ်ဝေင်လဝ်တုဲတအ်ဂှ် ထ္ၜးလဝ် နကဵု <strong>အက္ခရ်တီုတီု</strong>.",
        "wlnote": "ဗွဲသၟဝ်ဝွံ {{PLURAL:$1|ဒှ် အရာ မပြံင်လှာဲလဝ် လက္ကရဴအိုတ်ရ၊၊| ဒှ် အရာ မပြံင်လှာဲလဝ် လက္ကရဴအိုတ်ဂမၠိုင်ရ၊၊ <strong>$1</strong> အပြံင်အလှာဲ}} ပ္ဍဲအခိင် မအောန် နူ {{PLURAL:$2|နာဍဳ|<strong>$2</strong> နာဍဳ}}, ကု $3, $4.",
        "wlshowlast": "လက္ကရဴအိုတ် $1 နာဍဳ $2 တ္ၚဲ ဂှ် ထ္ၜးညိ",
+       "watchlist-hide": "ဗဒန်",
+       "watchlist-submit": "ထ္ၜး",
+       "wlshowhideminor": "မပလေဝ်ဒါန်လဝ် ညိည",
+       "wlshowhidebots": "ဗောတ်ဂမၠိုင်",
+       "wlshowhideliu": " ညးလွပ် မစၟတ်သမ္တီလဝ်တုဲဂမၠိုင်",
+       "wlshowhideanons": "ညးလွပ် ဟွံဗမံက်ယၟု",
+       "wlshowhidecategorization": "မုက်လိက် မသ္ပကၠောန်ကဏ္ဍ",
        "watchlist-options": "အရာမရုဲစှ် သွက် စရင်မမင်မဲ",
+       "watching": " မမၚ်မွဲဒၟံၚ်",
+       "unwatching": "ဟွံမၚ်မွဲဒၟံၚ်...",
        "enotif_reset": "ကဵုစၟတ် ကုမုက်လိက် မဗဵုစိုပ်လဝ်တုဲ သီုဖအိုတ်",
+       "enotif_impersonal_salutation": "{{SITENAME}} ညးလွပ်",
+       "enotif_subject_deleted": "{{SITENAME}} မုက်လိက် $1 ဒးဒုၚ် {{GENDER:$2|ပလီု}} နကဵု $2",
+       "enotif_subject_created": "{{SITENAME}} မုက်လိက် $1 ဒးဒုၚ် {{GENDER:$2|ခၞံကၠောန်လဝ်}} နကဵု $2",
+       "enotif_subject_moved": "{{SITENAME}} မုက်လိက် $1 ဒးဒုၚ် {{GENDER:$2|ပတိတ်လဝ်}} နကဵု $2",
+       "enotif_subject_restored": "{{SITENAME}} မုက်လိက် $1 ဒးဒုၚ် {{GENDER:$2|ကလေၚ်စွံလဝ်}} နကဵု $2",
+       "enotif_subject_changed": "{{SITENAME}} မုက်လိက် $1 ဒးဒုၚ် {{GENDER:$2|ပြံၚ်လဝ်}} နကဵု $2",
+       "enotif_body_intro_deleted": "The {{SITENAME}} မုက်လိက် $1 ဒးဒုၚ် {{GENDER:$2|ပလီုလဝ်}} ပ္ဍဲ $PAGEEDITDATE နကဵု $2, see $3.",
+       "enotif_lastdiff": "သ္ဂောအ်ဗဵုကေတ်ပြံၚ်လှာဲဏအ်, ရံၚ်ကေတ်$1",
+       "enotif_anon_editor": "ညးလွပ် ဟွံဗမံက်ယၟု $1",
+       "enotif_minoredit": "ဣဏအ်ဂှ် ဒှ်အရာ မပလေဝ်ဒါန် ညိည",
+       "deletepage": "မုက်မပလီု",
+       "confirm": "သ္ပဒတန်",
+       "delete-confirm": "ပလီုလဝ် $1",
+       "delete-legend": "ပလီု",
+       "historyaction-submit": "ထ္ၜး",
+       "actioncomplete": "ကမၠောန်အာစိုပ်ဒတုဲ",
+       "actionfailed": "ကမၠောန် ဟုံဗြီု",
        "dellogpage": "တင်စၟတ်သမ္တီ အရာမဇိုတ်ပလီုလဝ်",
+       "logentry-create-create": "$1 {{GENDER:$2|ခၞံကၠောန်လဝ်}} မုက်လိက် $3",
+       "deletecomment": "ဟိုတ်:",
+       "deleteotherreason": "တၞဟ်/မထပ် ဟိုတ်:",
+       "deletereasonotherlist": "ဟိုတ် တၞဟ်",
        "rollbacklink": "ကလေင်",
        "rollbacklinkcount": "ကလေင်အာ $1 {{PLURAL:$1|ပလေဝ်ဒါန်|ပလေဝ်ဒါန်ဂမၠိုင်}}",
+       "changecontentmodel-legend": "ပြံၚ် မဝ်ဒေလ် မာတိက",
+       "changecontentmodel-title-label": "က္ဍိုပ်မုက်လိက်",
+       "changecontentmodel-model-label": " မဝ်ဒေလ် မာတိကမတၟိ",
+       "changecontentmodel-reason-label": "ဟိုတ်:",
+       "changecontentmodel-submit": "ပြံင်လှာဲ",
+       "logentry-contentmodel-change-revertlink": "ကလေင်ပြံင်",
+       "logentry-contentmodel-change-revert": "ကလေင်ပြံင်",
        "protectlogpage": "တင်စၟတ်သမ္တီ အရာမစဵုဒၞာဂမၠိုင်",
        "protectedarticle": "မစဵုဒၞာလဝ် \"[[$1]]\"",
        "modifiedarticleprotection": "ပြံင်လှာဲ ကဆံင်မစဵုဒၞာ သွက် မုက်လိက် \"[[$1]]\"",
+       "prot_1movedto2": "[[$1]] ပြံၚ်ဏာ စရေၚ် [[$2]]",
+       "protectcomment": "ဟိုတ်:",
+       "protectexpiry": "အိုတ်အာ:",
        "protect-default": "ကဵုအခေါင် ညးလွပ် သီုဖအိုတ်",
+       "protect-othertime": "အခိၚ် တၞဟ်:",
+       "protect-othertime-op": "အခိၚ် တၞဟ်",
+       "protect-otherreason-op": "ဟိုတ် တၞဟ်",
+       "restriction-type": "တင်မကဵုအခေါင်:",
        "restriction-edit": "ပလေဝ်ဒါန်",
        "restriction-move": "ပြံင်ပဆုဲ",
+       "restriction-create": "ခၞံကၠောန်",
+       "restriction-upload": "ပတိုန်",
+       "undeletebtn": "ကလေၚ်စွံ",
+       "undeletelink": "ဗဗဵု/ကလေၚ်စွံ",
+       "undeleteviewlink": "ဗဗဵု",
+       "undeleteinvert": "ဂတးထောအ် အရာမရုဲစှ်",
+       "undeletecomment": "ဟိုတ်:",
+       "undelete-search-title": "ဂၠာဲ မုက်လိက်မပလီုလဝ်တအ်",
+       "undelete-search-box": "ဂၠာဲ မုက်လိက်မပလီုလဝ်တအ်",
+       "undelete-search-submit": "ဂၠာဲ",
+       "undelete-show-file-submit": "ယွံ",
        "namespace": "ဒၞာဲယၟု",
        "invert": "ဂတးထောအ် အရာမရုဲစှ်လဝ်",
        "tooltip-invert": "Check this box to hide changes to pages within the selected namespace (and the associated namespace if checked)",
        "month": "နူ ဂိတု (ကေုာံ ပြဟ်နူ)",
        "year": "နူ သၞာံ (ကေုာံ ပြဟ်နူ):",
        "sp-contributions-newbies": "ထ္ၜး အရာမကၠောန်ခၞံ နူကဵု အကံက်တၟိ ဟေင်",
+       "sp-contributions-newbies-sub": "သွက် အကံက် တၟိဂမၠိုၚ်",
+       "sp-contributions-newbies-title": "ညးလွပ် ရီုဗၚ် သွက် အကံက် တၟိဂမၠိုၚ်",
        "sp-contributions-blocklog": "စၟတ်သမ္တီ အရာမကၟာတ်ဗလံက်လဝ်",
        "sp-contributions-uploads": "ပတိုန်ပၠောပ်",
        "sp-contributions-logs": "တင်စၟတ်သမ္တီဂမၠိုင်",
        "whatlinkshere-hidelinks": "$1 လေန်",
        "whatlinkshere-hideimages": "$1 ဝှာင်အဆက်အစပ်",
        "whatlinkshere-filters": "ဖဍိုဟ်",
+       "whatlinkshere-submit": "အာ",
+       "block": "ညးလွပ် မဒးကၟာတ်",
+       "unblock": "ညးလွပ် ဟွံဒးကၟာတ်",
+       "ipbreason": "ဟိုတ်:",
+       "ipbsubmit": "ကၟာတ်ထောံ ညးလွပ်ဏအ်",
+       "ipbother": "အခိၚ် တၞဟ်:",
        "ipboptions": "၂ နာဍဳ:2 hours,၁ တ္ၚဲ:1 day,၃တ္ၚဲ:3 days,၁ သတ္တဟ:1 week,၂သတ္တဟ:2 weeks,၁ ဂိတု:1 month,၃ ဂိတု:3 months,၆ ဂိတု:6 months,၁ သၞာံ:1 year,ဟွံချိုတ်ပၠိုတ်:infinite",
+       "unblockip": "ဟွံကၟာတ်ထောံ ညးလွပ်",
+       "ipusubmit": "ပတိတ်ထောအ် ကရုင်ဏအ်",
+       "blocklist": "ညးလွပ်မဒးကၟာတ်လဝ်",
+       "autoblocklist-submit": "ဂၠာဲ",
+       "blocklist-reason": "ဟိုတ်",
+       "ipblocklist-submit": "ဂၠာဲ",
        "infiniteblock": "မဟွံမဲကုအပိုင်အခြာ",
        "blocklink": "ကၟာတ်ဗလံက်",
+       "unblocklink": "ဟွံကၟာတ်",
+       "change-blocklink": "ပြံၚ်ကရုၚ်",
        "contribslink": "တြးပတိတ်",
+       "emaillink": "ပလံၚ် အဳမေလ်",
        "blocklogpage": "စၟတ်သမ္တီ အရာမကၟာတ်ဗလံက်လဝ်",
        "blocklogentry": "ကၟာတ်ဗလံက်လဝ် [[$1]] နကဵု အပိုင်အခြာအခိင်  $2 ဟိုတ်နူ $3",
        "reblock-logentry": "ဒဒှ်မကၟာတ်လဒဵု ညးလွပ်  [[$1]] ဂှ် ပြံင်လှာဲလဝ် နကဵု တ္ၚဲလက္ကရဴအိုတ် $2 $3",
        "block-log-flags-nocreate": "ပွမခၞံကၠောန် အကံက်ဂှ် ဟွံသၟဟ်ရထ",
+       "ipb_already_blocked": "\"$1\" ကၟာတ်လဝ်တုဲ.",
+       "ipb-otherblocks-header": "တၞဟ် {{PLURAL:$1|ကၟာတ်|ကၟာတ်တအ်}}",
        "proxyblocker": "ညးမကၟာတ်စဵု proxy",
+       "move-page": "ပဆုဲ $1",
+       "move-page-legend": "ပဆုဲမုက်လိက်",
+       "movenotallowed": "မၞး အခေါၚ်အရာဟွံမွဲ သွက်ဂွံပဆုဲမုက်လိက်တအ်.",
+       "movenotallowedfile": "မၞး အခေါၚ်အရာ ဟွံမွဲ သ္ဂောအ်ပဆုဲဝှာၚ်တအ်",
+       "cant-move-user-page": "မၞး အခေါၚ်အရာ ဟွံမွဲ သ္ဂောံပဆုဲမုက်လိက် ညးလွပ် (မဒှ်အဝဲနူ သာပ်မုက်လိက်တအ်).",
+       "cant-move-category-page": "မၞး အခေါၚ်အရာဟွံမွဲ သွက်ဂွံပဆုဲ ကဏ္ဍမုက်လိက်တအ်.",
+       "cant-move-to-category-page": "မၞး အခေါၚ်အရာ ဟွံမွဲ သ္ဂောံပဆုဲမုက်လိက် စရၚ်မုက်လိက်မကဏ္ဍ",
+       "cant-move-subpages": "မၞး အခေါၚ်အရာဟွံမွဲ သွက်ဂွံပဆုဲသာပ်မုက်လိက်တအ်.",
+       "newtitle": "က္ဍိုပ်လိက်တၟိ:",
+       "movepagebtn": "ပဆုဲမုက်လိက်",
+       "pagemovedsub": "ပဆုဲ အံၚ်ဇၞးတုဲဒှ်",
+       "movepage-moved": "<strong>\"$1\" ဒးဒုၚ်ပဆုဲဏာလဝ်တေံ \"$2\"</strong>",
        "movelogpage": "ပြံင်ပဆုဲ တင်စၟတ်သမ္တီ",
+       "movereason": "ဟိုတ်:",
+       "revertmove": "ကလေင်ပြံင်",
+       "delete_and_move_confirm": "ယွံ, ပလီုမုက်လိက်",
+       "immobile-source-page": "မုက်လိက်ဏအ်ဂှ် ပဆုဲဟွံဂွံ.",
        "export": "ပတိတ်တြး မုက်လိက်တအ်",
+       "export-submit": "ပတိတ်",
+       "export-addcattext": "ထပ်မုက်လိက်နူကဏ္ဍ:",
+       "export-addcat": "စုတ်",
+       "export-addnstext": "ထပ်မုက်လိက်နူ ဒၞါယၟု:",
+       "export-addns": "စုတ်",
+       "export-download": "ဂိုၚ်သိပ် နဒဒှ် ဝှာၚ်",
+       "allmessagesname": "ယၟု",
+       "allmessagesdefault": "လိက်ဂလာန်ပိုဒ်မဒတန်",
+       "allmessages-filter-legend": "ဖဍိုဟ်",
+       "allmessages-filter-unmodified": "ဟွံပြုပြောၚ်လဝ်",
+       "allmessages-filter-all": " သီုဖအိုတ်",
+       "allmessages-filter-modified": "ပြုပြေၚ်လဝ်",
+       "allmessages-language": "အရေဝ်ဘာသာ :",
+       "allmessages-filter-submit": "အာ",
+       "allmessages-filter-translate": "မတြာဲ",
        "thumbnail-more": "ဇၞော်ပတိုန်",
+       "import": "ပလုပ် မုက်လိက်ဂမၠိုၚ်",
+       "importinterwiki": "ပလုပ် နူ ဝဳကဳ တၞဟ်",
+       "import-interwiki-sourcewiki": "တမ်ရိုဟ် ဝဳကဳ:",
+       "import-interwiki-sourcepage": "တမ်ရိုဟ် မုက်လိက်:",
+       "import-interwiki-submit": "ပလုပ်",
+       "import-upload-filename": "ယၟုဝှာင်:",
+       "import-comment": "တင်ပသောင်ကလး:",
+       "importstart": "ပလုပ်ဒၟံၚ် မုက်လိက်ဂမၠိုၚ်...",
+       "import-revision-count": "$1{{PLURAL:$1|ကလေၚ်|ကလေၚ်ဂမၠိုၚ်}}",
+       "importnopages": "ဟွံမွဲ မုက်လိက်ဂမၠိုၚ် သွက်ဂွံ ပလုပ်.",
+       "import-noarticle": "ဟွံမွဲ မုက်လိက်ဂမၠိုၚ် သွက်ဂွံ ပလုပ်!",
        "importlogpage": "တင်စၟတ်သမ္တီ မပၠောပ်စုတ်",
+       "javascripttest": "JavaScript စမ်ၜတ်ဒၟံၚ်",
+       "javascripttest-pagetext-unknownaction": "ပွ မတီကေတ်ဟွံမာန် $1",
        "tooltip-pt-userpage": "မုက်လိက် {{GENDER:|မၞးမသုင်စောဲ}}",
        "tooltip-pt-mytalk": "{{GENDER:|မုက်လိက် မၞး}} မဓရီုကျာ",
        "tooltip-pt-preferences": "{{GENDER:|မၞး}} မဒးဂၞပ်စိုတ်ဂမၠိုင်",
        "tooltip-t-permalink": "ဌာန်ဒၟံင်လေန် လၟိုန် မုက်လိက် မကလေင်ပလေဝ်ဏအ်",
        "tooltip-ca-nstab-main": "ဗဵု မုက်လိက် မာတိကာ",
        "tooltip-ca-nstab-user": "ဗဵု မုက်လိက် ညးလွပ်",
+       "tooltip-ca-nstab-media": "ဗဵု မုက်လိက် မဳဒဳယာ",
        "tooltip-ca-nstab-special": "မုက်လိက်ဏအ်ဂှ် ဒှ်မုက် တၟေင်၊ ဟိုတ်ဂှ်ရ ပလေဝ် ဟွံဂွံ",
        "tooltip-ca-nstab-project": "ဗဵု မုက်လိက် ပရဝ်ဂျေတ်",
        "tooltip-ca-nstab-image": "ဗဵု မုက်လိက် ဝှာင်",
        "tooltip-ca-nstab-mediawiki": "ကျောဝ်ဗဵု သၞောတ် ပရိုင်မေတ်သုက်",
        "tooltip-ca-nstab-template": "ကျောဝ်ဗဵု template",
+       "tooltip-ca-nstab-help": "ဗဵု မုက်လိက် ရီုဗၚ်",
        "tooltip-ca-nstab-category": "ဗဵု မုက်လိက်ကဏ္ဍ",
        "tooltip-minoredit": "ကဵုစၟတ် အရာဏအ် ဒဒှ်ရ မဒှ် အရာမပလေဝ်ဒါန် ညိည",
        "tooltip-save": "ဂိုင်သိပ် အရာမၞး မပြံင်လှာဲလဝ်",
+       "tooltip-publish": "မပြံၚ်လှာဲတအ် ပတိတ်တြး",
        "tooltip-preview": "ဗဵုနမူနာ အရာမၞး မပြံင်လှာဲလဝ်၊၊ ပဂုန်တုဲ ကၠာဟွံဂွံဂိုင်သိပ်ဂှ် ကၠောန်ကၠာညိ၊၊",
        "tooltip-diff": "ထ္ၜး ဒၞာဲ မလိက် မၞးမပြံင်လှာဲလဝ်ဂှ်ညိ",
        "tooltip-compareselectedversions": "ရံင် ဗီုတၞဟ်ခြာ အကြာ မူမပလေဝ်ဒါန်လဝ် ပ္ဍဲမုက်လိက်ဏအ် ဒၞာဲမရုဲစှ်လဝ် ၜါဂှ်",
        "tooltip-watch": "စုတ် မုက်လိက်ဏအ် ပ္ဍဲစရင်မမင်မဲ မၞး",
+       "tooltip-watchlistedit-normal-submit": "ပတိတ်ထောံ က္ဍိုပ်လိက်ဂမၠိုၚ်",
+       "tooltip-watchlistedit-raw-submit": "ပလေဝ် စရင်မမင်မဲ",
+       "tooltip-upload": "စ ပတိုန်",
        "tooltip-rollback": "\"Rollback\" reverts the last contributor's edit(s) to this page in one click",
        "tooltip-undo": "\"ဟွံကၠောန်\" ဂှ် ဒှ်အရာ မဟွံကၠောန်တုဲ ကလေင်အာ ဗီုအတိုင်တြေံ ကၠာဟွံဂွံစ ပလေဝ်လဝ်ဂှ်ရ၊၊ မုဟိုတ် ကလေင်အာ အတိုင်ဗီုတြေံပၠန်ဂှ် ချူစၟတ်သမ္တီ သကေံ မာန်ရ၊၊",
+       "tooltip-preferences-save": "ဂိုင်သိပ် မဒးဂၞပ်ဂမၠိုင်",
        "tooltip-summary": "စုတ် သကေမ် summary ဇမၠေအ်",
+       "siteuser": "{{SITENAME}} ညးလွပ် $1",
+       "anonuser": "{{SITENAME}} ညးလွပ် မဟွံပပြာကတ်ယၟု $1",
+       "lastmodifiedatby": "မုက်လိက်ဏအ် လက္ကရဴအိုတ် ပလေဝ်ဒါန်လဝ် $2, $1 နကဵု $3",
+       "othercontribs": "ဒုၚ်သ္ဇိုၚ်လ္တူကမၠောန် နူ$1",
+       "others": "တၞဟ်တအ်",
+       "siteusers": "{{SITENAME}} {{PLURAL:$2|{{လိၚ်:$1|ညးလွပ်}}|ညးလွပ်}} $1",
+       "creditspage": "မုက်လိက် မကဵုစရာဲဂမၠိုၚ်",
+       "spamprotectiontitle": "ဖဍိုဟ် ဂွံစဵုဒၞါ Spam",
        "simpleantispam-label": "စၟဳစၟတ် အရာမပလီုပလာ်\n<strong>လ္ပ </strong> စုတ် ပ္ဍဲဏအ်ညိ!",
        "pageinfo-title": "ပရိုင်တင်ဂၞင် သွက် \"$1\"",
        "pageinfo-header-basic": "ပရိုင်တင်ဂၞင် သဇိုင်",
        "pageinfo-length": "ဇမၠိင် မုက်လိက် (နကဵု ဘာက်)",
        "pageinfo-article-id": "မုက်လိက် ID",
        "pageinfo-language": "မုက်လိက် အရေဝ်ဘာသာ ဖျုန်လိက်",
+       "pageinfo-language-change": "ပြံင်လှာဲ",
        "pageinfo-content-model": "မုက်လိက် မဝ်ဒေလ် မာတိက",
+       "pageinfo-content-model-change": "ပြံင်လှာဲ",
        "pageinfo-robot-policy": "ကၠောန်မာတိကာ index နကဵု စက်ရဝ်ဗတ်",
        "pageinfo-robot-index": "မသၠးကဵုလဝ်အခေါင်",
        "pageinfo-robot-noindex": "ဟွံကဵုလဝ်အခေါင်",
        "pageinfo-hidden-categories": "ပၞုက် {{PLURAL:$1|ကဏ္ဍ|ကဏ္ဍဂမၠိုင်}} ($1)",
        "pageinfo-templates": "မကၠောန် Transcluded လဝ် {{PLURAL:$1|template|templates}} ($1)",
        "pageinfo-toolboxlink": "မုက်လိက် ပရိုင်တင်ဂၞင်",
+       "pageinfo-redirectsto-info": "တၚ်နၚ်",
        "pageinfo-contentpage": "ရိုဟ်လၟိဟ် နဒဒှ် မုက်လိက် မာတိကာ",
        "pageinfo-contentpage-yes": "ယွံ",
+       "pageinfo-protect-cascading-yes": "ယွံ",
+       "pageinfo-category-info": "တၚ်နၚ်ပရိုၚ် ကဏ္ဍ",
+       "pageinfo-category-total": "လၟိဟ် ကောန်ဂကောံ သီုဖအိုတ်",
+       "pageinfo-category-pages": "လၟိုဟ်မုက်လိက်ဂမၠိုၚ်",
+       "pageinfo-category-subcats": "လၟိုဟ် သာပ်ကဏ္ဍဂမၠိုၚ်",
+       "pageinfo-category-files": "လၟိုဟ် ဝှာၚ်တအ်",
+       "pageinfo-user-id": "ID ညးလွပ်",
        "patrol-log-page": "တင်စၟတ်သမ္တီ အရာမစဳစောတ်ကောပ်ကာဲ",
+       "confirm-markpatrolled-button": "ခိုဟ်",
        "previousdiff": "← အရာမပလေဝ်ဒါန်လဝ် တြေံ",
        "nextdiff": "မပလေဝ်ဒါန်လဝ် တၟိနူဂှ် →",
        "widthheightpage": "$1 × $2, $3 {{PLURAL:$3|မုက်လိက်|မုက်လိက်ဂမၠိုင်}}",
        "show-big-image-preview": "ဇမၞော် နမူနာ ဏအ် - $1",
        "show-big-image-other": "တၞဟ် {{PLURAL:$2|resolution|resolutions}}: $1.",
        "show-big-image-size": "$1 × $2 pixels",
+       "newimages-legend": "ဖဍိုဟ်",
+       "newimages-user": "IP address ဟွံသေင်မ္ဂး ယၟုမညးလွပ်",
+       "newimages-newbies": "ထ္ၜး အရာမကၠောန်ခၞံ နူကဵု အကံက်တၟိ ဟေင်",
+       "newimages-showbots": "ထ္ၜး ပတိုန်နူ ရုပ်စက်တအ်",
+       "ilsubmit": "ဂၠာဲ",
+       "bydate": "နကဵု စၟတ်တ္ၚဲ",
+       "sp-newimages-showfrom": "ထ္ၜး အရာမပြံင်လှာဲတၟိတၟိ စနူ $2, $1",
+       "seconds": "{{PLURAL:$1|စက္က|စက္ကဂမၠိုၚ်}}",
+       "minutes": "{{PLURAL:$1|$1ဗဳဇနာ|$1 ဗဳဇနာဂမၠိုၚ်}}",
+       "hours": "{{PLURAL:$1|နာဍဳ|နာဍဳဂမၠိုၚ်}}",
+       "days": "$1 {{PLURAL:$1|တ္ၚဲ|တ္ၚဲဂမၠိုင်}}",
+       "weeks": "{{PLURAL:$1|$1 အပါတ်|$1 အပါတ်ဂမၠိုၚ်}}",
+       "months": "{{PLURAL:$1|$1 ဂိတု|$1 ဂိတုဂမၠိုၚ်}}",
+       "years": "{{PLURAL:$1|$1 သၞာံ|$1 သၞာံဂမၠိုၚ်}}",
+       "ago": "$1 တုဲကၠုၚ်",
+       "just-now": "ဆ လၟုဟ်",
+       "hours-ago": "$1{{PLURAL:$1|နာဍဳ|နာဍဳဂမၠိုၚ်}} တုဲကၠုၚ်",
+       "minutes-ago": "$1 {{PLURAL:$1|ဗဳဇနာ|ဗဳဇနာဂမၠိုၚ်}} တုဲကၠုၚ်",
+       "seconds-ago": "$1 {{PLURAL:$1|စက္က|စက္ကဂမၠိုၚ်}} မတုဲကၠုၚ်",
+       "monday-at": "တ္ၚဲစန် ပ္ဍဲ$1",
+       "tuesday-at": "တ္ၚဲအၚာ ပ္ဍဲ $1",
+       "wednesday-at": "တ္ၚဲဗုဒ္ဓဝါ ပ္ဍဲ$1",
+       "thursday-at": "တ္ၚဲဗြဴပတိ ပ္ဍဲ $1",
+       "friday-at": "တ္ၚဲသိုက် ပ္ဍဲ$1",
+       "saturday-at": "တ္ၚဲသ္ၚိသဝ် ပ္ဍဲ$1",
+       "sunday-at": "တ္ၚဲအဒိုတ် ပ္ဍဲ$1",
+       "yesterday-at": "နူကနေံ ပ္ဍဲ$1",
        "metadata": "Metadata",
        "metadata-help": "ပ္ဍဲဝှာင်ဏအ်ဂှ် နွံဒၟံင် နကဵုအရာမဗပေင်စုတ်လဝ်ရ၊၊ မဒှ်အရာ မဗပေင်စုတ်လဝ် နူကဵု ကမ္မရာ ဒဳဂျဳတေဝ် ဟွံသေင်မ္ဂး နူသကေန်နာ မွဲမွဲ ဒှ်မာန်ရ၊၊\nယဝ်ရ ဝှာင်ဂှ် ဒးဒုင်ပလေဝ်ပလေတ် နူတမ်မူလဍေဟ်မ္ဂး၊ အရာလ္ၚဵုတအ်ဂှ် ဟွံမံက် ပ္ဍဲဝှာင်ဂှ် ဒှ်မာန်ရ၊၊",
        "metadata-fields": "Image metadata fields listed in this message will be included on image page display when the metadata table is collapsed.\nOthers will be hidden by default.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-imagewidth": "အနာံ",
+       "exif-imagelength": "သၠုၚ်",
        "exif-orientation": "ဒဒှ်မဖျေဟ်ဗီုပြင်မုက်",
        "exif-xresolution": "သွဟ် ဂၠံင်လၞင်",
        "exif-yresolution": "သွဟ် ဂၠံင်စှ်ေ",
        "exif-datetime": "ဝှာင် ပြံင်လှာဲ စၟတ်တ္ၚဲ ကေုာံ အခိင်",
+       "exif-imagedescription": "က္ဍိုပ်လိက် ဗီုရုပ်",
        "exif-make": "ညးမကၠောန်ပတိတ် ကမ္မရာ",
        "exif-model": "မဝ်ဒေလ် ကမ္မရာ",
        "exif-software": "သပ်ဝဴ မစကာလဝ်",
+       "exif-artist": "ကဝိ",
        "exif-exifversion": "Exif version",
        "exif-colorspace": "ဒၞာဲ အသာ်",
+       "exif-pixelxdimension": "အနာံ သၞိၚ်ရုပ်",
+       "exif-pixelydimension": "သၠုၚ် ဗီုရုပ်",
        "exif-datetimeoriginal": "စၟတ်တ္ၚဲ ကေုာံ အခိင် မခၞံဗဒှ် ဒါတာ",
        "exif-datetimedigitized": "စၟတ်တ္ၚဲ ကေုာံ အခိင် မပြံင်လှာဲ နကဵုဒဳဂျဳတေဝ်",
+       "exif-headline": "က္ဍိုပ်လိက်",
+       "exif-credit": "မကဵုစရာဲ/ ညးဖန်ကၠောန်",
+       "exif-source": "တမ်ရိုဟ်",
+       "exif-writer": "ညးချူ",
+       "exif-languagecode": "အရေဝ်ဘာသာ",
+       "exif-iimversion": "မူ IIM",
+       "exif-iimcategory": "ကဏ္ဍ",
+       "exif-datetimereleased": "တြးပတိတ်လဝ်",
+       "exif-label": "ကရံက်",
+       "exif-unknowndate": "စၟတ်တ္ၚဲ တီကေတ်ဟွံမာန်",
        "exif-orientation-1": "ဓမ္မတာ",
+       "exif-orientation-3": "ဗ္ဂေတ်ကေတ် 180°",
+       "exif-orientation-6": "ဗ္ဂေတ်ကေတ် 90° CCW",
+       "exif-orientation-8": "ဗ္ဂေတ်ကေတ် 90° CW",
+       "exif-exposureprogram-1": "ဗွဲတဲ",
+       "exif-meteringmode-0": "တီကေတ်ဟွံမာန်",
+       "exif-meteringmode-3": "ပချဳဇိုၚ်တဲ",
+       "exif-meteringmode-255": "တၞဟ်",
+       "exif-lightsource-0": "တီကေတ်ဟွံမာန်",
+       "exif-focalplaneresolutionunit-2": "ၝောံတဲဂမၠိုၚ်",
+       "exif-scenecapturetype-1": "လ္ပာ်အနာံ",
+       "exif-scenecapturetype-2": "လ္ပာ်ပစူ",
+       "exif-gaincontrol-0": "ဟွံသေၚ်",
+       "exif-contrast-0": "ဓမ္မတာ",
+       "exif-contrast-1": "ဍိုန်ၜတ်",
+       "exif-contrast-2": "ကြံၚ်မ္ၚိုဟ်",
+       "exif-saturation-0": "ဓမ္မတာ",
+       "exif-sharpness-0": "ဓမ္မတာ",
+       "exif-sharpness-1": "ဍိုန်ၜတ်",
+       "exif-sharpness-2": "ကြံၚ်မ္ၚိုဟ်",
+       "exif-subjectdistancerange-0": "တီကေတ်ဟွံမာန်",
+       "exif-gpsdop-excellent": "အိုတ်အစောန်$1",
+       "exif-gpsdop-good": "ခိုဟ် ($1)",
+       "exif-gpsdop-moderate": "တဲအဒေါဝ် ($1)",
+       "exif-gpsdop-fair": "ဓရ်ယာ($1)",
+       "exif-gpsdop-poor": "အောန်($1)",
+       "exif-objectcycle-a": "နူဂယး ဟေၚ်",
+       "exif-objectcycle-p": "သဝ်တ္ၚဲ ဟေၚ်",
+       "exif-objectcycle-b": "သီု နူဂယး ကဵု သဝ်တ္ၚဲ",
+       "exif-dc-date": "ပလီု(တအ်)",
+       "exif-dc-publisher": "ညးတြးပတိတ်",
+       "exif-dc-rights": "အခေါၚ်အရာဂမၠိုၚ်",
+       "exif-iimcategory-edu": "ပရေၚ်ပညာ",
+       "exif-iimcategory-evn": "ပရေၚ်ပွဳပွိုၚ်သဘာဝ",
+       "exif-iimcategory-hth": "ပရေၚ်ထတ်ယုတ်",
+       "exif-iimcategory-hum": "ဒတုဲဖိုဟ် မၞိဟ်",
+       "exif-iimcategory-lab": "သၟာကမၠောန်",
+       "exif-iimcategory-pol": "ပရေၚ်ဍုၚ်ကွာန်",
+       "exif-iimcategory-rel": "ဘာသာ ကေုာံ ဓရ်ပတှေ်",
+       "exif-iimcategory-sci": "သိပ္ပံ ကေုာံ နဲကဲပညာ",
+       "exif-iimcategory-soi": "ပရူပရာ ပရေၚ်မၞိဟ်",
+       "exif-iimcategory-spo": "ပရေၚ်ချဳဒရာၚ်ဂမၠိုၚ်",
+       "exif-iimcategory-war": "ပၞာန်, ပဋိပက္ခ ကေုာံ ကလာ်ကမဵု",
+       "exif-iimcategory-wea": "ဥတုရာသီ",
+       "exif-urgency-normal": "သာမည ($1)",
+       "exif-urgency-low": "သဝ် ($1)",
+       "exif-urgency-high": "သၠုၚ် ($1)",
        "namespacesall": "သီုဖအိုတ်",
        "monthsall": "သီုဖအိုတ်",
+       "confirm_purge_button": "OK",
+       "confirm-watch-button": "OK",
+       "confirm-unwatch-button": "OK",
+       "confirm-rollback-button": "OK",
+       "quotation-marks": "\"$1\"",
+       "imgmultipageprev": "← မုက်လိက် ကြဴ",
        "imgmultipagenext": "မုက်လိက်ဂတ →",
        "imgmultigo": "အာ!",
        "imgmultigoto": "အာ ဇရေင် မုက်လိက် $1",
+       "img-lang-go": "အာ",
+       "table_pager_next": "မုက်လိက် ဂတ",
+       "table_pager_prev": "မုက်လိက် ကြဴ",
+       "table_pager_first": "မုက်လိက် ပထမ",
+       "table_pager_last": "မုက်လိက် လကြဴ",
+       "table_pager_limit_submit": "အာ",
+       "autosumm-new": "ခၞံကၠောန်လဝ် မုက်လိက် နကဵု \"$1\"",
+       "autosumm-newblank": "ခၞံကၠောန်လဝ် မုက်လိက် ပလး",
+       "watchlistedit-normal-title": "ပလေဝ် စရင်မမင်မဲ",
+       "watchlistedit-normal-legend": "ပတိတ် က္ဍိုပ်လိက်တအ် နူ စရၚ်မမၚ်မွဲ",
+       "watchlistedit-normal-submit": "ပတိတ်ထောံ က္ဍိုပ်လိက်ဂမၠိုၚ်",
+       "watchlistedit-raw-title": "ပလေဝ် စရင်မမင်မဲ အပြောမ်",
+       "watchlistedit-raw-legend": "ပလေဝ် စရင်မမင်မဲ အပြောမ်",
+       "watchlistedit-raw-titles": "က္ဍိုပ်လိက်ဂမၠိုၚ်:",
+       "watchlistedit-raw-submit": "ပဂဵုလဟဵု စရၚ်မမၚ်မွဲ",
+       "watchlistedit-raw-done": "စရၚ်မမၚ်မွဲ မၞး ပဂဵုလဟဵုလဝ်တုဲ.",
+       "watchlistedit-clear-title": "ဖအး စရင်မမင်မွဲဂှ်",
+       "watchlistedit-clear-legend": "ဖအး စရင်မမင်မွဲဂှ်",
+       "watchlistedit-clear-titles": "က္ဍိုပ်လိက်ဂမၠိုၚ်:",
+       "watchlistedit-clear-done": "စရၚ်မမၚ်မွဲ မၞး ဖအးကၠောံတုဲယျ.",
+       "watchlistedit-clear-jobqueue": "စရၚ်မမၚ်မွဲ မၞး စဖအးကၠေအ်ဒၟံၚ်ယျ. ဒးကေတ်အခိၚ်ညိဏောၚ်!",
        "watchlisttools-clear": "ဖအး စရင်မမင်မွဲဂှ်",
        "watchlisttools-view": "ဗဵု အရာမပြံင်လှာဲထေက်တအ်",
        "watchlisttools-edit": "ဗဵု ကေုာံ ပလေဝ် စရင်မမင်မဲ",
        "watchlisttools-raw": "ပလေဝ် စရင်မမင်မဲ အပြောမ်",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|ဓရီု]])",
+       "timezone-local": "ဒေသ",
+       "version-editors": "ညးဒါန်ဂမၠိုၚ်",
+       "version-other": "တၞဟ်",
        "redirect": "ကလေင်စၞောန်ပညုင်လဝ် နကဵု ဝှာင်၊ ညးလွပ်၊ မုက်လိက်၊ မူမပလေဝ်ဒန်လဝ် ဟွံသေင်မ္ဂး အာင်ဒဳ",
        "redirect-summary": "မုက်လိက်တၟေင်ဏအ် ကလေင်စၞောန် ကဵု ဝှာင်(မကဵုလဝ်ယၟု), မုက်လိက်မွဲ (given a revision ID or page ID), မုက်လိက် ညးမသုင်စောဲမွဲ (given a numeric user ID), ဟွံသေင်မ္ဂး တင်စၟတ်သမ္တီမွဲ (given the log ID). Usage: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]], or [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "အာ",
        "redirect-page": "မုက်လိက် အာင်ဒဳ",
        "redirect-revision": "မုက်လိက် မူမပလေဝ်ဒါန်",
        "redirect-file": "ယၟုဝှာင်",
+       "fileduplicatesearch-filename": "ယၟုဝှာင်:",
+       "fileduplicatesearch-submit": "ဂၠာဲ",
        "specialpages": "မုက်လိက် တၟေင်",
+       "specialpages-note-top": "ဒဏ္ဍာရဳ",
+       "specialpages-group-users": "ညးလွပ်တအ် ကေုာံ အခေါၚ်အရာဂမၠိုၚ်",
+       "specialpages-group-pages": "စရၚ်မုက်လိက်ဂမၠိုၚ်",
+       "specialpages-group-pagetools": "ကြိယာမုက်လိက်",
+       "specialpages-group-wiki": "စၟတ်တ္ၚဲ ကေုာံ ကြိယာဂမၠိုၚ်",
+       "blankpage": "မုက်လိက် ပလး",
        "tag-filter": "[[Special:Tags|Tag]] ဝှာင်ဂမၠိုင်:",
+       "tag-filter-submit": "ဖဍိုဟ်",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag|Tags}}]]: $2)",
+       "tag-mw-replace": "ကလေၚ်ဖျေံဒၞာဲ",
+       "tag-mw-undo": "ဟွံပ",
+       "tags-source-header": "တမ်ရိုဟ်",
+       "tags-active-header": "မချဳဓရာင်",
+       "tags-actions-header": "ပွဂမၠိုၚ်",
        "tags-active-yes": "ယွံ",
        "tags-active-no": "ဟအှ်ေ",
+       "tags-edit": "ပလေဝ်ဒါန်",
+       "tags-delete": "ပလီု",
        "tags-hitcount": "$1 {{PLURAL:$1|ပြံင်လှာဲ|ပြံင်လှာဲဂမၠိုင်}}",
+       "tags-create-reason": "ဟိုတ်:",
+       "tags-create-submit": "ခၞံကၠောန်",
+       "tags-delete-reason": "ဟိုတ်:",
+       "tags-activate-reason": "ဟိုတ်:",
+       "tags-deactivate-reason": "ဟိုတ်:",
+       "tags-edit-reason": "ဟိုတ်:",
+       "compare-page1": "မုက်လိက် 1",
+       "compare-page2": "မုက်လိက် 2",
+       "htmlform-submit": "ဗပေင်",
+       "htmlform-selectorother-other": "တၞဟ်",
+       "htmlform-no": "ဟအှ်ေ",
+       "htmlform-yes": "ယွံ",
+       "htmlform-cloner-create": "စုတ် ပပဵု",
+       "htmlform-cloner-delete": "ပတိတ်",
+       "htmlform-date-placeholder": "YYYY-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
        "logentry-delete-delete": "$3 မုက်လိက်ဂှ် $1 {{GENDER:$2|ပလီုထောအ်လဝ်ရ}}",
        "logentry-delete-restore": "$1 {{GENDER:$2|ကလေင်ပ္တန်}} မုက်လိက် $3 ($4)",
        "logentry-delete-revision": "ပ္ဍဲမုက်လိက် $3: $4 ဂှ် $1 {{GENDER:$2|ပြံင်လှာဲလဝ်}} ဗီုပြင် မုက်လိက် {{PLURAL:$5|မူလိက်မဒါန်လဝ် မွဲ|$5 မူလိက်မဒါန်လဝ်ဂမၠိုင်}}",
        "logentry-newusers-autocreate": "အကံက် ညးလွပ် $1 ဂှ် {{GENDER:$2|ခၞံကၠောန်လဝ်}} အလဵုအလဵုရ၊၊",
        "logentry-upload-upload": "$1  {{GENDER:$2|ပတိုန်ပၠောပ်လဝ်}} $3",
        "logentry-upload-overwrite": "$1 {{GENDER:$2|ပလံင်ပၠောပ်လဝ်}} မူလိက် $3ဏအ် တၟိမွဲ",
+       "rightsnone": "(ဟွံမဲ)",
+       "feedback-back": "ကလေင်",
+       "feedback-cancel": "တးပဲါ",
+       "feedback-close": "တုဲဒှ်",
+       "feedback-message": "မေတ်သုက်:",
+       "feedback-subject": "ပရူပရာ:",
+       "feedback-submit": "ဗပေင်",
+       "feedback-thanks-title": "တင်ဂုန်ရအဴ!",
        "searchsuggest-search": "ဂၠာဲ {{SITENAME}}",
+       "duration-seconds": "$1{{PLURAL:$1|စက္က|စက္ကဂမၠိုၚ်}}",
+       "duration-minutes": "$1{{PLURAL:$1|ဗဳဇနာ|ဗဳဇနာဂမၠိုၚ်}}",
+       "duration-hours": "$1{{PLURAL:$1|နာဍဳ|နာဍဳဂမၠိုၚ်}}",
        "duration-days": "$1 {{PLURAL:$1|တ္ၚဲ|တ္ၚဲဂမၠိုင်}}",
-       "randomrootpage": "တမ် မုက်လိက် ဇဟောမ်"
+       "limitreport-cputime-value": "$1{{PLURAL:$1|စက္က|စက္ကဂမၠိုၚ်}}",
+       "expand_templates_output": "လဂွံ",
+       "expand_templates_ok": "OK",
+       "expand_templates_preview": "ကလေၚ်ရံၚ်",
+       "pagelanguage": "သၠာဲ အရေဝ်ဘာသာ မုက်လိက်",
+       "pagelang-name": "မုက်လိက်",
+       "pagelang-language": "အရေဝ်ဘာသာ",
+       "pagelang-select-lang": "ရုဲဘာသာဇကုညိ",
+       "pagelang-reason": "ဟိုတ်",
+       "pagelang-submit": "ဗပေင်",
+       "pagelang-nonexistent-page": "မုက်လိက်ဏအ် $1 ဟွံပြာကတ်",
+       "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (enabled)",
+       "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>disabled</strong>)",
+       "mediastatistics-table-mimetype": "ဂကူ MIME",
+       "mediastatistics-table-count": "လၟိုဟ် ဝှာၚ်တအ်",
+       "mediastatistics-header-unknown": "တီကေတ်ဟွံမာန်",
+       "mediastatistics-header-audio": "ရမျှာၚ်",
+       "mediastatistics-header-office": "ရုၚ်",
+       "mediastatistics-header-total": "ဝှာၚ် သီုဖအိုတ်",
+       "special-characters-group-ipa": "IPA",
+       "special-characters-group-thai": "ထာဲ",
+       "special-characters-group-lao": "လော",
+       "special-characters-group-khmer": "ခမာ",
+       "mw-widgets-categoryselector-add-category-placeholder": "ထပ် ကဏ္ဍ...",
+       "date-range-from": "နူ စၟတ်တ္ၚဲ:",
+       "date-range-to": "စိုပ် စၟတ်တ္ၚဲ:",
+       "randomrootpage": "တမ် မုက်လိက် ဇဟောမ်",
+       "log-action-filter-all": " သီုဖအိုတ်",
+       "log-action-filter-block-block": "ကၟာတ်လဒဵု",
+       "log-action-filter-block-unblock": "ဟွံကၟာတ်",
+       "pagedata-title": "တၚ်နၚ် မုက်လိက်",
+       "passwordpolicies-group": "ဂကောံ",
+       "passwordpolicies-policies": "မူဝါဒဂမၠိုၚ်",
+       "passwordpolicies-policy-minimalpasswordlength": "မက္ခရ်ပၞုက်တအ်ဂှ် အောန်အိုတ်ဒးနွံကဵု $1{{PLURAL:$1|သၚ်္ကေတ|သၚ်္ကေတဂမၠိုၚ်}} ဂၠိၚ်"
 }
index b3fd486..bd817dc 100644 (file)
        "subject-preview": "विषयाची झलक:",
        "previewerrortext": "आपल्या बदलांची झलक बघण्याचे प्रयत्नादरम्यान त्रुटी उद्भवली.",
        "blockedtitle": "हा सदस्य प्रतिबंधित आहे",
-       "blockedtext": "'''तुमचे सदस्यनाव अथवा IP पत्ता ब्लॉक केलेला आहे.'''\n\nहा ब्लॉक $1 यांनी केलेला आहे.\nयासाठी ''$2'' हे कारण दिलेले आहे.\n\n* ब्लॉकची सुरूवात: $8\n* ब्लॉकचा शेवट: $6\n* कुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही ह्या ब्लॉक संदर्भातील चर्चेसाठी $1 अथवा [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकांशी]] संपर्क करू शकता.\nतुम्ही जोवर वैध ई-मेल पत्ता आपल्या [[Special:Preferences|'माझ्या पसंती']] पानावर देत नाही तोवर तुम्ही ’सदस्याला ई-मेल पाठवा’ हा दुवा वापरू शकत नाही. तसेच असे करण्यापासून आपल्याला ब्लॉक केलेले नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे.\nकृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
+       "blockedtext": "<strong>तुमचे सदस्यनाव अथवा IP पत्ता ब्लॉक केलेला आहे.<strong>\n\nहा ब्लॉक $1 यांनी केलेला आहे.\nयासाठी </em>$2</em> हे कारण दिलेले आहे.\n\n* ब्लॉकची सुरूवात: $8\n* ब्लॉकचा शेवट: $6\n* कुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही ह्या ब्लॉक संदर्भातील चर्चेसाठी $1 अथवा [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकांशी]] संपर्क करू शकता.\nतुम्ही जोवर वैध ई-मेल पत्ता आपल्या [[Special:Preferences|'माझ्या पसंती']] पानावर देत नाही तोवर तुम्ही ’सदस्याला ई-मेल पाठवा’ हा दुवा वापरू शकत नाही. तसेच असे करण्यापासून आपल्याला ब्लॉक केलेले नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे.\nकृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
        "autoblockedtext": "तुमचा आंतरजालीय अंकपत्ता आपोआप स्थगित केला आहे कारण तो इतर अशा सदस्याने वापरला, ज्याला $1ने प्रतिबंधित केले.\nआणि दिलेले कारण खालील प्रमाणे आहे\n:''$2''\nब्लॉकची सुरूवात: $8\nब्लॉकचा शेवट: $6\nकुणाला ब्लॉक करायचे आहे: $7\n\nतुम्ही $1शी संपर्क करू शकता किंवा इतर [[{{MediaWiki:Grouppage-sysop}}|प्रबंधकां पैकी]] एकाशी स्थगनाबद्दल चर्चा करू शकता.\n\n[[Special:Preferences|सदस्य पसंतीत]]त शाबीत विपत्र पत्ता नमूद असल्या शिवाय आणि तुम्हाला  तो वापरण्या पासून प्रतिबंधित केले असल्यास तुम्ही  \"या सदस्यास विपत्र पाठवा\" सुविधा  वापरू शकणार नाही.\nतुमचा सध्याचा IP पत्ता $3 हा आहे, व तुमचा ब्लॉक क्रमांक #$5 हा आहे. \nतुमचा स्थगन क्र $5 आहे. कृपया या संदर्भातील चर्चेमध्ये वरील सर्व तपशिल उद्घृत करा.",
        "blockednoreason": "कारण दिलेले नाही",
        "whitelistedittext": "लेखांचे संपादन करण्यासाठी आधी $1 करा.",
        "accmailtext": "[[User talk:$1|$1]] यांसाठी अनियतक्रमाने निर्मित केलेला परवलीचा शब्द $2 यांना पाठवण्यात आला आहे.\n\nया नवीन खात्यासाठीचा परवलीचा शब्द,सनोंद-प्रवेश घेतल्यावर [[Special:ChangePassword|परवलीचा शब्द बदला]] येथे बदलता येईल.",
        "newarticle": "(नवीन लेख)",
        "newarticletext": "आपण सध्या अस्तित्त्वात नसलेल्या पानाच्या दुव्याचा मागोवा घेत आला आहात.\nहे पान नव्याने तयार करण्यासाठी खालील पेटीत टंकन करणे सुरु करा(अधिक माहितीसाठी [$1 साहाय्य पान] बघा).\n\nजर आपण येथे चुकून आला असाल तर ब्राउझरच्या  <strong>परत</strong>(बॅक) कळीवर टिचकी द्या.",
-       "anontalkpagetext": "<em>हे चर्चापान अशा अज्ञात सदस्यासाठी आहे, ज्यांनी खाते तयार केलेले नाही किंवा त्याचा वापर करत नाहीत.</em> \nत्यांच्या ओळखीसाठी आम्ही आंतरजाल अंकपत्ता वापरतो आहोत. असा अंकपत्ता बऱ्याच लोकांचा एकच असू शकतो. \nजर आपण अज्ञात सदस्य असाल आणि आपल्याला काही अप्रासंगिक संदेश मिळाला असेल तर कृपया [[Special:CreateAccount| खाते तयार करा]] किंवा [[Special:CreateAccount|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.",
+       "anontalkpagetext": "<em>हे चर्चापान अशा अज्ञात सदस्यासाठी आहे, ज्यांनी खाते तयार केलेले नाही किंवा त्याचा वापर करत नाहीत.</em> \nत्यांच्या ओळखीसाठी आम्ही आंतरजाल अंकपत्ता वापरतो आहोत. असा अंकपत्ता बऱ्याच लोकांचा एकच असू शकतो.  \nजर आपण अज्ञात सदस्य असाल आणि आपल्याला काही अप्रासंगिक संदेश मिळाला असेल तर कृपया [[Special:CreateAccount|खाते तयार करा]] किंवा [[Special:UserLogin|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.",
        "noarticletext": "या लेखात सध्या काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये या [[Special:Search/{{PAGENAME}}| मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} इतर नोंदी शोधा],\nकिंवा हा लेख [{{fullurl:{{FULLPAGENAME}}|action=edit}}तयार करू शकता]</span>.",
        "noarticletext-nopermission": "सध्या या लेखात  काहीही मजकूर नाही.\nतुम्ही विकिपीडियावरील इतर लेखांमध्ये [[Special:Search/{{PAGENAME}}| या मथळ्याचा शोध घेऊ शकता]], <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAME}}}}आपण या लेखाच्या इतर नोंदी शोधा]</span>,परंतु, आपणास हा लेख लिहीण्याची परवानगी देण्यात येउ शकत नाही.",
        "missing-revision": "\"{{FULLPAGENAME}}\" या लेखाचे #$1 हे संस्करण अस्तित्वात नाही.वगळल्या गेलेल्या लेखपानाच्या जुन्या इतिहास-दुव्याचे अनुसरण केल्यामुळे असे होते.याबाबत विस्तृत माहिती  [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} वगळलेल्या नोंदी]येथे बघता येईल.",
        "recentchangeslinked-feed": "या पृष्ठासंबंधीचे बदल",
        "recentchangeslinked-toolbox": "या पृष्ठासंबंधीचे बदल",
        "recentchangeslinked-title": "\"$1\" च्या संदर्भातील बदल",
-       "recentchangeslinked-summary": "हे पृष्ठ एखाद्या विशिष्ट पानाशी, (किंवा एखाद्या विशिष्ट वर्गात असणाऱ्या पानांशी), जोडलेल्या पानांवरील बदल दर्शविते.\nआपल्या [[Special:Watchlist|निरीक्षणसूचीत]] ही पाने <strong>ठळक</strong> दिसतील.",
+       "recentchangeslinked-summary": "हे पृष्ठ एखाद्या विशिष्ट पानाशी, (किंवा एखाद्या विशिष्ट वर्गात असणाऱ्या पानांशी), जोडलेल्या पानांवरील बदल दर्शविते.एखाद्या वर्गातील पाने पाहाण्यासाठी तो वर्ग लिहा\nआपल्या [[Special:Watchlist|निरीक्षणसूचीत]] ही पाने <strong>ठळक</strong> दिसतील.",
        "recentchangeslinked-page": "पृष्ठ नाव:",
        "recentchangeslinked-to": "याऐवजी दिलेल्या पानाला जोडलेल्या पानांवरील बदल दाखवा",
        "recentchanges-page-added-to-category": "[[:$1]] हे पान या वर्गास जोडले",
        "imagelinks": "संचिका वापर",
        "linkstoimage": "खालील {{PLURAL:$1|पान चित्राशी जोडले आहे|$1 पाने चित्रांशी जोडली आहेत}}:",
        "linkstoimage-more": "या संचिके ला $1 {{PLURAL:$1|पान जोडले|पाने जोडली}} आहेत.\nखालील यादी या संचिके ला जोडलेल्या {{PLURAL:$1|पहिल्या पानाचा दुवा |पहिल्या $1 पानांचे दुवे }}दर्शविते.\n[[Special:WhatLinksHere/$2|संपुर्ण यादी]] उपलब्ध आहे.",
-       "nolinkstoimage": "या चित्राशी जोडलेली पृष्ठे नाही आहेत.",
+       "nolinkstoimage": "या चित्राशी जोडलेली पृष्ठे नाहीत.",
        "morelinkstoimage": "या संचिकेचे [[Special:WhatLinksHere/$1|अधिक दुवे]] पहा.",
        "linkstoimage-redirect": "$1 (संचिका पुनर्निर्देशन) $2",
        "duplicatesoffile": "खालील संचिका या दिलेल्या {{PLURAL:$1|संचिकेची प्रत आहे|$1 संचिकांच्या प्रती आहेत}}. [[Special:FileDuplicateSearch/$2|अधिक माहिती]]",
index 33c715d..01de69f 100644 (file)
        "loginreqpagetext": "အခြားစာမျက်နှာများကို ကြည့်ရန် $1ရမည်။",
        "accmailtitle": "စကားဝှက်ကို ပို့ပြီးပြီ",
        "newarticle": "(အသစ်)",
-       "newarticletext": "သင်သည် မရှိသေးသော စာမျက်နှာလင့် ကို ရောက်လာခြင်းဖြစ်သည်။\nစာမျက်နှာအသစ်စတင်ရန် အောက်မှ သေတ္တာထဲတွင် စတင်ရိုက်ထည့်ပါ (နောက်ထပ် သတင်းအချက်အလက်များအတွက်[$1 အကူအညီ စာမျက်နှာ]ကို ကြည့်ပါ)။\nမတော်တဆရောက်လာခြင်း ဖြစ်ပါက ဘရောက်ဆာ၏ နောက်ပြန်ပြန်သွားသော <strong>back</strong> ခလုတ်ကို နှိပ်ပါ။",
+       "newarticletext": "သင်သည် မရှိသေးသော စာမျက်နှာလင့် ကို ရောက်လာခြင်းဖြစ်သည်။\nစာမျက်နှာအသစ်စတင်ရန် အောက်မှ သေတ္တာထဲတွင် စတင်ရိုက်ထည့်ပါ (နောက်ထပ် သတင်းအချက်အလက်များအတွက် [$1 အကူအညီ စာမျက်နှာ]ကို ကြည့်ပါ)။\nမတော်တဆရောက်လာခြင်း ဖြစ်ပါက ဘရောက်ဆာ၏ နောက်ပြန်ပြန်သွားသော <strong>back</strong> ခလုတ်ကို နှိပ်ပါ။",
        "anontalkpagetext": "----\n<em>ဤသည်မှာ အကောင့်မဖန်တီးသော သို့မဟုတ် အကောင့်မရှိသော အမည်မသိ အသုံးပြုသူတစ်ဦးအတွက် ဆွေးနွေးချက် စာမျက်နှာ ဖြစ်သည်။</em>\nသို့အတွက် ကျွန်ုပ်တို့အနေဖြင့် အိုင်ပီလိပ်စာဂဏန်းကိုသာ သူ/သူမ အားခွဲခြားနိုင်ရန် အသုံးပြုရပါသည်။\nထိုသို့သော အိုင်ပီလိပ်စာများကို အသုံးပြုသူများစွာမှ မျှဝေသုံးစွဲနေနိုင်ပါသည်။\nသင်သည် အမည်မသိ အသုံးပြုသူတစ်ဦးဖြစ်ပြီး မသက်ဆိုင်သော သုံးသပ်ဆွေးနွေးချက်များက သင့်အား အနှောက်အယှက်ဖြစ်စေပါက၊ ကျေးဇူးပြု၍ [[Special:CreateAccount|အကောင့်တစ်ခု ဖန်တီးပါ]] သို့မဟုတ် [[Special:UserLogin|လော့ဂ်အင်ဝင်ရောက်ပြီး]] အခြား အမည်မသိအသုံးပြုသူများနှင့် ရောထွေးနေနိုင်ခြင်းကို ရှောင်ကြဉ်နိုင်ပါသည်။",
        "noarticletext": "ဤစာမျက်နှာတွင် ယခုလက်ရှိတွင် မည်သည့်စာသားမှ မရှိပါ။\nသင်သည် အခြားစာမျက်နှာများတွင် [[Special:Search/{{PAGENAME}}|ဤစာမျက်နှာ၏ ခေါင်းစဉ်ကို ရှာနိုင်သည်]]၊ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ဆက်စပ်ရာ မှတ်တမ်းများကို ရှာနိုင်သည်]၊ သို့မဟုတ် [{{fullurl:{{FULLPAGENAME}}|action=edit}} ဤစာမျက်နှာကို ဖန်တီးနိုင်သည်]</span>။",
        "noarticletext-nopermission": "ဤစာမျက်နှာတွင် ယခုလက်ရှိတွင် မည်သည့်စာသားမှ မရှိပါ။\nသင်သည် အခြားစာမျက်နှာများတွင် [[Special:Search/{{PAGENAME}}|ဤစာမျက်နှာ၏ ခေါင်းစဉ်ကို ရှာနိုင်သည်]]၊ သို့မဟုတ် <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} ဆက်စပ်ရာ မှတ်တမ်းများကို ရှာနိုင်သည်]</span>။ သို့သော် ဤစာမျက်နှာကို ဖန်တီးရန် သင့်တွင် အခွင့်အရေး မရှိပါ။",
        "editingsection": "$1 (အပိုင်း) ကို ပြင်ဆင်နေသည်။",
        "editingcomment": "$1 (အပိုင်းသစ်) ကို ပြင်ဆင်နေသည်။",
        "editconflict": "အငြင်းပွားမှုကို တည်းဖြတ်ရန် - $1",
+       "explainconflict": "သင် စတင်တည်းဖြတ်ကတည်းက တစ်စုံတစ်ယောက်မှ ဤစာမျက်နှာကို ပြောင်းလဲခဲ့သည်။ အပေါ်ပိုင်းဧရိယာတွင် လက်ရှိတည်ရှိနေသော စာမျက်နှာစာသား ပါဝင်သည်။ သင်၏ပြောင်းလဲချက်များကို အောက်ပိုင်းစာသားဧရိယာတွင် ပြသပေးထားသည်။ သင်၏ပြောင်းလဲချက်များကို ရှိနှင့်ပြီးသားစာသားတွင် ပေါင်းစပ်ရမည်ဖြစ်ပါသည်။ \"$1\" ကို သင်နှိပ်လိုက်ပါက အပေါ်ပိုင်းဧရိယာရှိ စာသား<strong>သာလျင်</strong> သိမ်းဆည်းသွားမည်ဖြစ်ပါသည်။",
        "yourtext": "သင့်စာသား",
        "storedversion": "သိမ်းဆည်းထားသောမူ",
        "yourdiff": "ကွဲပြားချက်များ",
        "post-expand-template-argument-warning": "'''သတိပေးချက် -''' ဤစာမျက်နှာတွင် ပမာဏအားဖြင့် ကြီးမားကျယ်ပြန့်သော template argument တစ်ခုပါဝင်သည်။\nယင်း arguments များကို ဖယ်ထုတ်လိုက်သည်။",
        "post-expand-template-argument-category": "ဖယ်ထုတ်ထားသော template arguments များပါဝင်သည့် စာမျက်နှာများ",
        "parser-template-loop-warning": "တမ်းပလိတ်များ လှည့်ပတ်ဆက်စပ် နေသည်ကို တွေ့ရသည်။ [[$1]]",
+       "undo-success": "တည်းဖြတ်မှုကို နောက်ပြန်ဆုတ်နိုင်ပါသည်။ သင် လုပ်ဆောင်လိုသည့်အရာကို အတည်ပြုစစ်ဆေးနိုင်ရန် အောက်တွင်ပြထားသော နှိုင်းယှဉ်ချက်ကို စစ်ဆေးပါ၊ ပြီးလျင် နောက်သို့ပြန်ပြင်ရန် ပြောင်းလဲမှုများကို သိမ်းဆည်းပါ။",
        "undo-failure": "ကြားဖြတ် တည်းဖြတ်မှုများကြောင့် တည်းဖြတ်မှုကို နောက်ပြန် မပြင်နိုင်တော့ပါ။",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|ဆွေးနွေး]]) ၏ တည်းဖြတ်မူ $1 ကို ပြန်လည်ပယ်ဖျက်လိုက်သည်",
        "cantcreateaccount-text": "ဤအိုင်ပီလိပ်စာ (<strong>$1</strong>) မှ အကောင့်ဖန်တီးခြင်းကို [[User:$3|$3]] က ပိတ်ပင်ထားသည်။ \n\n$3 က ပေးထားသော အကြောင်းပြချက်မှာ <em>$2</em>",
        "next": "နောက်ထပ်",
        "last": "ယခုမတိုင်မီ",
        "page_first": "ပထမဆုံး",
-       "page_last": "á\80¡á\80\94á\80±á\80¬á\80\80á\80ºá\80\86á\80¯á\80¶á\80¸",
+       "page_last": "နောက်ဆုံး",
        "histlegend": "တည်းဖြတ်မူများကို နှိုင်းယှဉ်ရန် radio boxes လေးများကို မှတ်သားပြီးနောက် Enter ရိုက်ချပါ သို့ အောက်ခြေမှ ခလုတ်ကို နှိပ်ပါ။<br />\nLegend: <strong>({{int:cur}})</strong> = နောက်ဆုံးမူနှင့် ကွဲပြားချက် <strong>({{int:last}})</strong> = ယင်းရှေ့မူနှင့် ကွဲပြားချက်, <strong>{{int:minoreditletter}}</strong> = အရေးမကြီးသော ပြုပြင်မှု.",
        "history-fieldset-title": "ယခင်မူများ ရှာဖွေရန်",
        "history-show-deleted": "ဖျက်ထားသော မူများသာ",
        "rcfilters-watchlist-markseen-button": "ပြောင်းလဲမှုများအားလုံးကို ကြည့်ရှုပြီးကြောင်း မှတ်သားရန်",
        "rcfilters-watchlist-edit-watchlist-button": "သင့်စောင့်ကြည့်စာရင်းရှိ စာမျက်နှာများစာရင်းအား တည်းဖြတ်ရန်",
        "rcfilters-watchlist-showupdated": "သင်နောက်ဆုံးကြည့်ရှုခဲ့ပြီးနောက် ပြောင်းလဲမှုရှိခဲ့သော စာမျက်နှာများကို <strong>စာလုံးမဲ</strong> ဖြင့် ပြသထားသည်။",
+       "rcfilters-preference-label": "လတ်တလောအပြောင်းအလဲများ၏ မွမ်းမံထားသောဗားရှင်းကို ဝှက်ရန်",
+       "rcfilters-watchlist-preference-label": "စောင့်ကြည့်စာရင်း၏ မွမ်းမံထားသောဗားရှင်းကို ဝှက်ရန်",
        "rcfilters-target-page-placeholder": "စာမျက်နှာနာမည် (သို့မဟုတ် ကဏ္ဍ) ရိုက်ထည့်ပါ",
        "rcnotefrom": "အောက်ပါတို့မှာ <strong>$3၊ $4</strong> မှစ၍ {{PLURAL:$5|ပြောင်းလဲမှု|ပြောင်းလဲမှုများ}} ဖြစ်သည်  (<strong>$1</strong> အထိ ပြထား)။",
        "rclistfromreset": "ရက်စွဲရွေးချယ်မှုအား ပြန်စရန်",
        "newpages": "စာမျက်နှာအသစ်",
        "newpages-submit": "ပြသရန်",
        "newpages-username": "မှတ်​ပုံ​တင်​အ​မည်:",
-       "ancientpages": "အဟောင်းဆုံးစာမျက်နှာ",
+       "ancientpages": "အဟောင်းဆုံး စာမျက်နှာများ",
        "move": "ရွှေ့ရန်",
        "movethispage": "ဤစာမျက်နှာကို ရွှေ့ပြောင်းရန်",
        "unusedimagestext": "အောက်ပါဖိုင်များသည် မည်သည့်စာမျက်နှာတွင်မှ သုံးစွဲထားခြင်း မရှိပါ။\nအခြားသော ဝက်ဘ်ဆိုဒ်များမှနေ၍ ဖိုင်တစ်ခုခုသို့ တိုက်ရိုက် URL ဖြင့် တိုက်ရိုက်ချိတ်ဆက်ထားခြင်း ရှိနေနိုင်ပြီး သုံးစွဲနေခြင်းမရှိသော်လည်း ဤနေရာတွင် ဖော်ပြထားနိုင်ကြောင်း ကျေးဇူးပြု၍ မှတ်သားပါ။",
        "booksources": "မှီငြမ်း စာအုပ်များ",
        "booksources-search-legend": "စာအုပ်ရင်းမြစ်များကို ရှာရန်",
        "booksources-search": "ရှာဖွေရန်",
+       "booksources-text": "အောက်ပါတို့သည် အသုံးပြုပြီးသားနှင့် စာအုပ်သစ်များကို ရောင်းချသော အခြားဆိုဒ်လင့်ခ်များစာရင်းဖြစ်သည်၊ သင်ရှာဖွေနေသော စာအုပ်များနှင့်ပတ်သက်သည့် အခြားသတင်းအချက်အလက်လည်း ရှိနိုင်ပါသည်:",
+       "booksources-invalid-isbn": "ပေးထားသော ISBN မှာ ဆီလျော်သည့်ပုံစံ မရှိပါ၊ မူလရင်းမြစ်မှ ကော်ပီကူးခြင်းအမှားများအတွက် စစ်ဆေးကြည့်ပါ။",
        "specialloguserlabel": "ဆောင်ရွက်သူ -",
        "speciallogtitlelabel": "ရည်ရွယ်ရာ (ခေါင်းစဉ် သို့ {{ns:user}}:အသုံးပြုသူအတွက် အသုံးပြုအမည်):",
        "log": "မှတ်​တမ်း​များ​",
        "nocontribs": "ဤသတ်မှတ်ချက်များနှင့် ကိုက်ညီသည့် ပြောင်းလဲမှုများ မရှိပါ။",
        "uctop": "(လက်ရှိ)",
        "month": "အဆိုပါ လမှစ၍ ( အဆိုပါလထက်လည်း စောသော) :",
-       "year": "အဆိုပါ နှစ်မှစ၍ ( အဆိုပါနှစ်ထက်လည်း စောသော) :",
+       "year": "အဆိုပါ နှစ်မှစ၍ (အဆိုပါနှစ်ထက်လည်း စောသော):",
        "date": "အဆိုပါရက်စွဲမှစ၍ (ယင်းထက်လည်း စောသော):",
        "sp-contributions-newbies": "အကောင့်အသစ်များ၏ ပံ့ပိုးမှုများကိုသာ ပြရန်",
        "sp-contributions-newbies-sub": "အကောင့်အသစ်များအတွက်",
        "exif-dc-contributor": "ဆောင်ရွက်ပေးထားသူများ",
        "exif-dc-source": "ရင်းမြစ် မီဒီယာ",
        "exif-dc-type": "မီဒီယာ အမျိုးအစား",
+       "exif-rating-rejected": "ငြင်းပယ်ခဲ့သည်",
        "exif-iimcategory-ace": "အနုပညာ၊ ယဥ်ကျေးမှုနှင့် ဖြေဖျော်ရေး",
        "exif-iimcategory-clj": "ရာဇဝတ်မှုနှင့် ဥပဒေ",
        "exif-iimcategory-dis": "ဘေးအန္တရာယ်များနှင့် မတော်တဆမှုများ",
        "restore-count-files": "{{PLURAL: $1|၁ ဖိုင်|$1 ဖိုင်များ}}",
        "logentry-delete-revision": "$3 စာမျက်နှာပေါ်ရှိ {{PLURAL:$5|တည်းဖြတ်မူတစ်ခု|တည်းဖြတ်မူ $5 ခု}}၏ အမြင်ပုံစံကို $1 က {{GENDER:$2|ပြောင်းလဲခဲ့သည်}}: $4",
        "revdelete-content-hid": "အကြောင်းအရာ ဝှက်ခြင်း",
+       "revdelete-summary-hid": "တည်းဖြတ်မှုအကျဉ်းချုပ် ဝှက်ထားခြင်း",
+       "revdelete-uname-hid": "အသုံးပြုသူအမည် ဝှက်ခြင်း",
        "revdelete-restricted": "အက်ဒမင်များသို့ ကန့်သတ်ချက်များ သက်ရောက်ရန်",
        "revdelete-unrestricted": "အက်ဒမင်များအတွက် ကန့်သတ်ချက်များကို ဖယ်ရှားရန်",
        "logentry-block-block": "$1 က {{GENDER:$4|$3}} ကို သက်တမ်းကုန်လွန်ချိန် $5 $6 ဖြင့် {{GENDER:$2|ပိတ်ပင်ခဲ့သည်}}",
        "authmanager-realname-label": "အမည်ရင်း",
        "authmanager-realname-help": "အသုံးပြုသူ၏ အမည်ရင်း",
        "authmanager-provider-temporarypassword": "ယာယီစကားဝှက်",
+       "authprovider-resetpass-skip-label": "ကျော်ရန်",
        "cannotauth-not-allowed-title": "ခွင့်ပြုချက် ငြင်းပယ်လိုက်သည်",
        "cannotauth-not-allowed": "သင်သည် ဤစာမျက်နှာကို အသုံးပြုခွင့်မရှိပါ",
        "edit-error-short": "အမှား - $1",
        "passwordpolicies-summary": "ဤသည်မှာ ဤဝီကီရှိ အသုံးပြုသူအုပ်စုများအတွက် အကျုံးဝင်သော စကားဝှက် မူဝါဒများ ဖြစ်သည်။",
        "passwordpolicies-group": "အုပ်စု",
        "passwordpolicies-policies": "မူဝါဒများ",
+       "passwordpolicies-policy-minimalpasswordlength": "စကားဝှက်တွင် အနည်းဆုံး {{PLURAL:$1|စကားလုံး|စကားလုံးများ}} $1 ခုရှိရမည်။",
        "passwordpolicies-policy-passwordcannotmatchusername": "စကားဝှက်သည် အသုံးပြုသူအမည်နှင့် မတူညီရပါ"
 }
index 2fe2bc0..379fa5c 100644 (file)
        "deletecomment": "Lí-iû:",
        "rollback": "Kā siu-kái ká tńg khì",
        "rollbacklink": "ká tńg khì",
+       "rollbacklinkcount": "Ká tńg $1 kái {{PLURAL:$1|pian-chi̍p|pian-chi̍p}}",
        "rollbackfailed": "Ká bē tńg khì",
        "cantrollback": "Bô-hoat-tō· kā siu-kái ká-tńg--khì; téng ūi kòng-hiàn-chiá sī chit ia̍h î-it ê chok-chiá.",
        "alreadyrolled": "Bô-hoat-tō· kā [[User:$2|$2]] ([[User talk:$2|Thó-lūn]]) tùi [[:$1]] ê siu-kái ká-tńg-khì; í-keng ū lâng siu-kái a̍h-sī ká-tńg chit ia̍h. Téng 1 ūi siu-kái-chiá sī [[User:$3|$3]] ([[User talk:$3|Thó-lūn]]).",
index bc1eb57..68cea82 100644 (file)
        "customcssprotected": "Nun v'è permesso 'a cagnà sta paggena CSS, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
        "customjsonprotected": "Nun v'è permesso 'a cagnà sta paggena JSON, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
        "customjsprotected": "Nun v'è permesso 'a cagnà sta paggena JavaScript, pecché cuntene 'e mpustaziune perzunale 'e n'at'utente.",
-       "sitecssprotected": "Nun téne premmesse pe' puté cagnà sta paggena CSS pecché putesse dà prubbleme a 'e vvisite",
-       "sitejsonprotected": "Nun téne premmesse pe' puté cagnà sta paggena JSON pecché putesse dà prubbleme a 'e vvisite",
+       "sitecssprotected": "Nun téne premmesse pe' puté cagnà sta paggena CSS pecché putesse dà prubbleme a 'e vvisite.",
+       "sitejsonprotected": "Nun téne premmesse pe' puté cagnà sta paggena JSON pecché putesse dà prubbleme a 'e vvisite.",
+       "sitejsprotected": "Nun téne premmesse pe' puté cagnà sta paggena JavaScript pecché putesse dà prubbleme a 'e vvisite.",
        "mycustomcssprotected": "Nun v'è permesso 'a cagnà sta paggena CSS.",
        "mycustomjsonprotected": "Nun v'è permesso 'a cagnà sta paggena JSON.",
        "mycustomjsprotected": "Nun v'è licenzia pe cagnà sta paggena JavaScript.",
        "diff-multi-otherusers": "({{PLURAL:$1|Na virzione ntermedia|$1 verziune ntermedie}} 'a {{PLURAL:$2|n'at'utente|$2 n'ati ddoj'utente}} nun è mmustata)",
        "diff-multi-manyusers": "({{PLURAL:$1|Na virzione ntermedia|$1 verziune ntermedie}} 'a cchiù 'e $2 {{PLURAL:$2|utente|utente}} nun è mmustata)",
        "diff-paragraph-moved-tonew": "'O paragrafo è stato spustat. Facite clic pe' puté cagnà dint'a nova posiziona.",
+       "diff-paragraph-moved-toold": "'O paragrafo è stato spustat. Facite clic pe' puté cagnà dint' 'o posto viecchio.",
        "difference-missing-revision": "{{PLURAL:$2|Na virziona|$2 verziune}} 'e sta differenza ($1) {{PLURAL:$2|nun è stata truvata|nun so' state truvate}}.\n\nChest'è succiesso quanno s'è secutato nu diff obsoleto a na paggena scancellata.\n'E dettaglie se ponno truvà dint'a [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 'o riggistro 'e scancellamiente].",
        "searchresults": "Risultato d''a recerca",
+       "search-filter-title-prefix": "Ascià surtanto dint' 'e paggene c' 'o titolo c'accumencia pe' \"$1\"",
+       "search-filter-title-prefix-reset": "Ascìa tutt' 'e paggene",
        "searchresults-title": "Ascià risultate ppe \"$1\"",
        "titlematches": "Currispunnenze d' 'o titolo d' 'e paggene",
        "textmatches": "Currispunnenze d' 'o testo d' 'e paggene",
        "prefs-editwatchlist-clear": "Sbacanta l'elenco 'e paggene cuntrullate",
        "prefs-watchlist-days": "Nummero 'e juorne 'a mmustà dint'a l'elenco 'e cuntrollo:",
        "prefs-watchlist-days-max": "Massimo $1 {{PLURAL:$1|juorno|juorne}}",
-       "prefs-watchlist-edits": "Numero massimo 'e cagnamiente 'a mmustà ch' 'e funziune avanzate:",
+       "prefs-watchlist-edits": "Numero massimo 'e cagnamiente 'a mmustà dint' a l'elenco 'e paggene cuntrullate:",
        "prefs-watchlist-edits-max": "Nummero massimo: 1000",
        "prefs-watchlist-token": "Token 'e l'elenco 'e cuntrollo:",
+       "prefs-watchlist-managetokens": "Gestisce 'e tokén",
        "prefs-misc": "Varje",
        "prefs-resetpass": "Cagna 'a password",
        "prefs-changeemail": "Cagna o lèva l'indirizzo e-mail",
        "stub-threshold-disabled": "Stutato",
        "recentchangesdays": "Nummero 'e juorne a mmustà dint'a l'urdeme cagnamiente:",
        "recentchangesdays-max": "Massimo $1 {{PLURAL:$1|juorno|juorne}}",
-       "recentchangescount": "Nummero predefinito 'e cagnamiente 'a mmustà:",
-       "prefs-help-recentchangescount": "Chesto ntenne ll'urdeme cagnamiente, 'e cronologgie 'e paggena, e riggistre.",
-       "prefs-help-watchlist-token2": "Chest'è 'a chiave segreta pe se ffà 'o feed web 'e l'elenco 'e cuntrolo d' 'o vuosto.\nSi coccheruno 'a cunoscesse, allora putesse vedé l'elenco 'e cuntrollo, picciò nun 'a spartite. [[Special:ResetTokens|Cliccate ccà se tenite necessità d' 'a rimpizzà]].",
+       "recentchangescount": "Nummero predefinito 'e cagnamiente 'a mmustà dint' 'e paggene 'e cagnamiente 'e mo, cronologgie e riggistre:",
+       "prefs-help-recentchangescount": "Nummero massimo: 1000",
+       "prefs-help-watchlist-token2": "Chest'è 'a chiave segreta pe se ffà 'o feed web 'e l'elenco 'e cuntrolo d' 'o vuosto.\nSi coccheruno 'a cunoscesse, allora putesse vedé l'elenco vuost' 'e cuntrollo, picciò nun 'a spartite.\nSi ve serve, [[Special:ResetTokens|facite clic ccà p' 'a rimpizzà]].",
+       "prefs-help-tokenmanagement": "Putite vedé e mpustà n'ata vota 'a chiave segreta pe' l'utenza d' 'a vosta pe' ve puté fà trasì dint' 'o feed web 'e paggene cuntrullate 'a vuje. Chi canuscesse sta chiave putesse leggere 'e paggene cuntrullate vuoste, picciò, tenit' 'a mente e nun 'a spartí.",
        "savedprefs": "'E preferenze songo state sarvate.",
        "savedrights": "'E dritte 'e gruppe 'utente {{GENDER:$1|$1}} sto state sarvate.",
        "timezonelegend": "Fuso orario:",
        "timezoneregion-indian": "Oceano Indiano",
        "timezoneregion-pacific": "Oceano Pacifeco",
        "allowemail": "Abbìa 'a ricezione 'e mmasciate mannate 'a l'ati utente",
+       "email-allow-new-users-label": "Abbìa 'a ricezione 'e mmasciate 'a l'ati utente nuove nuove",
+       "email-blacklist-label": "Nun permettere chist' utente 'e me mannà masciate:",
        "prefs-searchoptions": "Ascìa",
        "prefs-namespaces": "Namespace",
        "default": "predefinito",
        "prefs-files": "File",
        "prefs-custom-css": "CSS personalizzato",
+       "prefs-custom-json": "JSON personalizzato",
        "prefs-custom-js": "JavaScript personalizzato",
-       "prefs-common-config": "CSS/JavaScript spartuto pe' tutt' 'e skin:",
+       "prefs-common-config": "CSS/JSON/JavaScript spartuto pe' tutt' 'e skin:",
        "prefs-reset-intro": "Putisse ausà sta paggena pe' rimpizzà 'e preferenze proprie comme chille predefinite d' 'o sito.\nL'operazione nun se può annullà.",
        "prefs-emailconfirm-label": "Cunferma 'e ll'e-mail:",
        "youremail": "E-mail:",
        "prefs-dateformat": "Furmato data",
        "prefs-timeoffset": "Ore 'e differenza",
        "prefs-advancedediting": "Opziune generale",
+       "prefs-developertools": "Strumiente p' 'e sviluppature",
        "prefs-editor": "Editore",
        "prefs-preview": "Anteprimma",
        "prefs-advancedrc": "Opziune avanzate",
+       "prefs-opt-out": "Stuta miglioramente",
        "prefs-advancedrendering": "Opziune avanzate",
        "prefs-advancedsearchoptions": "Opziune avanzate",
        "prefs-advancedwatchlist": "Opziune avanzate",
        "group-autoconfirmed": "Utente autocunfermate",
        "group-bot": "Bot",
        "group-sysop": "Ammenistrature",
+       "group-interface-admin": "Ammenistrature 'e ll'interfaccia",
        "group-bureaucrat": "Burocrate",
        "group-suppress": "Soppressure",
        "group-all": "(tutte)",
        "group-autoconfirmed-member": "{{GENDER:$1|utente autocunfermato|utente autocunfermata|utente autocunfermato/a}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "group-sysop-member": "{{GENDER:$1|ammenistratore|ammenistratrice|ammenistratore/trice}}",
+       "group-interface-admin-member": "{{GENDER:$1|ammenistratore|ammenistratrice|ammenistratore/trice}} 'e ll'interfaccia",
        "group-bureaucrat-member": "{{GENDER:$1|burocrate}}",
        "group-suppress-member": "{{GENDER:$1|suppressure|supprimitrice}}",
        "grouppage-user": "{{ns:project}}:Utente",
        "grouppage-autoconfirmed": "{{ns:project}}:Utente autocunfermate",
        "grouppage-bot": "{{ns:project}}:Bot",
        "grouppage-sysop": "{{ns:project}}:Ammenistrature",
+       "grouppage-interface-admin": "{{ns:project}}:Ammenistrature 'e ll'interfaccia",
        "grouppage-bureaucrat": "{{ns:project}}:Burocrate",
        "grouppage-suppress": "{{ns:project}}:Suppressure",
        "right-read": "Liegge paggene",
        "right-editcontentmodel": "Cagna 'o modello 'e cuntenute 'e na paggena",
        "right-editinterface": "Modifeca 'a nterfaccia utente",
        "right-editusercss": "Cagna 'e file CSS 'e l'at'utente",
+       "right-edituserjson": "Cagna 'e file JSON 'e l'at'utente",
        "right-edituserjs": "Cagna 'e file JS e l'at'utente",
+       "right-editsitecss": "Cagna 'e CSS p' 'o sito sano",
+       "right-editsitejson": "Cagna 'e JSON p' 'o sito sano",
+       "right-editsitejs": "Cagna 'e JavaScript p' 'o sito sano",
        "right-editmyusercss": "Cagna 'e proprie file CSS",
+       "right-editmyuserjson": "Cagna 'e proprie file JSON",
        "right-editmyuserjs": "Cagna 'e proprie file JavaScript",
        "right-viewmywatchlist": "Vide l'elenco 'e cuntrollo proprio",
        "right-editmywatchlist": "Cagna l'elenco 'e cuntrollo proprio. Vedete ca cocch'azione putesse jògnere ancora paggene senza stu deritto.",
        "grant-createaccount": "Crìa cunte",
        "grant-createeditmovepage": "Créa, cagna e móve paggene",
        "grant-delete": "Scancella paggene, verziune, trasute 'e riggistro",
-       "grant-editinterface": "Cagna 'o namespace MediaWiki e CSS/JavaScript 'e ll'utente",
-       "grant-editmycssjs": "Cagna 'e CSS/JavaScript 'e ll'utenza d' 'a vosta",
+       "grant-editinterface": "Cagna 'o namespace MediaWiki 'e ll'utente/JSON p' 'o sito sano",
+       "grant-editmycssjs": "Cagna 'e CSS/JSON/JavaScript 'e ll'utenza d' 'a vosta",
        "grant-editmyoptions": "Cagna 'e preferenze utente proprie",
        "grant-editmywatchlist": "Cagna l'elenco 'e cuntrolo 'o tuojo",
+       "grant-editsiteconfig": "Cagna 'e CSS/JS p' 'o sito sano",
        "grant-editpage": "Cagna 'e paggene esistente",
        "grant-editprotected": "Cagna 'e paggine prutette",
        "grant-highvolume": "Cagnamiente massive",
        "action-writeapi": "usa l'API 'n scrittura",
        "action-delete": "scancèlla chesta paggena",
        "action-deleterevision": "scancellà 'e verziune",
+       "action-deletelogentry": "scancellà riggistro",
        "action-deletedhistory": "vide 'a cronologgia scancellata 'e sta paggena",
+       "action-deletedtext": "vide 'a verziona d' 'o testo scancellato",
        "action-browsearchive": "ascìa dint' 'e paggene scancellate",
        "action-undelete": "arripiglia chesta paggena",
        "action-suppressrevision": "rivedé e arripiglià 'e cagnamiente annascunnute",
        "action-userrights-interwiki": "cagna 'e deritte 'e ll'utente int'a l'ati wiki",
        "action-siteadmin": "blocca o sblocca 'o database",
        "action-sendemail": "manna e-mail",
+       "action-editmyoptions": "cagna 'e preferenze proprie",
        "action-editmywatchlist": "cagna l'elenco 'e cuntrolo 'o tuojo",
        "action-viewmywatchlist": "vide l'elenco 'e cuntrollo proprio",
        "action-viewmyprivateinfo": "vide 'e date perzunale",
        "recentchanges-legend": "Opzione urdeme cagnamiénte",
        "recentchanges-summary": "Ncopp'a chesta paggena song' appresentate ll'urdeme cagnamiente fatte ê cuntenute d\"o sito.",
        "recentchanges-noresult": "Nisciuno cagnamiento dint'o periodo dato ca soddisfà sti criterie.",
+       "recentchanges-timeout": "Sta ricerca è ammaturata mo. Si tu vulisse, putisse tentà n'ati parametre 'e cerca.",
+       "recentchanges-network": "Pe' bbìa 'e n'errore tecnico, nun se pò carecà nisciuno risultato. Facite agghiurnamento d' 'a paggena.",
+       "recentchanges-notargetpage": "Azzeccate ncoppa 'o nomme 'e na paggena pe' puté vedé 'e cagnamiente 'e chesta paggena.",
        "recentchanges-feed-description": "Ncoppa chistu feed song' appresentate ll'urdeme cagnamiente fatte ê cuntenute d\"o sito.",
        "recentchanges-label-newpage": "Chisto cagno ha criato na paggena nova",
        "recentchanges-label-minor": "Chisto è nu cagnamiénto piccerillo",
        "recentchanges-legend-heading": "<strong>Liggenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (vide [[Special:NewPages|'e paggene nove]])",
        "recentchanges-submit": "Faje vedé",
+       "rcfilters-tag-remove": "Léva '$1'",
+       "rcfilters-legend-heading": "<strong>Elenco abbreviaziune:</strong>",
+       "rcfilters-other-review-tools": "Ate strumiente 'e cuntrollo",
+       "rcfilters-group-results-by-page": "Arricetta risultate pe' paggena",
+       "rcfilters-activefilters": "Filtre appicciate",
+       "rcfilters-activefilters-hide": "Annascunne",
+       "rcfilters-activefilters-show": "Faje vedé",
+       "rcfilters-activefilters-hide-tooltip": "Annascunne l'area 'e filtre appicciate",
+       "rcfilters-activefilters-show-tooltip": "Fà vedé l'area 'e filtre appicciate",
+       "rcfilters-advancedfilters": "Filtre avanzate",
+       "rcfilters-limit-title": "Risultate 'a fà vedé",
+       "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}}, $2",
+       "rcfilters-date-popup-title": "Periodo 'e tiempo a cercà",
+       "rcfilters-days-title": "Ùrdeme juorne",
+       "rcfilters-hours-title": "Ùrdeme ore",
+       "rcfilters-days-show-days": "$1 {{PLURAL:$1|juorno|juorne}}",
+       "rcfilters-days-show-hours": "$1 {{PLURAL:$1|ora|ore}}",
+       "rcfilters-highlighted-filters-list": "Evidenziato: $1",
+       "rcfilters-quickfilters": "Filtre riggistrate",
+       "rcfilters-quickfilters-placeholder-title": "Nisciuno filtro riggistrato",
+       "rcfilters-savedqueries-defaultlabel": "Filtre riggistrate",
+       "rcfilters-savedqueries-rename": "Renommena",
+       "rcfilters-savedqueries-setdefault": "Mpustà comme predefinito",
+       "rcfilters-savedqueries-unsetdefault": "Léva cumme predefinito",
+       "rcfilters-savedqueries-remove": "Scancèlla",
+       "rcfilters-savedqueries-new-name-label": "Nomme",
+       "rcfilters-savedqueries-apply-label": "Crea filtro",
+       "rcfilters-savedqueries-cancel-label": "Scancella",
+       "rcfilters-clear-all-filters": "Pulezza tutt' 'e filtre",
+       "rcfilters-show-new-changes": "Vide 'e cagnamiente cchiù nnove",
+       "rcfilters-invalid-filter": "Filtro invalido",
+       "rcfilters-filterlist-title": "Filtre",
+       "rcfilters-filterlist-whatsthis": "Cumme funzionano?",
+       "rcfilters-highlightbutton-title": "Evidenzia risultate",
+       "rcfilters-filterlist-noresults": "Nisciuno filtro truvato",
+       "rcfilters-filtergroup-authorship": "Autore d' 'o cuntribbuto",
+       "rcfilters-filtergroup-lastRevision": "Ùrdeme verziune",
+       "rcfilters-filter-lastrevision-label": "Verzione 'e mmo",
        "rcnotefrom": "Ccà abbascio {{PLURAL:$5|è alencato 'o cagnamiento appurtato|song' alincate 'e cagnamiente appurtate}} 'a <strong>$3, $4</strong> (mmustate nfin'a <strong>$1</strong>).",
        "rclistfrom": "Faje vedé 'e cagnamiénte fatte a partì 'a $3 $2",
        "rcshowhideminor": "$1 'e cagnamiénte piccerille",
index 359d8b7..05206d8 100644 (file)
        "redirect-file": "Filnavn",
        "redirect-logid": "Logg-ID",
        "redirect-not-exists": "Verdi er ikke funnet",
+       "redirect-not-numeric": "Verdien er ikke numerisk",
        "fileduplicatesearch": "Søk etter duplikatfiler",
        "fileduplicatesearch-summary": "Søk etter duplikatfiler basert på dets hash-verdi.",
        "fileduplicatesearch-filename": "Filnavn:",
index 5b810ea..89db104 100644 (file)
@@ -29,7 +29,8 @@
                        "Drjpoudel",
                        "Fitoschido",
                        "Nabin Sapkota",
-                       "Tulsi Bhagat"
+                       "Tulsi Bhagat",
+                       "ديفيد"
                ]
        },
        "tog-underline": "रेखाङ्कित लिङ्क:",
index 5831b82..c238105 100644 (file)
@@ -90,7 +90,8 @@
                        "MarcoSwart",
                        "Pahles",
                        "Optilete",
-                       "Goefie"
+                       "Goefie",
+                       "AHmed Khaled"
                ]
        },
        "tog-underline": "Verwijzingen onderstrepen:",
        "botpasswords-invalid-name": "De gebruikersnaam bevat niet het scheidingsteken van het botwachtwoord (\"$1\").",
        "botpasswords-not-exist": "Gebruiker \"$1\" heeft geen botwachtwoord genaamd \"$2\"",
        "botpasswords-needs-reset": "Het botwachtwoord voor botnaam \"$2\" van {{GENDER:$1|gebruiker}} \"$1\" moet opnieuw worden ingesteld.",
+       "botpasswords-locked": "U kunt uzelf niet aanmelden met een botwachtwoord omdat uw account is vergrendeld.",
        "resetpass_forbidden": "Wachtwoorden kunnen niet gewijzigd worden",
        "resetpass_forbidden-reason": "Wachtwoorden kunnen niet gewijzigd worden: $1",
        "resetpass-no-info": "U dient aangemeld zijn voordat u deze pagina kunt gebruiken.",
        "move-page-legend": "Pagina hernoemen",
        "movepagetext": "Door middel van het onderstaande formulier kunt u een pagina hernoemen.\nDe geschiedenis gaat mee naar de nieuwe pagina.\n* De oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.\n* Koppelingen naar de oude pagina worden niet aangepast.\n* De pagina's die doorverwijzen naar de oorspronkelijke paginanaam worden automatisch bijgewerkt.\nAls u dit niet wenst, controleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.\n\nEen pagina kan <strong>alleen</strong> hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.\n\n<strong>Opmerking:</strong>\nVoor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.\nZorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
        "movepagetext-noredirectfixer": "Door middel van het onderstaande formulier kunt u een pagina en alle bijbehorende oude versies hernoemen.\nDe oude naam wordt automatisch een doorverwijzing naar de nieuwe pagina.\nControleer dan of er geen [[Special:DoubleRedirects|dubbele]] of [[Special:BrokenRedirects|onjuiste doorverwijzingen]] zijn ontstaan.\n\nEen pagina kan <strong>alleen</strong> hernoemd worden als de nieuwe paginanaam niet bestaat of een doorverwijspagina zonder verdere geschiedenis is.\nU kunt dus een pagina die per ongeluk is hernoemd terug hernoemen en u kunt een bestaande pagina niet overschrijven. \n\n<strong>Opmerking:</strong>\nVoor veel bekeken pagina's kan het hernoemen drastische en onvoorziene gevolgen hebben.\nZorg ervoor dat u die gevolgen overziet voordat u deze handeling uitvoert.",
-       "movepagetalktext": "Als u het onderstaande vinkje selecteert, krijgt de bijbehorende overlegpagina automatisch een andere naam, tenzij de overlegpagina onder de nieuwe naam al bestaat.\n\nIn dit geval moet u de pagina handmatig hernoemen of samenvoegen.",
+       "movepagetalktext": "Als u deze optie inschakelt krijgt de bijbehorende overlegpagina automatisch een andere naam, tenzij de overlegpagina onder de nieuwe naam al bestaat.\n\nIn dit geval moet u de pagina handmatig hernoemen of samenvoegen.",
        "moveuserpage-warning": "'''Waarschuwing:''' u gaat een gebruikerspagina hernoemen. Houd er rekening mee dat alleen de pagina wordt hernoemd, ''niet'' de gebruiker.",
        "movecategorypage-warning": "<strong>Waarschuwing:</strong> U staat op het punt een categoriepagina te hernoemen. Houdt u er rekening mee dat alleen de categoriepagina zelf hernoemd wordt; pagina's in de oude categorie worden <em>niet</em> automatisch naar de nieuwe verplaatst.",
        "movenologintext": "U moet [[Special:UserLogin|aangemeld]] zijn om een pagina te hernoemen.",
        "confirm-unwatch-top": "Deze pagina verwijderen uit uw volglijst?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Bewerkingen op deze pagina ongedaan maken?",
+       "confirm-mcrrestore-title": "Een versie terugplaatsen",
        "confirm-mcrundo-title": "Een wijziging ongedaan maken",
        "mcrundofailed": "Ongedaan maken mislukt",
        "mcrundo-missingparam": "Er ontbreken nodige parameters in het verzoek.",
        "redirect-file": "Bestandsnaam",
        "redirect-logid": "Logboekregel-ID",
        "redirect-not-exists": "Waarde niet gevonden",
+       "redirect-not-numeric": "Waarde is geen nummer",
        "fileduplicatesearch": "Duplicaatbestanden zoeken",
        "fileduplicatesearch-summary": "Duplicaatbestanden zoeken op basis van de hashwaarde.",
        "fileduplicatesearch-filename": "Bestandsnaam:",
        "edit-error-long": "Fouten:\n\n$1",
        "revid": "versie $1",
        "pageid": "Pagina-ID $1",
-       "interfaceadmin-info": "$1\n\nRechten voor het bewerken van wikibrede CSS/JS/JSON bestanden zijn recentelijk gescheiden van het <code>editinterface</code> recht. Als u niet begrijpt waarom u deze foutmelding te zien krijgt, ga dan naar [[mw:MediaWiki_1.32/interface-admin]].",
+       "interfaceadmin-info": "$1\n\nRechten voor het bewerken van wikibrede CSS/JS/JSON-bestanden zijn recentelijk gescheiden van het <code>editinterface</code> recht. Als u niet begrijpt waarom u deze foutmelding te zien krijgt, ga dan naar [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "&lt;html&gt; tags kunnen alleen op normale pagina's geplaatst worden.",
        "gotointerwiki": "{{SITENAME}} verlaten",
        "gotointerwiki-invalid": "De opgegeven titel is ongeldig.",
index 71640d5..b3fc56c 100644 (file)
        "rcfilters-filter-bots-description": "Endringar gjorde med automatiske verktøy.",
        "rcfilters-filter-humans-label": "Menneske (ikkje robot)",
        "rcfilters-filter-humans-description": "Endringar gjorde av menneske.",
+       "rcfilters-filtergroup-reviewstatus": "Granskingsstode",
+       "rcfilters-filter-reviewstatus-unpatrolled-description": "Endringar som ikkje er manuelt eller automatisk merkte som patruljerte.",
+       "rcfilters-filter-reviewstatus-manual-description": "Endringar som manuelt er merkte som patruljerte.",
+       "rcfilters-filter-reviewstatus-auto-description": "Endringar av vidarekomne brukarar som automatisk får arbeidet sitt merkt som patruljert.",
        "rcfilters-filtergroup-significance": "Vekt",
        "rcfilters-filter-minor-label": "Småplukk",
        "rcfilters-filter-minor-description": "Endringar merkte som småplukk av forfattaren.",
        "pageinfo-category-files": "Tal filer",
        "markaspatrolleddiff": "Merk som patruljert",
        "markaspatrolledtext": "Merk innhaldssida som patruljert",
+       "markaspatrolledtext-file": "Merk filversjonen som patruljert",
        "markedaspatrolled": "Merk som patruljert",
        "markedaspatrolledtext": "Den valde versjonen av [[:$1]] er vorten merkt som patruljert.",
        "rcpatroldisabled": "Siste-endringar-patruljering er deaktivert",
        "markedaspatrollederrornotify": "Det gjekk ikkje å merkja endringa som patruljert.",
        "patrol-log-page": "Patruljeringslogg",
        "patrol-log-header": "Dette er ein logg over patruljerte sideversjonar.",
+       "confirm-markpatrolled-top": "Merk versjon $3 av $2 som patruljert?",
        "deletedrevision": "Slett gammal versjon $1",
        "filedeleteerror-short": "Feil ved sletting av fila: $1",
        "filedeleteerror-long": "Det vart ein feil under filslettinga av:\n\n$1",
        "newimages-summary": "Denne spesialsida syner dei sist opplasta filene.",
        "newimages-legend": "Filnamn",
        "newimages-label": "Filnamn (eller ein del av det):",
+       "newimages-user": "IP-adresse eller brukarnamn",
+       "newimages-newbies": "Berre vis opplastingar frå nye kontoar",
+       "newimages-showbots": "Vis opplastingar av robotar",
+       "newimages-hidepatrolled": "Gøym patruljerte opplastingar",
        "noimages": "Her er ingen filer som kan visast.",
        "ilsubmit": "Søk",
        "bydate": "etter dato",
        "mediastatistics-table-extensions": "Mogelege filendingar",
        "mediastatistics-table-count": "Tal filer",
        "mediastatistics-header-unknown": "Ukjende",
+       "mediastatistics-header-bitmap": "Bitmap-bilete",
+       "mediastatistics-header-drawing": "Teikningar (vektorbilete)",
        "mediastatistics-header-audio": "Lyd",
        "mediastatistics-header-video": "Videoar",
        "mediastatistics-header-multimedia": "Rike media",
index 1751fdd..340a33a 100644 (file)
        "version-skin-colheader-name": "ସ୍କିନ",
        "version-ext-colheader-version": "ସଂସ୍କରଣ",
        "version-ext-colheader-license": "ଲାଇସେନ୍ସ",
-       "version-ext-colheader-description": "ବର୍ଣନା",
+       "version-ext-colheader-description": "ବରà­\8dଣà­\8dଣନା",
        "version-ext-colheader-credits": "ଲେଖକମାନେ",
        "version-license-title": "$1 ପାଇଁ ଲାଇସେନ୍ସ",
        "version-license-not-found": "ଏହି ଏକ୍ସଟେନସନରେ କୌଣସି ସବିଶେଷ ସୂଚନା ନାହିଁ ।",
index 20164c0..3aa864a 100644 (file)
        "note": "'''Hiwes:'''",
        "previewnote": "'''Deng'g drõõ, dasses nua e Vorschau isch.'''\nDoi Ännarunge sinn noch nedd gschbaischadd worre!",
        "editing": "An de Said $1 schaffe",
-       "creating": "Magschd $1",
+       "creating": "$1 aaleche",
        "editingsection": "$1 schaffe (Deel)",
        "editingcomment": "$1 schaffe (Deel)",
        "editconflict": "Schdraid ums Ännare: $1",
index 1e73153..bf8fcde 100644 (file)
        "botpasswords-invalid-name": "Określona nazwa użytkownika nie zawiera separatora hasła bota (\"$1\").",
        "botpasswords-not-exist": "Użytkownik \"$1\" nie ma hasła dla bota o nazwie \"$2\".",
        "botpasswords-needs-reset": "Hasło dla bota o nazwie „$2” {{GENDER:$1|użytkownika|użytkowniczki}} „$1” musi zostać zresetowane.",
+       "botpasswords-locked": "Nie możesz zalogować się przy użyciu hasła bota, ponieważ Twoje konto jest zablokowane.",
        "resetpass_forbidden": "Hasła nie mogą zostać zmienione",
        "resetpass_forbidden-reason": "Hasła nie mogą zostać zmienione: $1",
        "resetpass-no-info": "Musisz być zalogowany, by uzyskać bezpośredni dostęp do tej strony.",
        "right-suppressionlog": "Podgląd rejestru ukrywania",
        "right-block": "Blokowanie użytkownikom możliwości edycji",
        "right-blockemail": "Blokowanie użytkownikom możliwości wysyłania wiadomości",
-       "right-hideuser": "Blokowanie użytkownika, niewidoczne publicznie",
+       "right-hideuser": "Blokowanie użytkownika i ukrywanie od publiczności",
        "right-ipblock-exempt": "Obejście blokad, automatycznych blokad i blokad zakresów adresów IP",
        "right-unblockself": "Odblokowanie samego siebie",
        "right-protect": "Zmiana poziomu zabezpieczenia i edycja stron zabezpieczonych kaskadowo",
        "right-editinterface": "Edycja interfejsu użytkownika",
        "right-editusercss": "Edycja plików CSS innych użytkowników",
        "right-edituserjson": "Edycja plików JSON innych użytkowników",
-       "right-edituserjs": "Edycja plików JS innych użytkowników",
+       "right-edituserjs": "Edycja plików JavaScript innych użytkowników",
        "right-editsitecss": "Edycja plików CSS projektu",
        "right-editsitejson": "Edycja plików JSON projektu",
        "right-editsitejs": "Edycja plików JavaScript projektu",
        "spam_blanking": "Wszystkie wersje zawierały odnośniki do $1. Czyszczenie strony.",
        "spam_deleting": "Wszystkie wersje zawierały linki do $1, usuwam.",
        "simpleantispam-label": "Filtr antyspamowy.\n<strong>Nie</strong> wpisuj tu nic!",
-       "pageinfo-title": "Informacje o „$1”",
+       "pageinfo-title": "Informacje o stronie „$1”",
        "pageinfo-not-current": "Niestety, te informacje nie są dostępne dla starych wersji stron.",
        "pageinfo-header-basic": "Podstawowe informacje",
        "pageinfo-header-edits": "Historia edycji",
        "confirm-unwatch-top": "Usunąć tę stronę z listy obserwowanych?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Wycofać edycje tej strony?",
+       "confirm-mcrrestore-title": "Odtwórz wersję",
        "confirm-mcrundo-title": "Cofnij zmianę",
        "mcrundofailed": "Cofnięcie nie powiodło się",
        "mcrundo-missingparam": "W żądaniu nie podano wymaganych parametrów.",
        "mcrundo-changed": "Strona została zmodyfikowana w czasie w którym {{GRAMMAR:|przeglądałeś|przeglądałaś}} różnicę. Sprawdź nową zmianę.",
+       "mcrundo-parse-failed": "Parsowanie nowej nie powiodło się: $1",
        "percent": "$1%",
        "quotation-marks": "„$1”",
        "imgmultipageprev": "← poprzednia strona",
index 9a0b8f6..6fc3143 100644 (file)
        "botpasswords-invalid-name": "O nome de usuário especificado não contém o separador de senha de robô (\"$1\").",
        "botpasswords-not-exist": "O usuário \"$1\" não possui uma senha de robô \"$2\".",
        "botpasswords-needs-reset": "A senha do robô de nome \"$2\" {{GENDER:$1|do usuário|da usuária}} \"$1\" deve ser redefinida.",
+       "botpasswords-locked": "Você não pode entrar com uma senha de bot, pois sua conta está bloqueada.",
        "resetpass_forbidden": "As senhas não podem ser alteradas",
        "resetpass_forbidden-reason": "Senhas não podem ser alteradas: $1",
        "resetpass-no-info": "Você precisa estar autenticado para acessar esta página diretamente.",
        "confirm-unwatch-top": "Remover esta página das páginas vigiadas?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Reverter edições nesta página?",
+       "confirm-mcrrestore-title": "Restaurar uma revisão",
        "confirm-mcrundo-title": "Desfazer uma mudança",
        "mcrundofailed": "A reversão falhou",
        "mcrundo-missingparam": "Faltam parâmetros obrigatórios no pedido.",
        "mcrundo-changed": "Esta página foi alterada desde que começou a ver as diferenças. Reveja a nova mudança, por favor.",
+       "mcrundo-parse-failed": "Falha ao analisar a nova revisão: $1",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "redirect-file": "Nome do arquivo",
        "redirect-logid": "ID de log",
        "redirect-not-exists": "Valor não encontrado",
+       "redirect-not-numeric": "Valor não numérico",
        "fileduplicatesearch": "Procurar por arquivos duplicados",
        "fileduplicatesearch-summary": "Procure por arquivos duplicados tendo por base seu valor \"hash\".",
        "fileduplicatesearch-filename": "Nome do arquivo:",
        "edit-error-long": "Erros:\n$1",
        "revid": "revisão $1",
        "pageid": "ID da página $1",
-       "interfaceadmin-info": "$1\n\nAs permissões de edição de arquivos CSS/JS/JSON que afetam todo o ''site'' foram recentemente separadas do privilégio <code>editinterface</code>. Se não compreende porque está a receber este erro, consulte [[mw:MediaWiki_1.32/interface-admin]].",
+       "interfaceadmin-info": "$1\n\nAs permissões para edição de arquivos CSS/JS/JSON em todo o site foram separadas recentemente do direito <code>editinterface</code>. Se você não entende porque está recebendo este erro, veja [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "As tags &lt;html&gt; não podem ser usadas fora das páginas normais.",
        "gotointerwiki": "Saindo {{SITENAME}}",
        "gotointerwiki-invalid": "O título especificado é inválido.",
index 3fe7135..9b8fa98 100644 (file)
        "botpasswords-invalid-name": "O nome de utilizador especificado não contém o separador de palavra-passe de robô (\"$1\").",
        "botpasswords-not-exist": "O utilizador \"$1\" não tem uma palavra-passe para o robô chamado \"$2\".",
        "botpasswords-needs-reset": "A palavra-passe do robô de nome \"$2\" {{GENDER:$1|do utilizador|da utilizadora}} \"$1\" deve ser redefinida.",
+       "botpasswords-locked": "Não pode entrar com uma palavra-passe de robô porque a sua conta está bloqueada.",
        "resetpass_forbidden": "As palavras-passe não podem ser alteradas",
        "resetpass_forbidden-reason": "As palavras-passe não podem ser alteradas: $1",
        "resetpass-no-info": "Precisa de iniciar sessão para aceder diretamente a esta página.",
        "confirm-unwatch-top": "Remover esta página da lista de páginas vigiadas?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Reverter as edições desta página?",
+       "confirm-mcrrestore-title": "Restaurar uma revisão",
        "confirm-mcrundo-title": "Desfazer uma mudança",
        "mcrundofailed": "A reversão falhou",
        "mcrundo-missingparam": "Faltam parâmetros obrigatórios no pedido.",
        "mcrundo-changed": "Esta página foi alterada desde que começou a ver as diferenças. Reveja a nova mudança, por favor.",
+       "mcrundo-parse-failed": "Falha na análise sintática da nova revisão: $1",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← página anterior",
        "imgmultipagenext": "página seguinte →",
        "redirect-file": "Nome do ficheiro",
        "redirect-logid": "Identificador da entrada do registo",
        "redirect-not-exists": "Valor não encontrado",
+       "redirect-not-numeric": "Valor não numérico",
        "fileduplicatesearch": "Pesquisa de ficheiros duplicados",
        "fileduplicatesearch-summary": "Pesquisa de ficheiros duplicados baseada no resumo criptográfico.",
        "fileduplicatesearch-filename": "Nome do ficheiro:",
index 4bb5fc4..eeb0a1c 100644 (file)
        "botpasswords-invalid-name": "Error message when a username lacking the separator character is passed to BotPassword. Parameters:\n* $1 - The separator character.",
        "botpasswords-not-exist": "Error message when a username exists but does not a bot password for the given \"bot name\". Parameters:\n* $1 - username\n* $2 - bot name",
        "botpasswords-needs-reset": "Error message when a bot password exists but needs to be reset. Parameters:\n* $1 - username\n* $2 - bot name",
+       "botpasswords-locked": "Shown in the event that the underlying account is locked",
        "resetpass_forbidden": "Used as error message in changing password. Maybe the external auth plugin won't allow local password changes.",
        "resetpass_forbidden-reason": "Like {{msg-mw|resetpass_forbidden}} but the auth provider gave a reason.\n\nParameters:\n* $1 - reason given by auth provider",
        "resetpass-no-info": "Error message for [[Special:ChangePassword]].\n\nParameters:\n* $1 (unused) - a link to [[Special:UserLogin]] with {{msg-mw|loginreqlink}} as link description",
        "confirm-unwatch-top": "Used as confirmation message.",
        "confirm-rollback-button": "Used as Submit button text.\n{{Identical|OK}}",
        "confirm-rollback-top": "Used as confirmation message.",
+       "confirm-mcrrestore-title": "Title for the editless restore form.",
        "confirm-mcrundo-title": "Title for the editless undo form.",
        "mcrundofailed": "Title of the error page when an editless undo fails.",
        "mcrundo-missingparam": "Error displayed when parameters for action=mcrundo are missing",
        "mcrundo-changed": "Message displayed when the page has been edited between the loading and submission of an editless undo.",
+       "mcrundo-parse-failed": "Error message indicating that the page's content can not be parsed because it is syntactically invalid. This may occurr for content types using serialization or a strict markup syntax.\n\nParameters:\n* $1 – specific error message",
        "semicolon-separator": "{{optional}}",
        "comma-separator": "{{optional}}\n\nWarning: languages have different usages of punctuation, and sometimes they are swapped (e.g. openining and closing quotation marks, or full stop and colon in Armenian), or change their form (the full stop in Chinese and Japanese, the prefered \"colon\" in Armenian used in fact as the regular full stop, the comma in Arabic, Armenian, and Chinese...)\n\nTheir spacing (before or after) may also vary across languages (for example French requires a non-breaking space, preferably narrow if the browser supports NNBSP, on the inner side of some punctuations like quotation/question/exclamation marks, colon, and semicolons).",
        "colon-separator": "{{optional}}\nChange it only if your language uses another character for ':' or it needs an extra space before the colon.",
        "redirect-file": "Description of lookup type for [[Special:Redirect]].\n{{Identical|Filename}}",
        "redirect-logid": "Description of lookup type for [[Special:Redirect]].\n{{Identical|Log ID}}",
        "redirect-not-exists": "Used as error message in [[Special:Redirect]]",
+       "redirect-not-numeric": "Used as error message in [[Special:Redirect]]",
        "fileduplicatesearch": "Name of special page [[Special:FileDuplicateSearch]].",
        "fileduplicatesearch-summary": "Summary of [[Special:FileDuplicateSearch]]",
        "fileduplicatesearch-filename": "Input form of [[Special:FileDuplicateSearch]]:\n\n{{Identical|Filename}}",
index 7fdfdbb..803e37a 100644 (file)
@@ -11,7 +11,8 @@
                        "Purodha",
                        "Fitoschido",
                        "Ruthven",
-                       "Matěj Suchánek"
+                       "Matěj Suchánek",
+                       "Vlad5250"
                ]
        },
        "tog-underline": "Collegaminde sottolinèate:",
        "customcssprotected": "Non ge tine 'u permesse pe cangià sta pàgene de CSS, purcè tène otre configurazione personale.",
        "customjsonprotected": "Non ge tine 'u permesse pe cangià sta pàgene de JSON, purcè tène otre configurazione personale.",
        "customjsprotected": "Non ge tine 'u permesse pe cangià sta pàgene de Javascript, purcè tène otre configurazione personale.",
+       "sitecssprotected": "Non ge tìne le permesse pe cangià sta pàgene CSS purcé pò avè effette sus a tutte le visitature.",
+       "sitejsonprotected": "Non ge tìne le permesse pe cangià sta pàgene JSON purcé pò avè effette sus a tutte le visitature.",
+       "sitejsprotected": "Non ge tìne le permesse pe cangià sta pàgene JavaScript purcé pò avè effette sus a tutte le visitature.",
        "mycustomcssprotected": "Non ge tìne le permesse pe cangià sta pàgene CSS",
+       "mycustomjsonprotected": "Non ge tìne le permesse pe cangià sta pàgene JSON.",
        "mycustomjsprotected": "Non ge tìne le permesse pe cangià sta pàgene JavaScript",
        "myprivateinfoprotected": "Non ge tìne le permesse pe cangià le 'mbormaziune private tune.",
        "mypreferencesprotected": "Non ge tìne le permesse pe cangià le preferenze tune.",
        "botpasswords-updated-body": "'A passuord pu bot de nome \"$1\" de l'{{GENDER:$2|utende}} \"$2\" ha state aggiornate.",
        "botpasswords-deleted-title": "Passuord d'u bot scangellate",
        "botpasswords-deleted-body": "'A passuord pu bot de nome \"$1\" de l'{{GENDER:$2|utende \"$2\"}} ha state scangellate.",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider non g'è disponibbile.",
        "botpasswords-restriction-failed": "Le restrizziuyne de passuord bot non ge fanne trasè.",
        "botpasswords-invalid-name": "'U nome de l'utende mise non ge tène 'u separatore pe passuord bot (\"$1\").",
        "resetpass_forbidden": "Le Password non ge ponne cangià",
        "default": "defolt",
        "prefs-files": "Fails",
        "prefs-custom-css": "CSS Personalizzete",
+       "prefs-custom-json": "JSON personalizzate",
        "prefs-custom-js": "JS Personalizzete",
        "prefs-common-config": "CSS/JSON/JavaScript condivise pe tutte le sfonde:",
        "prefs-reset-intro": "Tu puè ausà sta pàgene pe azzerà le preferenze tue a quidde de default d'u site.\nQuiste non ge pò essere annullate.",
        "prefs-dateformat": "Formate d'a data",
        "prefs-timeoffset": "Differenze d'orarie",
        "prefs-advancedediting": "Opziune avanzate",
+       "prefs-developertools": "Struminde pe le sviluppature",
        "prefs-editor": "Cangiatore",
        "prefs-preview": "Andeprime",
        "prefs-advancedrc": "Opzione avanzate",
+       "prefs-opt-out": "Disattivazzione de le miglioraminde",
        "prefs-advancedrendering": "Opzione avanzate",
        "prefs-advancedsearchoptions": "Opzione avanzate",
        "prefs-advancedwatchlist": "Opzione avanzate",
        "right-ipblock-exempt": "Zumbe le blocche de l'IP, auto blocche e le blocche a indervalle",
        "right-unblockself": "Sbluecche da sule",
        "right-protect": "Cange le levèlle de protezione e cange le pàggene prutette",
-       "right-editprotected": "Cange le pàggene prutette (senza protezzione a cascata)",
+       "right-editprotected": "Cange le pàggene prutette cumme a \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Cange le pàggene prutette cumme a \"{{int:protect-level-autoconfirmed}}\"",
        "right-editcontentmodel": "Cange 'u modelle de condenute de 'na pàgene",
        "right-editinterface": "Cange l'inderfacce utende",
        "right-editusercss": "Cange 'u CSS de l'otre utinde",
+       "right-edituserjson": "Cange 'u JSON de l'otre utinde",
        "right-edituserjs": "Cange 'u JS de l'otre utinde",
        "right-editmyusercss": "Cange le file tune de CSS",
+       "right-editmyuserjson": "Cange le file tune de JSON",
        "right-editmyuserjs": "Cange le file tune de JavaScript",
        "right-viewmywatchlist": "'Ndruche le pàggene condrollate tune",
        "right-editmywatchlist": "Cange le pàggene condrollate tune. Vide bbuene ca certe aziune vonne a aggiungere pàggene pure ca non ge stonne le deritte.",
        "rcfilters-filter-minor-label": "Cangiaminde stuèdeche",
        "rcfilters-filter-watchlist-watched-label": "Jndr'à le pàggene condrollate",
        "rcfilters-filter-watchlist-notwatched-label": "Fore da le pàggene condrollate",
+       "rcfilters-filtergroup-watchlistactivity": "Attività de le pàggene condrollate",
        "rcfilters-filter-watchlistactivity-unseen-label": "Cangiaminde ca non g'è 'ndrucate",
        "rcfilters-filter-watchlistactivity-seen-label": "Cangiaminde 'ndrucate",
        "rcfilters-filtergroup-changetype": "Tipe de cangiamende",
        "uploadstash-errclear": "'A pulizie de le file non g'ha riuscite.",
        "uploadstash-refresh": "Aggiorne l'elenghe de le file",
        "uploadstash-thumbnail": "'ndruche 'a miniature",
+       "uploadstash-bad-path": "'U percorse non g'esiste.",
        "uploadstash-bad-path-invalid": "Percorse invalide.",
        "uploadstash-bad-path-unknown-type": "Tipe scanusciute \"$1\".",
        "uploadstash-bad-path-unrecognized-thumb-name": "Nome d'a miniature non acchiate.",
        "uctop": "(de mò)",
        "month": "Da 'u mese (e cchiù recende):",
        "year": "Da l'anne (e cchiù recende):",
+       "date": "Da 'a date (e cchiù recende):",
        "sp-contributions-newbies": "Fà vedè sulamende le condrebbute de le utinde nueve",
        "sp-contributions-newbies-sub": "Pe l'utinde nuève",
        "sp-contributions-newbies-title": "Condrebbute de l'utinde pe le cunde utinde nuéve",
        "version-specialpages": "Pàggene speciele",
        "version-parserhooks": "Hook analizzature",
        "version-variables": "Variabbele",
+       "version-editors": "Cangiature",
        "version-antispam": "Previzione d'u spam",
        "version-api": "API",
        "version-other": "Otre",
        "redirect-file": "Nome d'u file",
        "redirect-logid": "ID de l'archivije",
        "redirect-not-exists": "Valore non acchiate",
+       "redirect-not-numeric": "Valore none numereche",
        "fileduplicatesearch": "Cirche pe le file duplichete",
        "fileduplicatesearch-summary": "Cirche pe file duplichete sus a base d'u valore hash.",
        "fileduplicatesearch-filename": "Nome d'u faile:",
        "tag-filter-submit": "Filtre",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Tag}}]]: $2)",
        "tag-mw-contentmodelchange": "cangiamende d'u modelle de condenute",
+       "tag-mw-contentmodelchange-description": "Cangiaminde ca [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:ChangeContentModel cangiane 'u modelle de le condenute] de 'na pàgene",
+       "tag-mw-new-redirect": "Reindirizzamende nuève",
+       "tag-mw-undo": "Annulle",
        "tags-title": "Tag",
        "tags-intro": "Sta pàgene elenghe le tag ca 'u software pò marcà cu 'nu cangiamende e 'u lore significate.",
        "tags-tag": "Nome d'u tag",
        "mw-widgets-usersmultiselect-placeholder": "Aggiunge de cchiù...",
        "date-range-from": "Da 'a date:",
        "date-range-to": "'Mbonde 'a date:",
+       "sessionprovider-generic": "$1 sessiune",
+       "sessionprovider-mediawiki-session-cookiesessionprovider": "sessiune ca se appoggiane sus a le cookie",
        "randomrootpage": "Pàgene prengepàle a uecchije",
        "log-action-filter-block": "Tipe de blocche:",
        "log-action-filter-contentmodel": "Tipe de cangiamende d'u modelle de condenute:",
        "log-action-filter-managetags-delete": "Scangellazzione d'u tag",
        "log-action-filter-managetags-activate": "Attivazione d'u tag",
        "log-action-filter-managetags-deactivate": "Disattivazione d'u tag",
+       "log-action-filter-newusers-create": "Ccrejazzione da 'utende senza nome",
+       "log-action-filter-newusers-create2": "Ccrejazzione da 'utende reggistrate",
+       "log-action-filter-newusers-autocreate": "Ccrejazione automateche",
        "log-action-filter-rights-rights": "Cangiamende a màne",
        "log-action-filter-rights-autopromote": "Cangiamende automateche",
        "log-action-filter-suppress-event": "Soppressione de l'archivije",
        "rawhtml-notallowed": "Le tag &lt;html&gt; non ge ponne essere ausate fore da le pàggene normale.",
        "gotointerwiki": "Ste lasse {{SITENAME}}",
        "gotointerwiki-invalid": "'U titole specificate non g'è valide.",
-       "pagedata-bad-title": "Titole invalide: $1."
+       "pagedata-bad-title": "Titole invalide: $1.",
+       "passwordpolicies-group": "Gruppe",
+       "passwordpolicies-policies": "Politeche"
 }
index 9d90fb4..8f2586c 100644 (file)
        "sort-descending": "Упорядочить по убыванию",
        "sort-ascending": "Упорядочить по возрастанию",
        "nstab-main": "Статья",
-       "nstab-user": "Участник",
+       "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Участник|Участница}}",
        "nstab-media": "Мультимедиа",
        "nstab-special": "Служебная страница",
        "nstab-project": "О проекте",
        "botpasswords-invalid-name": "Указанное имя участника не содержит разделителя для пароля бота («$1»).",
        "botpasswords-not-exist": "У участника «$1» нет пароля для бота с названием «$2».",
        "botpasswords-needs-reset": "Пароль для бота «$1» {{GENDER:$2|участника|участницы}} «$2» должен быть сброшен.",
+       "botpasswords-locked": "Вы не можете войти в систему с паролем бота, поскольку ваша учётная запись заблокирована.",
        "resetpass_forbidden": "Пароль не может быть изменён",
        "resetpass_forbidden-reason": "Пароли не могут быть изменены: $1",
        "resetpass-no-info": "Чтобы обращаться непосредственно к этой странице, вам следует представиться системе.",
        "permissionserrorstext-withaction": "У вас нет прав на выполнение действия «$2» по {{PLURAL:$1|1=следующей причине|следующим причинам}}:",
        "contentmodelediterror": "Вы не можете редактировать эту версию, поскольку модель её содержания — <code>$1</code>, отличающаяся от текущей модели содержания страницы — <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Внимание: Вы пытаетесь воссоздать страницу, которая ранее удалялась.</strong>\n\nПроверьте, действительно ли вам нужно воссоздавать эту страницу.\nНиже для справки приведены журналы удаления и переименований этой страницы.",
-       "moveddeleted-notice": "ЭÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð±Ñ\8bла Ñ\83далена.\nÐ\9dиже Ð´Ð»Ñ\8f Ñ\81пÑ\80авки Ð¿Ñ\80иведенÑ\8b Ð¶Ñ\83Ñ\80налÑ\8b Ñ\83далениÑ\8f, Ð·Ð°Ñ\89иÑ\82Ñ\8b Ð¸ Ð¿ÐµÑ\80емеÑ\89ения для этой страницы.",
-       "moveddeleted-notice-recent": "Ð\9a Ñ\81ожалениÑ\8e, Ñ\8dÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð±Ñ\8bла Ð½ÐµÐ´Ð°Ð²Ð½Ð¾ Ñ\83далена (в Ñ\82еÑ\87ение Ð¿Ð¾Ñ\81ледниÑ\85 24 Ñ\87аÑ\81ов).\nÐ\9dиже Ð´Ð»Ñ\8f Ñ\81пÑ\80авки Ð¿Ñ\80иведенÑ\8b Ð¶Ñ\83Ñ\80налÑ\8b Ñ\83далениÑ\8f, Ð·Ð°Ñ\89иÑ\82Ñ\8b Ð¸ Ð¿ÐµÑ\80емеÑ\89ения для этой страницы.",
+       "moveddeleted-notice": "ЭÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð±Ñ\8bла Ñ\83далена.\nÐ\9dиже Ð´Ð»Ñ\8f Ñ\81пÑ\80авки Ð¿Ñ\80иведенÑ\8b Ð¶Ñ\83Ñ\80налÑ\8b Ñ\83далениÑ\8f, Ð·Ð°Ñ\89иÑ\82Ñ\8b Ð¸ Ð¿ÐµÑ\80еименования для этой страницы.",
+       "moveddeleted-notice-recent": "Ð\9a Ñ\81ожалениÑ\8e, Ñ\8dÑ\82а Ñ\81Ñ\82Ñ\80аниÑ\86а Ð±Ñ\8bла Ð½ÐµÐ´Ð°Ð²Ð½Ð¾ Ñ\83далена (в Ñ\82еÑ\87ение Ð¿Ð¾Ñ\81ледниÑ\85 24 Ñ\87аÑ\81ов).\nÐ\9dиже Ð´Ð»Ñ\8f Ñ\81пÑ\80авки Ð¿Ñ\80иведенÑ\8b Ð¶Ñ\83Ñ\80налÑ\8b Ñ\83далениÑ\8f, Ð·Ð°Ñ\89иÑ\82Ñ\8b Ð¸ Ð¿ÐµÑ\80еименования для этой страницы.",
        "log-fulllog": "Просмотреть журнал целиком",
        "edit-hook-aborted": "Правка отменена процедурой-перехватчиком.\nДополнительных разъяснений не приведено.",
        "edit-gone-missing": "Невозможно обновить страницу.\nВероятно, она была удалена.",
        "redirect-file": "Название файла",
        "redirect-logid": "ID журнала",
        "redirect-not-exists": "Значение не найдено",
+       "redirect-not-numeric": "Значение не числовое",
        "fileduplicatesearch": "Поиск одинаковых файлов",
        "fileduplicatesearch-summary": "Поиск одинаковых файлов по хэш-коду.",
        "fileduplicatesearch-filename": "Имя файла:",
index 1a81188..ba7acd8 100644 (file)
        "right-move": "Переменованя сторінок",
        "right-move-subpages": "Переменованя сторінок і їх підсторінок",
        "right-move-rootuserpages": "Переменованя корінёвых сторінок хоснователїв",
+       "right-move-categorypages": "Переменованя сторінок катеґорій",
        "right-movefile": "Переменовати файлы",
        "right-suppressredirect": "Нестворіня напрямлїня про переменоваю сторінкы",
        "right-upload": "Наладовованя файлів",
        "right-editinterface": "Едітованя інтерфейсу хоснователя",
        "right-editusercss": "Едітованя CSS файлів іншых хоснователїв",
        "right-edituserjson": "Едітованя JSON файлів іншых хоснователїв",
-       "right-edituserjs": "Едітованя JS файлів іншых хоснователїв",
+       "right-edituserjs": "Едітованя JavaScript файлів іншых хоснователїв",
        "right-editmyusercss": "Едітовати вашы властны хосновательскы CSS файлы.",
        "right-editmyuserjson": "Едітовати вашы властны хосновательскы JSON файлы",
        "right-editmyuserjs": "Едітовати вашы властны хосновательскы JavaScript файлы",
        "right-siteadmin": "Замыкана і одомыканя датабазы",
        "right-override-export-depth": "Експорт сторінок включаючі звязаны сторінкы з глубков до 5",
        "right-sendemail": "Посыланя пошты іншым хоснователям",
+       "right-applychangetags": "Придаваня [[Special:Tags|значок]] до властных змін",
        "newuserlogpage": "Лоґ вытварянь хоснователїв",
        "newuserlogpagetext": "Тото є список ново реґістрованых хоснователїв.",
        "rightslog": "Лоґ хосновательскых прав",
        "action-move": "Переменовати тоту сторінку",
        "action-move-subpages": "переменованя той сторінкы зо вшыткыма єй підсторінками",
        "action-move-rootuserpages": "переменовати корінёвы сторінкы хостователїв",
+       "action-move-categorypages": "переменованя сторінок катеґорій",
        "action-movefile": "переменовати тот файл",
        "action-upload": "наладовати тот файл",
        "action-reupload": "переписати тот екзістуючій файл",
index 3f8abdf..77524a4 100644 (file)
@@ -16,7 +16,8 @@
                        "Pippinu",
                        "Macofe",
                        "S4b1nuz E.656",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "Vlad5250"
                ]
        },
        "tog-underline": "Suttalìnia li lijami:",
        "right-editcontentmodel": "Canciari lu mudellu di cuntinutu di na pàggina",
        "right-editinterface": "Canciari la ntirfaccia utenti",
        "right-editusercss": "Canciari li file CSS di l'àutri utenti",
+       "right-edituserjson": "Canciari li file JSON di l'àutri utenti",
        "right-edituserjs": "Canciari li file JavaScript di l'àutri utenti",
        "right-editmyusercss": "Canciari li file CSS dû propiu utenti",
+       "right-editmyuserjson": "Canciari li file JSON dû propiu utenti",
        "right-editmyuserjs": "Canciari li file JavaScript dû propiu utenti",
        "right-viewmywatchlist": "Taliari la propia lista taliata",
        "right-editmywatchlist": "Canciari la propia lista taliata. Nota chi certi azzioni ci ponnu agghiùnciri pàggini macari senza di stu drittu.",
index 3df66d9..b552e57 100644 (file)
        "rollback": "ترميمن کي واپس ورايو",
        "rollbacklink": "واپس ورايو",
        "rollbacklinkcount": "اڻڪريو $1 {{PLURAL:$1|ترميم|ترميمون}}",
+       "revertpage": "ترميمون واپس ڪيون [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]]) [[User:$1|$1]] جي آخري ترميمن ڏانهن",
        "changecontentmodel-title-label": "صفحي جو عنوان",
        "changecontentmodel-reason-label": "سبب:",
        "logentry-contentmodel-change-revertlink": "واپس ورايو",
index 975271a..3e75864 100644 (file)
@@ -17,7 +17,8 @@
                        "Сербијана",
                        "Acamicamacaraca",
                        "Fitoschido",
-                       "BadDog"
+                       "BadDog",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Podvuci linkove:",
index 55a27ed..5630e92 100644 (file)
        "prefs-info": "بنیادی معلومات",
        "prefs-i18n": "بین الاقوامیت",
        "prefs-signature": "دستخط",
-       "prefs-dateformat": "تارÛ\8cØ® Ø¯Û\8c ØªØ±ØªÛ\8cب",
+       "prefs-dateformat": "تریخ دی ترتیب",
        "prefs-timeoffset": "وقت دی ترتیب",
        "prefs-advancedediting": "عام آپشن",
        "prefs-editor": "خانہ ترمیم",
        "upload-form-label-usage-filename": "فائل دا ناں",
        "upload-form-label-own-work": "یہ میݙا ذاتی کم ہے",
        "upload-form-label-infoform-categories": "ونکیاں",
-       "upload-form-label-infoform-date": "تارÛ\8cØ®",
+       "upload-form-label-infoform-date": "تریخ",
        "backend-fail-delete": "مِسَل \"$1\" کوں مٹایا نی ونڄ سڳیا۔",
        "license": "اجازت نامہ:",
        "license-header": "اجازہ کاری",
        "imgfile": "فائل",
        "listfiles": "فائل لسٹ",
        "listfiles_thumb": "تھمب نیل",
-       "listfiles_date": "تارÛ\8cØ®",
+       "listfiles_date": "تریخ",
        "listfiles_name": "ناں",
        "listfiles_user": "ورتݨ والا",
        "listfiles_size": "حجم",
        "listfiles-latestversion-no": "کو",
        "file-anchor-link": "فائل",
        "filehist": "فائل دا تاریخچہ",
-       "filehist-help": "Ú©Û\81Û\8cÚº Ø®Ø§Øµ Ù\88Û\8cÙ\84Û\92 ØªÛ\92 ØªØ§Ø±Û\8cØ® Ú©Ù\88Úº Ù\81ائÙ\84 Ú©Û\8cÙ\86Ù\98Ù\88Û\8cÚº  Ù\86ظردÛ\8c Û\81ائÛ\8cØ\8c Ý\99Û\8cکھݨ Ú©Û\8cتÛ\92 Ø§Ù\88Úº Ù\88Û\8cÙ\84Û\92 ØªÛ\92 Ú©Ù\84Ú© Ú©Ø±Ù\88Û\94",
+       "filehist-help": "کہیں خاص ویلے تے تریخ کوں فائل کین٘ویں  نظردی ہائی، ݙیکھݨ کیتے اوں ویلے تے کلک کرو۔",
        "filehist-deleteall": "سارے مٹاؤ",
        "filehist-deleteone": "مٹاؤ",
        "filehist-revert": "واپس",
        "pageinfo-redirects-name": "رجوعاں  دی تعداد",
        "pageinfo-subpages-name": "ایں ورقے دے ذیلی ورقیاں دی تعداد",
        "pageinfo-firstuser": "ورقہ ساز",
-       "pageinfo-firsttime": "Ù\88رÙ\82Û\81 Ø¨Ý¨Ý¨ Ø¯Û\8c ØªØ§Ø±Û\8cØ®",
+       "pageinfo-firsttime": "ورقہ بݨݨ دی تریخ",
        "pageinfo-lastuser": "چھیکڑی ترمیم کنندہ",
-       "pageinfo-lasttime": "Ú\86Ú¾Û\8cÚ©Ú\91Û\8c ØªØ±Ù\85Û\8cÙ\85 Ø¯Û\8c ØªØ§Ø±Û\8cØ®",
+       "pageinfo-lasttime": "چھیکڑی ترمیم دی تریخ",
        "pageinfo-edits": "ترامیم دی مجموعی تعداد",
        "pageinfo-authors": "مختلف مصنفین دی  تعداد",
        "pageinfo-recent-edits": "حالیہ ترامیم دی تعداد (گزشتہ $1 وچ)",
        "exif-orientation": "اورینٹیشن",
        "exif-xresolution": "افقی ریزولوشن",
        "exif-yresolution": "عمودی ریزولیشن",
-       "exif-datetime": "Ù\81ائÙ\84 Ø¨Ø¯Ù\84ݨ Ø¯Û\8c ØªØ§Ø±Û\8cØ® ØªÛ\92 Ù\88Û\8cÙ\84ا",
+       "exif-datetime": "فائل بدلݨ دی تریخ تے ویلا",
        "exif-make": "کیمرہ ساز کمپنی",
        "exif-model": "کیمرے دا ماڈل",
        "exif-software": "مستعمل سافٹ ویئر",
        "exif-exifversion": "اکزیف ورژن",
        "exif-colorspace": "رنگ فضا",
-       "exif-datetimeoriginal": "Ú\88Û\8cٹا Ø¨Ý¨Ø§Ù\88ݨ Ø¯Û\8c ØªØ§Ø±Û\8cØ® ØªÛ\92 Ù\88Û\8cÙ\84ا",
+       "exif-datetimeoriginal": "ڈیٹا بݨاوݨ دی تریخ تے ویلا",
        "exif-datetimedigitized": "ڈجیٹائزنگ دا ویلہ تے تریخ",
        "exif-orientation-1": "عام",
        "namespacesall": "یکے",
index be9789d..c560bee 100644 (file)
@@ -16,7 +16,8 @@
                        "NegativeTwelveDollars",
                        "Xð",
                        "HairyFotr",
-                       "Upwinxp"
+                       "Upwinxp",
+                       "Vlad5250"
                ]
        },
        "tog-underline": "Podčrtavanje povezav:",
        "botpasswords-invalid-name": "Navedeno uporabniško ime ne vsebuje ločila za geslo bota (»$1«).",
        "botpasswords-not-exist": "Uporabnik »$1« nima gesla bota z imenom »$2«.",
        "botpasswords-needs-reset": "Geslo bota »$2« {{GENDER:$1|uporabnika|uporabnice}} »$1« mora biti ponastavljeno.",
+       "botpasswords-locked": "Ne morete se prijaviti z geslom bota, ker je vaš račun zaklenjen.",
        "resetpass_forbidden": "Gesla ne morete spremeniti",
        "resetpass_forbidden-reason": "Gesel nismo mogli spremeniti: $1",
        "resetpass-no-info": "Za neposreden dostop do te strani morate biti prijavljeni.",
        "right-editsemiprotected": "Urejanje strani, zaščitenih kot »{{int:protect-level-autoconfirmed}}«",
        "right-editcontentmodel": "Urejanje vsebinskega modela strani",
        "right-editinterface": "Urejanje uporabniškega vmesnika",
-       "right-editusercss": "Uredi CSS datotek drugih uporabnikov",
+       "right-editusercss": "Urejanje CSS datotek drugih uporabnikov",
        "right-edituserjson": "Urejanje JSON-datotek drugih uporabnikov",
-       "right-edituserjs": "Uredi JS datotek drugih uporabnikov",
+       "right-edituserjs": "Urejanje JavaScript datotek drugih uporabnikov",
        "right-editsitecss": "Urejanje CSS spletišča",
        "right-editsitejson": "Urejanje JSON spletišča",
        "right-editsitejs": "Urejanje JavaScripta spletišča",
        "confirm-unwatch-top": "Odstranim stran z vašega spiska nadzorov?",
        "confirm-rollback-button": "V redu",
        "confirm-rollback-top": "Povrnemo urejanja te strani?",
+       "confirm-mcrrestore-title": "Obnovi redakcijo",
        "confirm-mcrundo-title": "Razveljavi spremembo",
        "mcrundofailed": "Razveljavitev ni uspela",
        "mcrundo-missingparam": "Pri zahtevi manjkajo zahtevani parametri.",
        "mcrundo-changed": "Stran je bila spremenjena, odkar ste si ogledali primerjavo. Prosimo, preglejte nove spremembe.",
+       "mcrundo-parse-failed": "Razčlenjevanje nove redakcije je spodletelo: $1",
        "percent": "$1&#160;%",
        "quotation-marks": "»$1«",
        "imgmultipageprev": "← prejšnja stran",
        "redirect-file": "Ime datoteke",
        "redirect-logid": "ID dnevnika",
        "redirect-not-exists": "Vrednosti ni mogoče najti",
+       "redirect-not-numeric": "Vrednost ni številska",
        "fileduplicatesearch": "Iskanje podvojenih datotek",
        "fileduplicatesearch-summary": "Iskanje podvojenih datotek, ki temelji na podlagi njenih hashvrednosti.",
        "fileduplicatesearch-filename": "Ime datoteke:",
index bef87ba..5a618f5 100644 (file)
        "category-file-count": "{{PLURAL:$2|1=Ова категорија садржи само следећу датотеку.|{{PLURAL:$1|1=Следећа датотека је|Следеће $1 датотеке су|Следећих $1 датотека је}} у овој категорији, од укупно $2.}}",
        "category-file-count-limited": "{{PLURAL:$1|1=Следећа датотека је|Следеће $1 датотеке су|Следећих $1 датотека је}} у овој категорији.",
        "listingcontinuesabbrev": "наст.",
-       "index-category": "Ð\9fопиÑ\81ане странице",
+       "index-category": "Ð\98ндекÑ\81иÑ\80ане странице",
        "noindex-category": "Непописане странице",
        "broken-file-category": "Странице са неисправним везама до датотека",
        "categoryviewer-pagedlinks": "$1 ($2)",
        "tagline": "Извор: {{SITENAME}}",
        "help": "Помоћ",
        "search": "Претрага",
-       "search-ignored-headings": " #<!-- Ð½Ðµ Ð¼ÐµÑ\9aаÑ\98Ñ\82е Ð½Ð¸Ñ\88Ñ\82а Ñ\83 Ð¾Ð²Ð¾Ð¼ Ñ\80едÑ\83 --> <pre>\n# Ð\9dаÑ\81лови ÐºÐ¾Ñ\98и Ñ\9bе Ð±Ð¸Ñ\82и Ð·Ð°Ð½ÐµÐ¼Ð°Ñ\80ени Ð¿Ñ\80и Ð¿Ñ\80еÑ\82Ñ\80ази.\n# Ð\9fÑ\80омене Ñ\81Ñ\83 Ð²Ð¸Ð´Ñ\99иве Ð¾Ð´Ð¼Ð°Ñ\85 Ð½Ð°ÐºÐ¾Ð½ Ñ\88Ñ\82о Ñ\81е Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81а Ð½Ð°Ñ\81ловом Ð¿Ð¾Ð¿Ð¸Ñ\88е.\n# Ð\9cожеÑ\82е Ð¸Ð·Ð½Ñ\83диÑ\82и Ð¿Ð¾Ð½Ð¾Ð²Ð½Ð¾ Ð¿Ð¾Ð¿Ð¸Ñ\81ивање „нултом” изменом.\n# Синтакса је следећа:\n#  * Сваки ред који започиње знаком „#” је коментар.\n#  * Сваки не празни ред је тачан наслов који ће бити занемарен, с тим да се разликују мала и велика слова и све остало\nРеференце\nСпољашње везе\nТакође погледајте\n #</pre> <!-- не мењајте ништа у овом реду -->",
+       "search-ignored-headings": " #<!-- Ð½Ðµ Ð¼ÐµÑ\9aаÑ\98Ñ\82е Ð½Ð¸Ñ\88Ñ\82а Ñ\83 Ð¾Ð²Ð¾Ð¼ Ñ\80едÑ\83 --> <pre>\n# Ð\9dаÑ\81лови ÐºÐ¾Ñ\98и Ñ\9bе Ð±Ð¸Ñ\82и Ð·Ð°Ð½ÐµÐ¼Ð°Ñ\80ени Ð¿Ñ\80и Ð¿Ñ\80еÑ\82Ñ\80ази.\n# Ð\9fÑ\80омене Ñ\81Ñ\83 Ð²Ð¸Ð´Ñ\99иве Ð¾Ð´Ð¼Ð°Ñ\85 Ð½Ð°ÐºÐ¾Ð½ Ñ\88Ñ\82о Ñ\81е Ñ\81Ñ\82Ñ\80аниÑ\86а Ñ\81а Ð½Ð°Ñ\81ловом Ð¸Ð½Ð´ÐµÐºÑ\81иÑ\80а.\n# Ð\9cожеÑ\82е Ð¸Ð·Ð½Ñ\83диÑ\82и Ð¿Ð¾Ð½Ð¾Ð²Ð½Ð¾ Ð¸Ð½Ð´ÐµÐºÑ\81иÑ\80ање „нултом” изменом.\n# Синтакса је следећа:\n#  * Сваки ред који започиње знаком „#” је коментар.\n#  * Сваки не празни ред је тачан наслов који ће бити занемарен, с тим да се разликују мала и велика слова и све остало\nРеференце\nСпољашње везе\nТакође погледајте\n #</pre> <!-- не мењајте ништа у овом реду -->",
        "searchbutton": "Претражи",
        "go": "Иди",
        "searcharticle": "Иди",
        "jumpto": "Иди на:",
        "jumptonavigation": "навигацију",
        "jumptosearch": "претрагу",
-       "view-pool-error": "Ð\9dажалоÑ\81Ñ\82, Ñ\81еÑ\80веÑ\80и Ñ\81Ñ\83 Ñ\82Ñ\80енÑ\83Ñ\82но Ð¿Ñ\80еопÑ\82еÑ\80еÑ\9bени.\nÐ\9fÑ\80евиÑ\88е ÐºÐ¾Ñ\80иÑ\81ника Ð¿Ð¾ÐºÑ\83Ñ\88ава Ð´Ð° Ð¿Ñ\80егледа ову страницу.\nСачекајте неко време пре него што поново покушате да јој приступите.\n\n$1",
-       "generic-pool-error": "Ð\9dажалоÑ\81Ñ\82, Ñ\81еÑ\80веÑ\80и Ñ\81Ñ\83 Ñ\82Ñ\80енÑ\83Ñ\82но Ð¿Ñ\80еопÑ\82еÑ\80еÑ\9bени.\nÐ\9fÑ\80евиÑ\88е ÐºÐ¾Ñ\80иÑ\81ника Ð¿Ð¾ÐºÑ\83Ñ\88ава Ð´Ð° Ð¿Ð¾Ð³Ð»ÐµÐ´Ð° овај ресурс.\nСачекајте неко време пре него што поново покушате да му приступите.",
+       "view-pool-error": "СеÑ\80веÑ\80и Ñ\81Ñ\83 Ñ\82Ñ\80енÑ\83Ñ\82но Ð¿Ñ\80еопÑ\82еÑ\80еÑ\9bени.\nÐ\9fÑ\80евиÑ\88е ÐºÐ¾Ñ\80иÑ\81ника Ð¿Ð¾ÐºÑ\83Ñ\88ава Ð´Ð° Ð²Ð¸Ð´Ð¸ ову страницу.\nСачекајте неко време пре него што поново покушате да јој приступите.\n\n$1",
+       "generic-pool-error": "СеÑ\80веÑ\80и Ñ\81Ñ\83 Ñ\82Ñ\80енÑ\83Ñ\82но Ð¿Ñ\80еопÑ\82еÑ\80еÑ\9bени.\nÐ\9fÑ\80евиÑ\88е ÐºÐ¾Ñ\80иÑ\81ника Ð¿Ð¾ÐºÑ\83Ñ\88ава Ð´Ð° Ð²Ð¸Ð´Ð¸ овај ресурс.\nСачекајте неко време пре него што поново покушате да му приступите.",
        "pool-timeout": "Истек времена чека на закључавање",
        "pool-queuefull": "Ред је пун захтева",
        "pool-errorunknown": "Непозната грешка",
        "internalerror": "Унутрашња грешка",
        "internalerror_info": "Унутрашња грешка: $1",
        "internalerror-fatal-exception": "Грешка необрађеног изузетка типа „$1“",
-       "filecopyerror": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° ÐºÐ¾Ð¿Ð¸Ñ\80ам Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c Ñ\83 â\80\9e$2â\80\9c.",
-       "filerenameerror": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80еименÑ\83Ñ\98ем Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c Ñ\83 â\80\9e$2â\80\9c.",
-       "filedeleteerror": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c.",
-       "directorycreateerror": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\98Ñ\83м â\80\9e$1â\80\9c.",
+       "filecopyerror": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе ÐºÐ¾Ð¿Ð¸Ñ\80аÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d Ñ\83 â\80\9e$2â\80\9d.",
+       "filerenameerror": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80еименоваÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d Ñ\83 â\80\9e$2â\80\9d.",
+       "filedeleteerror": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.",
+       "directorycreateerror": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\98Ñ\83м â\80\9e$1â\80\9d.",
        "directoryreadonlyerror": "Директоријум „$1“ је само за читање.",
        "directorynotreadableerror": "Директоријум „$1“ није читљив.",
-       "filenotfound": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80онаÑ\92ем Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c.",
+       "filenotfound": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80онаÑ\9bи Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.",
        "unexpected": "Неочекивана вредност: „$1“=„$2“.",
-       "formerror": "Ð\93Ñ\80еÑ\88ка: Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99ем образац.",
+       "formerror": "Ð\93Ñ\80еÑ\88ка: Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ð¾Ñ\81лаÑ\82и образац.",
        "badarticleerror": "Ова радња се не може извршити на овој страници.",
-       "cannotdelete": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð¸Ð»Ð¸ Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c.\nМогуће је да ју је неко већ избрисао.",
-       "cannotdelete-title": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 â\80\9e$1â\80\9c",
+       "cannotdelete": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ð¸Ð»Ð¸ Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.\nМогуће је да ју је неко већ избрисао.",
+       "cannotdelete-title": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 â\80\9e$1â\80\9d",
        "delete-hook-aborted": "Брисање је прекинула кука.\nНије дато никакво образложење.",
-       "no-null-revision": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим Ð½Ð¾Ð²Ñ\83 Ð½Ð¸Ñ\88Ñ\82авнÑ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86е â\80\9e$1â\80\9c",
+       "no-null-revision": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и Ð½Ð¾Ð²Ñ\83 Ð½Ð¸Ñ\88Ñ\82авнÑ\83 Ð¸Ð·Ð¼ÐµÐ½Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86е â\80\9e$1â\80\9d",
        "badtitle": "Лош наслов",
        "badtitletext": "Тражени наслов странице је неважећи, празан или је погрешно повезан међујезички или међувики наслов.\nМожда садржи један или више знакова који се не могу користити у насловима.",
        "title-invalid-empty": "Тражено име странице је празно или садржи само назив именског простора.",
        "mycustomjsprotected": "Немате дозволу да уређујете ову страницу с јаваскриптом.",
        "myprivateinfoprotected": "Немате дозволу да уређујете своје приватне информације.",
        "mypreferencesprotected": "Немате дозволу да уређујете своја подешавања.",
-       "ns-specialprotected": "Ð\9fоÑ\81ебне Ñ\81Ñ\82Ñ\80аниÑ\86е Ñ\81е Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ñ\83Ñ\80еÑ\92иваÑ\82и.",
+       "ns-specialprotected": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\83Ñ\80еÑ\92иваÑ\82и Ð¿Ð¾Ñ\81ебне Ñ\81Ñ\82Ñ\80аниÑ\86е.",
        "titleprotected": "Овај назив је [[User:$1|$1]] заштитио од прављења. Разлог: <em>$2</em>.",
        "filereadonlyerror": "Не могу да изменим датотеку „$1“ јер је ризница „$2“ у режиму за читање.\n\nСистемски администратор је навео следеће објашњење: „$3“.",
        "invalidtitle": "Неважећи наслов",
        "cannotlogin-text": "Пријава није могућа",
        "cannotloginnow-title": "Пријава тренутно није могућа",
        "cannotloginnow-text": "Пријава није могућа када се користи $1.",
-       "cannotcreateaccount-title": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им налоге",
+       "cannotcreateaccount-title": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82воÑ\80иÑ\82и налоге",
        "cannotcreateaccount-text": "Директно отварање налога није омогућено на овом викију.",
        "yourdomainname": "Домен:",
        "password-change-forbidden": "Не можете да промените лозинку на овом викију.",
        "userexists": "Унесено корисничко име је већ у употреби.\nОдаберите друго.",
        "loginerror": "Грешка при пријављивању",
        "createacct-error": "Дошло је до грешке при отварању налога",
-       "createaccounterror": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им Ð½Ð°Ð»Ð¾Ð³: $1.",
+       "createaccounterror": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82воÑ\80иÑ\82и Ð½Ð°Ð»Ð¾Ð³: $1",
        "nocookiesnew": "Кориснички налог је отворен, али нисте пријављени.\n{{SITENAME}} користи колачиће за пријаву. Вама су колачићи онемогућени.\nОмогућите их, па се онда пријавите са својим корисничким именом и лозинком.",
        "nocookieslogin": "{{SITENAME}} користи колачиће за пријављивање корисника.\nВама су колачићи онемогућени. Омогућите их и покушајте поново.",
        "nocookiesfornew": "Кориснички налог није отворен јер његов извор није потврђен.\nОмогућите колачиће на прегледачу и поново учитајте страницу.",
        "wrongpasswordempty": "Нисте унели лозинку. Покушајте поново.",
        "passwordtooshort": "Лозинка мора имати најмање {{PLURAL:$1|један знак|$1 знака|$1 знакова}}.",
        "passwordtoolong": "Лозинке не могу бити дуже од {{PLURAL:$1|$1 знака|$1 знакова}}.",
-       "passwordtoopopular": "ЧеÑ\81Ñ\82о Ð¾Ð´Ð°Ð±Ñ\80ане Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81е ÐºÐ¾Ñ\80иÑ\81Ñ\82е. Одаберите лозинку коју је теже погодити.",
+       "passwordtoopopular": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82и Ñ\87еÑ\81Ñ\82о Ð¾Ð´Ð°Ð±Ñ\80ане Ð»Ð¾Ð·Ð¸Ð½Ðºе. Одаберите лозинку коју је теже погодити.",
        "password-name-match": "Лозинка се мора разликовати од корисничког имена.",
        "password-login-forbidden": "Коришћење овог корисничког имена и лозинке је забрањено.",
        "mailmypassword": "Ресетуј лозинку",
        "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу IP адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога}} претходни $2, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове IP адресе тренутно не могу отворити више налога.",
        "emailauthenticated": "Ваша имејл-адреса је потврђена на дан $2 у $3 ч.",
        "emailnotauthenticated": "Ваша имејл-адреса још није потврђена.\nНиједан имејл неће да буде послат ни у једном од следећих случајева.",
-       "noemailprefs": "Наведите имејл-адресу у својим подешавањима за оспособљавање ових могућности.",
+       "noemailprefs": "Наведите имејл-адресу у подешавањима за оспособљавање ових функција.",
        "emailconfirmlink": "Потврдите своју имејл-адресу",
        "invalidemailaddress": "Имејл-адреса не може да буде прихваћена јер је у неважећем облику.\nУнесите исправну адресу или оставите празно поље.",
-       "cannotchangeemail": "Ð\98меÑ\98л-адÑ\80еÑ\81е Ð½Ð°Ð»Ð¾Ð³Ð° Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81е Ð¿Ñ\80омене Ð½Ð° Ð¾Ð²Ð¾Ð¼ Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83.",
+       "cannotchangeemail": "Ð\9dа Ð¾Ð²Ð¾Ð¼ Ð²Ð¸ÐºÐ¸Ñ\98Ñ\83 Ð½Ð¸Ñ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80омениÑ\82и Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81е Ð½Ð°Ð»Ð¾Ð³Ð°.",
        "emaildisabled": "Овај сајт не може да шаље имејлове.",
        "accountcreated": "Налог је отворен",
        "accountcreatedtext": "Кориснички налог [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) је отворен.",
        "botpasswords-no-provider": "BotPasswordsSessionProvider није доступан.",
        "botpasswords-restriction-failed": "Не можете се пријавити због ограничења лозинки за ботове.",
        "botpasswords-not-exist": "Корисник „$1“ нема лозинку бота „$2“.",
-       "resetpass_forbidden": "Не могу да променим лозинке",
-       "resetpass_forbidden-reason": "Не могу да променим лозинке: $1",
+       "botpasswords-locked": "Не можете да се пријавите са лозинком бота пошто је ваш налог закључан.",
+       "resetpass_forbidden": "Није могуће променити лозинке",
+       "resetpass_forbidden-reason": "Није могуће променити лозинке: $1",
        "resetpass-no-info": "Морате бити пријављени да бисте приступили овој страници.",
        "resetpass-submit-loggedin": "Промени лозинку",
        "resetpass-submit-cancel": "Откажи",
-       "resetpass-wrong-oldpass": "Неважећа привремена или актуелна лозинка.\nМожда сте већ променили лозинку или сте захтевали нову привремену лозинку.",
+       "resetpass-wrong-oldpass": "Неважећа привремена или тренутна лозинка.\nМожда сте већ променили лозинку или сте захтевали нову привремену лозинку.",
        "resetpass-recycled": "Унели сте садашњу лозинку, да бисте променили лозинку морате унети нову.",
        "resetpass-temp-emailed": "Пријавили сте се са привременим кодом из имејла.\nДа бисте завршили пријављивање морате поставити нову лозинку овде:",
        "resetpass-temp-password": "Привремена лозинка:",
        "changeemail-no-info": "Морате бити пријављени да бисте приступили овој страници.",
        "changeemail-oldemail": "Актуелна имејл-адреса:",
        "changeemail-newemail": "Нова имејл-адреса:",
-       "changeemail-newemail-help": "Ово поље би требало да оставите празно ако желите да уклоните вашу имејл адресу. Нећете бити у могућности да ресетујете заборављену лозинку и нећете примати мејлове од овог викија ако је имејл адреса уклоњена.",
+       "changeemail-newemail-help": "Ово поље треба да оставите празно ако желите да уклоните своју имејл-адресу. Нећете бити у могућности да ресетујете заборављену лозинку и нећете примати имејлове са овог викија ако је имејл-адреса уклоњена.",
        "changeemail-none": "(ништа)",
        "changeemail-password": "Ваша лозинка за пројекат {{SITENAME}}:",
        "changeemail-submit": "Промени имејл",
        "savechanges": "Сачувај промене",
        "publishpage": "Објави страницу",
        "publishchanges": "Објави промене",
-       "savearticle-start": "Сачувај страницу...",
-       "savechanges-start": "Сачувај промене...",
+       "savearticle-start": "Сачувај страницу",
+       "savechanges-start": "Сачувај промене",
        "publishpage-start": "Објави страницу...",
-       "publishchanges-start": "Објави промене...",
+       "publishchanges-start": "Објави промене",
        "preview": "Претпреглед",
        "showpreview": "Прикажи претпреглед",
        "showdiff": "Прикажи промене",
        "subject-preview": "Преглед теме:",
        "previewerrortext": "Дошло је до грешке при покушају прегледа промена.",
        "blockedtitle": "Корисник је блокиран",
-       "blockedtext": "<strong>Ваше корисничко име или IP адреса је блокирана.</strong>\n\nБлокаду је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Блокирани: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте дискутовали о блокади.\nНе можете да користите могућност „{{int:emailuser}}” осим ако сте навели валидну имејл адресу у својим [[Special:Preferences|подешавањима налога]] и нисте блокирани од коришћења исте.\nВаша актуелна IP адреса је $3, а ID блокаде #$5.\nНаведите све горње детаље при прављењу било каквих упита.",
-       "autoblockedtext": "Ваша IP адреса је аутоматски блокирана јер ју је користио други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Почетак блокаде: $8\n* Крај блокаде: $6\n* Име корисника: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте расправљали о блокади.\n\nЗапамтите да не можете да користите могућност „{{int:emailuser}}“ осим ако сте навели ваљану имејл адресу у својим [[Special:Preferences|подешавањима]].\n\nВаша актуелна IP адреса је $3, а ID блокаде $5.\nУкључите све горње детаље при прављењу било каквих упита.",
+       "blockedtext": "<strong>Ваше корисничко име или IP адреса је блокирана.</strong>\n\nБлокаду је {{GENDER:$4|извршио|извршила}} $1.\nРазлог је <em>$2</em>.\n\n* Почетак блокаде: $8\n* Истек блокаде: $6\n* Блокирани: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте дискутовали о блокади.\nНе можете да користите функцију „{{int:emailuser}}” осим ако сте навели валидну имејл-адресу у својим [[Special:Preferences|подешавањима налога]] и нисте блокирани од коришћења исте.\nВаша тренутна IP адреса је $3, а ID блокаде #$5.\nНаведите све горње детаље при прављењу било каквих упита.",
+       "autoblockedtext": "Ваша IP адреса је аутоматски блокирана јер ју је користио други корисник, кога је {{GENDER:$4|блокирао|блокирала}} $1.\nРазлог:\n\n:<em>$2</em>\n\n* Почетак блокаде: $8\n* Крај блокаде: $6\n* Име корисника: $7\n\nМожете да контактирате {{GENDER:$4|корисника|корисницу}} $1 или другог [[{{MediaWiki:Grouppage-sysop}}|администратора]] да бисте расправљали о блокади.\n\nЗапамтите да не можете да користите функцију „{{int:emailuser}}“ осим ако сте навели важећу имејл-адресу у својим [[Special:Preferences|подешавањима]].\n\nВаша тренутна IP адреса је $3, а ID блокаде $5.\nУкључите све горње детаље при прављењу било каквих упита.",
        "blockednoreason": "разлог није наведен",
        "whitelistedittext": "$1 да бисте уређивали странице.",
        "confirmedittext": "Морате да потврдите своју имејл адресу пре уређивања страница.\nПоставите и потврдите имејл адресу преко [[Special:Preferences|подешавања]].",
-       "nosuchsectiontitle": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80онаÑ\92ем Ð¾Ð´ÐµÑ\99ак.",
+       "nosuchsectiontitle": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80онаÑ\9bи Ð¾Ð´ÐµÑ\99ак",
        "nosuchsectiontext": "Покушали сте да уредите одељак који не постоји.\nМожда је премештен или избрисан док сте прегледали страницу.",
        "loginreqtitle": "Потребна је пријава",
        "loginreqlink": "Пријавите се",
        "loginreqpagetext": "$1 да бисте видели друге странице.",
        "accmailtitle": "Лозинка је послата.",
-       "accmailtext": "Ð\9bозинка Ð·Ð° {{GENDER:$1|коÑ\80иÑ\81ника|коÑ\80иÑ\81ниÑ\86Ñ\83}} [[User talk:$1|$1]] Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а Ð½Ð° $2. Ð\9dакон Ð¿Ñ\80иÑ\98аве, Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ñ\81е Ð¼Ð¾Ð¶Ðµ Ð¿Ñ\80омениÑ\82и [[Special:ChangePassword|овде]].",
+       "accmailtext": "Ð\9dаÑ\81Ñ\83миÑ\87но Ð³ÐµÐ½ÐµÑ\80иÑ\81ана Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ð·Ð° ÐºÐ¾Ñ\80иÑ\81ника [[User talk:$1|$1]] Ð¿Ð¾Ñ\81лаÑ\82а Ñ\98е Ð½Ð° $2. Ð\9dакон Ð¿Ñ\80иÑ\98аве, Ð»Ð¾Ð·Ð¸Ð½ÐºÐ° Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ñ\81е Ð¿Ñ\80омени Ð½Ð° Ñ\81Ñ\82Ñ\80аниÑ\86и <em>[[Special:ChangePassword|Ð\9fÑ\80омена Ð»Ð¾Ð·Ð¸Ð½ÐºÐµ]]</em>.",
        "newarticle": "(нови)",
        "newarticletext": "Дошли сте на страницу која још не постоји.\nДа бисте је направили, почните да куцате у прозор испод овог текста (погледајте [$1 страницу за помоћ]).\nАко сте овде дошли грешком, вратите се на претходну страницу.",
        "anontalkpagetext": "----\n<em>Ово је страница за разговор с анонимним корисником који још нема налог или га не користи.</em>\nЗбог тога морамо да користимо бројчану IP адресу како бисмо га препознали.\nТакву адресу може делити више корисника.\nАко сте анонимни корисник и мислите да су вам упућене примедбе, [[Special:CreateAccount|отворите налог]] или се [[Special:UserLogin|пријавите]] да бисте избегли будућу забуну с осталим анонимним корисницима.",
        "noarticletext": "На овој страници тренутно нема текста.\nМожете [[Special:Search/{{PAGENAME}}|потражити овај наслов]] на другим страницама,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражити сродне извештаје] или [{{fullurl:{{FULLPAGENAME}}|action=edit}} направити ову страницу]</span>.",
        "noarticletext-nopermission": "Тренутно нема текста на овој страници.\nМожете да [[Special:Search/{{PAGENAME}}|потражите овај наслов странице]] на другим страницама или <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} претражите сродне дневнике]</span>, али немате дозволу да направите ову страницу.",
        "missing-revision": "Измена бр. $1 на страници под именом „{{FULLPAGENAME}}“ не постоји.\n\nОво се обично дешава када пратите застарелу везу до странице која је избрисана.\nВише информација можете да пронађете у [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} дневнику брисања].",
-       "userpage-userdoesnotexist": "Ð\9aоÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð³ â\80\9e<nowiki>$1</nowiki>â\80\9c Ð½Ð¸Ñ\98е Ð¾Ñ\82воÑ\80ен.\nРазмиÑ\81лиÑ\82е Ð´Ð° Ð»Ð¸ Ð·Ð°Ð¸Ñ\81Ñ\82а Ð¶ÐµÐ»Ð¸Ñ\82е да направите/уредите ову страницу.",
+       "userpage-userdoesnotexist": "Ð\9aоÑ\80иÑ\81ниÑ\87ки Ð½Ð°Ð»Ð¾Ð³ â\80\9e<nowiki>$1</nowiki>â\80\9d Ð½Ð¸Ñ\98е Ñ\80егиÑ\81Ñ\82Ñ\80ован.\nРазмиÑ\81лиÑ\82е Ð¶ÐµÐ»Ð¸Ñ\82е Ð»Ð¸ Ð·Ð°Ð¸Ñ\81Ñ\82а да направите/уредите ову страницу.",
        "userpage-userdoesnotexist-view": "Кориснички налог „$1“ није отворен.",
        "blocked-notice-logextract": "Овај корисник је тренутно блокиран.\nНајновији унос у дневнику блокирања је наведен испод као референца:",
        "clearyourcache": "<strong>Напомена:</strong> Након чувања, можда ћете морати да очистите кеш меморију прегледача како бисте видели промене.\n* <strong>Фајерфокс / Сафари:</strong> Држите <em>Shift</em> и кликните на <em>Освежи</em> или притисните <em>Ctrl-F5</em> или <em>Ctrl-R</em> (<em>⌘-R</em> на Меку)\n* <strong>Гугл кроум:</strong> Притисните <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Меку)\n* <strong>Интернет експлорер:</strong> Држите <em>Ctrl</em> и кликните на <em>Освежи</em> или притисните <em>Ctrl-F5</em>\n* <strong>Опера:</strong> Идите на <em>Алатке → Подешавања</em> (<em>Опера → Подешавања</em> на Меку) и затим <em>Приватност и безбедност → Очистите податке о прегледима → Кеширане слике и датотеке</em>.",
        "contentmodelediterror": "Не можете уредити ову измену јер је њен модел садржаја <code>$1</code>, што се разликује од актуелног модела садржаја странице <code>$2</code>.",
        "recreate-moveddeleted-warn": "<strong>Упозорење: Поново правите страницу која је претходно избрисана.</strong>\n\nРазмотрите да ли је прикладно да наставите са уређивањем ове странице.\nОвде је наведен дневник брисања и премештања са образложењем:",
        "moveddeleted-notice": "Ова страница је избрисана.\nДневник брисања, заштите и премештања странице је наведен испод као референца.",
-       "moveddeleted-notice-recent": "Ð\9dажалоÑ\81Ñ\82, Ð¾ва страница је недавно избрисана (у последњих 24 сата).\nДневник брисања, заштите и премештања странице наведен је испод као референца:",
+       "moveddeleted-notice-recent": "Ð\9eва страница је недавно избрисана (у последњих 24 сата).\nДневник брисања, заштите и премештања странице наведен је испод као референца:",
        "log-fulllog": "Цео дневник",
        "edit-hook-aborted": "Измену је прекинула кука.\nНије дато никакво образложење.",
-       "edit-gone-missing": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð°Ð¶Ñ\83Ñ\80иÑ\80ам страницу.\nИзгледа да је избрисана.",
+       "edit-gone-missing": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð°Ð¶Ñ\83Ñ\80иÑ\80аÑ\82и страницу.\nИзгледа да је избрисана.",
        "edit-conflict": "Сукоб измена.",
        "edit-no-change": "Ваша измена је занемарена јер није било никаквих промена у тексту.",
        "postedit-confirmation-created": "Страница је направљена.",
        "postedit-confirmation-restored": "Страница је враћена.",
        "postedit-confirmation-saved": "Ваша измена је сачувана.",
        "postedit-confirmation-published": "Ваша измена је објављена.",
-       "edit-already-exists": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим страницу.\nИзгледа да она већ постоји.",
+       "edit-already-exists": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и Ð½Ð¾Ð²Ñ\83 страницу.\nИзгледа да она већ постоји.",
        "defaultmessagetext": "Подразумевани текст поруке",
-       "content-failed-to-parse": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\80аÑ\88Ñ\87ланим Ñ\81адÑ\80жаÑ\98 Ñ\82ипа $2 Ð·Ð° Ð¼Ð¾Ð´ÐµÐ» $1: $3",
+       "content-failed-to-parse": "РаÑ\88Ñ\87лаÑ\9aиваÑ\9aе Ñ\81адÑ\80жаÑ\98а Ñ\82ипа $2 Ð·Ð° Ð¼Ð¾Ð´ÐµÐ» $1 Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело: $3",
        "invalid-content-data": "Неважећи подаци садржаја",
        "content-not-allowed-here": "Садржај модела „$1“ није дозвољен на страници [[$2]]",
        "editwarning-warning": "Ако напустите ову страницу, изгубићете све измене које сте направили. Ако сте пријављени, можете онемогућити ово упозорење у својим подешавањима, у одељку „{{int:prefs-editing}}“.",
        "converter-manual-rule-error": "Пронађена је грешка у правилу за ручно претварање језика",
        "undo-success": "Измена се може поништити.\nПроверите разлике испод, па сачувајте измене.",
        "undo-failure": "Ова измена се не може поништити због сукоба измена.",
-       "undo-norev": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð²Ñ\80аÑ\82им измену јер не постоји или је избрисана.",
+       "undo-norev": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð²Ñ\80аÑ\82иÑ\82и измену јер не постоји или је избрисана.",
        "undo-nochange": "Изгледа да је измена већ поништена.",
        "undo-summary": "Поништена измена $1 {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]])",
        "undo-summary-username-hidden": "Поништи измену $1 скривеног корисника",
        "rev-showdeleted": "прикажи",
        "revisiondelete": "Брисање/враћање измена",
        "revdelete-nooldid-title": "Неважећа одредишна измена",
-       "revdelete-nooldid-text": "Нисте навели одредишну измену на којој треба да се изврши ова функција, та измена не постоји, или покушавате да сакријете актуелну измену.",
+       "revdelete-nooldid-text": "Нисте навели одредишну измену на којој треба да се изврши ова функција, та измена не постоји, или покушавате да сакријете тренутну измену.",
        "revdelete-no-file": "Тражена датотека не постоји.",
        "revdelete-show-file-confirm": "Јесте ли сигурни да желите да видите избрисану измену датотеке „<nowiki>$1</nowiki>“ од $2; $3?",
        "revdelete-show-file-submit": "Да",
        "revdelete-log": "Разлог:",
        "revdelete-submit": "Примени на {{PLURAL:$1|изабрану измену|изабране измене}}",
        "revdelete-success": "Видљивост измене је ажурирана.",
-       "revdelete-failure": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð°Ð¶Ñ\83Ñ\80иÑ\80ам видљивост измене:\n$1",
+       "revdelete-failure": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð°Ð¶Ñ\83Ñ\80иÑ\80аÑ\82и видљивост измене:\n$1",
        "logdelete-success": "Постављена је видљивост уноса у дневнику.",
        "logdelete-failure": "'''Не могу да поставим видљивост историје:'''\n$1",
        "revdel-restore": "промени видљивост",
        "pagehist": "Историја странице",
        "deletedhist": "Избрисана историја",
-       "revdelete-hide-current": "Грешка при сакривању ставке од $1, $2: Ово је актуелна измена.\nНе може да буде сакривена.",
+       "revdelete-hide-current": "Грешка при сакривању ставке од $1, $2: Ово је тренутна измена.\nНе може да буде сакривена.",
        "revdelete-show-no-access": "Грешка при приказивању ставке од $1, $2: означена је као „ограничена“.\nНемате приступ до ње.",
        "revdelete-modify-no-access": "Грешка при мењању ставке од $1, $2: означена је као „ограничена“.\nНемате приступ до ње.",
        "revdelete-modify-missing": "Грешка при мењању ИБ ставке $1: она не постоји у бази података.",
        "revdelete-no-change": "<strong>Упозорење:</strong> ставка од $1, $2 већ поседује затражена подешавања видљивости.",
        "revdelete-concurrent-change": "Грешка при мењању ставке од $1, $2: њен статус је у међувремену променио други корисник.\nПроверите дневник.",
-       "revdelete-only-restricted": "Грешка при сакривању ставке од $1, $2: не можете сакрити ставке од администратора без избора других могућности видљивости.",
+       "revdelete-only-restricted": "Грешка при сакривању ставке од дана $1, $2: Не можете сакрити ставке од приказа администраторима без избора једне од других опција видљивости.",
        "revdelete-reason-dropdown": "*Уобичајени разлози за брисање\n** Кршење ауторског права\n** Неприкладан коментар или лични подаци\n** Неприкладно корисничко име\n** Увредљиви подаци",
        "revdelete-otherreason": "Други/додатни разлог:",
        "revdelete-reasonotherlist": "Други разлог",
        "revdelete-edit-reasonlist": "Уреди разлоге за брисање",
        "revdelete-offender": "Аутор измене:",
        "suppressionlog": "Дневник сакривања",
-       "suppressionlogtext": "Испод се налази списак брисања и блокирања који укључује садржај сакривен од администратора. Погледајте [[Special:BlockList|списак блокирања]] за списак актуелних операција забрана и блокирања.",
+       "suppressionlogtext": "Испод се налази списак брисања и блокирања који укључује садржај сакривен од администратора. Погледајте [[Special:BlockList|списак блокирања]] за списак тренутних операција забрана и блокирања.",
        "mergehistory": "Спајање историја странице",
        "mergehistory-header": "Ова страница вам омогућава да спојите измене неке изворне странице у нову страницу.\nЗапамтите да ће ова промена оставити непромењен садржај историје странице.",
        "mergehistory-box": "Споји измене две странице:",
        "mergehistory-submit": "Споји измене",
        "mergehistory-empty": "Нема измена за спајање.",
        "mergehistory-done": "$3 {{PLURAL:$3|измена странице $1 је спојена|измене странице $1 су спојене|измена странице $1 је спојено}} у [[:$2]].",
-       "mergehistory-fail": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81поÑ\98им историје. Проверите страницу и временске параметре.",
+       "mergehistory-fail": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð²Ñ\80Ñ\88иÑ\82и Ñ\81паÑ\98аÑ\9aе историје. Проверите страницу и временске параметре.",
        "mergehistory-fail-bad-timestamp": "Временска ознака је неважећа.",
        "mergehistory-fail-invalid-source": "Изворна страница није валидна.",
        "mergehistory-fail-invalid-dest": "Одредишна страница је неважећа.",
        "mergehistory-fail-no-change": "Спајање историје није спојило ниједну измену. Проверите параметре странице и времена.",
        "mergehistory-fail-permission": "Немате овлашћење за спајање историје.",
-       "mergehistory-fail-self-merge": "Изворна и одредишна страница не могу бити исте.",
+       "mergehistory-fail-self-merge": "Изворна и одредишна страница су исте.",
        "mergehistory-fail-timestamps-overlap": "Изворне измене се преклапају или долазе након одредишних измена.",
-       "mergehistory-fail-toobig": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð²Ñ\80Ñ\88им спајање историје јер ће више од $1 {{PLURAL:$1|измене бити премештене|измена бити премештено}}.",
+       "mergehistory-fail-toobig": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð²Ñ\80Ñ\88иÑ\82и спајање историје јер ће више од $1 {{PLURAL:$1|измене бити премештене|измена бити премештено}}.",
        "mergehistory-no-source": "Изворна страница $1 не постоји.",
        "mergehistory-no-destination": "Одредишна страница $1 не постоји.",
        "mergehistory-invalid-source": "Изворна страница мора имати валидан наслов.",
        "powersearch-togglenone": "Ништа",
        "powersearch-remember": "Запамти избор за будуће претраге",
        "search-external": "Спољашња претрага",
-       "searchdisabled": "Ð\9fÑ\80еÑ\82Ñ\80ага Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bена.\nУ Ð¼ÐµÑ\92Ñ\83вÑ\80еменÑ\83 Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\82Ñ\80ажиÑ\82и Ð¿Ñ\80еко Ð\93Ñ\83гла.\nУпамÑ\82иÑ\82е Ð´Ð° Ñ\9aегови Ð¿Ð¾Ð¿Ð¸си овог викија могу бити застарели.",
+       "searchdisabled": "Ð\9fÑ\80еÑ\82Ñ\80ага Ñ\98е Ð¾Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bена.\nУ Ð¼ÐµÑ\92Ñ\83вÑ\80еменÑ\83 Ð¼Ð¾Ð¶ÐµÑ\82е Ñ\82Ñ\80ажиÑ\82и Ð¿Ñ\80еко Ð\93Ñ\83гла.\nУпамÑ\82иÑ\82е Ð´Ð° Ñ\9aегови Ð¸Ð½Ð´ÐµÐºси овог викија могу бити застарели.",
        "search-error": "Дошло је до грешке приликом претраге: $1",
        "search-warning": "Упозорење приликом претраге: $1",
        "preferences": "Подешавања",
        "prefs-skin": "Тема",
        "skin-preview": "прегледај",
        "datedefault": "Свеједно",
-       "prefs-labs": "Ð\9fÑ\80обне Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и",
+       "prefs-labs": "Ð\95кÑ\81пеÑ\80именÑ\82алне Ñ\84Ñ\83нкÑ\86иÑ\98е",
        "prefs-user-pages": "Корисничке странице",
        "prefs-personal": "Кориснички профил",
        "prefs-rc": "Скорашње измене",
        "recentchanges-summary": "Пратите недавне промене на овој страници.",
        "recentchanges-noresult": "Нема промена током датог периода а које одговарају овим критеријумима.",
        "recentchanges-timeout": "Ова претрага је истекла. Можда желите да покушате другачије параметре претраге.",
-       "recentchanges-network": "Због техничког проблема не могу да учитам резултате. Покушајте да освежите страницу.",
+       "recentchanges-network": "Због техничког проблема, није могуће учитати резултате. Покушајте да освежите страницу.",
        "recentchanges-notargetpage": "Унесите име странице изнад да бисте видели промене сродне с овом страницом",
        "recentchanges-feed-description": "Пратите најскорије промене на викију у овом фиду.",
        "recentchanges-label-newpage": "Овом изменом је направљена нова страница",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|промена|промене|промена}}, $2",
        "rcfilters-date-popup-title": "Временски период за претрагу",
        "rcfilters-days-title": "Недавни дани",
-       "rcfilters-hours-title": "СкоÑ\80аÑ\88Ñ\9aи сати",
+       "rcfilters-hours-title": "Ð\9dедавни сати",
        "rcfilters-days-show-days": "$1 {{PLURAL:$1|дан|дана}}",
        "rcfilters-days-show-hours": "$1 {{PLURAL:$1|сат|сата}}",
        "rcfilters-highlighted-filters-list": "Истакнуто: $1",
        "illegal-filename": "Назив датотеке је забрањен.",
        "overwrite": "Замењивање постојеће датотеке је забрањено.",
        "unknown-error": "Дошло је до непознате грешке.",
-       "tmp-create-error": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим привремену датотеку.",
+       "tmp-create-error": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и привремену датотеку.",
        "tmp-write-error": "Грешка при писању привремене датотеке.",
        "large-file": "Препоручљиво је да датотеке не буду веће од $1; ова датотека је $2.",
        "largefileserver": "Ова датотека прелази ограничење величине.",
-       "emptyfile": "Ð\94аÑ\82оÑ\82ека ÐºÐ¾Ñ\98Ñ\83 Ñ\81Ñ\82е Ð¿Ð¾Ñ\81лали Ñ\98е Ð¿Ñ\80азна.\nУзÑ\80ок Ð¼Ð¾Ð¶Ðµ Ð±Ð¸Ñ\82и Ð³Ñ\80еÑ\88ка Ñ\83 Ð½Ð°Ð·Ð¸Ð²Ñ\83 Ð´Ð°Ñ\82оÑ\82еке.\nÐ\9fÑ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ð·Ð°Ð¸Ñ\81Ñ\82а Ð¶ÐµÐ»Ð¸Ñ\82е Ð´Ð° Ñ\98е Ð¿Ð¾Ñ\88аÑ\99ете.",
+       "emptyfile": "Ð\94аÑ\82оÑ\82ека ÐºÐ¾Ñ\98Ñ\83 Ñ\81Ñ\82е Ð¾Ñ\82пÑ\80емили Ñ\98е Ð¿Ñ\80азна.\nУзÑ\80ок Ð¼Ð¾Ð¶Ðµ Ð´Ð° Ð±Ñ\83де Ð³Ñ\80еÑ\88ка Ñ\83 Ð¸Ð¼ÐµÐ½Ñ\83 Ð´Ð°Ñ\82оÑ\82еке.\nÐ\9fÑ\80овеÑ\80иÑ\82е Ð¶ÐµÐ»Ð¸Ñ\82е Ð»Ð¸ Ð·Ð°Ð¸Ñ\81Ñ\82а Ð´Ð° Ñ\98е Ð¾Ñ\82пÑ\80емите.",
        "windows-nonascii-filename": "Овај вики не подржава имена датотека са посебним знацима.",
        "fileexists": "Датотека с овим именом већ постоји. Погледајте <strong>[[:$1]]</strong> ако нисте сигурни да ли желите да је промените.\n[[$1|thumb]]",
        "filepageexists": "Страница с описом ове датотеке је већ направљена овде <strong>[[:$1]]</strong>, иако датотека не постоји.\nОпис који сте навели се неће појавити на страници с описом.\nДа би се ваш опис овде нашао, потребно је да га ручно измените.\n[[$1|thumb]]",
        "file-thumbnail-no": "Име датотеке почиње са <strong>$1</strong>.\nИзгледа да се ради о слици умањене величине <em>(сличица)</em>.\nАко имате ову слику у пуној резолуцији, отпремите је, у противном, промените име датотеке.",
        "fileexists-forbidden": "Датотека с овим називом већ постоји и не може се заменити.\nАко и даље желите да пошаљете датотеку, вратите се и изаберите други назив.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Датотека са овим именом већ постоји у заједничкој остави.\nАко још увек желите да отпремите датотеку, вратите се и користите ново име.\n[[File:$1|thumb|center|$1]]",
-       "fileexists-no-change": "Датотека је дупликат актуелне верзије <strong>[[:$1]]</strong>.",
+       "fileexists-no-change": "Датотека је дупликат тренутне верзије <strong>[[:$1]]</strong>.",
        "fileexists-duplicate-version": "Датотека је дупликат {{PLURAL:$2|старе верзије|старих верзија}} <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Ово је дупликат {{PLURAL:$1|следеће датотеке|следећих датотека}}:",
        "file-deleted-duplicate": "Датотека која је идентична овој ([[:$1]]) је раније била избрисана.\nТребате да проверите историју брисања те датотеке пре него што наставите са њеним поновним оптремањем.",
        "php-uploaddisabledtext": "Отпремање датотека је онемогућено у PHP-у.\nПроверите подешавања file_uploads.",
        "uploadscripted": "Датотека садржи HTML или скриптни код који може бити погрешно протумачен од стране прегледача.",
        "upload-scripted-pi-callback": "Датотека која садржи инструкције за обраду XML стилског облика се не може отпремити.",
-       "upload-scripted-dtd": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82пÑ\80емаÑ\9aе SVG Ð´Ð°Ñ\82оÑ\82ека које садрже нестандардну DTD декларацију.",
+       "upload-scripted-dtd": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82пÑ\80емиÑ\82и SVG Ð´Ð°Ñ\82оÑ\82еке које садрже нестандардну DTD декларацију.",
        "uploaded-script-svg": "Пронађен скриптни елеменат „$1“ у постављеној SVG датотеци.",
        "uploaded-hostile-svg": "Пронађен небезбедан CSS у стилском елементу постављене SVG датотеке.",
        "uploaded-event-handler-on-svg": "Није дозвољено постављање атрибута који контролишу догађаје <code>$1=\"$2\"</code> у SVG датотекама.",
        "uploaded-href-unsafe-target-svg": "Пронађен href са несигурним подацима: URI одредиште <code>&lt;$1 $2=\"$3\"&gt;</code> у постављеној SVG датотеци.",
        "uploaded-animate-svg": "Пронађена „animate“ ознака која можда мења href користећи се „from“ атрибутом <code>&lt;$1 $2=\"$3\"&gt;</code> у постављеној SVG датотеци.",
        "uploadscriptednamespace": "Ова SVG датотека садржи погрешан именски простор „<nowiki>$1</nowiki>“",
-       "uploadinvalidxml": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\80аÑ\88Ñ\87ланим XML у отпремљеној датотеци.",
+       "uploadinvalidxml": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\80аÑ\88Ñ\87ланиÑ\82и XML у отпремљеној датотеци.",
        "uploadvirus": "Датотека садржи вирус!\nДетаљи: $1",
        "uploadjava": "Датотека је формата ZIP који садржи јава .class елемент.\nСлање јава датотека није дозвољено јер оне могу изазвати заобилажење сигурносних ограничења.",
        "upload-source": "Изворна датотека",
        "upload-form-label-infoform-categories": "Категорије",
        "upload-form-label-infoform-date": "Датум",
        "upload-form-label-own-work-message-generic-local": "Ја потврђујем да отпремам ову датотеку поштујући услове коришћења услуге и лиценцирање на {{SITENAME}}.",
-       "upload-form-label-not-own-work-message-generic-local": "Ако нисте у могућности да отпремите ову датотеку под условима {{SITENAME}}, молимо вас да затворите овај дијалог и покушате другом методом.",
+       "upload-form-label-not-own-work-message-generic-local": "Ако нисте у могућности да отпремите ову датотеку под правилима пројекта {{SITENAME}}, затворите овај дијалог и покушате другом методом.",
        "upload-form-label-not-own-work-local-generic-local": "Такође можете покушати [[Special:Upload|подразумевану страницу за отпремање]].",
-       "backend-fail-stream": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° ÐµÐ¼Ð¸Ñ\82Ñ\83Ñ\98ем Ð´Ð°Ñ\82оÑ\82екÑ\83 $1.",
-       "backend-fail-backup": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим Ñ\80езеÑ\80вÑ\83 Ð´Ð°Ñ\82оÑ\82еке $1.",
+       "backend-fail-stream": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе ÐµÐ¼Ð¸Ñ\82оваÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.",
+       "backend-fail-backup": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и Ñ\80езеÑ\80внÑ\83 ÐºÐ¾Ð¿Ð¸Ñ\98Ñ\83 Ð´Ð°Ñ\82оÑ\82еке â\80\9e$1â\80\9d.",
        "backend-fail-notexists": "Датотека $1 не постоји.",
-       "backend-fail-hashes": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð´Ð¾Ð±Ð¸Ñ\98ем дисперзије датотеке за упоређивање.",
+       "backend-fail-hashes": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð´Ð¾Ð±Ð¸Ñ\82и дисперзије датотеке за упоређивање.",
        "backend-fail-notsame": "Већ постоји неистоветна датотека – $1.",
        "backend-fail-invalidpath": "$1 није важећа путања за складиштење.",
-       "backend-fail-delete": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем датотеку „$1”.",
-       "backend-fail-describe": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80оменим Ð¼ÐµÑ\82аподаÑ\82ке Ð·Ð° Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c.",
+       "backend-fail-delete": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и датотеку „$1”.",
+       "backend-fail-describe": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80омениÑ\82и Ð¼ÐµÑ\82аподаÑ\82ке Ð·Ð° Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.",
        "backend-fail-alreadyexists": "Датотека $1 већ постоји.",
-       "backend-fail-store": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81меÑ\81Ñ\82им Ð´Ð°Ñ\82оÑ\82екÑ\83 $1 Ñ\83 $2.",
-       "backend-fail-copy": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83множим Ð´Ð°Ñ\82оÑ\82екÑ\83 $1 Ñ\83 $2.",
-       "backend-fail-move": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80емеÑ\81Ñ\82им Ð´Ð°Ñ\82оÑ\82екÑ\83 $1 Ñ\83 $2.",
-       "backend-fail-opentemp": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им привремену датотеку.",
-       "backend-fail-writetemp": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ð¸Ñ\88ем Ñ\83 Ð¿Ñ\80ивÑ\80еменоÑ\98 Ð´Ð°Ñ\82оÑ\82еÑ\86и.",
-       "backend-fail-closetemp": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ñ\82воÑ\80им привремену датотеку.",
-       "backend-fail-read": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80оÑ\87иÑ\82ам Ð´Ð°Ñ\82оÑ\82екÑ\83 $1.",
-       "backend-fail-create": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ð¿Ð¸Ñ\88ем Ð´Ð°Ñ\82оÑ\82екÑ\83 $1.",
+       "backend-fail-store": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\81кладиÑ\88Ñ\82иÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d Ñ\83 â\80\9e$2â\80\9d.",
+       "backend-fail-copy": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе ÐºÐ¾Ð¿Ð¸Ñ\80аÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d Ñ\83 â\80\9e$2â\80\9d.",
+       "backend-fail-move": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80емеÑ\81Ñ\82иÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d Ñ\83 â\80\9e$2â\80\9d.",
+       "backend-fail-opentemp": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82воÑ\80иÑ\82и привремену датотеку.",
+       "backend-fail-writetemp": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\83пиÑ\81иваÑ\82и Ñ\83 Ð¿Ñ\80ивÑ\80еменÑ\83 Ð´Ð°Ñ\82оÑ\82екÑ\83.",
+       "backend-fail-closetemp": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð·Ð°Ñ\82воÑ\80иÑ\82и привремену датотеку.",
+       "backend-fail-read": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\87иÑ\82аÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.",
+       "backend-fail-create": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ð¸Ñ\81аÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d.",
        "backend-fail-maxsize": "Не могу да запишем датотеку $1 јер је већа од {{PLURAL:$2|$2 бајта|$2 бајта|$2 бајтова}}.",
        "backend-fail-readonly": "Складишна основа „$1“ је тренутно само за читање. Наведени разлог је: <em>$2</em>",
        "backend-fail-synced": "Датотека „$1“ је недоследна између унутрашњих складишних основа",
-       "backend-fail-connect": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81е Ð¿Ð¾Ð²ÐµÐ¶ÐµÐ¼ Ñ\81а Ñ\81кладиÑ\88ном Ð¾Ñ\81новом â\80\9e$1â\80\9c.",
+       "backend-fail-connect": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ð¾Ð²ÐµÐ·Ð°Ñ\82и Ñ\81е Ñ\81а Ð¿Ð¾Ð·Ð°Ð´Ð¸Ð½Ñ\81ким Ñ\81кладиÑ\88Ñ\82ем â\80\9e$1â\80\9d.",
        "backend-fail-internal": "Дошло је до непознате грешке у складишној основи „$1“.",
-       "backend-fail-contenttype": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83Ñ\82вÑ\80дим ÐºÐ°ÐºÐ°Ð² Ñ\81адÑ\80жаÑ\98 Ð¸Ð¼Ð° Ð´Ð°Ñ\82оÑ\82ека ÐºÐ¾Ñ\98Ñ\83 Ñ\82Ñ\80еба Ð´Ð° Ñ\81меÑ\81Ñ\82им Ñ\83 â\80\9e$1â\80\9c.",
+       "backend-fail-contenttype": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ð´Ñ\80едиÑ\82и Ñ\82ип Ñ\81адÑ\80жаÑ\98а Ð´Ð°Ñ\82оÑ\82еке Ð·Ð° Ñ\81кладиÑ\88Ñ\82еÑ\9aе Ñ\83 â\80\9e$1â\80\9d.",
        "backend-fail-batchsize": "Складишна основа је добила блокаду од $1 {{PLURAL:$1|операције|операције|операција}}; ограничење је $2 {{PLURAL:$2|операција|операције|операција}}.",
        "backend-fail-usable": "Не могу да прочитам или запишем датотеку „$1“ јер немате довољно дозвола или вам недостају фасцикле/садржаоци.",
-       "filejournal-fail-dbconnect": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81е Ð¿Ð¾Ð²ÐµÐ¶ÐµÐ¼ Ñ\81 Ð½Ð¾Ð²Ð¸Ð½Ð°Ñ\80Ñ\81ком Ð±Ð°Ð·Ð¾Ð¼ Ð·Ð° Ñ\81кладиÑ\88нÑ\83 Ð¾Ñ\81новÑ\83 â\80\9e$1â\80\9c.",
-       "filejournal-fail-dbquery": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð°Ð¶Ñ\83Ñ\80иÑ\80ам Ð½Ð¾Ð²Ð¸Ð½Ð°Ñ\80Ñ\81кÑ\83 Ð±Ð°Ð·Ñ\83 Ð·Ð° Ñ\81кладиÑ\88нÑ\83 Ð¾Ñ\81новÑ\83 â\80\9e$1â\80\9c.",
-       "lockmanager-notlocked": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82кÑ\99Ñ\83Ñ\87ам â\80\9e$1â\80\9c јер није закључан.",
-       "lockmanager-fail-closelock": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ñ\82воÑ\80им ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9c.",
-       "lockmanager-fail-deletelock": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9c.",
-       "lockmanager-fail-acquirelock": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81е Ð·Ð°ÐºÑ\99Ñ\83Ñ\87ам Ð·Ð° â\80\9e$1â\80\9c.",
+       "filejournal-fail-dbconnect": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ð¾Ð²ÐµÐ·Ð°Ñ\82и Ñ\81е Ñ\81а Ð½Ð¾Ð²Ð¸Ð½Ð°Ñ\80Ñ\81ком Ð±Ð°Ð·Ð¾Ð¼ Ð¿Ð¾Ð´Ð°Ñ\82ака Ð·Ð° Ð¿Ð¾Ð·Ð°Ð´Ð¸Ð½Ñ\81ко Ñ\81кладиÑ\88Ñ\82е â\80\9e$1â\80\9d.",
+       "filejournal-fail-dbquery": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð°Ð¶Ñ\83Ñ\80иÑ\80аÑ\82и Ð½Ð¾Ð²Ð¸Ð½Ð°Ñ\80Ñ\81кÑ\83 Ð±Ð°Ð·Ñ\83 Ð¿Ð¾Ð´Ð°Ñ\82ака Ð·Ð° Ð¿Ð¾Ð·Ð°Ð´Ð¸Ð½Ñ\81ко Ñ\81кладиÑ\88Ñ\82е â\80\9e$1â\80\9d.",
+       "lockmanager-notlocked": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82кÑ\99Ñ\83Ñ\87аÑ\82и â\80\9e$1â\80\9d јер није закључан.",
+       "lockmanager-fail-closelock": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð·Ð°Ñ\82воÑ\80иÑ\82и ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9d.",
+       "lockmanager-fail-deletelock": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9d.",
+       "lockmanager-fail-acquirelock": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\81Ñ\82еÑ\9bи ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9d.",
        "lockmanager-fail-openlock": "Не могу да отворим катанац за „$1“. Уверите се да је ваш директоријум за отпремање исправно конфигурисан и да ваш веб-сервер има дозволу да пише у том директоријуму. Погледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgUploadDirectory за више информација.",
-       "lockmanager-fail-releaselock": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\81лободим ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9c.",
-       "lockmanager-fail-db-bucket": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° ÐºÐ¾Ð½Ñ\82акÑ\82иÑ\80ам Ñ\81 довољно катанаца у канти $1.",
-       "lockmanager-fail-db-release": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\81лободим ÐºÐ°Ñ\82анÑ\86е Ñ\83 Ð±Ð°Ð·Ð¸ $1.",
-       "lockmanager-fail-svr-acquire": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð´Ð¾Ð±Ð¸Ñ\98ем катанце на серверу $1.",
-       "lockmanager-fail-svr-release": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\81лободим катанце на серверу $1.",
+       "lockmanager-fail-releaselock": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\81лободиÑ\82и ÐºÐ°Ñ\82анаÑ\86 Ð·Ð° â\80\9e$1â\80\9d.",
+       "lockmanager-fail-db-bucket": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе ÐºÐ¾Ð½Ñ\82акÑ\82иÑ\80аÑ\82и Ñ\81а довољно катанаца у канти $1.",
+       "lockmanager-fail-db-release": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\81лободиÑ\82и ÐºÐ°Ñ\82анÑ\86е Ñ\83 Ð±Ð°Ð·Ð¸ Ð¿Ð¾Ð´Ð°Ñ\82ака $1.",
+       "lockmanager-fail-svr-acquire": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\81Ñ\82еÑ\9bи катанце на серверу $1.",
+       "lockmanager-fail-svr-release": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\81лободиÑ\82и катанце на серверу $1.",
        "zip-file-open-error": "Дошло је до грешке при отварању датотеке за проверу ZIP архиве.",
        "zip-wrong-format": "Наведена датотека није формата ZIP.",
        "zip-bad": "Датотека је оштећена или је нечитљива ZIP датотека.\nБезбедносна провера не може да се изврши како треба.",
-       "zip-unsupported": "Датотека је формата ZIP који користи могућности које не подржава Медијавики.\nБезбедносна провера не може да се изврши како треба.",
+       "zip-unsupported": "Датотека је формата ZIP који користи функције ZIP које Медијавики не подржава.\nНе може се правилно проверити у вези безбедности.",
        "uploadstash": "Отпремање низа датотека",
        "uploadstash-summary": "Ова страница пружа приступ датотекама које су отпремљене или се отпремају, али још нису објављене. Ове датотеке нису видљиве никоме, осим кориснику који их је отпремио.",
        "uploadstash-clear": "Очисти сакривене датотеке",
        "uploadstash-bad-path-unrecognized-thumb-name": "Непрепознато име минијатуре.",
        "uploadstash-bad-path-bad-format": "Кључ „$1“ није у одговарајућем облику.",
        "uploadstash-file-not-found": "Кључ „$1” није пронађен у складишту.",
-       "uploadstash-file-not-found-no-thumb": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80ибавим сличицу.",
+       "uploadstash-file-not-found-no-thumb": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80ибавиÑ\82и сличицу.",
        "uploadstash-file-not-found-no-local-path": "Нема локалне путање за умањену ставку.",
-       "uploadstash-file-not-found-no-object": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим локални датотечни објекат за сличицу.",
+       "uploadstash-file-not-found-no-object": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и локални датотечни објекат за сличицу.",
        "uploadstash-file-not-found-no-remote-thumb": "Добављање минијатуре није успело: $1\nАдреса = $2",
        "uploadstash-file-not-found-missing-content-type": "Недостаје заглавље за тип садржаја.",
        "uploadstash-file-not-found-not-exists": "Не могу наћи путању или ово није обична датотека.",
        "uploadstash-file-too-large": "Не могу послужити датотеку већу од $1 {{PLURAL:$1|бајта|бајтова}}",
        "uploadstash-not-logged-in": "Нико није пријављен. Датотеке морају припадати корисницима.",
-       "uploadstash-wrong-owner": "Ова датотека ($1) не припада актуелном кориснику.",
+       "uploadstash-wrong-owner": "Ова датотека ($1) не припада тренутном кориснику.",
        "uploadstash-no-such-key": "Нема таквог кључа ($1). Не могу уклонити.",
        "uploadstash-no-extension": "Додатак је празан.",
        "uploadstash-zero-length": "Датотека је празна",
        "img-auth-accessdenied": "Приступ је одбијен",
        "img-auth-nopathinfo": "Недостаје PATH_INFO.\nВаш сервер није подешен да прослеђује овакве податке.\nМожда је заснован на CGI-ју који не подржава img_auth.\nПогледајте https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization?uselang=sr-ec.",
        "img-auth-notindir": "Тражена путања није у подешеном директоријуму за отпремање.",
-       "img-auth-badtitle": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81аÑ\81Ñ\82авим Ð²Ð°Ð¶ÐµÑ\9bи Ð½Ð°Ñ\81лов Ð¸Ð· â\80\9e$1â\80\9c.",
+       "img-auth-badtitle": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\81аÑ\81Ñ\82авиÑ\82и Ð²Ð°Ð¶ÐµÑ\9bи Ð½Ð°Ñ\81лов Ð¸Ð· â\80\9e$1â\80\9d.",
        "img-auth-nologinnWL": "Нисте пријављени и „$1” није на списку дозвољених.",
        "img-auth-nofile": "Датотека „$1“ не постоји.",
        "img-auth-isdir": "Покушавате да приступите фасцикли „$1“.\nДозвољен је само приступ датотекама.",
        "http-curl-error": "Грешка при отварању адресе: $1",
        "http-bad-status": "Дошло је до проблема током захтева HTTP: $1 $2",
        "http-internal-error": "HTTP интерна грешка.",
-       "upload-curl-error6": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80иÑ\81Ñ\82Ñ\83пим адреси",
-       "upload-curl-error6-text": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80иÑ\81Ñ\82Ñ\83пим Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾Ð¼ URL-Ñ\83.\nÐ\9fÑ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ñ\98е URL Ð¸Ñ\81пÑ\80аван Ð¸ Ð´Ð¾Ñ\81Ñ\82Ñ\83пан.",
+       "upload-curl-error6": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80иÑ\81Ñ\82Ñ\83пиÑ\82и URL адреси",
+       "upload-curl-error6-text": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80иÑ\81Ñ\82Ñ\83пиÑ\82и Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¾Ñ\98 URL Ð°Ð´Ñ\80еÑ\81и.\nÐ\9fоново Ð¿Ñ\80овеÑ\80иÑ\82е Ð´Ð° Ð»Ð¸ Ñ\98е Ð¸Ñ\81пÑ\80авна Ð¸ Ð´Ð° Ð»Ð¸ Ñ\81аÑ\98Ñ\82 Ñ\80ади.",
        "upload-curl-error28": "Отпремање је истекло",
        "upload-curl-error28-text": "Сервер не одговара на упит.\nПроверите да ли сајт ради, мало осачекајте и покушајте поново.\nПробајте касније када буде мање оптерећење.",
        "license": "Лиценца:",
        "filehist-deleteall": "избриши све",
        "filehist-deleteone": "избриши",
        "filehist-revert": "врати",
-       "filehist-current": "актуелна",
+       "filehist-current": "тренутна",
        "filehist-datetime": "Датум/време",
        "filehist-thumb": "Сличица",
        "filehist-thumbtext": "Минијатура за верзију на дан $1",
        "filedelete-reason-dropdown": "*Најчешћи разлози брисања\n** Кршење ауторских права\n** Дупликати датотека",
        "filedelete-edit-reasonlist": "Уреди разлоге брисања",
        "filedelete-maintenance": "Брисање и враћање датотека је привремено онемогућено због одржавања.",
-       "filedelete-maintenance-title": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем датотеку",
+       "filedelete-maintenance-title": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и датотеку",
        "mimesearch": "MIME претрага",
        "mimesearch-summary": "Ова страница омогућава филтрирање датотека према њиховим MIME типовима.\nУлазни подаци: contenttype/subtype или contenttype/*, нпр. <code>image/jpeg</code>.",
        "mimetype": "MIME тип:",
        "allpages-bad-ns": "{{SITENAME}} нема именски простор „$1“.",
        "allpages-hide-redirects": "Сакриј преусмерења",
        "cachedspecial-viewing-cached-ttl": "Гледате кеширану верзију ове странице, која може бити стара и до $1.",
-       "cachedspecial-viewing-cached-ts": "Гледате кеширану верзију ове странице, која можда није потпуно актуелна.",
+       "cachedspecial-viewing-cached-ts": "Гледате кеширану верзију ове странице, која можда није потпуно тренутна.",
        "cachedspecial-refresh-now": "Погледај најновију.",
        "categories": "Категоријe",
        "categories-submit": "Прикажи",
        "rollbacklinkcount-morethan": "врати више од $1 {{PLURAL:$1|измене|измене|измена}}",
        "rollbackfailed": "Враћање није успело",
        "rollback-missingparam": "Недостаје потребан параметар на захтеву.",
-       "rollback-missingrevision": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83Ñ\87иÑ\82ам податке о измени.",
-       "cantrollback": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð²Ñ\80аÑ\82им Ð¸Ð·Ð¼ÐµÐ½Ñ\83.\nÐ\9fоÑ\81ледÑ\9aи Ð°Ñ\83Ñ\82оÑ\80 је уједно и једини.",
+       "rollback-missingrevision": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\83Ñ\87иÑ\82аÑ\82и податке о измени.",
+       "cantrollback": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð²Ñ\80аÑ\82иÑ\82и Ð¸Ð·Ð¼ÐµÐ½Ñ\83.\nÐ\9fоÑ\81ледÑ\9aи Ð´Ð¾Ð¿Ñ\80иноÑ\81илаÑ\86 је уједно и једини.",
        "alreadyrolled": "Враћање последње измене странице [[:$1]] од стране {{GENDER:$2|корисника|кориснице|корисника}} [[User:$2|$2]] ([[User talk:$2|разговор]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) није успело; неко други је у међувремену изменио или вратио страницу.\n\nПоследњу измену је {{GENDER:$3|направио|направила|направио}} [[User:$3|$3]] ([[User talk:$3|разговор]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Резиме измене је био: <em>$1</em>.",
        "revertpage": "Враћене измене {{GENDER:$2|корисника|кориснице}} [[Special:Contributions/$2|$2]] ([[User talk:$2|разговор]]) на последњу измену {{GENDER:$1|корисника|кориснице}} [[User:$1|$1]]",
        "protect_expiry_old": "Време истека је у прошлости.",
        "protect-unchain-permissions": "Откључај даљња подешавања заштите",
        "protect-text": "Овде можете да погледате и промените ниво заштите странице <strong>$1</strong>.",
-       "protect-locked-blocked": "Не можете да мењате нивое заштите док сте блокирани.\nОво су актуелна подешавања странице '''$1''':",
-       "protect-locked-dblock": "Нивои заштите се не могу мењати јер је активна база података закључана.\nОво су актуелна подешавања странице '''$1''':",
-       "protect-locked-access": "Ваш налог нема дозволу да мења нивое заштите странице.\nОво су актуелна подешавања странице '''$1''':",
+       "protect-locked-blocked": "Не можете да мењате нивое заштите док сте блокирани.\nОво су тренутна подешавања странице <strong>$1</strong>:",
+       "protect-locked-dblock": "Нивои заштите се не могу мењати јер је активна база података закључана.\nОво су тренутна подешавања странице <strong>$1</strong>:",
+       "protect-locked-access": "Ваш налог нема дозволу да мења нивое заштите странице.\nОво су тренутна подешавања странице <strong>$1</strong>:",
        "protect-cascadeon": "Ова страница је тренутно заштићена јер је укључена у {{PLURAL:$1|следећу страницу која има|следеће странице које имају}} укључену преносиву заштиту.\nПромене нивоа заштите ове странице неће да утичу на преносиву заштиту.",
        "protect-default": "Допуштено свим корисницима",
        "protect-fallback": "Дозвољено само корисницима са дозволом „$1“",
        "contribsub2": "За {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Кориснички налог „$1“ није отворен.",
        "nocontribs": "Нису пронађене промене које одговарају овим критеријумима.",
-       "uctop": "(актуелна)",
+       "uctop": "(тренутна)",
        "month": "од месеца (и раније):",
        "year": "од године (и раније):",
        "date": "Од датума (и раније):",
        "blockipsuccesssub": "Блокирање је успело",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] је {{GENDER:$1|блокиран|блокирана}}.<br />\nПогледајте [[Special:BlockList|списак]] за преглед блокада.",
        "ipb-blockingself": "Блокираћете самог себе! Заиста то желите?",
-       "ipb-confirmhideuser": "УпÑ\80аво Ñ\9bеÑ\82е Ð±Ð»Ð¾ÐºÐ¸Ñ\80аÑ\82и ÐºÐ¾Ñ\80иÑ\81ника Ñ\81 Ñ\83кÑ\99Ñ\83Ñ\87еном Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\88Ñ\9bÑ\83 â\80\9eÑ\81акÑ\80иÑ\98 ÐºÐ¾Ñ\80иÑ\81никаâ\80\9c. Ð\9eвим Ñ\9bе ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ð±Ð¸Ñ\82и Ñ\81акÑ\80ивено Ñ\83 Ñ\81вим Ñ\81пиÑ\81ковима Ð¸ Ð¸Ð·Ð²ÐµÑ\88Ñ\82аÑ\98има. Ð\96елиÑ\82е Ð»Ð¸ то да урадите?",
+       "ipb-confirmhideuser": "Ð\91локиÑ\80аÑ\82е ÐºÐ¾Ñ\80иÑ\81ника Ñ\81а Ð¾Ð¼Ð¾Ð³Ñ\83Ñ\9bеном Ñ\84Ñ\83нкÑ\86иÑ\98ом â\80\9eÑ\81акÑ\80иÑ\98 ÐºÐ¾Ñ\80иÑ\81никаâ\80\9d. Ð\9eвим Ñ\9bе Ñ\81е Ñ\81акÑ\80иÑ\82и ÐºÐ¾Ñ\80иÑ\81ниÑ\87ко Ð¸Ð¼Ðµ Ñ\83 Ñ\81вим Ñ\81пиÑ\81ковима Ð¸ Ñ\83ноÑ\81има Ñ\83 Ð´Ð½ÐµÐ²Ð½Ð¸ÐºÑ\83. Ð\96елиÑ\82е Ð»Ð¸ Ð·Ð°Ð¸Ñ\81Ñ\82а то да урадите?",
        "ipb-confirmaction": "Ако сте сигурни да желите наставити означите поље „{{int:ipb-confirm}}“ на дну странице.",
        "ipb-edit-dropdown": "Уреди разлоге блокирања",
        "ipb-unblock-addr": "Деблокирај $1",
        "blocklog-showsuppresslog": "{{GENDER:$1|Овај корисник је раније блокиран и сакривен|Ова корисница је раније блокирана и сакривена}}.\nДневник сакривања је наведен испод као референца:",
        "blocklogentry": "је блокирао [[$1]] са временом истицања од $2 $3",
        "reblock-logentry": "је {{GENDER:|променио|променила}} подешавања блокирања за {{GENDER:$1|корисника|корисницу}} [[$1]] са временом истека од $2 ($3)",
-       "blocklogtext": "Ово је дневник радњи блокирања и деблокирања корисника.\nАутоматски блокиране IP адресе нису наведене.\nПогледајте [[Special:BlockList|списак блокирања]] за списак актуелних операција забрана и блокирања.",
+       "blocklogtext": "Ово је дневник радњи блокирања и деблокирања корисника.\nАутоматски блокиране IP адресе нису наведене.\nПогледајте [[Special:BlockList|списак блокирања]] за списак тренутних операција забрана и блокирања.",
        "unblocklogentry": "је деблокирао $1",
        "block-log-flags-anononly": "само анонимни корисници",
        "block-log-flags-nocreate": "онемогућено отварање налога",
        "immobile-target-namespace": "Не могу преместити странице у именски простор „$1“.",
        "immobile-target-namespace-iw": "Међувики веза није важеће одредиште за премештање странице.",
        "immobile-source-page": "Ова страница се не може преместити.",
-       "immobile-target-page": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80емеÑ\81Ñ\82им Ð½Ð° Ð¶ÐµÑ\99ени наслов.",
+       "immobile-target-page": "Ð\9fÑ\80емеÑ\88Ñ\82аÑ\9aе Ð½Ð¸Ñ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð° Ð¾Ð´Ñ\80едиÑ\88ни наслов.",
        "bad-target-model": "Жељено одредиште користи другачији модел садржаја. Не могу да претворим из $1 у $2.",
        "imagenocrossnamespace": "Датотека се не може преместити у именски простор који не припада датотекама.",
        "nonfile-cannot-move-to-file": "Не-датотеке не можете преместити у именски простор за датотеке",
        "move-over-sharedrepo": "[[:$1]] се налази на дељеном складишту. Ако преместите датотеку на овај наслов, то ће заменити дељену датотеку.",
        "file-exists-sharedrepo": "Наведени назив датотеке се већ користи у дељеном складишту.\nИзаберите други назив.",
        "export": "Извоз страница",
-       "exporttext": "Можете да извезете текст и историју измена одређене странице или скупа страница уклљених у XML формату.\nОво онда може да буде увезено у други вики који користи Медијавики софтвер преко [[Special:Import|странице за увоз]].\n\nДа бисте извезли странице, унесите називе у оквиру испод, с једним насловом по реду, и изаберите да ли желите актуелну измену и све остале, или само актуелну измену с подацима о последњој измени.\n\nУ другом случају, можете користити и везе, на пример [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] за страницу [[{{MediaWiki:Mainpage}}]].",
+       "exporttext": "Можете да извезете текст и историју измена одређене странице или скупа страница уклљених у XML формату.\nОво онда може да буде увезено у други вики који користи Медијавики софтвер преко [[Special:Import|странице за увоз]].\n\nДа бисте извезли странице, унесите називе у оквиру испод, с једним насловом по реду, и изаберите да ли желите тренутну измену и све остале, или само тренутну измену с подацима о последњој измени.\n\nУ другом случају, можете користити и везе, на пример [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] за страницу [[{{MediaWiki:Mainpage}}]].",
        "exportall": "Извези све странице",
-       "exportcuronly": "Укључи само актуелну измену, не целу историју",
+       "exportcuronly": "Укључи само тренутну измену, не целу историју",
        "exportnohistory": "----\n'''Напомена:''' извоз пуне историје страница преко овог обрасца је онемогућено из техничких разлога.",
        "exportlistauthors": "Укључи целокупан списак доприносилаца за сваку страницу",
        "export-submit": "Извези",
        "thumbnail_error": "Грешка при прављењу сличице: $1",
        "thumbnail_error_remote": "Порука о грешци из $1:\n$2",
        "djvu_page_error": "DjVu страница је ван опсега",
-       "djvu_no_xml": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80еÑ\83змем XML за DjVu датотеку.",
-       "thumbnail-temp-create": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим Ð¿Ñ\80ивÑ\80еменÑ\83 Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° сличицу",
-       "thumbnail-dest-create": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\81аÑ\87Ñ\83вам Ð¼Ð¸Ð½Ð¸Ñ\98аÑ\82Ñ\83Ñ\80Ñ\83 Ñ\83 Ð¾Ð´Ñ\80едиÑ\88Ñ\82Ñ\83",
+       "djvu_no_xml": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ\82и XML за DjVu датотеку.",
+       "thumbnail-temp-create": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и Ð¿Ñ\80ивÑ\80еменÑ\83 Ð´Ð°Ñ\82оÑ\82екÑ\83-сличицу",
+       "thumbnail-dest-create": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\81аÑ\87Ñ\83ваÑ\82и Ñ\81лиÑ\87иÑ\86Ñ\83 Ð½Ð° Ð¾Ð´Ñ\80едиÑ\88Ñ\82е",
        "thumbnail_invalid_params": "Неважећи параметри сличице",
        "thumbnail_toobigimagearea": "Датотека са величинама већим од $1",
-       "thumbnail_dest_directory": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ð¿Ñ\80авим Ð¾Ð´Ñ\80едиÑ\88нÑ\83 Ñ\84аÑ\81Ñ\86иклÑ\83",
+       "thumbnail_dest_directory": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ð¿Ñ\80авиÑ\82и Ð¾Ð´Ñ\80едиÑ\88ни Ð´Ð¸Ñ\80екÑ\82оÑ\80иÑ\98Ñ\83м",
        "thumbnail_image-type": "Тип слике није подржан",
        "thumbnail_gd-library": "Недовршена подешавања графичке библиотеке: недостаје функција $1",
        "thumbnail_image-size-zero": "Изгледа да је величина датотеке нула.",
        "importfailed": "Неуспешан увоз: <nowiki>$1</nowiki>",
        "importunknownsource": "Непознат изворни тип увоза",
        "importnoprefix": "Није наведен међувики префикс",
-       "importcantopen": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82воÑ\80им Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° Ñ\83воз.",
+       "importcantopen": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ñ\82воÑ\80иÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° Ñ\83воз",
        "importbadinterwiki": "Лоша међувики веза",
        "importsuccess": "Увожење је завршено!",
        "importnosources": "Није одређен ниједан извор за увоз, тако да је отпремање историје онемогућено.",
-       "importnofile": "Увозна Ð´Ð°Ñ\82оÑ\82ека Ð½Ð¸Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82а.",
-       "importuploaderrorsize": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82пÑ\80емим Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° Ñ\83воз.\nДатотека је већа од дозвољене величине.",
-       "importuploaderrorpartial": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ñ\82пÑ\80емим Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° Ñ\83воз.\nÐ\94аÑ\82оÑ\82ека Ñ\98е Ñ\81амо Ð´ÐµÐ»Ð¸Ð¼Ð¸Ñ\87но Ð¿Ð¾Ñ\81лаÑ\82а.",
-       "importuploaderrortemp": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ð¾Ñ\88аÑ\99ем Ð´Ð°Ñ\82оÑ\82екÑ\83 Ð·Ð° Ñ\83воз.\nНедостаје привремена фасцикла.",
+       "importnofile": "Ð\94аÑ\82оÑ\82ека Ð·Ð° Ñ\83воз Ð½Ð¸Ñ\98е Ð¾Ñ\82пÑ\80емÑ\99ена.",
+       "importuploaderrorsize": "Ð\9eÑ\82пÑ\80емаÑ\9aе Ð´Ð°Ñ\82оÑ\82еке Ð·Ð° Ñ\83воз Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело.\nДатотека је већа од дозвољене величине.",
+       "importuploaderrorpartial": "Ð\9eÑ\82пÑ\80емаÑ\9aе Ð´Ð°Ñ\82оÑ\82еке Ð·Ð° Ñ\83воз Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело.\nÐ\94аÑ\82оÑ\82ека Ñ\98е Ñ\81амо Ð´ÐµÐ»Ð¸Ð¼Ð¸Ñ\87но Ð¾Ñ\82пÑ\80емÑ\99ена.",
+       "importuploaderrortemp": "Ð\9eÑ\82пÑ\80емаÑ\9aе Ð´Ð°Ñ\82оÑ\82еке Ð·Ð° Ñ\83воз Ð½Ð¸Ñ\98е Ñ\83Ñ\81пело.\nНедостаје привремена фасцикла.",
        "import-parse-failure": "Погрешно рашчлањивање XML-а.",
        "import-noarticle": "Нема странице за увоз!",
        "import-nonewrevisions": "Ниједна измена није увезена (све су већ присутне или су прескочене због грешака).",
        "xml-error-string": "$1 у реду $2, колона $3 (бајт $4): $5",
        "import-upload": "Отпремање XML података",
        "import-token-mismatch": "Губитак података о сесији.\n\nМожда сте одјављени. '''Молимо Вас проверите да ли сте још увек пријављени и покушајте поново'''.\n\nАко и даље не ради, покушајте се [[Special:UserLogout|одјавити]] и поново пријавити и проверите да ли ваш веб-претраживач дозвољава колачиће са овог сајта.",
-       "import-invalid-interwiki": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83возим Ñ\81 наведеног викија.",
+       "import-invalid-interwiki": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\83возиÑ\82и Ñ\81а наведеног викија.",
        "import-error-edit": "Страница „$1“ није увезена јер вам није дозвољено да је уређујете.",
        "import-error-create": "Страница „$1“ није увезена јер вам није дозвољено да је направите.",
-       "import-error-interwiki": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83везем Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 â\80\9e$1â\80\9c Ñ\98еÑ\80 Ñ\98е Ñ\9aен Ð½Ð°Ð·Ð¸Ð² Ñ\80езеÑ\80виÑ\81ан Ð·Ð° Ñ\81поÑ\99но повезивање (међувики).",
-       "import-error-special": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ñ\83везем Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 â\80\9e$1â\80\9c Ñ\98еÑ\80 Ð¾Ð½Ð° Ð¿Ñ\80ипада Ð¿Ð¾Ñ\81ебном Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 ÐºÐ¾Ñ\98е Ð½Ðµ Ð¿Ñ\80иÑ\85ваÑ\82а странице.",
+       "import-error-interwiki": "СÑ\82Ñ\80аниÑ\86а â\80\9e$1â\80\9d Ð½Ð¸Ñ\98е Ñ\83везена Ñ\98еÑ\80 Ñ\98е Ñ\9aен Ð½Ð°Ð·Ð¸Ð² Ñ\80езеÑ\80виÑ\81ан Ð·Ð° Ñ\81поÑ\99аÑ\88Ñ\9aе повезивање (међувики).",
+       "import-error-special": "СÑ\82Ñ\80аниÑ\86а â\80\9e$1â\80\9d Ð½Ð¸Ñ\98е Ñ\83везена Ñ\98еÑ\80 Ð¿Ñ\80ипада Ð¿Ð¾Ñ\81ебном Ð¸Ð¼ÐµÐ½Ñ\81ком Ð¿Ñ\80оÑ\81Ñ\82оÑ\80Ñ\83 ÐºÐ¾Ñ\98и Ð½Ðµ Ð´Ð¾Ð·Ð²Ð¾Ñ\99ава странице.",
        "import-error-invalid": "Страница „$1“ није увезена јер је име под којим се треба увости неважеће на овом викију.",
-       "import-error-unserialize": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð´ÐµÑ\81еÑ\80иÑ\98ализÑ\83Ñ\98ем Ð¸Ð·Ð¼ÐµÐ½Ñ\83 $2 Ñ\81Ñ\82Ñ\80аниÑ\86е $1. Ð\97апиÑ\81ано Ñ\98е Ð´Ð° Ð¸Ð·Ð¼ÐµÐ½Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82и $3 Ð¼Ð¾Ð´ÐµÐ» Ñ\81адÑ\80жаÑ\98а Ñ\83 $4 Ñ\84оÑ\80маÑ\82Ñ\83.",
+       "import-error-unserialize": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð´ÐµÑ\81еÑ\80иÑ\98ализоваÑ\82и Ð¸Ð·Ð¼ÐµÐ½Ñ\83 $2 Ñ\81Ñ\82Ñ\80аниÑ\86е â\80\9e$1â\80\9d. Ð\97апиÑ\81ано Ñ\98е Ð´Ð° Ð¸Ð·Ð¼ÐµÐ½Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82и Ð¼Ð¾Ð´ÐµÐ» Ñ\81адÑ\80жаÑ\98а $3 ÐºÐ¾Ñ\98и Ñ\98е Ñ\81еÑ\80иÑ\98ализован ÐºÐ°Ð¾ $4.",
        "import-options-wrong": "{{PLURAL:$2|Погрешна опција|Погрешне опције}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "Наведена основна страница има неважећи наслов.",
        "import-rootpage-nosubpage": "Именски простор „$1“ основне странице не дозвољава подстранице.",
        "tooltip-pt-anontalk": "Дискусија о уређивањима са ове IP адресе",
        "tooltip-pt-preferences": "{{GENDER:|Ваша}} подешавања",
        "tooltip-pt-watchlist": "Списак страница које надгледате",
-       "tooltip-pt-mycontris": "СпиÑ\81ак {{GENDER:|Ð\92аших}} доприноса",
+       "tooltip-pt-mycontris": "СпиÑ\81ак {{GENDER:|ваших}} доприноса",
        "tooltip-pt-anoncontribs": "Списак измена направљених са ове IP адресе",
        "tooltip-pt-login": "Предлажемо вам да се пријавите, иако то није обавезно",
        "tooltip-pt-login-private": "Морате да се пријавите да бисте користили овај Вики",
        "spam_deleting": "Све измене садрже везе до $1. Бришем",
        "simpleantispam-label": "Провера против нежељеног садржаја. \n<strong>Не</strong> попуњавајте ово!",
        "pageinfo-title": "Информације за „$1“",
-       "pageinfo-not-current": "Ð\9dажалоÑ\81Ñ\82, Ð½ÐµÐ¼Ð¾Ð³Ñ\83Ñ\9bе Ñ\98е навести ове инфомације за старије измене.",
+       "pageinfo-not-current": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе навести ове инфомације за старије измене.",
        "pageinfo-header-basic": "Основне информације",
        "pageinfo-header-edits": "Историја измена",
        "pageinfo-header-restrictions": "Заштита странице",
        "markedaspatrolled": "Означено као патролирано",
        "markedaspatrolledtext": "Изабрана измена странице [[:$1]] означена је као патролирана.",
        "rcpatroldisabled": "Патролирање скорашњих измена је онемогућено",
-       "rcpatroldisabledtext": "Ð\9cогÑ\83Ñ\9bноÑ\81Ñ\82 Ð¿Ð°Ñ\82Ñ\80олиÑ\80аÑ\9aа Ñ\81коÑ\80аÑ\88Ñ\9aиÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð° Ñ\98е Ð°ÐºÑ\82Ñ\83елно онемогућена.",
-       "markedaspatrollederror": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¾Ð·Ð½Ð°Ñ\87им ÐºÐ°Ð¾ Ð¿Ð°Ñ\82Ñ\80олиÑ\80ано.",
+       "rcpatroldisabledtext": "ФÑ\83нкÑ\86иÑ\98а Ð¿Ð°Ñ\82Ñ\80олиÑ\80аÑ\9aа Ñ\81коÑ\80аÑ\88Ñ\9aиÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð° Ñ\98е Ñ\82Ñ\80енÑ\83Ñ\82но онемогућена.",
+       "markedaspatrollederror": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¾Ð·Ð½Ð°Ñ\87иÑ\82и ÐºÐ°Ð¾ Ð¿Ð°Ñ\82Ñ\80олиÑ\80ано",
        "markedaspatrollederrortext": "Морате навести измену да бисте је означили као патролирану.",
        "markedaspatrollederror-noautopatrol": "Не можете да означите своје промене као патролиране.",
        "markedaspatrollednotify": "Ова измена на страници „$1” означена је као патролирана.",
        "deletedrevision": "Избрисана стара измена $1.",
        "filedeleteerror-short": "Грешка при брисању датотеке: $1",
        "filedeleteerror-long": "Дошло је до грешака при брисању датотеке:\n\n$1",
-       "filedelete-missing": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¸Ð·Ð±Ñ\80иÑ\88ем Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9c јер не постоји.",
+       "filedelete-missing": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¸Ð·Ð±Ñ\80иÑ\81аÑ\82и Ð´Ð°Ñ\82оÑ\82екÑ\83 â\80\9e$1â\80\9d јер не постоји.",
        "filedelete-old-unregistered": "Наведена измена датотеке „$1“ не постоји у бази података.",
        "filedelete-current-unregistered": "Наведена датотека „$1“ не постоји у бази података.",
        "filedelete-archive-read-only": "Сервер не може да пише по складишној фасцикли ($1).",
        "exif-pixelxdimension": "Ширина слике",
        "exif-pixelydimension": "Висина слике",
        "exif-usercomment": "Кориснички коментари",
-       "exif-relatedsoundfile": "Ð\9fовезани Ð·Ð²Ñ\83Ñ\87ни Ð·Ð°Ð¿Ð¸Ñ\81",
+       "exif-relatedsoundfile": "СÑ\80одне Ð·Ð²Ñ\83Ñ\87не Ð´Ð°Ñ\82оÑ\82еке",
        "exif-datetimeoriginal": "Датум и време сликања",
        "exif-datetimedigitized": "Датум и време дигитализације",
        "exif-subsectime": "Део секунде у којем је сликано",
        "exif-focalplaneyresolution": "Резолуција фокусне равни Y",
        "exif-focalplaneresolutionunit": "Јединица за резолуцију фокусне равни",
        "exif-subjectlocation": "Положај објекта",
-       "exif-exposureindex": "Ð\9fопис експозиције",
+       "exif-exposureindex": "Ð\98ндекс експозиције",
        "exif-sensingmethod": "Начин сензора",
        "exif-filesource": "Изворна датотека",
        "exif-scenetype": "Тип сцене",
        "monthsall": "све",
        "confirmemail": "Потврда имејл-адресе",
        "confirmemail_noemail": "Нисте поставили важећу имејл-адресу у [[Special:Preferences|корисничким подешавањима]].",
-       "confirmemail_text": "{{SITENAME}} захтева да потврдите имејл адресу пре него што почнете да користите могућности имејла.\nКликните на дугме испод за слање поруке на вашу адресу.\nУ поруци ће се налазити веза са потврдним кодом;\nунесите је у прегледач да бисте потврдили да је ваша имејл адреса важећа.",
+       "confirmemail_text": "{{SITENAME}} захтева да проверите ваљаност имејл-адресе пре него што почнете да користите функцију имејла.\nАктивирајте дугме испод да бисте послали мејл за потврду на своју адресу.\nМејл ће укључивати везу са кодом;\nучитајте везу у свом прегледачу да бисте потврдили да је ваша имејл-адреса важећа.",
        "confirmemail_pending": "Код за потврду вам је већ послат имејлом.\nАко сте недавно отворили налог, можда треба да сачекате неколико минута да пристигне пре него што поново затражите нови код.",
        "confirmemail_send": "Пошаљи код за потврду",
        "confirmemail_sent": "Потврдна порука је послата.",
-       "confirmemail_oncreate": "Ð\9fоÑ\81лаÑ\82 Ñ\98е ÐºÐ¾Ð´ Ð·Ð° Ð¿Ð¾Ñ\82вÑ\80дÑ\83 Ð½Ð° Ð²Ð°Ñ\88Ñ\83 Ð¸Ð¼ÐµÑ\98л Ð°Ð´Ñ\80еÑ\81Ñ\83.\nÐ\9eваÑ\98 ÐºÐ¾Ð´ Ð½Ð¸Ñ\98е Ð¿Ð¾Ñ\82Ñ\80ебан Ð·Ð° Ð¿Ñ\80иÑ\98авÑ\99иваÑ\9aе, Ð°Ð»Ð¸ Ð²Ð°Ð¼ Ñ\82Ñ\80еба Ð´Ð° Ð±Ð¸Ñ\81Ñ\82е Ñ\83кÑ\99Ñ\83Ñ\87или Ð¼Ð¾Ð³Ñ\83Ñ\9bноÑ\81Ñ\82и Ð¸Ð¼ÐµÑ\98ла на викију.",
+       "confirmemail_oncreate": "Ð\9aôд Ð·Ð° Ð¿Ð¾Ñ\82вÑ\80дÑ\83 Ñ\98е Ð¿Ð¾Ñ\81лаÑ\82 Ð½Ð° Ð²Ð°Ñ\88Ñ\83 Ð¸Ð¼ÐµÑ\98л-адÑ\80еÑ\81Ñ\83.\nÐ\9eваÑ\98 ÐºÃ´Ð´ Ð½Ð¸Ñ\98е Ð½ÐµÐ¾Ð¿Ñ\85одан Ð·Ð° Ð¿Ñ\80иÑ\98авÑ\99иваÑ\9aе, Ð°Ð»Ð¸ Ñ\9bеÑ\82е Ð¼Ð¾Ñ\80аÑ\82и Ð´Ð° Ð³Ð° Ð½Ð°Ð²ÐµÐ´ÐµÑ\82е Ð¿Ñ\80е Ð¾Ð¼Ð¾Ð³Ñ\83Ñ\9bаваÑ\9aа Ð±Ð¸Ð»Ð¾ ÐºÐ°ÐºÐ²Ð¸Ñ\85 Ñ\84Ñ\83нкÑ\86иÑ\98а Ð·Ð°Ñ\81нованиÑ\85 Ð½Ð° Ð¸Ð¼ÐµÑ\98лÑ\83 на викију.",
        "confirmemail_sendfailed": "{{SITENAME}} не може да пошаље имејл потврду.\nПроверите да ли је имејл адреса правилно написана.\n\nГрешка: $1",
        "confirmemail_invalid": "Неважећи код за потврду.\nКод је можда истекао.",
        "confirmemail_needlogin": "Морате бити $1 да бисте потврдили своју имејл-адресу.",
        "confirmemail_success": "Ваша имејл-адреса је потврђена.\nСада можете да се [[Special:UserLogin|пријавите]] и уживате у викију.",
        "confirmemail_loggedin": "Ваша имејл-адреса је сада потврђена.",
        "confirmemail_subject": "{{SITENAME}} – потврда имејл-адресе",
-       "confirmemail_body": "Неко, вероватно Ви, са IP адресе $1,\nрегистровао је налог „$2“ са овом имејл адресом на пројекту {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и активирали могућности имејла на пројекту {{SITENAME}}, отворите ова у прегледачу:\n\n$3\n\nАко ви *нисте* регистровали налог, пратите ову везу\nда бисте отказали потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче у $4.",
-       "confirmemail_body_changed": "Неко, вероватно Ви, с IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на пројекту {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и поново активирали могућности имејла, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче $6 у $7",
-       "confirmemail_body_set": "Неко, вероватно Ви, с IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали\nмогућности имејла на {{SITENAME}}, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче $4.",
+       "confirmemail_body": "Неко, вероватно Ви, са IP адресе $1,\nрегистровао је налог „$2“ са овом имејл адресом на пројекту {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и активирали функцију имејла на пројекту {{SITENAME}}, отворите ова у прегледачу:\n\n$3\n\nАко ви *нисте* регистровали налог, пратите ову везу\nда бисте отказали потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче у $4.",
+       "confirmemail_body_changed": "Неко, вероватно Ви, с IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на пројекту {{SITENAME}}.\n\nДа бисте потврдили да овај налог стварно припада вама и поново активирали функцију имејла, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче $6 у $7",
+       "confirmemail_body_set": "Неко, вероватно Ви, с IP адресе $1,\nпроменио је имејл адресу налога „$2“ у ову адресу на {{SITENAME}}.\n\nДа бисмо потврдили да овај налог стварно припада вама и поново активирали\nфункцију имејла на {{SITENAME}}, отворите следећу везу у прегледачу:\n\n$3\n\nАко налог *не* припада вама, пратите следећу везу да откажете потврду имејл адресе:\n\n$5\n\nОвај код за потврду истиче $4.",
        "confirmemail_invalidated": "Потврда имејл адресе је отказана",
        "invalidateemail": "Отказивање потврде имејла",
        "notificationemail_subject_changed": "Регистрована имејл адреса на пројекту {{SITENAME}} је промењена",
        "scarytranscludefailed-httpstatus": "[Не могу да преузмем шаблон $1: HTTP $2]",
        "scarytranscludetoolong": "[URL адреса је предугачка]",
        "deletedwhileediting": "<strong>Упозорење</strong>: Ова страница је избрисана након што сте почели са уређивањем!",
-       "confirmrecreate": "{{GENDER:$1|Ð\9aоÑ\80иÑ\81ник|Ð\9aоÑ\80иÑ\81ниÑ\86а}} [[User:$1|$1]] ([[User talk:$1|Ñ\80азговоÑ\80]]) Ñ\98е {{GENDER:$1|обÑ\80иÑ\81ао|обрисала}} ову страницу након што сте почели да је уређујете из следећег разлога:\n: <em>$2</em>\nПотврдите да стварно желите да направите страницу.",
-       "confirmrecreate-noreason": "{{GENDER:$1|Ð\9aоÑ\80иÑ\81ник|Ð\9aоÑ\80иÑ\81ниÑ\86а}} [[User:$1|$1]] ([[User talk:$1|Ñ\80азговоÑ\80]]) Ñ\98е {{GENDER:$1|обÑ\80иÑ\81ао|обрисала}} ову страницу након што сте почели да је уређујете. Потврдите да стварно желите да поново направите ову страницу.",
+       "confirmrecreate": "{{GENDER:$1|Ð\9aоÑ\80иÑ\81ник|Ð\9aоÑ\80иÑ\81ниÑ\86а}} [[User:$1|$1]] ([[User talk:$1|Ñ\80азговоÑ\80]]) Ñ\98е {{GENDER:$1|избÑ\80иÑ\81ао|избрисала}} ову страницу након што сте почели да је уређујете из следећег разлога:\n: <em>$2</em>\nПотврдите да стварно желите да направите страницу.",
+       "confirmrecreate-noreason": "{{GENDER:$1|Ð\9aоÑ\80иÑ\81ник|Ð\9aоÑ\80иÑ\81ниÑ\86а}} [[User:$1|$1]] ([[User talk:$1|Ñ\80азговоÑ\80]]) Ñ\98е {{GENDER:$1|избÑ\80иÑ\81ао|избрисала}} ову страницу након што сте почели да је уређујете. Потврдите да стварно желите да поново направите ову страницу.",
        "recreate": "Поново направи",
        "unit-pixel": "п",
        "confirm-purge-title": "Освежи ову страницу",
        "confirm-unwatch-top": "Уклонити ову страницу са списка надгледања?",
        "confirm-rollback-button": "У реду",
        "confirm-rollback-top": "Врати измене на овој страници?",
+       "confirm-mcrrestore-title": "Враћање измене",
        "confirm-mcrundo-title": "Поништавање промене",
        "mcrundofailed": "Поништавање није успело",
        "mcrundo-missingparam": "Недостаје потребан параметар на захтеву.",
        "mcrundo-changed": "Страница је промењена док сте гледали разлику. Прегледајте нову промену.",
+       "mcrundo-parse-failed": "Рашчлањивање нових измена није успело: $1",
        "semicolon-separator": ";&#32;",
        "comma-separator": ",&#32;",
        "colon-separator": ":&#32;",
        "watchlistedit-clear-removed": "{{PLURAL:$1|1 наслов је уклоњен|$1 наслова су уклоњена|$1 наслова је уклоњено}}:",
        "watchlistedit-too-many": "Има превише страница за приказ овде.",
        "watchlisttools-clear": "очисти списак надгледања",
-       "watchlisttools-view": "погледаÑ\98 Ñ\80елеванÑ\82не промене",
+       "watchlisttools-view": "погледаÑ\98 Ñ\81Ñ\80одне промене",
        "watchlisttools-edit": "погледај и уреди списак надгледања",
        "watchlisttools-raw": "уреди сиров списак надгледања",
        "iranian-calendar-m1": "Фарвардин",
        "redirect-file": "Назив датотеке",
        "redirect-logid": "ID дневника",
        "redirect-not-exists": "Вредност није пронађена",
+       "redirect-not-numeric": "Вредност није нумеричка",
        "fileduplicatesearch": "Претрага дупликата датотека",
        "fileduplicatesearch-summary": "Претрага дуплираних датотека према хеш вредности.",
        "fileduplicatesearch-filename": "Назив датотеке:",
        "tags-activate-title": "Активирање ознака",
        "tags-activate-question": "Активирате ознаку „$1“.",
        "tags-activate-reason": "Разлог:",
-       "tags-activate-not-allowed": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð°ÐºÑ\82ивиÑ\80аÑ\82и Ð¾Ð·Ð½Ð°ÐºÑ\83 â\80\9e$1â\80\9c.",
+       "tags-activate-not-allowed": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð°ÐºÑ\82ивиÑ\80аÑ\82и Ð¾Ð·Ð½Ð°ÐºÑ\83 â\80\9e$1â\80\9d.",
        "tags-activate-not-found": "Ознака „$1“ не постоји.",
        "tags-activate-submit": "Активирај",
        "tags-deactivate-title": "Деактивирање ознака",
        "tags-deactivate-question": "Деактивирате ознаку „$1“.",
        "tags-deactivate-reason": "Разлог:",
-       "tags-deactivate-not-allowed": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð´ÐµÐ°ÐºÑ\82ивиÑ\80аÑ\82и Ð¾Ð·Ð½Ð°ÐºÑ\83 â\80\9e$1â\80\9c.",
+       "tags-deactivate-not-allowed": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð´ÐµÐ°ÐºÑ\82ивиÑ\80аÑ\82и Ð¾Ð·Ð½Ð°ÐºÑ\83 â\80\9e$1â\80\9d.",
        "tags-deactivate-submit": "Декативирај",
        "tags-apply-no-permission": "Немате дозволу да примените ознаке промена заједно са својим променама.",
        "tags-apply-blocked": "Не можете да примените ознаке тагова заједно са вашим променама све док сте блокирани.",
        "tags-edit-reason": "Разлог:",
        "tags-edit-revision-submit": "Примени промене {{PLURAL:$1|овој измени|$1 изменама}}",
        "tags-edit-success": "Промене су примењене.",
-       "tags-edit-failure": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80именим Ð¸Ð·мене:\n$1",
+       "tags-edit-failure": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ñ\80имениÑ\82и Ð¿Ñ\80омене:\n$1",
        "tags-edit-nooldid-title": "Неважећа одредишна измена",
        "tags-edit-nooldid-text": "Нисте одредили било коју циљану измену на којој ће се извршити ова функција или ако наведена измена не постоји.",
        "tags-edit-none-selected": "Изаберите бар једну ознаку коју треба додати или уклонити.",
        "htmlform-title-not-exists": "$1 не постоји.",
        "htmlform-user-not-exists": "<strong>$1</strong> не постоји.",
        "htmlform-user-not-valid": "<strong>$1</strong> није валидно корисничко име.",
-       "logentry-delete-delete": "$1 Ñ\98е {{GENDER:$2|обÑ\80иÑ\81ао|обрисала}} страницу $3",
-       "logentry-delete-delete_redir": "$1 Ñ\98е {{GENDER:$2|обÑ\80иÑ\81ао|обрисала}} преусмерење $3 преписивањем",
+       "logentry-delete-delete": "$1 Ñ\98е {{GENDER:$2|избÑ\80иÑ\81ао|избрисала}} страницу $3",
+       "logentry-delete-delete_redir": "$1 Ñ\98е {{GENDER:$2|избÑ\80иÑ\81ао|избрисала}} преусмерење $3 преписивањем",
        "logentry-delete-restore": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3 ($4)",
        "logentry-delete-restore-nocount": "$1 је {{GENDER:$2|вратио|вратила}} страницу $3",
        "restore-count-revisions": "{{PLURAL:$1|1 измена|$1 измене|$1 измена}}",
        "mediastatistics-header-unknown": "Непознато",
        "mediastatistics-header-bitmap": "Битмап слике",
        "mediastatistics-header-drawing": "Цртежи (векторске слике)",
-       "mediastatistics-header-audio": "Звук",
+       "mediastatistics-header-audio": "Звучни снимци",
        "mediastatistics-header-video": "Видеи",
        "mediastatistics-header-multimedia": "Обогаћени медији",
        "mediastatistics-header-office": "Канцеларија",
        "log-action-filter-upload-upload": "ново отпремање",
        "log-action-filter-upload-overwrite": "промена постојећег",
        "authmanager-authn-not-in-progress": "Потврда идентитета није у току или је дошло до губитка података о сесији. Почните испочетка.",
-       "authmanager-authn-no-primary": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ñ\80овеÑ\80им пружене акредитиве.",
+       "authmanager-authn-no-primary": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ð¾Ñ\82вÑ\80диÑ\82и пружене акредитиве.",
        "authmanager-authn-no-local-user": "Пружени акредитиви нису повезани ни са једним корисником на овом викију.",
-       "authmanager-authn-no-local-user-link": "Пружени су важећи акредитиви, али нису повезани ни с једним корисником на овом викију. Пријавите се на неки други начин или направите нови кориснички налог, што ће вам дати могућност да повежете претходне акредитиве на нови налог.",
+       "authmanager-authn-no-local-user-link": "Пружени акредитиви су важећи, али нису повезани ни са једним корисником на овом викију. Пријавите се на неки други начин или отворите нови кориснички налог, што ће вам дати опцију да повежете претходне акредитиве на нови налог.",
        "authmanager-authn-autocreate-failed": "Не могу да аутоматски направим локални налог: $1",
        "authmanager-change-not-supported": "Не могу да променим пружене акредитиве јер их ништа не би користило.",
        "authmanager-create-disabled": "Отварање налога је онемогућено.",
        "authform-notoken": "Недостаје токен",
        "authform-wrongtoken": "Погрешан токен",
        "specialpage-securitylevel-not-allowed-title": "Није дозвољено",
-       "specialpage-securitylevel-not-allowed": "Ð\96ао Ð½Ð°Ð¼ Ñ\98е, Ð½Ð¸Ñ\98е Ð²Ð°Ð¼ Ð´Ð¾Ð·Ð²Ð¾Ñ\99ено Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ñ\98еÑ\80 Ð½Ðµ Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð¿Ð¾Ñ\82вÑ\80дим ваш идентитет.",
-       "authpage-cannot-login": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ð¿Ð¾Ñ\87нем пријаву.",
-       "authpage-cannot-login-continue": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ñ\81Ñ\82авим са пријавом. Ваша сесија је највероватније истекла.",
-       "authpage-cannot-create": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ð¿Ð¾Ñ\87нем отварање налога.",
-       "authpage-cannot-create-continue": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð½Ð°Ñ\81Ñ\82авим ÐºÑ\80еиÑ\80аÑ\9aе налога. Ваша сесија је највероватније истекла.",
-       "authpage-cannot-link": "Ð\9dе Ð¼Ð¾Ð³Ñ\83 Ð´Ð° Ð·Ð°Ð¿Ð¾Ñ\87нем повезивање налога.",
+       "specialpage-securitylevel-not-allowed": "Ð\9dиÑ\98е Ð²Ð°Ð¼ Ð´Ð¾Ð·Ð²Ð¾Ñ\99ено Ð´Ð° ÐºÐ¾Ñ\80иÑ\81Ñ\82иÑ\82е Ð¾Ð²Ñ\83 Ñ\81Ñ\82Ñ\80аниÑ\86Ñ\83 Ñ\98еÑ\80 Ð½Ð¸Ñ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð¿Ð¾Ñ\82вÑ\80диÑ\82и ваш идентитет.",
+       "authpage-cannot-login": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð·Ð°Ð¿Ð¾Ñ\87еÑ\82и пријаву.",
+       "authpage-cannot-login-continue": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ñ\81Ñ\82авиÑ\82и са пријавом. Ваша сесија је највероватније истекла.",
+       "authpage-cannot-create": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð·Ð°Ð¿Ð¾Ñ\87еÑ\82и отварање налога.",
+       "authpage-cannot-create-continue": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð½Ð°Ñ\81Ñ\82авиÑ\82и Ñ\81а Ð¾Ñ\82ваÑ\80аÑ\9aем налога. Ваша сесија је највероватније истекла.",
+       "authpage-cannot-link": "Ð\9dиÑ\98е Ð¼Ð¾Ð³Ñ\83Ñ\9bе Ð·Ð°Ð¿Ð¾Ñ\87еÑ\82и повезивање налога.",
        "authpage-cannot-link-continue": "Не могу наставити повезивање налога. Ваша сесија је највероватније истекла.",
        "cannotauth-not-allowed-title": "Приступ је одбијен",
        "cannotauth-not-allowed": "Није вам дозвољено да користите ову страницу",
        "removecredentials-invalidsubpage": "„$1“ није важећи тип акредитива.",
        "removecredentials-success": "Ваши акредитиви су уклоњени.",
        "credentialsform-provider": "Тип акредитива:",
-       "credentialsform-account": "Ð\9dазив налога:",
+       "credentialsform-account": "Ð\98ме налога:",
        "cannotlink-no-provider-title": "Нема налога за повезивање",
        "cannotlink-no-provider": "Нема налога за повезивање.",
        "linkaccounts": "Спајање налога",
index 7aefc63..57b246f 100644 (file)
        "resetpass-no-info": "Morate biti prijavljeni da biste pristupili ovoj stranici.",
        "resetpass-submit-loggedin": "Promeni lozinku",
        "resetpass-submit-cancel": "Otkaži",
-       "resetpass-wrong-oldpass": "Nevažeća privremena ili aktuelna lozinka.\nMožda ste već promenili lozinku ili ste zahtevali novu privremenu lozinku.",
+       "resetpass-wrong-oldpass": "Nevažeća privremena ili trenutna lozinka.\nMožda ste već promenili lozinku ili ste zahtevali novu privremenu lozinku.",
        "resetpass-recycled": "Uneli ste sadašnju lozinku, da biste promenili lozinku morate uneti novu.",
        "resetpass-temp-emailed": "Prijavili ste se sa privremenim kodom iz imejla.\nDa biste završili prijavljivanje morate postaviti novu lozinku ovde:",
        "resetpass-temp-password": "Privremena lozinka:",
        "subject-preview": "Pregled teme:",
        "previewerrortext": "Došlo je do greške pri pokušaju pregleda promena.",
        "blockedtitle": "Korisnik je blokiran",
-       "blockedtext": "<strong>Vaše korisničko ime ili IP adresa je blokirana.</strong>\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog je <em>$2</em>.\n\n* Početak blokiranja: $8\n* Istek blokiranja: $6\n* Blokirani: $7\n\nMožete da kontaktirate {{GENDER:$4|korisnika|korisnicu}} $1 ili drugog [[{{MediaWiki:Grouppage-sysop}}|administratora]] da biste razgovarali o blokiranju.\nNe možete da koristite mogućnost „{{int:emailuser}}” osim ako ste naveli validnu imejl adresu u svojim [[Special:Preferences|podešavanjima naloga]] i niste blokirani od korišćenja iste.\nVaša aktuelna IP adresa je $3, a ID blokade #$5.\nNavedite sve gornje detalje pri pravljenju bilo kakvih upita.",
-       "autoblockedtext": "Vaša IP adresa je automatski blokirana jer ju je koristio drugi korisnik, koga je {{GENDER:$4|blokirao|blokirala}} $1.\nRazlog:\n\n:<em>$2</em>\n\n* Početak blokade: $8\n* Kraj blokade: $6\n* Ime korisnika: $7\n\nMožete da kontaktirate {{GENDER:$4|korisnika|korisnicu}} $1 ili drugog [[{{MediaWiki:Grouppage-sysop}}|administratora]] da biste raspravljali o blokadi.\n\nZapamtite da ne možete da koristite mogućnost „{{int:emailuser}}“ osim ako ste naveli valjanu imejl adresu u svojim [[Special:Preferences|podešavanjima]].\n\nVaša aktuelna IP adresa je $3, a ID blokade $5.\nUključite sve gornje detalje pri pravljenju bilo kakvih upita.",
+       "blockedtext": "<strong>Vaše korisničko ime ili IP adresa je blokirana.</strong>\n\nBlokiranje je {{GENDER:$4|izvršio|izvršila}} $1.\nRazlog je <em>$2</em>.\n\n* Početak blokiranja: $8\n* Istek blokiranja: $6\n* Blokirani: $7\n\nMožete da kontaktirate {{GENDER:$4|korisnika|korisnicu}} $1 ili drugog [[{{MediaWiki:Grouppage-sysop}}|administratora]] da biste razgovarali o blokiranju.\nNe možete da koristite mogućnost „{{int:emailuser}}” osim ako ste naveli validnu imejl adresu u svojim [[Special:Preferences|podešavanjima naloga]] i niste blokirani od korišćenja iste.\nVaša trenutna IP adresa je $3, a ID blokade #$5.\nNavedite sve gornje detalje pri pravljenju bilo kakvih upita.",
+       "autoblockedtext": "Vaša IP adresa je automatski blokirana jer ju je koristio drugi korisnik, koga je {{GENDER:$4|blokirao|blokirala}} $1.\nRazlog:\n\n:<em>$2</em>\n\n* Početak blokade: $8\n* Kraj blokade: $6\n* Ime korisnika: $7\n\nMožete da kontaktirate {{GENDER:$4|korisnika|korisnicu}} $1 ili drugog [[{{MediaWiki:Grouppage-sysop}}|administratora]] da biste raspravljali o blokadi.\n\nZapamtite da ne možete da koristite mogućnost „{{int:emailuser}}“ osim ako ste naveli valjanu imejl adresu u svojim [[Special:Preferences|podešavanjima]].\n\nVaša trenutna IP adresa je $3, a ID blokade $5.\nUključite sve gornje detalje pri pravljenju bilo kakvih upita.",
        "blockednoreason": "nije naveden razlog",
        "whitelistedittext": "Za uređivanje stranice je potrebno da budete $1.",
        "confirmedittext": "Morate da potvrdite svoju imejl adresu pre uređivanja stranica.\nPostavite i potvrdite imejl adresu preko [[Special:Preferences|podešavanja]].",
        "rev-showdeleted": "prikaži",
        "revisiondelete": "Brisanje/vraćanje izmena",
        "revdelete-nooldid-title": "Nevažeća odredišna izmena",
-       "revdelete-nooldid-text": "Niste naveli odredišnu izmenu na kojoj treba da se izvrši ova funkcija, ta izmena ne postoji, ili pokušavate da sakrijete aktuelnu izmenu.",
+       "revdelete-nooldid-text": "Niste naveli odredišnu izmenu na kojoj treba da se izvrši ova funkcija, ta izmena ne postoji, ili pokušavate da sakrijete trenutnu izmenu.",
        "revdelete-no-file": "Tražena datoteka ne postoji.",
        "revdelete-show-file-confirm": "Jeste li sigurni da želite da vidite izbrisanu izmenu datoteke „<nowiki>$1</nowiki>“ od $2; $3?",
        "revdelete-show-file-submit": "Da",
        "revdel-restore": "promeni vidljivost",
        "pagehist": "Istorija stranice",
        "deletedhist": "Izbrisana istorija",
-       "revdelete-hide-current": "Greška pri sakrivanju stavke od $1, $2: Ovo je aktuelna izmena.\nNe može da bude sakrivena.",
+       "revdelete-hide-current": "Greška pri sakrivanju stavke od $1, $2: Ovo je trenutna izmena.\nNe može da bude sakrivena.",
        "revdelete-show-no-access": "Greška pri prikazivanju stavke od $1, $2: označena je kao „ograničena“.\nNemate pristup do nje.",
        "revdelete-modify-no-access": "Greška pri menjanju stavke od $1, $2: označena je kao „ograničena“.\nNemate pristup do nje.",
        "revdelete-modify-missing": "Greška pri menjanju IB stavke $1: ona ne postoji u bazi podataka.",
        "revdelete-edit-reasonlist": "Uredi razloge za brisanje",
        "revdelete-offender": "Autor izmene:",
        "suppressionlog": "Evidencija sakrivanja",
-       "suppressionlogtext": "Ispod se nalazi spisak brisanja i blokiranja koji uključuje sadržaj sakriven od administratora. Pogledajte [[Special:BlockList|spisak blokiranja]] za spisak aktuelnih operacija zabrana i blokiranja.",
+       "suppressionlogtext": "Ispod se nalazi spisak brisanja i blokiranja koji uključuje sadržaj sakriven od administratora. Pogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih operacija zabrana i blokiranja.",
        "mergehistory": "Spajanje istorija stranice",
        "mergehistory-header": "Ova stranica vam omogućava da spojite izmene neke izvorne stranice u novu stranicu.\nZapamtite da će ova promena ostaviti nepromenjen sadržaj istorije stranice.",
        "mergehistory-box": "Spoji izmene dve stranice:",
        "right-undelete": "vraćanje izbrisanih stranica",
        "right-suppressrevision": "pregledanje, skrivanje i vraćanje određenih izmena stranica od svih korisnika",
        "right-viewsuppressed": "pregledanje izmena skrivenih od svih korisnika",
-       "right-suppressionlog": "pregledanje privatnih evidencija",
+       "right-suppressionlog": "pregledanje privatnih dnevnika",
        "right-block": "blokiranje daljih izmena drugih korisnika",
        "right-blockemail": "blokiranje korisnika da šalju imejl",
        "right-hideuser": "blokiranje korisničkog imena i njegovo sakrivanje od javnosti",
        "newuserlogpage": "Evidencija novih korisnika",
        "newuserlogpagetext": "Ovo je dnevnik o registraciji novih korisnika.",
        "rightslog": "Evidencija korisničkih prava",
-       "rightslogtext": "Ovo je evidencija promena korisničkih prava.",
+       "rightslogtext": "Ovo je dnevnik promena korisničkih prava.",
        "action-read": "čitate ovu stranicu",
        "action-edit": "uređujete ovu stranicu",
        "action-createpage": "napravite ovu stranicu",
        "file-thumbnail-no": "Ime datoteke počinje sa <strong>$1</strong>.\nIzgleda da se radi o slici umanjene veličine <em>(sličica)</em>.\nAko imate ovu sliku u punoj rezoluciji, otpremite je, u protivnom, promenite ime datoteke.",
        "fileexists-forbidden": "Datoteka s ovim nazivom već postoji i ne može se zameniti.\nAko i dalje želite da pošaljete datoteku, vratite se i izaberite drugi naziv.\n[[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Datoteka sa ovim imenom već postoji u zajedničkoj ostavi.\nAko još uvek želite da otpremite datoteku, vratite se i koristite novo ime.\n[[File:$1|thumb|center|$1]]",
-       "fileexists-no-change": "Datoteka je duplikat aktuelne verzije <strong>[[:$1]]</strong>.",
+       "fileexists-no-change": "Datoteka je duplikat trenutne verzije <strong>[[:$1]]</strong>.",
        "fileexists-duplicate-version": "Datoteka je duplikat {{PLURAL:$2|stare verzije|starih verzija}} <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Ovo je duplikat {{PLURAL:$1|sledeće datoteke|sledećih datoteka}}:",
        "file-deleted-duplicate": "Datoteka koja je identična ovoj ([[:$1]]) je ranije bila izbrisana.\nTrebate da proverite istoriju brisanja te datoteke pre nego što nastavite sa njenim ponovnim optremanjem.",
        "uploadstash-file-not-found-not-exists": "Ne mogu naći putanju ili ovo nije obična datoteka.",
        "uploadstash-file-too-large": "Ne mogu poslužiti datoteku veću od $1 {{PLURAL:$1|bajta|bajtova}}",
        "uploadstash-not-logged-in": "Niko nije prijavljen. Datoteke moraju pripadati korisnicima.",
-       "uploadstash-wrong-owner": "Ova datoteka ($1) ne pripada aktuelnom korisniku.",
+       "uploadstash-wrong-owner": "Ova datoteka ($1) ne pripada trenutnom korisniku.",
        "uploadstash-no-such-key": "Nema takvog ključa ($1). Ne mogu ukloniti.",
        "uploadstash-no-extension": "Dodatak je prazan.",
        "uploadstash-zero-length": "Datoteka je prazna",
        "filehist-deleteall": "izbriši sve",
        "filehist-deleteone": "izbriši",
        "filehist-revert": "vrati",
-       "filehist-current": "aktuelna",
+       "filehist-current": "trenutna",
        "filehist-datetime": "Datum/vreme",
        "filehist-thumb": "Sličica",
        "filehist-thumbtext": "Minijatura za verziju na dan $1",
        "protect_expiry_old": "Vreme isteka je u prošlosti.",
        "protect-unchain-permissions": "Otključaj daljnja podešavanja zaštite",
        "protect-text": "Ovde možete da pogledate i promenite nivo zaštite stranice <strong>$1</strong>.",
-       "protect-locked-blocked": "Ne možete da menjate nivoe zaštite dok ste blokirani.\nOvo su aktuelna podešavanja stranice '''$1''':",
-       "protect-locked-dblock": "Nivoi zaštite se ne mogu menjati jer je aktivna baza podataka zaključana.\nOvo su aktuelna podešavanja stranice '''$1''':",
-       "protect-locked-access": "Vaš nalog nema dozvolu da menja nivoe zaštite stranice.\nOvo su aktuelna podešavanja stranice '''$1''':",
+       "protect-locked-blocked": "Ne možete da menjate nivoe zaštite dok ste blokirani.\nOvo su trenutna podešavanja stranice '''$1''':",
+       "protect-locked-dblock": "Nivoi zaštite se ne mogu menjati jer je aktivna baza podataka zaključana.\nOvo su trenutna podešavanja stranice '''$1''':",
+       "protect-locked-access": "Vaš nalog nema dozvolu da menja nivoe zaštite stranice.\nOvo su trenutna podešavanja stranice '''$1''':",
        "protect-cascadeon": "Ova stranica je trenutno zaštićena jer je uključena u {{PLURAL:$1|sledeću stranicu koja ima|sledeće stranice koje imaju}} uključenu prenosivu zaštitu.\nPromene nivoa zaštite ove stranice neće da utiču na prenosivu zaštitu.",
        "protect-default": "Dopušteno svim korisnicima",
        "protect-fallback": "Dozvoljeno samo korisnicima sa dozvolom „$1“",
        "contribsub2": "Za {{GENDER:$3|$1}} ($2)",
        "contributions-userdoesnotexist": "Korisnički nalog „$1“ nije otvoren.",
        "nocontribs": "Nisu pronađene promene koje odgovaraju ovim kriterijumima.",
-       "uctop": "(aktuelna)",
+       "uctop": "(trenutna)",
        "month": "od meseca (i ranije):",
        "year": "od godine (i ranije):",
        "date": "Od datuma (i ranije):",
        "sp-contributions-newbies": "Prikaži samo doprinose novih naloga",
        "sp-contributions-newbies-sub": "Za nove korisnike",
        "sp-contributions-newbies-title": "Doprinosi novih korisnika",
-       "sp-contributions-blocklog": "evidencija blokiranja",
+       "sp-contributions-blocklog": "dnevnik blokiranja",
        "sp-contributions-suppresslog": "izbrisani doprinosi {{GENDER:$1|korisnika|korisnice}}",
        "sp-contributions-deleted": "izbrisani doprinosi {{GENDER:$1|korisnika|korisnice}}",
        "sp-contributions-uploads": "otpremanja",
-       "sp-contributions-logs": "evidencije",
+       "sp-contributions-logs": "dnevnici",
        "sp-contributions-talk": "razgovor",
        "sp-contributions-userrights": "upravljanje pravima {{GENDER:$1|korisnika|korisnice}}",
        "sp-contributions-blocked-notice": "Ovaj korisnik je trenutno blokiran. \nPoslednji unos u evidenciji blokiranja je naveden ispod kao referenca:",
        "blocklog-showsuppresslog": "{{GENDER:$1|Ovaj korisnik je ranije blokiran i sakriven|Ova korisnica je ranije blokirana i sakrivena}}.\nIstorija sakrivanja se nalazi ispod:",
        "blocklogentry": "je blokirao [[$1]] sa vremenom isticanja od $2 $3",
        "reblock-logentry": "{{GENDER:|je promenio|je promenila}} podešavanja za blokiranje {{GENDER:$1|korisnika|korisnice}} [[$1]] sa vremenom isteka od $2 ($3)",
-       "blocklogtext": "Ovo je dnevnik radnji blokiranja i deblokiranja korisnika.\nAutomatski blokirane IP adrese nisu navedene.\nPogledajte [[Special:BlockList|spisak blokiranja]] za spisak aktuelnih operacija zabrana i blokiranja.",
+       "blocklogtext": "Ovo je dnevnik radnji blokiranja i deblokiranja korisnika.\nAutomatski blokirane IP adrese nisu navedene.\nPogledajte [[Special:BlockList|spisak blokiranja]] za spisak trenutnih operacija zabrana i blokiranja.",
        "unblocklogentry": "je deblokirao $1",
        "block-log-flags-anononly": "samo anonimni korisnici",
        "block-log-flags-nocreate": "onemogućeno otvaranje naloga",
        "move-over-sharedrepo": "[[:$1]] se nalazi na deljenom skladištu. Ako premestite datoteku na ovaj naslov, to će zameniti deljenu datoteku.",
        "file-exists-sharedrepo": "Navedeni naziv datoteke se već koristi u deljenom skladištu.\nIzaberite drugi naziv.",
        "export": "Izvoz stranica",
-       "exporttext": "Možete da izvezete tekst i istoriju izmena određene stranice ili skupa stranica uklljenih u XML formatu.\nOvo onda može da bude uvezeno u drugi viki koji koristi Medijaviki softver preko [[Special:Import|stranice za uvoz]].\n\nDa biste izvezli stranice, unesite nazive u okviru ispod, s jednim naslovom po redu, i izaberite da li želite aktuelnu izmenu i sve ostale, ili samo aktuelnu izmenu s podacima o poslednjoj izmeni.\n\nU drugom slučaju, možete koristiti i link, na primer [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za stranicu [[{{MediaWiki:Mainpage}}]].",
+       "exporttext": "Možete da izvezete tekst i istoriju izmena određene stranice ili skupa stranica uklljenih u XML formatu.\nOvo onda može da bude uvezeno u drugi viki koji koristi Medijaviki softver preko [[Special:Import|stranice za uvoz]].\n\nDa biste izvezli stranice, unesite nazive u okviru ispod, s jednim naslovom po redu, i izaberite da li želite trenutnu izmenu i sve ostale, ili samo trenutnu izmenu s podacima o poslednjoj izmeni.\n\nU drugom slučaju, možete koristiti i link, na primer [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] za stranicu [[{{MediaWiki:Mainpage}}]].",
        "exportall": "Izvezi sve stranice",
-       "exportcuronly": "Uključi samo aktuelnu izmenu, ne celu istoriju",
+       "exportcuronly": "Uključi samo trenutnu izmenu, ne celu istoriju",
        "exportnohistory": "----\n'''Napomena:''' izvoz pune istorije stranica preko ovog obrasca je onemogućeno iz tehničkih razloga.",
        "exportlistauthors": "Uključi celokupan spisak doprinosilaca za svaku stranicu",
        "export-submit": "Izvezi",
        "markedaspatrolled": "Označeno kao patrolirano",
        "markedaspatrolledtext": "Izabrana izmena stranice [[:$1]] označena je kao patrolirana.",
        "rcpatroldisabled": "Patroliranje skorašnjih izmena je onemogućeno",
-       "rcpatroldisabledtext": "Mogućnost patroliranja skorašnjih izmena je aktuelno onemogućena.",
+       "rcpatroldisabledtext": "Mogućnost patroliranja skorašnjih izmena je trenutno onemogućena.",
        "markedaspatrollederror": "Ne mogu da označim kao patrolirano.",
        "markedaspatrollederrortext": "Morate navesti izmenu da biste je označili kao patroliranu.",
        "markedaspatrollederror-noautopatrol": "Ne možete da označite svoje promene kao patrolirane.",
        "specialpages-group-maintenance": "Izveštaji održavanja",
        "specialpages-group-other": "Ostale posebne stranice",
        "specialpages-group-login": "Prijava / registracija",
-       "specialpages-group-changes": "Nedavne promene i evidencije",
+       "specialpages-group-changes": "Nedavne promene i dnevnici",
        "specialpages-group-media": "Izveštaji o multimedijalnom sadržaju i otpremanja",
        "specialpages-group-users": "Korisnici i korisnička prava",
        "specialpages-group-highuse": "Najčešće korišćene stranice",
index 622880d..38c7c23 100644 (file)
        "botpasswords-invalid-name": "Det angivna användarnamnet innehåller inte separatorn för botlösenord (\"$1\").",
        "botpasswords-not-exist": "Användaren \"$1\" har inte ett botlösenord som är \"$2\".",
        "botpasswords-needs-reset": "Botlösenordet för botnamnet \"$2\" till {{GENDER:$1|användaren}} \"$1\" måste återställas.",
+       "botpasswords-locked": "Du kan inte logga in med ett botlösenord eftersom ditt konto är låst.",
        "resetpass_forbidden": "Lösenord kan inte ändras",
        "resetpass_forbidden-reason": "Lösenorden kan inte ändras: $1",
        "resetpass-no-info": "Du måste vara inloggad för att komma åt den här sidan direkt.",
        "confirm-unwatch-top": "Ta bort denna sida från din bevakningslista?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Återställ redigeringar på denna sida?",
+       "confirm-mcrrestore-title": "Återställ en sidversion",
        "confirm-mcrundo-title": "Ångra en ändring",
        "mcrundofailed": "Misslyckades att ångra",
        "mcrundo-missingparam": "Nödvändiga parametrar saknas i begäran.",
        "mcrundo-changed": "Sidan har ändrats sedan du visade skillnaden. Granska den nya ändringen.",
+       "mcrundo-parse-failed": "Misslyckades att tolka den nya sidversionen: $1",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← föregående sida",
        "imgmultipagenext": "nästa sida →",
        "redirect-file": "Filnamn",
        "redirect-logid": "Logg-ID",
        "redirect-not-exists": "Värdet hittades inte",
+       "redirect-not-numeric": "Värdet är inte numeriskt",
        "fileduplicatesearch": "Sök efter dubblettfiler",
        "fileduplicatesearch-summary": "Sök efter dubblettfiler baserat på filernas hash-värden.",
        "fileduplicatesearch-filename": "Filnamn:",
index c4590dc..e2a152b 100644 (file)
@@ -53,7 +53,8 @@
                        "Rakeshonwiki",
                        "Kaartic",
                        "Fitoschido",
-                       "Matěj Suchánek"
+                       "Matěj Suchánek",
+                       "UY Scuti"
                ]
        },
        "tog-underline": "அடிக்கோடிட்டத்தை இணை:",
index 0701ffb..6cc0d7b 100644 (file)
        "createacct-emailoptional": "E-posta adresi (isteğe bağlı)",
        "createacct-email-ph": "E-posta adresinizi girin",
        "createacct-another-email-ph": "E-posta adresinizi girin",
-       "createaccountmail": "Geçici bir rastgele şifre kullanabilir ve bu şifreyi belirtilen e-posta adresine gönderebilirsiniz",
+       "createaccountmail": "Geçici bir rastgele parola kullanabilir ve bu parolayı belirtilen e-posta adresine gönderebilirsiniz",
        "createaccountmail-help": "Parolayı öğrenmeden başka bir kişi için hesap oluşturmak amacıyla kullanılabilir.",
        "createacct-realname": "Gerçek adı (isteğe bağlı)",
        "createacct-reason": "Gerekçe",
        "loginerror": "Oturum açma hatası.",
        "createacct-error": "Hesap oluşturma hatası",
        "createaccounterror": "Hesap oluşturulamıyor: $1",
-       "nocookiesnew": "Kullanıcı hesabı oluşturuldu ama oturum açamadınız.\nOturum açmak için {{SITENAME}} çerezleri kullanır.\nÇerez kullanımı devredışı.\nLütfen çerez kullanımını açınız ve yeni kullanıcı adınız ve şifrenizle oturum açınız.",
-       "nocookieslogin": "{{SITENAME}} sitesinde oturum açabilmek için çerezlerinizin açık olması gerekiyor. Sizin çerezleriniz kapalı. Lütfen açınız ve bir daha deneyiniz.",
+       "nocookiesnew": "Kullanıcı hesabı oluşturuldu, ama oturum açmış durumda değilsiniz.\n{{SITENME}}, kullanıcı oturumlarını açmak için tanımlama bilgilerinden yararlanır.\nTanımlama bilgilerini devre dışı bıraktınız.\nLütfen etkinleştirin ve ardından yeni kullanıcı adı ve parolanızla oturum açın.",
+       "nocookieslogin": "{{SITENAME}}, kullanıcı oturumlarını açmak için tanımlama bilgilerinden yararlanır.\nTanımlama bilgilerini devre dışı bıraktınız.\nLütfen etkinleştirip yeniden deneyin.",
        "nocookiesfornew": "Kullanıcı hesabı oluşturulamadı, sorunun kaynağını da tespit edemedik.\nÇerezlerin açık olduğundan emin olun ve bu sayfayı yeniden yükleyip tekrar deneyin.",
        "createacct-loginerror": "Hesap başarılı şekilde oluşturuldu ancak otomatik olarak oturumunuz açılmadı. Lütfen [[Special:UserLogin|manuel giriş]] sayfasına gidin.",
        "noname": "Geçerli bir kullanıcı adı girmediniz.",
        "wrongpasswordempty": "Boş parola girdiniz. Lütfen tekrar deneyiniz.",
        "passwordtooshort": "Parolalar en az {{PLURAL:$1|1 karakter|$1 karakter}} uzunluğunda olmalı.",
        "passwordtoolong": "Parolalar $1 karakterden uzun olamaz.",
-       "passwordtoopopular": "Yaygın olarak seçilen şifreler kullanılamaz. Lütfen tahmin edilmesi daha zor bir şifre seçin.",
+       "passwordtoopopular": "Yaygın olarak seçilen parolalar kullanılamaz. Lütfen tahmin edilmesi daha zor bir parola seçin.",
        "password-name-match": "Parolanız kullanıcı adınızdan farklı olmalıdır.",
        "password-login-forbidden": "Bu kullanıcı adı ve parolanın kullanımı yasaklanmıştır.",
        "mailmypassword": "Parolayı sıfırla",
        "accountcreated": "Hesap açıldı",
        "accountcreatedtext": "[[{{ns:User}}:$1|$1]]([[{{ns:User talk}}:$1|msj]])   için kullanıcı hesabı oluşturuldu.",
        "createaccount-title": "{{SITENAME}} için hesap oluşturma",
-       "createaccount-text": "Birisi {{SITENAME}} sitesinde ($4) sizin e-posta adresinizi kullarak, şifresi \"$3\" olan, \"$2\" isimli bir hesap oluşturdu.\n\nSiteye giriş yapmalı ve parolanızı değiştirmelisiniz.\n\nEğer kullanıcı hesabını yanlışlıkla oluşturmuş iseniz, bu mesajı yoksayabilirsiniz.",
+       "createaccount-text": "Birisi {{SITENAME}} sitesinde ($4) sizin e-posta adresinizi kullarak, parolası \"$3\" olan, \"$2\" isimli bir hesap oluşturdu.\n\nSiteye giriş yapmalı ve parolanızı değiştirmelisiniz.\n\nEğer kullanıcı hesabını yanlışlıkla oluşturmuş iseniz, bu mesajı yoksayabilirsiniz.",
        "login-throttled": "Yakın zamanda çok fazla oturum açma girişiminde bulundunuz.\nLütfen yeniden denemeden önce $1 süreyle bekleyin.",
        "login-abort-generic": "Giriş başarısız - Durduruldu",
        "login-migrated-generic": "Hesabınız aktarılmış ve kullanıcı adınız artık bu vikide yok.",
        "changepassword-success": "Parolanız değiştirildi!",
        "changepassword-throttled": "Çok fazla yeni oturum açma girişiminde bulundunuz.\nLütfen tekrar denemeden önce $1 bekleyin.",
        "botpasswords": "Bot parolaları",
-       "botpasswords-summary": "<em>Bot şifreleri,</em> hesabın ana giriş kimlik bilgilerini kullanmadan API aracılığıyla bir kullanıcı hesabına erişime izin verir. Bir bot şifresi ile giriş yaptığınızda mevcut kullanıcı hakları kısıtlanabilir.\n\nBunu neden yapmak isteyebileceğinizi bilmiyorsanız, yapmayınız. Hiç kimse sizden bunlardan birini üretip onlara vermenizi istememelidir.",
+       "botpasswords-summary": "<em>Bot parolaları,</em> hesabın ana giriş kimlik bilgilerini kullanmadan API aracılığıyla bir kullanıcı hesabına erişime izin verir. Bir bot parolası ile giriş yaptığınızda mevcut kullanıcı hakları kısıtlanabilir.\n\nBunu neden yapmak isteyebileceğinizi bilmiyorsanız, yapmayınız. Hiç kimse sizden bunlardan birini üretip onlara vermenizi istememelidir.",
        "botpasswords-disabled": "Bot parolaları devre dışı.",
        "botpasswords-no-central-id": "Bot parolaları kullanmak için, merkezi bir hesap ile oturum açmalısınız.",
        "botpasswords-existing": "Mevcut bot parolaları",
        "botpasswords-updated-body": "\"$2\" adlı {{GENDER:$2|kullanıcının}} \"$1\" adlı botunun bot parolası güncellendi.",
        "botpasswords-deleted-title": "Bot parolası silindi",
        "botpasswords-deleted-body": "\"$2\" adlı {{GENDER:$2|kullanıcının}} \"$1\" adlı botunun bot parolası silindi.",
-       "botpasswords-newpassword": "<strong>$1</strong> ile giriş yapılan yeni parola: <strong>$2</strong>. <em>Lütfen bunu ileride başvurmak için kaydedin.<em> <br> (Kullanıcı adının, nihai kullanıcı adıyla aynı olmasını gerektiren eski botlar için kullanıcı adı olarak <strong>$3</strong> ve şifre olarak da <strong>$4</strong> kullanabilirsiniz.)",
+       "botpasswords-newpassword": "<strong>$1</strong> ile giriş yapılan yeni parola: <strong>$2</strong>. <em>Lütfen bunu ileride başvurmak için kaydedin.<em> <br> (Kullanıcı adının, nihai kullanıcı adıyla aynı olmasını gerektiren eski botlar için kullanıcı adı olarak <strong>$3</strong> ve parola olarak da <strong>$4</strong> kullanabilirsiniz.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider kullanılamaz.",
        "botpasswords-restriction-failed": "Bot parolası kısıtlamaları bu oturum açma işlemini önlemektedir.",
        "botpasswords-invalid-name": "Belirtilen kullanıcı adı bot parolası ayırıcısı içermiyor (\"$1\").",
-       "botpasswords-not-exist": "\"$1\" kullanıcısının \"$2\" adında bir bot şifresine sahip değil.",
+       "botpasswords-not-exist": "\"$1\" kullanıcısının \"$2\" adında bir bot parolasına sahip değil.",
        "botpasswords-needs-reset": "\"$1\" {{GENDER:$1|kullanıcısına}} ait \"$2\" adlı bot için bot parolası sıfırlanmalı.",
        "resetpass_forbidden": "Parolalar değiştirilememektedir",
        "resetpass_forbidden-reason": "Parolalar değiştirilemez: $1",
        "passwordreset-domain": "Domain:",
        "passwordreset-email": "E-posta adresi:",
        "passwordreset-emailtitle": "{{SITENAME}} hesap detayları",
-       "passwordreset-emailtext-ip": "Birisi, (muhtemelen siz, $1 IP adresinden) {{SITENAME}} ($4) için hesap bilgilerinizin \nhatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:\n\n$2\n\n{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5  gün}} geçerlidir.\nBu geçici parola ile giriş yapın ve yeni bir şifre seçin. Şifre değişimini siz istemediyseniz veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.",
-       "passwordreset-emailtext-user": "$1 adlı kullanıcı, {{SITENAME}} ($4) için hesap bilgilerinizin hatırlatılmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkili:\n\n$2\n\n{{PLURAL:$3|Bu geçici şifre|Bu geçici şifreler}} {{PLURAL:$5|bir gün|$5  gün}} geçerlidir.\nBu geçici parola ile giriş yapın ve yeni bir şifre seçin. Bu talep bir başkasına aitse veya şifrenizi hatırladıysanız ve artık şifrenizi değiştirmek istemiyorsanız; bu iletiyi önemsemeyerek eski şifrenizi kullanmaya devam edebilirsiniz.",
+       "passwordreset-emailtext-ip": "Birisi ($1 numaralı IP adresini kullanarak muhtemelen siz), {{SITENAME}} ($4) için \nparolanızın sıfırlanmasını istedi. Aşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} \nbu e-posta adresiyle ilişkilidir:\n\n$2\n\n{{PLURAL:$3|Bu geçici parolanın|Bu geçici parolaların}} süresi {{PLURAL:$5|bir gün|$5  gün}} sonra dolacaktır.\nŞu an oturum açarak yeni bir parola seçmeniz gerekmektedir. Bu istekte bulunan \nbir başkasıysa ya da özgün parolanızı hatırladıysanız ve artık değiştirmek \nistemiyorsanız, bu iletiyi göz ardı edebilir ve eski parolanızı kullanmaya \ndevam edebilirsiniz.",
+       "passwordreset-emailtext-user": "{{SITENAME}} kullanıcısı $1, {{SITENAME}} ($4) parolanızı sıfırlama isteğinde bulundu.\nAşağıdaki kullanıcı {{PLURAL:$3|hesabı|hesapları}} bu e-posta adresiyle ilişkilidir:\n\n$2\n\n{{PLURAL:$3|Bu geçici parolanın|Bu geçici parolaların}} süresi {{PLURAL:$5|bir gün|$5  gün}} sonra dolacaktır.\nŞu an oturum açarak yeni bir parola seçmeniz gerekmektedir. Bu istekte bulunan \nbir başkasıysa ya da özgün parolanızı hatırladıysanız ve artık değiştirmek \nistemiyorsanız, bu iletiyi göz ardı edebilir ve eski parolanızı kullanmaya devam edebilirsiniz.",
        "passwordreset-emailelement": "Kullanıcı adı: \n$1\n\nGeçici şifre: \n$2",
        "passwordreset-emailsentemail": "Eğer bu e-posta adresi hesabınızın bağlı olduğu adres ise, bir parola sıfırlama e-postası gönderilecektir.",
        "passwordreset-emailsentusername": "Eğer bu e-posta adresi hesabınızın bağlı olduğu adres ise, bir parola sıfırlama e-postası gönderilecektir.",
        "passwordreset-nocaller": "Bir ziyaretçi sağlanmalıdır",
        "passwordreset-nosuchcaller": "Ziyaretçi mevcut değil: $1",
-       "passwordreset-ignored": "Şifre sıfırlama işlenmedi. Belki de herhangi bir sağlayıcı yapılandırılmadı?",
+       "passwordreset-ignored": "Parola sıfırlama işlenmedi. Belki herhangi bir sağlayıcı yapılandırılmamıştır?",
        "passwordreset-invalidemail": "Geçersiz e-posta adresi",
        "passwordreset-nodata": "Ne bir kullanıcı adı ne de bir e-posta adresi verildi.",
        "changeemail": "E-posta adresini değiştir veya çıkar",
        "changeemail-no-info": "Bu sayfaya doğrudan erişmek için oturum açmanız gereklidir.",
        "changeemail-oldemail": "Mevcut E-posta adresi:",
        "changeemail-newemail": "Yeni E-posta adresi:",
-       "changeemail-newemail-help": "E-posta adresinizi silmek istiyorsanız bu alan boş bırakılmalıdır. E-posta adresi silindikten sonra unutulan şifreyi sıfırlayamazsınız ve bu Viki'den e-posta alamazsınız.",
+       "changeemail-newemail-help": "E-posta adresinizi silmek istiyorsanız bu alan boş bırakılmalıdır. E-posta adresi silindikten sonra unutulan parolayı sıfırlayamazsınız ve bu vikiden e-posta alamazsınız.",
        "changeemail-none": "(yok)",
        "changeemail-password": "{{SITENAME}} parolanız:",
        "changeemail-submit": "E-posta'yı değiştir",
        "group-interface-admin": "Arayüz yöneticileri",
        "group-bureaucrat": "Bürokratlar",
        "group-suppress": "Gözetmenler",
-       "group-all": "(hepsi)",
+       "group-all": "(tümü)",
        "group-user-member": "{{GENDER:$1|kullanıcı}}",
        "group-autoconfirmed-member": "{{GENDER:$1|otomatik onaylanmış kullanıcı}}",
        "group-bot-member": "{{GENDER:$1|bot}}",
        "right-move-categorypages": "Kategori sayfaları taşı",
        "right-movefile": "Dosyaları taşı",
        "right-suppressredirect": "Bir sayfayı taşırken eski isimden yönlendirme oluşturma",
-       "right-upload": "Dosyaları yükle",
+       "right-upload": "Dosya yükle",
        "right-reupload": "Mevcut dosyaların üstüne yaz",
        "right-reupload-own": "Kendisinin yüklediği bir dosyanın üzerine yaz",
        "right-reupload-shared": "Paylaşılan ortam deposundaki dosyaları yerel olarak geçersiz kıl",
        "right-bot": "Otomatik bir işlem gibi muamele gör",
        "right-nominornewtalk": "Kullanıcı tartışma sayfalarında yaptığı küçük değişiklikler kullanıcıya yeni mesaj bildirimiyle bildirilmez",
        "right-apihighlimits": "API sorgularında yüksek sınır kullan",
-       "right-writeapi": "API yaz kullanımı",
+       "right-writeapi": "Yazma API'sini kullan",
        "right-delete": "Sayfaları sil",
        "right-bigdelete": "Uzun tarihli sayfaları sil",
        "right-deletelogentry": "Belirli günlük girdilerini sil ve geri getir",
        "right-patrolmarks": "Son değişiklikler gözleme işaretlerini gör",
        "right-unwatchedpages": "İzlenmeyen sayfaların bir listesini gör",
        "right-mergehistory": "Sayfalarının tarihlerini birleştir",
-       "right-userrights": "Tüm kullanıcı haklarını değiştirmek",
+       "right-userrights": "Tüm kullanıcı haklarını değiştir",
        "right-userrights-interwiki": "Diğer vikilerdeki kullanıcıların kullanıcı haklarını değiştir",
        "right-siteadmin": "Veritabanını kilitle ve kilidi aç",
        "right-override-export-depth": "Sayfaları, derinlik 5'e kadar bağlantılı sayfalarla beraber, dışa aktar",
        "right-managechangetags": "[[Special:Tags|Etiket]] oluşturma ve (de)aktive etme",
        "right-applychangetags": "Değişiklikleriyle beraber [[Special:Tags|etiketleri]] uygula",
        "right-changetags": "Tekil sürümler ve günlük kayıtlarına rastgele [[Special:Tags|etiket]] ekleme veya çıkarma",
-       "right-deletechangetags": "Veritabanından [[Special:Tags|etiketleri]] silin",
+       "right-deletechangetags": "Veritabanından [[Special:Tags|etiketleri]] sil",
        "grant-generic": "\"$1\" hak paketi",
        "grant-group-page-interaction": "Sayfalarla etkileşim kur",
        "grant-group-file-interaction": "Medya ile etkileşim kur",
        "expand_templates_preview_fail_html": "<em>{{SITENAME}} işlenmemiş HTML koduna izin verdiği ve oturum verilerinde kayıp yaşandığı için, ön izleme, JavaScript saldırılarına karşı önlem olarak gizlendi.</em>\n\n<strong>Eğer meşru bir ön izleme girişimi idiyse, tekrar deneyiniz.</strong>\nYine de çalışmıyorsa, [[Special:UserLogout|oturum kapamayı]] ve tekrar açmayı deneyin.",
        "expand_templates_preview_fail_html_anon": "<em>{{SITENAME}} işlenmemiş HTML koduna izin verdiği ve oturum verilerinde kayıp yaşandığı için, ön izleme, JavaScript saldırılarına karşı önlem olarak gizlendi.</em>\n\n<strong>Eğer meşru bir ön izleme girişimi idiyse, lütfen  [[Special:UserLogin|oturum açarak]] tekrar deneyin.</strong>",
        "expand_templates_input_missing": "En azından bazı giriş viki metni sağlamak zorundasınız.",
-       "pagelanguage": "Sayfa dilini değiştir",
+       "pagelanguage": "Sayfanın dilini değiştir",
        "pagelang-name": "Sayfa",
        "pagelang-language": "Dil",
        "pagelang-use-default": "Varsayılan dili kullan",
        "pagelang-select-lang": "Dil seçin",
        "pagelang-reason": "Sebep",
        "pagelang-submit": "Gönder",
-       "right-pagelang": "Sayfa dilini değiştir",
-       "action-pagelang": "sayfa dilini değiştir",
+       "right-pagelang": "Sayfanın dilini değiştir",
+       "action-pagelang": "sayfanın dilini değiştir",
        "log-name-pagelang": "Dil değişimi günlüğü",
        "log-description-pagelang": "Bu, sayfalardaki dil değişikliklerinin kayıt günlüğüdür.",
        "logentry-pagelang-pagelang": "$1, $3 sayfasının dilini $4 dilinden $5 diline {{GENDER:$2|çevirdi}}.",
        "pageid": "sayfa ID'si $1",
        "gotointerwiki": "Ayrılınıyor {{SITENAME}}",
        "pagedata-title": "Sayfa verisi",
-       "passwordpolicies": "Şifre politikaları",
+       "passwordpolicies": "Parola politikaları",
        "passwordpolicies-summary": "Bu, bu vikide tanımlanan kullanıcı grupları için etkili parola ilkelerinin bir listesidir.",
        "passwordpolicies-group": "Grup",
        "passwordpolicies-policies": "Politikalar",
-       "passwordpolicies-policy-minimalpasswordlength": "Şifre en az $1 karakter uzunluğunda olmalı",
+       "passwordpolicies-policy-minimalpasswordlength": "Parola en az $1 karakter uzunluğunda olmalıdır",
        "passwordpolicies-policy-minimumpasswordlengthtologin": "Şifre giriş yapabilmek için en az $1 karakter uzunluğunda olmalı",
-       "passwordpolicies-policy-passwordcannotmatchusername": "Şifre kullanıcı adıyla aynı olamaz",
+       "passwordpolicies-policy-passwordcannotmatchusername": "Parola kullanıcı adıyla aynı olamaz",
        "passwordpolicies-policy-passwordcannotmatchblacklist": "Şifre özellikle kara listeye alınmış şifrelerle aynı olamaz",
-       "passwordpolicies-policy-maximalpasswordlength": "Şifre $1 karakterden az olmalı",
-       "passwordpolicies-policy-passwordcannotbepopular": "Şifre, $1 popüler şifrenin listesinde olamaz"
+       "passwordpolicies-policy-maximalpasswordlength": "Parola $1 karakterden kısa olmalı",
+       "passwordpolicies-policy-passwordcannotbepopular": "Parola, $1 popüler parola listesinde olamaz"
 }
index 99a5b0b..5b1af67 100644 (file)
        "botpasswords-invalid-name": "Вказане ім'я користувача не містить роздільник для пароля бота («$1»).",
        "botpasswords-not-exist": "У користувача «$1» нема пароля для бота «$2».",
        "botpasswords-needs-reset": "Пароль бота з ім'ям «$2» {{GENDER:$1|користувача|користувачки}} «$1» необхідно скинути.",
+       "botpasswords-locked": "Ви не можете увійти за допомогою пароля бота, оскільки Ваш обліковий запис заблоковано.",
        "resetpass_forbidden": "Пароль не можна змінити",
        "resetpass_forbidden-reason": "Пароль не можна змінити: $1",
        "resetpass-no-info": "Щоб звертатися безпосередньо до цієї сторінки, вам слід увійти до системи.",
        "right-reupload": "перезаписування існуючих файлів",
        "right-reupload-own": "перезаписування існуючих файлів, завантажених тим самим користувачем",
        "right-reupload-shared": "підміна файлів зі спільного сховища локальними",
-       "right-upload_by_url": "Ð\97авантаження файлів за URL-адресами",
+       "right-upload_by_url": "завантаження файлів за URL-адресами",
        "right-purge": "очищення кешу сторінки без необхідності підтвердження",
        "right-autoconfirmed": "без обмежень швидкості за IP",
        "right-bot": "автоматична обробка",
        "right-editinterface": "редагування інтерфейсу користувача",
        "right-editusercss": "редагування CSS-файлів інших користувачів",
        "right-edituserjson": "редагування JSON-файлів інших користувачів",
-       "right-edituserjs": "редагування JS-файлів інших користувачів",
+       "right-edituserjs": "редагування JavaScript-файлів інших користувачів",
        "right-editsitecss": "Редагувати загальний CSS",
        "right-editsitejson": "Редагувати загальний JSON",
        "right-editsitejs": "Редагувати загальний JavaScript",
        "right-mergehistory": "об'єднання історій редагувань сторінок",
        "right-userrights": "зміна всіх прав користувачів",
        "right-userrights-interwiki": "зміна прав користувачів у інших вікі",
-       "right-siteadmin": "Ð\91локування і розблокування бази даних",
+       "right-siteadmin": "блокування і розблокування бази даних",
        "right-override-export-depth": "експорт сторінок, включаючи пов'язані сторінки з глибиною до 5",
        "right-sendemail": "надсилання електронної пошти іншим користувачам",
        "right-managechangetags": "створення та (де)активування [[Special:Tags|міток]]",
        "redirect-file": "Назва файлу",
        "redirect-logid": "ID журналу",
        "redirect-not-exists": "Значення не знайдено",
+       "redirect-not-numeric": "Значення не числове",
        "fileduplicatesearch": "Пошук файлів-дублікатів",
        "fileduplicatesearch-summary": "Пошук дублікатів файлів на основі хеш-значень.",
        "fileduplicatesearch-filename": "Назва файлу:",
        "edit-error-long": "Помилки:\n\n$1",
        "revid": "версія $1",
        "pageid": "ID сторінки $1",
-       "interfaceadmin-info": "$1\n\nÐ\9fÑ\80ава Ð½Ð° Ñ\80едагÑ\83ваннÑ\8f Ð·Ð°Ð³Ð°Ð»Ñ\8cниÑ\85 CSS/JS/JSON-Ñ\84айлÑ\96в Ð±Ñ\83ли Ð½ÐµÐ´Ð°Ð²Ð½Ð¾ Ð²Ð¸Ð½ÐµÑ\81енÑ\96 Ð· Ð¿Ñ\80ава <code>editinterface.</code> Ð¯ÐºÑ\89о Ð²Ð¸ Ð½Ðµ Ñ\80озÑ\83мÑ\96Ñ\94Ñ\82е, Ñ\87омÑ\83 Ð²и наткнулись на цю помилку, див. [[mw:MediaWiki_1.32/interface-admin]].",
+       "interfaceadmin-info": "$1\n\nÐ\9fÑ\80ава Ð½Ð° Ñ\80едагÑ\83ваннÑ\8f Ð·Ð°Ð³Ð°Ð»Ñ\8cниÑ\85 CSS/JS/JSON-Ñ\84айлÑ\96в Ð½ÐµÐ´Ð°Ð²Ð½Ð¾ Ð²Ð¸Ð½ÐµÑ\81ено Ð· Ð¿Ñ\80ава <code>editinterface.</code> Ð¯ÐºÑ\89о Ð\92и Ð½Ðµ Ñ\80озÑ\83мÑ\96Ñ\94Ñ\82е, Ñ\87омÑ\83 Ð\92и наткнулись на цю помилку, див. [[mw:MediaWiki_1.32/interface-admin]].",
        "rawhtml-notallowed": "Теги &lt;html&gt; не можна використовувати за межами звичайних сторінок.",
        "gotointerwiki": "Ви покидаєте сайт {{SITENAME}}",
        "gotointerwiki-invalid": "Вказана назва неприпустима.",
index 2b71087..cf94891 100644 (file)
@@ -14,7 +14,8 @@
                        "Таржимон",
                        "Ximik1991",
                        "Bmansurov",
-                       "Fitoschido"
+                       "Fitoschido",
+                       "ديفيد"
                ]
        },
        "tog-underline": "Havolaning tagiga chizish:",
index f456b88..05eabfa 100644 (file)
        "october-date": "$1 d' octôbe",
        "november-date": "$1 di nôvimbe",
        "december-date": "$1 di decimbe",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Categoreye|Categoreyes}}",
        "category_header": "Årtikes el categoreye «$1»",
        "subcategories": "Dizo-categoreyes",
        "category-file-count": "{{PLURAL:$2|Dins cisse categoreye ci, gn a k' ene pådje.|{{PLURAL:$1|Gn a cisse pådje ci|Gn a les $1 pådjes ki shuvèt}} dins cisse categoreye ci, po $2 pådjes å totå.}}",
        "category-file-count-limited": "{{PLURAL:$1|Gn a k' cisse pådje cial|Gn a les $1 pådjes ciddé padzo}} dins cisse categoreye ci.",
        "listingcontinuesabbrev": "(shûte)",
+       "index-category": "Pådjes indecsêyes",
+       "noindex-category": "Pådjes nén indecsêyes",
        "broken-file-category": "Pådjes avou des hårdêyes esketêyes",
        "about": "Åd fwait",
        "article": "Årtike",
        "newwindow": "(drovant en on novea purnea)",
        "cancel": "Rinoncî",
        "moredotdotdot": "Co dpus...",
+       "morenotlisted": "Ci lisse ci pout èn nén esse complete.",
        "mypage": "Pådje",
        "mytalk": "Mi copinaedje",
        "anontalk": "Copinaedje",
        "navigation": "Naiviaedje",
        "and": "&#32;eyet",
+       "faq": "FÅK",
        "actions": "Accions",
        "namespaces": "Espåces di lomaedje",
        "variants": "Variantes",
        "protect_change": "candjî",
        "unprotect": "Candjî l' protedjaedje",
        "newpage": "Novele pådje",
-       "talkpagelinktext": "Copiner",
+       "talkpagelinktext": "copiner",
        "specialpage": "Pådje sipeciåle",
        "personaltools": "Usteyes da vosse",
        "talk": "Copene",
        "views": "Vuwes",
        "toolbox": "Usteyes",
        "imagepage": "Vey li pådje do fitchî",
+       "viewhelppage": "Vey li pådje d' aidance",
+       "categorypage": "Vey li pådje di categoreye",
        "viewtalkpage": "Vey li pådje di copene",
-       "otherlanguages": "Ôtes lingaedjes",
+       "otherlanguages": "Dins ds ôtes lingaedjes",
        "redirectedfrom": "(Redjiblé di $1)",
        "redirectpagesub": "Pådje di redjiblaedje",
+       "redirectto": "Ridjibler viè :",
        "lastmodifiedat": "Cisse pådje a stî candjeye pol dierin côp li $2 a $1.",
        "viewcount": "Cisse pådje la a stî léjhowe {{PLURAL:$1|on côp|$1 côps}}.",
        "protectedpage": "Pådje protedjeye",
        "nospecialpagetext": "Vos avoz dmandé ene pådje sipeciåle nén valide, po ene djivêye des pådjes sipeciåles valides, loukîz a [[Special:SpecialPages]].",
        "error": "Aroke",
        "databaseerror": "Åk n' a nén stî avou l' båze di dnêyes",
+       "databaseerror-function": "Fonccion : $1",
        "databaseerror-error": "Aroke: $1",
        "laggedslavemode": "Asteme: I s' pout ki l' pådje n' åye nén co les dierins candjmints.",
        "readonly": "Li båze di dnêyes est aclawêye",
        "cascadeprotected": "Cisse pådje ci a stî protedjeye siconte des candjmints, pask' ele est eploye ådvins {{PLURAL:$1|del pådje shuvante k' est protedjeye|des pådjes shuvantes ki sont protedjeyes}} avou l' tchuze «e cascåde» en alaedje:\n$2",
        "logouttext": "<strong>Vos vs avoz dislodjî.</strong>\n\nNotez ki des pådjes k' i gn a si pôrént continouwer a vey come si vos estîz elodjî, disk' a tant ki vos vudrîz l' muchete di vosse betchteu waibe.",
        "welcomeuser": "Bénvnowe, $1!",
-       "yourname": "Vosse no d' elodjaedje:",
+       "yourname": "No d' uzeu :",
        "userlogin-yourname": "No d' uzeu",
        "userlogin-yourname-ph": "Tapez vosse no d' uzeu",
        "yourpassword": "Vosse sicret",
        "userlogin-yourpassword": "Sicret",
+       "userlogin-yourpassword-ph": "Tapez vosse sicret",
+       "createacct-yourpassword-ph": "Tapez on sicret",
        "yourpasswordagain": "Ritapez vosse sicret",
+       "createacct-yourpasswordagain": "Ritapez l' sicret",
+       "createacct-yourpasswordagain-ph": "Ritapez l' sicret",
+       "userlogin-remembermypassword": "Wårdez mi elodjaedje a tchaeke côp",
        "yourdomainname": "Vosse dominne",
        "login": "S' elodjî",
        "nav-login-createaccount": "Ahiver on conte, udon-bén s' elodjî",
        "logout": "Si dislodjî",
        "userlogout": "Si dislodjî",
        "notloggedin": "Nén elodjî",
+       "userlogin-noaccount": "Vos n' avoz nén d' conte ?",
        "userlogin-joinproject": "S' edjîstrer so {{SITENAME}}",
        "createaccount": "Ahiver on novea conte",
+       "userlogin-resetpassword-link": "Av rovyî vosse sicret ?",
+       "userlogin-helplink2": "Aidance po s' elodjî",
+       "userlogin-createanother": "Ahivez èn ôte conte",
+       "createacct-emailrequired": "Adresse emile",
+       "createacct-emailoptional": "Adresse emile (nén oblidjeye)",
+       "createacct-email-ph": "Tapez vosse adresse emile",
+       "createacct-another-email-ph": "Tapez l' adresse emile",
        "createaccountmail": "Eployî on scret timporaire a l' astcheyance eyet l' evoyî so l' emile diné",
        "createacct-realname": "Vraiy no (opcionel)",
        "createacct-reason": "Råjhon",
+       "createacct-reason-ph": "Pocwè ahivez vs èn ôte conte",
+       "createacct-reason-help": "Messaedje afitchî dins l' djournå d' ahivaedje di conte",
+       "createacct-submit": "Ahivez on conte da vosse",
        "createacct-another-submit": "Ahiver èn ôte conte",
+       "createacct-continue-submit": "Porshuvoz l' ahivaedje di conte",
+       "createacct-another-continue-submit": "Porshuvoz l' ahivaedje di conte",
+       "createacct-benefit-heading": "{{SITENAME}} est scrît pa des djins come vos.",
        "createacct-benefit-body1": "{{PLURAL:$1|candjmint|candjmints}}",
        "createacct-benefit-body2": "{{PLURAL:$1|pådje|pådjes}}",
        "badretype": "Vos avoz dné deus screts diferins.",
        "noname": "Vos n' avoz nén dné di no d' uzeu valide.",
        "loginsuccesstitle": "Vos estoz elodjî",
        "loginsuccess": "'''L' elodjaedje a stî comifåt, asteure vos estoz elodjî dins {{SITENAME}} dizo l' no d' uzeu «$1».'''",
-       "nosuchuser": "I g na nou uzeu dizo l' no «$1».\nNotez k' les nos d' uzeu fjhèt l' diferince etur pitites et grandès letes.\nVerifyîz çou k' vos avoz tapé, oudonbén [[Special:CreateAccount|ahivez on novea conte]].",
+       "nosuchuser": "I g na nou uzeu dizo l' no « $1 ».\nNotez k' les nos d' uzeu fjhèt l' diferince etur pitites et grandès letes.\nVerifyîz çou k' vos avoz tapé, oudonbén [[Special:CreateAccount|ahivez on novea conte]].",
        "nosuchusershort": "I g na nou uzeu dizo l' no «$1». Verifyîz çou k' vos avoz tapé.",
        "nouserspecified": "Vos dvoz dner on no d' elodjaedje.",
        "login-userblocked": "{{GENDER:$1|Cist uzeu est bloké|Ciste uzeuse est blokêye}}. L' elodjaedje n' est nén possibe.",
-       "wrongpassword": "Li scret ki vs avoz dné est måva. Rissayîz s' i vs plait.",
+       "wrongpassword": "El no d' uzeu u l' sicret ki vs avoz dné est måva. Rissayîz s' i vs plait.",
        "wrongpasswordempty": "Vos avoz dné on vude sicret. Rissayîz s' i vs plait.",
        "passwordtooshort": "Li scret doet esse di pol moens {{PLURAL:$1|1 caractere|$1 caracteres}}.",
        "passwordtoolong": "Les screts n' polèt nén aveur pus di {{PLURAL:$1|1 caractere|$1 caracteres}}.",
        "mailmypassword": "Rifé l' sicret",
        "passwordremindertitle": "Novea scret timporaire po {{SITENAME}}",
-       "passwordremindertext": "Ene sakî (probåblumint vos-minme, avou l' adresse IP $1) a dmandé \non novea scret po {{SITENAME}} ($4).\nOn scret timporare po l' uzeu «$2» a stî fwait, c' est «$3».\nSi c' est vos k' a fwait l' dimande, vos vs divoz elodjî eyet tchoezi on novea scret.\nLi scret timporaire ni srè pus valide après {{PLURAL:$5|on djoû|$5 djoûs}}.\n\nSi c' est ene ôte sakî k' a fwait l' dimande, ou si vos vs avoz rtrové l' vî scret eyet \nnel pus vleur candjî, vos ploz djusse ignorer ci messaedje ci eyet continouwer avou l' vî scret.",
+       "passwordremindertext": "Ene sakî (avou l' adresse IP $1) a dmandé \non novea scret po {{SITENAME}} ($4).\nOn scret timporare po l' uzeu «$2» a stî fwait, c' est «$3».\nSi c' est vos k' a fwait l' dimande, vos vs divoz elodjî eyet tchoezi on novea scret.\nLi scret timporaire ni srè pus valide après {{PLURAL:$5|on djoû|$5 djoûs}}.\n\nSi c' est ene ôte sakî k' a fwait l' dimande, ou si vos vs avoz rtrové l' vî scret eyet \nnel pus vleur candjî, vos ploz djusse ignorer ci messaedje ci eyet continouwer avou l' vî scret.",
        "noemail": "I n' a pont d' adresse emile di cnoxhowe po l' uzeu «$1».",
        "noemailcreate": "Vos dvoz dner ene adresse emile valide.",
        "passwordsent": "On novea scret a stî emilé a l' adresse emile\nracsegneye po l' uzeu «$1».\nRelodjîz vs avou ç' noû scret on côp ki vos l' åroz rçuvou s' i vs plait.",
-       "blocked-mailpassword": "Voste adresse IP est blokêye pol sicrijhaedje, et do côp vos n' poloz nén eployî l' fonccion d' rapexhaedje do scret po-z eviter les abus.",
+       "blocked-mailpassword": "Voste adresse IP est blokêye pol sicrijhaedje. Po-z eviter les abus, vos n' poloz nén eployî l' fonccion d' rapexhaedje do scret avou ciste adresse IP.",
        "eauthentsent": "Èn emile d' acertinaedje a stî evoyî a l' adresse emile tchoezeye.\nDivant d' poleur evoyî èn ôte emile a ci conte la, vos dvroz shure les instruccions di l' emile ki vos alez rçure, po-z acertiner ki l' conte est bén da vosse.",
        "mailerror": "Åk n' a nén stî tot-z evoyant l' emile: $1",
-       "acct_creation_throttle_hit": "Ene sakî a ddja ahivé {{PLURAL:$1|1 conte|$1 contes}} dins les dierinnes 24 eures a pårti dek minme adresse IP, çou k' est l' limite acceptêye po ene sifwaite termene.\nÇa fwait ki l' ahivaedje di contes a p·årti di ciste adresse IP la a stî dismetou pol moumint.",
+       "acct_creation_throttle_hit": "Ene sakî a ddja ahivé {{PLURAL:$1|1 conte|$1 contes}} dins les dierinnes $2 a pårti del minme adresse IP, çou k' est l' limite acceptêye po ene sifwaite termene.\nÇa fwait ki l' ahivaedje di contes a pårti di ciste adresse IP la a stî dismetou pol moumint.",
        "emailauthenticated": "Voste adresse emile a stî acertinêye li $2 a $3.",
        "emailnotauthenticated": "Voste adresse emile n' a nén co stî acertinêye. Nol emile ni serè-st evoyî po les fonccions shuvantes.",
        "noemailprefs": "Dinez ene adresse emile po ces fonccions si mete en alaedje.",
        "resetpass-temp-password": "Sicret timporaire:",
        "passwordreset": "Rifé l' sicret",
        "passwordreset-disabled": "Li rfijhaedje di screts a stî dismetou so ç' wiki ci.",
-       "passwordreset-username": "No d' elodjaedje:",
+       "passwordreset-username": "No d' uzeu :",
        "passwordreset-domain": "Dominne:",
        "passwordreset-email": "Adresse emile:",
        "passwordreset-emailtitle": "Detays do contre so {{SITENAME}}",
        "missingsummary": "'''Asteme:''' Vos n' avoz nén dné on tecse di rascourti po vosse candjmint. Si vos rclitchîz sol boton «Schaper», li candjmint da vosse serè schapé sins nou tecse di rascourti po l' istwere del pådje.",
        "missingcommenttext": "Tapez on comintaire chal pa dzo s' i vs plait.",
        "blockedtitle": "L' uzeu est bloké",
-       "blockedtext": "'''Vosse no d' uzeu ou voste adresse IP a stî blokêye.'''\n\nLi blocaedje a stî fwait pa $1.\nLi råjhon dnêye est ''$2''.\n\n* Comince do blocaedje: $8\n* Fén do blocaedje: $6\n* Blocaedje di: $7\n\nVos ploz contacter $1 oudonbén onk des\n[[{{MediaWiki:Grouppage-sysop}}|manaedjeus]] po discuter do blocaedje.\nNotez ki vos n' poloz nén eployî l' fonccion «emiler a l' uzeu» a moens ki vos åyîz ene adresse emile valide dins vos [[Special:Preferences|preferinces]] et ki cisse possibilité n' a nén stî blokêye.\nVoste adresse IP est $3 eyet l' ID di blocaedje est $5.\nS' i vs plait racsegnoz totes les racsegnes chal å dzeur dins les dmandes ki vos frîz.",
+       "blockedtext": "<strong>Vosse no d' uzeu ou voste adresse IP a stî blokêye.</strong>\n\nLi blocaedje a stî fwait pa $1.\nLi råjhon dnêye est <em>$2</em>.\n\n* Comince do blocaedje: $8\n* Fén do blocaedje: $6\n* Blocaedje di: $7\n\nVos ploz contacter $1 oudonbén onk des\n[[{{MediaWiki:Grouppage-sysop}}|manaedjeus]] po discuter do blocaedje.\nNotez ki vos n' poloz nén eployî l' fonccion « {{int:emailuser}} » a moens ki vos åyîz ene adresse emile valide dins vos [[Special:Preferences|preferinces]] et ki cisse possibilité n' a nén stî blokêye.\nVoste adresse IP est $3 eyet l' ID di blocaedje est $5.\nS' i vs plait racsegnoz totes les racsegnes chal å dzeur dins les dmandes ki vos frîz.",
        "autoblockedtext": "Voste adresse IP a stî ablokêye otomaticmint, pask' elle a stî eployeye pa èn ôte uzeu, lu-minme dedja rbouté pa $1.\nLi råjhon k' on-z a dné, c' est:\n\n:''$2''.\n\n* Comince do blocaedje: $8\n* Fén do blocaedje: $6\n* Blocaedje di: $7\n\nVos ploz contacter $1 oudonbén onk des\n[[{{MediaWiki:Grouppage-sysop}}|manaedjeus]] po discuter do blocaedje.\n\nNotez ki vos n' poloz nén eployî l' fonccion «emiler a l' uzeu» a moens ki vos åyîz ene adresse emile valide dins vos [[Special:Preferences|preferinces]] et ki cisse possibilité n' a nén stî blokêye.\n\nVoste adresse IP est $3 eyet l' ID di blocaedje est $5.\nS' i vs plait racsegnoz totes les racsegnes chal å dzeur dins les dmandes ki vos frîz.",
        "blockednoreason": "sins dire pocwè",
        "whitelistedittext": "I vs fåt $1 po pleur candjî les årtikes.",
        "accmailtext": "On scret costrût a l' astcheyance po [[User talk:$1|$1]] a stî evoyî a $2.\n\nLi scret po ci novea conte ci pout esse candjî sol pådje di ''[[Special:ChangePassword|candjmint di scret]]'' après l' elodjaedje.",
        "newarticle": "(Novea)",
        "newarticletext": "Vos avoz clitchî so on loyén viè ene pådje ki n' egzistêye nén co.\nMins '''vos''' l' poloz askepyî! Po çoula, vos n' avoz k' a cmincî a taper vosse tecse dins l' boesse di tecse cial pa dzo (alez vey li [$1 pådje d' aidance] po pus d' infôrmåcion).\nSi vos estoz droci par accidint, clitchîz simplumint sol boton <strong>En erî</strong> di vosse betchteu waibe po rivni al pådje di dvant.",
-       "anontalkpagetext": "---- ''Çouchal, c' est li pådje di copene po èn uzeu anonime ki n' a nén (co) fwait on conte por lu s' elodjî, ou ki n' l' eploye nén.\nÇa fwait k' on doet eployî si adresse IP limerike po l' idintifyî.\nCome ene sifwaite adresse IP pout esse eployeye pa pus d' èn uzeu, i s' pout ki vos veyoz chal des rmarkes et des messaedjes ki n' sont nén por vos.\nLoukîz s' i vs plait po [[Special:CreateAccount|fé on novea conte]] ou [[Special:UserLogin|s' elodjî]] po n' pus aveur d' ecramiaedje avou des ôtes uzeus anonimes.''",
+       "anontalkpagetext": "---- \n<em>Çouchal, c' est li pådje di copene po èn uzeu anonime ki n' a nén co fwait on conte por lu s' elodjî, ou ki n' l' eploye nén.\nÇa fwait k' on doet eployî si adresse IP limerike po l' idintifyî.\nCome ene sifwaite adresse IP pout esse eployeye pa pus d' èn uzeu, i s' pout ki vos veyoz chal des rmarkes et des messaedjes ki n' sont nén por vos.\nLoukîz s' i vs plait po [[Special:CreateAccount|fé on novea conte]] ou [[Special:UserLogin|s' elodjî]] po n' pus aveur d' ecramiaedje avou des ôtes uzeus anonimes.</em>",
        "noarticletext": "I gn a pol moumint nou tecse e cisse pådje chal.\nVos ploz [[Special:Search/{{PAGENAME}}|cweri après l' tite di cisse pådje ci]] dins des ôtès pådjes,\noudonbén <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cweri dins les djournås],\nou co [{{fullurl:{{FULLPAGENAME}}|action=edit}} ahiver l' pådje]</span>.",
        "noarticletext-nopermission": "I gn a pol moumint nou tecse e cisse pådje chal.\nVos ploz [[Special:Search/{{PAGENAME}}|cweri après l' tite di cisse pådje ci]] dins des ôtès pådjes,\noudonbén <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} cweri dins les djournås]</span>, mins vos n' avoz nén l' livea d' permission pol poleur ahiver.",
        "blocked-notice-logextract": "{{GENDER:$1|Cist uzeu est bloké|Ciste uzeuse est blokêye}} pol moumint.\nLi dierinne intrêye e djournå des blocaedjes est dnêye chal pa dzo po infôrmåcion:",
-       "clearyourcache": "'''Note:''' après aveur schapé l' pådje, vos l' divoz rafrister, po pleur vey les candjmints dins vosse betchteu waibe.\n* '''Firefox / Safari:''' tchôkîz so ''Shift'' tot clitchant so ''Rafrister'', ou co fjhoz ''Ctrl-F5'' ou ''Ctrl-R'' (''⌘-R'' so on Mac)\n* '''Google Chrome:''' tchôkîz so ''Ctrl-Shift-R'' (''⌘-Shift-R'' on a Mac)\n* '''Internet Explorer:''' tchôkîz so ''Ctrl'' tot clitchant so ''Rafrister'', ou co fjhoz ''Ctrl-F5''\n* '''Konqueror:''' clitchîz so ''Rafrister'' ou tchôkîz so ''F5''\n* '''Opera:''' vudîz l' muchete dins ''Usteyes → Preferinces''.",
+       "clearyourcache": "<strong>Note:</strong> après aveur schapé l' pådje, vos l' divoz rafrister, po pleur vey les candjmints dins vosse betchteu waibe.\n* <strong>Firefox / Safari :</strong> tchôkîz so <em>Shift</em> tot clitchant so <em>Rafrister</em>, ou co fjhoz <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> so on Mac)\n* <strong>Google Chrome :</strong> tchôkîz so <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> so on Mac)\n* <strong>Internet Explorer :</strong> tchôkîz so <em>Ctrl</em> tot clitchant so <em>Rafrister</em>, ou co fjhoz <em>Ctrl-F5</em>\n* <strong>Konqueror :</strong> clitchîz so <em>Rafrister</em> ou tchôkîz so <em>F5</em>\n* <strong>Opera :</strong> alez dins <em>Menu → Parametes</em> (<em>Opera → Preferinces</em> so on Mac), pus dins <em>Confidance & såvrité → Vudîz les dnêyes d' vizitaedje → Imådjes et fitchîs metous el muchete</em>.",
        "usercssyoucanpreview": "'''Racsegne:''' eployîz l' boton «{{int:showpreview}}» po sayî vosse novea CSS divant del schaper.",
        "userjsyoucanpreview": "'''Racsegne:''' eployîz l' boton «{{int:showpreview}}» po sayî vosse novea JavaScript divant del schaper.",
        "usercsspreview": "Èn rovyîz nén ki c' est djusse on prévoeyaedje di vosse stîle CSS d' uzeu.'''\n'''I n' a nén co stî schapé!'''",
        "updated": "(Ramidré)",
        "note": "'''Note :'''",
        "previewnote": "'''Èn rovyîz nén ki c' est djusse on prévoeyaedje.'''\n'''Les candmints n' ont nén co stî schapés!'''",
-       "continue-editing": "Continouwer a candjî",
+       "continue-editing": "Alez dins l' zône di candjmint",
        "previewconflict": "Ci prévoeyaedje ci mostere kimint kel tecse del boesse di tecse do dzeu sereut håyné si vos decidez del schaper.",
        "session_fail_preview": "'''Mande escuzes! Mins dji n' a nén polou traitî vosse candjmint paski les dnêyes del session ont stî pierdowes.\nRissayîz s' i vs plait. Si çoula n' va todi nén, sayîz di vs dislodjî eyet di vs relodjî.'''",
        "session_fail_preview_html": "'''Mande escuzes! Mins dji n' a nén polou traitî vosse candjmint paski les dnêyes del session ont stî pierdowes.'''\n\n''Come {{SITENAME}} a-st en alaedje li HTML brut, li prévoeyaedje est catchî, come proteccion siconte des atakes JavaScript.''\n\n'''Si c' est ene saye oniesse di candjî l' pådje, rissayîz s' i vs plait.'''\nSi çoula n' va todi nén, sayîz di vs [[Special:UserLogout|dislodjî]] eyet di vs relodjî.",
        "postedit-confirmation-saved": "vosse candjmint a stî schapé",
        "edit-already-exists": "Li novele pâdje n' a savou esse ahivêye, ca cisse pâdje la egzistêye dedja.",
        "editwarning-warning": "Cwiter cisse pådje ci vos frè piede tos les candjmints ki vos avoz fwait.\nSi vos estoz elodjî, vos ploz dismete cist adviertixhmint ci dins l' linwete «Boesse di tecse» di vos preferinces.",
+       "content-model-wikitext": "wikitecse",
        "duplicate-args-category": "Pådje eployant des dobes parametes dins les uzaedjes di modele",
        "post-expand-template-inclusion-warning": "'''Asteme:''' I gn a trop di modeles dins cisse pådje ci.\nSacwants di zels ni seront nén eployîs.",
        "post-expand-template-inclusion-category": "Pådjes ki l' inclusion d' modeles est foû limite",
        "revdelete-hide-comment": "Catchî l' comintaire di candjmint",
        "revdelete-hide-user": "Catchî l' no d' uzeu/adresse IP do candjeu",
        "revdelete-hide-restricted": "Oister foû les dnêyes ossu bén po les manaedjeus k' po les ôtes",
-       "revdelete-radio-set": "Oyi",
-       "revdelete-radio-unset": "Neni",
+       "revdelete-radio-set": "Catchî",
+       "revdelete-radio-unset": "Veyåve",
        "revdelete-log": "Råjhon:",
        "revdelete-submit": "Apliker {{PLURAL:$1|al modêye tchoezeye|åzès modêyes tchoezeyes}}",
        "revdel-restore": "candjî l' veyåvisté",
        "mergehistory-reason": "Råjhon:",
        "revertmerge": "Dispårti",
        "history-title": "Istwere des candjmints po «$1»",
+       "difference-title": "$1 : Diferince etur modêyes",
        "lineno": "Roye $1:",
        "compareselectedversions": "Comparer les modêyes tchoezeyes",
        "editundo": "disfé",
+       "diff-empty": "(Nole diferince)",
        "searchresults": "Rizultats do cweraedje",
        "searchresults-title": "Rizultats des rcwerances po « $1 »",
        "titlematches": "Årtikes avou on tite ki corespond",
        "search-redirect": "(redjiblé di $1)",
        "search-section": "(seccion $1)",
        "search-suggest": "Sayîz motoit çoula: $1",
-       "search-interwiki-caption": "So les ôtes pordjets frés",
-       "search-interwiki-default": "Gn a des sfwaitès sacwès so $1 :",
+       "search-interwiki-caption": "Adierças so les ôtes pordjets frés",
+       "search-interwiki-default": "Adierças so $1 :",
        "search-interwiki-more": "(dipus)",
        "searchall": "totafwait",
        "showingresults": "Chal pa dzo {{PLURAL:$1|'''1''' rizultat|'''$1''' rizultats}} a pårti do limero '''$2'''.",
        "prefs-reset-intro": "Vos ploz eployî ç' boton chal po rmete totes vos preferinces åzès prémetowès valixhances del waibe.\nÇoul n' pôrè nén esse disfwait.",
        "prefs-emailconfirm-label": "Acertinaedje di l' emile:",
        "youremail": "Vost emile:",
-       "username": "No d' elodjaedje:",
+       "username": "{{GENDER:$1|No d' uzeu|No d' uzeuse}} :",
        "prefs-memberingroups": "Mimbe {{PLURAL:$1|do groupe|des groupes}}:",
        "prefs-registration": "Date d' edjîstraedje:",
        "yourrealname": "Li vraiy no da vosse:",
        "filehist-filesize": "Grandeur do fitchî",
        "filehist-comment": "Comintaire",
        "imagelinks": "Eployaedjes do fitchî",
-       "linkstoimage": "{{PLURAL:$1|Li pådje shuvante eploye|Les $1 pådjes shuvantes eployèt}} ciste imådje chal:",
-       "nolinkstoimage": "I n' a nole pådje k' eploye ciste imådje chal.",
+       "linkstoimage": "{{PLURAL:$1|Li pådje shuvante eploye|Les $1 pådjes shuvantes eployèt}} ci fitchî ci :",
+       "nolinkstoimage": "I n' a nole pådje k' eploye ci fitchî ci.",
+       "linkstoimage-redirect": "$1 (redjiblaedje di fitchî) $2",
        "sharedupload": "Ci fitchî ci vént d' $1 ey i s' pout k' i soeye eployî pa ds ôtes pordjets.",
        "sharedupload-desc-there": "Ci fitchî ci provént d' $1; si pout i esse reployî dins des ôtes pordjets. Loukîz [$2 si pådje di discrijhaedje] po-z esse mî racsegnî.",
        "sharedupload-desc-here": "Ci fitchî ci provént d' $1; si pout i esse eployî divins des ôtes pordjets Wiki. Li discrijhaedje di [$2 si pådje di discrijhaedje] låvå est håynêye cial ådzo.",
+       "filepage-nofile": "Nou fitchî egziste avou c' no la.",
        "uploadnewversion-linktext": "Eberweter ene nouve modêye di ci fitchî ci",
        "shared-repo-from": "vént d' $1",
        "shared-repo": "on depot pårtaedjî",
        "magiclink-tracking-isbn": "Pådjes avou des hårdêyes otomatikes ISBN",
        "magiclink-tracking-isbn-desc": "So cisse pådje cial, gn a ene hårdêye otomatike ISBN. Loukîz so [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] po vey kimint aler dsu",
        "specialloguserlabel": "Fwait pa:",
-       "speciallogtitlelabel": "Såme (tite ou uzeu):",
+       "speciallogtitlelabel": "Såme (tite ou {{ns:user}}:uzeu):",
        "log": "Djournås",
        "logeventslist-submit": "Mostrer",
        "all-logs-page": "Tos les djournås publiks",
        "defemailsubject": "Emile da l' uzeu «$1» so {{SITENAME}}",
        "noemailtitle": "Pont d' adresse emile",
        "noemailtext": "Cist uzeu chal n' a nén dné d' adresse emile valide.",
+       "emailusername": "No d' uzeu :",
        "emailfrom": "Di:",
        "emailto": "Po:",
        "emailsubject": "Sudjet:",
        "watchlist-details": "Vos avoz {{PLURAL:$1|$1 pådje shuvowe|$1 pådjes shuvowes}} (sins conter les pådjes di copene).",
        "wlheader-enotif": "Li notifiaedje pa emile est en alaedje.",
        "wlheader-showupdated": "Les pådjes k' ont candjî dispoy vosse dierinne vizite sont metowes e <strong>cråssès letes</strong>.",
-       "wlnote": "Chal pa dzo {{PLURAL:$1|li dierin candjmint|les '''$1''' dierins candjmints}} {{PLURAL:$2|del dierinne eure|des '''$2''' dierinnès eures}}, disk' å $3 a $4.",
+       "wlnote": "Chal pa dzo {{PLURAL:$1|li dierin candjmint|les <strong>$1</strong> dierins candjmints}} {{PLURAL:$2|del dierinne eure|des <strong>$2</strong> dierinnès eures}}, disk' å $3 a $4.",
        "wlshowlast": "Mostrer les dierin(nè)s $1 eures, $2 djoûs",
        "watchlist-hide": "Catchî",
        "watchlist-submit": "Mostrer",
        "exbeforeblank": "li contnou dvant l' disfaçaedje esteut: «$1»",
        "delete-confirm": "Disfacer «$1»",
        "delete-legend": "Disfacer",
-       "historywarning": "'''Asteme:''' Li pådje ki vos alez disfacer a-st ene istwere avou a pô près $1 modêye{{PLURAL:$1||s}}:",
+       "historywarning": "<strong>Asteme:</strong> Li pådje ki vos alez disfacer a-st ene istwere avou a pô près $1 modêye{{PLURAL:$1||s}}:",
        "historyaction-submit": "Mostrer",
        "confirmdeletetext": "Vos alez disfacer ene pådje avou tote si istwere.\nAcertinez s' i vs plait ki c' est bén çoula ki vos vloz fé,\nki vos comprindoz les consecwinces, et ki vos fjhoz çoula\ntot [[{{MediaWiki:Policy-url}}|shuvant les rîles]].",
        "actioncomplete": "Fwait",
        "deletecomment": "Råjhon:",
        "deleteotherreason": "Ene råjhon diferinne ou di pus:",
        "deletereasonotherlist": "Ôte råjhon",
-       "deletereason-dropdown": "* Råjhons les pus corantes po disfacer\n** Dimande di l' oteur\n** Violåcion d' abondroets\n** Vandalisse",
+       "deletereason-dropdown": "* Råjhons les pus corantes po disfacer\n** Spam\n** Vandalisse\n** Violåcion d' abondroets\n** Dimande di l' oteur\n** Pierdou redjiblaedje",
        "delete-edit-reasonlist": "Candjî les råjhons do disfaçaedje",
        "delete-toobig": "Cisse pådje ci a ene foû grande istwere, avou dpus di $1 modêye{{PLURAL:$1||s}}.\nLi disfaçaedje des sfwaitès pådjes a stî dismetou po-z espaitchî k' i gn åye des problinmes so {{SITENAME}}.",
        "delete-warning-toobig": "Cisse pådje ci a ene foû grande istwere, avou dpus di $1 modêye{{PLURAL:$1||s}}.\nSi disfaçaedje pôreut fé des problinmes avou l' rotaedje del båze di dnêyes so {{SITENAME}}; \nnel fijhoz k' avou asteme.",
        "sp-contributions-newbies-sub": "Emey les noveas uzeus",
        "sp-contributions-newbies-title": "Contribouwaedjes des noveas uzeus",
        "sp-contributions-blocklog": "djournå des blocaedjes",
-       "sp-contributions-deleted": "contribouwaedjes disfacés",
+       "sp-contributions-deleted": "contribouwaedjes disfacés di l' uzeu{{GENDER:$1||se}}",
        "sp-contributions-uploads": "eberwetaedjes",
        "sp-contributions-logs": "djournås",
        "sp-contributions-talk": "copiner",
-       "sp-contributions-userrights": "droets",
+       "sp-contributions-userrights": "candjî les droets d' l' uzeu{{GENDER:$1||se}}",
        "sp-contributions-blocked-notice": "{{GENDER:$1|Cist uzeu est bloké|Ciste uzeuse est blokêye}} pol moumint.\nLi dierinne intrêye e djournå des blocaedjes est dnêye chal pa dzo po infôrmåcion:",
        "sp-contributions-blocked-notice-anon": "Ciste adresse IP est blokêye pol moumint.\nLi dierinne intrêye e djournå des blocaedjes est dnêye chal pa dzo po infôrmåcion:",
        "sp-contributions-search": "Cweri les contribouwaedjes",
        "linkshere": "Les pådjes ki shuvèt ont des loyéns viè '''$1''':",
        "nolinkshere": "Nole pådje avou des loyéns viè '''$1'''.",
        "isredirect": "pådje di redjiblaedje",
+       "istemplate": "transcluzion",
        "isimage": "loyén viè l' fitchî",
        "whatlinkshere-prev": "{{PLURAL:$1|di dvant|$1 di dvant}}",
        "whatlinkshere-next": "{{PLURAL:$1|shuvant|$1 shuvants}}",
        "whatlinkshere-hideredirs": "$1 les rdjiblaedjes",
        "whatlinkshere-hidetrans": "$1 les inclusions",
        "whatlinkshere-hidelinks": "$1 les loyaedjes",
-       "whatlinkshere-hideimages": "$1 fitchîs k' eploynut cist imådje ci",
+       "whatlinkshere-hideimages": "$1 les loyéns k' eploynut c' fitchî ci",
        "whatlinkshere-filters": "Passetes",
        "whatlinkshere-submit": "Vey",
        "autoblockid": "Blocaedje otomatike #$1",
        "tooltip-ca-move": "Displaecî cisse pådje ci",
        "tooltip-ca-watch": "Radjouter cisse pådje ci al djivêye di vos årtikes shuvous",
        "tooltip-ca-unwatch": "Bodjî cisse pådje ci di vosse djivêye des årtikes shuvous",
-       "tooltip-search": "Cweri so ci wiki chal",
+       "tooltip-search": "Cweri so {{SITENAME}}",
        "tooltip-search-go": "Potchî so ene pådje avou egzactumint ci no ci, si ele egzistêye.",
        "tooltip-search-fulltext": "Cweri les pådjes avou ç' tecse ci",
        "tooltip-p-logo": "Mwaisse pådje",
        "tooltip-feed-rss": "Sindicåcion RSS po cisse pådje ci",
        "tooltip-feed-atom": "Sindicåcion Atom po cisse pådje ci",
        "tooltip-t-contributions": "Vey li djivêye des ovraedjes fwait pa {{GENDER:$1|cist uzeu|ciste uzeuse}} ci",
-       "tooltip-t-emailuser": "Evoyî èn emile a cist uzeu ci",
+       "tooltip-t-emailuser": "Evoyî èn emile a {{GENDER:$1|cist uzeu|ciste uzeuse}} ci",
        "tooltip-t-upload": "Eberweter sol sierveu des imådjes ou fitchîs media",
        "tooltip-t-specialpages": "Djivêye di totes les pådjes sipeciåles",
        "tooltip-t-print": "Modêye sicrirece-amiståve del pådje",
        "nocredits": "I n' a pont d' infôrmåcion di credits po cisse pådje ci.",
        "spam_reverting": "Rimetaedje al dierinne modêye sins nou loyén viè $1",
        "pageinfo-title": "Infôrmåcion po «$1»",
+       "pageinfo-header-basic": "Infôrmåcion d' båze",
+       "pageinfo-header-edits": "Istwere des candjmints",
+       "pageinfo-header-restrictions": "Proteccion del pådje",
+       "pageinfo-length": "Taye del pådje (e-n octets)",
+       "pageinfo-article-id": "ID del pådje",
+       "pageinfo-language": "Lingaedje do contnou del pådje",
+       "pageinfo-robot-index": "Otorijheye",
+       "pageinfo-robot-noindex": "Nén otorijhî",
        "pageinfo-watchers": "Nombe di shuveus",
-       "pageinfo-edits": "Nombe di candjmints",
-       "pageinfo-authors": "Nombe d' oteurs diferins",
+       "pageinfo-subpages-name": "Nombe di dzo-pådjes po ciste pådje ci",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redjiblaedje|redjiblaedjes}}; $3 {{PLURAL:$3|nén-redjiblaedje|nén-redjiblaedjes}})",
+       "pageinfo-firstuser": "Ahiveu del pådje",
+       "pageinfo-firsttime": "Date d' ahivaedje del pådje",
+       "pageinfo-lastuser": "Dierin contribouweu",
+       "pageinfo-lasttime": "Date do dierin candjmint",
+       "pageinfo-edits": "Nombe totå d' candjmints",
+       "pageinfo-authors": "Nombe totå d' oteurs diferins",
+       "pageinfo-magic-words": "{{PLURAL:$1|Mot madjike|Mots madjikes}} ($1)",
+       "pageinfo-hidden-categories": "{{PLURAL:$1|Categoreye catcheye|Categoreyes catcheyes}} ($1)",
        "pageinfo-toolboxlink": "Infôrmåcion sol pådje",
+       "pageinfo-contentpage-yes": "Oyi",
        "markaspatrolleddiff": "Marké come ricoridjî",
        "markaspatrolledtext": "Marker cisse pådje ci come dedja patrouyeye",
        "markedaspatrolled": "Markêye come ricoridjeye",
-       "markedaspatrolledtext": "Li relîte modêye di [[:$1]] a stî markêye come ricoridjeye",
+       "markedaspatrolledtext": "Li relîte modêye di [[:$1]] a stî markêye come ricoridjeye.",
        "markedaspatrollednotify": "Ci candjmint cial di $1 a stî marké come ricoridjî",
        "patrol-log-page": "Djournå des patrouyaedjes",
        "patrol-log-header": "Çouchal c' est on djournå des modêyes k' ont stî patrouyeyes.",
        "thumbsize": "Grandeur po les imådjetes (thumb):",
        "widthheightpage": "$1 × $2, $3 pådje{{PLURAL:$3||s}}",
        "file-info-size": "$1 × $2 picsels, groxheur do fitchî: $3, del sôre \"MIME\": $4",
+       "file-info-size-pages": "$1 × $2 picsels ; taye do fitchî : $3 ; type MIME : $4 ; $5 pådje{{PLURAL:$5||s}}",
        "file-nohires": "I n' a nén di pus grande finté.",
        "svg-long-desc": "Fitchî SVG, finté di $1 × $2 picsels, grandeu: $3",
        "show-big-image": "Fitchî d' oridjinne",
        "size-megabytes": "$1 Mo",
        "size-gigabytes": "$1 Go",
        "watchlistedit-raw-titles": "Tites:",
+       "watchlisttools-clear": "Disfacer l' djivêye des shuvous",
        "watchlisttools-edit": "Vey et candjî l' djivêye des shuvous",
+       "watchlisttools-raw": "Candjî l' djivêye des shuvous e môde tecse",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|copene]])",
        "version": "Modêye des programes",
        "version-extensions": "Rawetes d' astalêyes",
        "version-skins": "Peas",
        "version-software": "Programes astalés",
        "version-software-product": "Prodût",
        "version-software-version": "Modêye",
+       "redirect-page": "ID del pådje",
+       "redirect-file": "No do fitchî",
        "fileduplicatesearch": "Cweraedje après les dobes fitchîs",
        "fileduplicatesearch-submit": "Cweri",
        "specialpages": "Pådjes sipeciåles",
        "tag-filter": "Passete po ls [[Special:Tags|etiketes]]:",
        "tag-filter-submit": "Passete",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|Etikete|Etiketes}}]]: $2)",
+       "tags-active-yes": "Oyi",
+       "tags-active-no": "Neni",
        "tags-edit": "candjî",
        "tags-hitcount": "$1 candjmint{{PLURAL:$1||s}}",
        "comparepages": "Comparer des pådjes",
        "compare-rev2": "Modêye 2",
        "compare-submit": "Comparer",
        "logentry-delete-delete": "$1 a disfacé l' pådje $3",
-       "logentry-delete-restore": "$1 a rapexhî l' pådje $3",
+       "logentry-delete-restore": "$1 {{GENDER:$2|a rapexhî}} l' pådje $3",
        "logentry-delete-event": "$1 a candjî l' veyåvisté d' {{PLURAL:$5| èn evenmint|$5 evenmints}} do djournå åd fwait di $3: $4",
-       "logentry-delete-revision": "$1 a candjî l' veyåvisté d' {{PLURAL:$5| on candjmint|$5 candjmints}} åd fwait di $3: $4",
+       "logentry-delete-revision": "$1 {{GENDER:$2|a candjî}} l' veyåvisté d' {{PLURAL:$5|on candjmint|$5 candjmints}} åd fwait di $3 : $4",
        "logentry-delete-event-legacy": "$1 a candjî l' veyåvisté d' evenmints do djournå åd fwait di $3",
        "logentry-delete-revision-legacy": "$1 a candjî l' veyåvisté des candjmints so $3",
        "logentry-suppress-delete": "$1 a disfacé l' pådje $3",
        "revdelete-restricted": "restriccions aplikêyes ås manaedjeus",
        "revdelete-unrestricted": "restriccions ås manaedjeus rsaetcheyes",
        "logentry-move-move": "$1 a displaecî l' pådje $3 viè $4",
-       "logentry-move-move-noredirect": "$1 a displaecî l' pådje $3 viè $4 sins leyî d' redjiblaedje",
-       "logentry-move-move_redir": "$1 a displaecî l' pådje $3 viè $4 pa dzeu d' on redjiblaedje",
+       "logentry-move-move-noredirect": "$1 {{GENDER:$2|a displaecî}} l' pådje $3 viè $4 sins leyî d' redjiblaedje",
+       "logentry-move-move_redir": "$1 {{GENDER:$2|a displaecî}} l' pådje $3 viè $4 pa dzeu d' on redjiblaedje",
        "logentry-move-move_redir-noredirect": "$1 a displaecî l' pådje $3 viè $4 pa dzeu d' on redjiblaedje et sins leyî d' redjblaedje",
        "logentry-patrol-patrol": "$1 a marké come patrouyî l' candjmint $4 del pådje $3",
-       "logentry-patrol-patrol-auto": "$1 a marké otomaticmint come patrouyî l' candjmint $4 del pådje $3",
+       "logentry-patrol-patrol-auto": "$1 {{GENDER:$2|a marké}} otomaticmint come ricoridjî l' candjmint $4 del pådje $3",
        "logentry-newusers-newusers": "$1 a-st ahivé on conte d' uzeu",
        "logentry-newusers-create": "Li conte d' uzeu $1 a stî ahivé",
        "logentry-newusers-create2": "$1 a-st ahivé on conte d' uzeu $3",
-       "logentry-newusers-autocreate": "li conte $1 a stî ahivé otomaticmint",
+       "logentry-newusers-autocreate": "Li conte $1 {{GENDER:$2|a stî ahivé}} otomaticmint",
        "logentry-upload-upload": "$1 {{GENDER:$2|}}a-st eberweté $3",
        "rightsnone": "(nouk)",
        "feedback-adding": "Vosse messaedje a stî håyné sol pådje...",
index 2c50814..337abd4 100644 (file)
@@ -71,6 +71,7 @@
        "tog-watchlisthidebots": "響監視清單度隱藏機械人嘅編輯",
        "tog-watchlisthideminor": "響監視清單度隱藏細修改",
        "tog-watchlisthideliu": "響監視清單度隱藏登入用戶",
+       "tog-watchlistreloadautomatically": "有篩選條件變嘅時候自動重新載入個監視清單(要用JavaScript)",
        "tog-watchlisthideanons": "響監視清單度隱藏匿名用戶",
        "tog-watchlisthidepatrolled": "響監視清單度隱藏巡查過嘅編輯",
        "tog-watchlisthidecategorization": "隱藏頁面分類",
        "customcssprotected": "你無權改呢版CSS,因為佢包含其他用戶嘅個人設定。",
        "customjsonprotected": "你無權改呢版JSON,因為佢包含其他用戶嘅個人設定。",
        "customjsprotected": "你無權改呢版JavaScript,因為佢包含其他用戶嘅個人設定。",
+       "sitecssprotected": "你無權改呢版CSS,因為噉做可能會影響所有網站訪客。",
+       "sitejsonprotected": "你無權改呢版JSON,因為噉做可能會影響所有網站訪客。",
+       "sitejsprotected": "你無權改呢版JavaScript,因為噉做可能會影響所有網站訪客。",
        "mycustomcssprotected": "你無權改呢版CSS。",
        "mycustomjsonprotected": "你無權改呢版JSON。",
        "mycustomjsprotected": "你無權改呢版JavaScript。",
        "ns-specialprotected": "特別頁係唔可以編輯嘅。",
        "titleprotected": "呢個標題已經俾[[User:$1|$1]]保護咗防止去開。原因係<em>$2</em>。",
        "filereadonlyerror": "改唔到檔案 \"$1\",因為檔案庫 \"$2\" 而家係唯讀。\n\n負責鎖嘅系統管理員嘅解釋:\"$3\"。",
+       "invalidtitle": "冇效嘅標題",
        "invalidtitle-knownnamespace": "名域 \"$2\" 同版名 \"$3\" 無效嘅標題",
        "invalidtitle-unknownnamespace": "未知名域號碼 \"$1\" 同版名 \"$2\" 無效嘅標題",
        "exception-nologin": "未簽到",
        "botpasswords-existing": "而家已經有嘅機械人密碼",
        "botpasswords-createnew": "整一個新嘅機械人密碼",
        "botpasswords-editexisting": "改已經有嘅機械人密碼",
+       "botpasswords-label-needsreset": "(密碼要重新設定)",
        "botpasswords-label-appid": "機械人名:",
        "botpasswords-label-create": "創造",
        "botpasswords-label-update": "上載",
        "botpasswords-updated-body": "{{GENDER:$2|用戶}}「$2」嘅機械人「$1」嘅密碼已經更新咗。",
        "botpasswords-deleted-title": "鏟咗機械人密碼",
        "botpasswords-deleted-body": "{{GENDER:$2|用戶}}「$2」嘅機械人「$1」嘅密碼已經剷走咗。",
+       "botpasswords-no-provider": "BotPasswordsSessionProvider用唔到。",
        "botpasswords-restriction-failed": "機械人密碼限制令到呢次簽到失敗。",
        "botpasswords-invalid-name": "呢個用戶名無機械人密碼分隔字(「$1」)",
        "botpasswords-not-exist": "用戶「$1」無叫做「$2」嘅機械人密碼。",
        "botpasswords-needs-reset": "{{GENDER:$1|用戶}}「$1」嘅機械人「$2」嘅密碼一定要重新改。",
+       "botpasswords-locked": "因為你個戶口俾人鎖咗,你唔可以用機械人密碼登入。",
        "resetpass_forbidden": "唔可以更改密碼",
        "resetpass_forbidden-reason": "改唔到密碼:$1",
        "resetpass-no-info": "你一定要登入咗去直接入來呢一版。",
        "passwordreset-emailtext-user": "{{SITENAME}}用戶$1請求更改閣下喺{{SITENAME}}道嘅密碼$4。同爾個電子郵件有關聯嘅用戶包括:\n\n$2\n\n{{PLURAL:$3|爾個|爾啲}}臨時密碼會喺{{$5}}日之後失效。\n\n如果係閣下自己請求改密碼嘅,請馬上登錄{{SITENAME}}並且更改密碼。如果閣下諗返起自己個密碼,或者根本無申請過改密碼嘅話,請忽略爾條訊息,繼續用返舊密碼。",
        "passwordreset-emailelement": "用戶名:\n$1\n\n臨時密碼:\n$2",
        "passwordreset-emailsentemail": "若果你個戶口有登記電郵,密碼重設電郵經已送出。",
+       "passwordreset-emailsentusername": "若果你個戶口有登記電郵,密碼重設電郵將會送出。",
        "passwordreset-invalidemail": "無效嘅電郵地址",
        "passwordreset-nodata": "漏咗畀用戶名同電郵地址",
        "changeemail": "改或者剷走電郵地址",
        "content-json-empty-object": "吉嘅嘢",
        "content-json-empty-array": "吉嘅陣列",
        "deprecated-self-close-category": "用無效自己閂嘅HTML標籤嘅頁面",
+       "deprecated-self-close-category-desc": "版面含有無效嘅自封閉(self-closed)HTML標籤,例如<code>&lt;b/></code>或者係<code>&lt;span/></code>。呢啲標籤嘅顯示結果好快會轉成符合HTML5規格,所以wikitext度嘅呢種用法已經停用。",
        "duplicate-args-warning": "<strong>警告:</strong> [[:$1]]調用咗[[:$2]]並且指定咗多過一個值畀「$3」呢個參數,祇有最後一次指定嘅值會用到。",
        "duplicate-args-category": "模用重複參數嘅版面",
        "duplicate-args-category-desc": "呢版調用模嗰陣用咗重複嘅參數,好似<code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code>或者<code><nowiki>{{foo|bar|1=baz}}</nowiki></code>噉。",
        "diff-multi-otherusers": "(無顯示{{PLURAL:$2|另一個用戶|另外$2個用戶}}中途改嘅 $1 個版本)",
        "diff-multi-manyusers": "(由$2位更多用戶所做嘅$1個中途修訂冇顯示到)",
        "searchresults": "搵嘢結果",
+       "search-filter-title-prefix-reset": "搵嘥所有版",
        "searchresults-title": "對\"$1\"嘅搵嘢結果",
        "titlematches": "頁面標題符合",
        "textmatches": "頁面文字符合",
        "search-external": "出面搵嘢",
        "searchdisabled": "{{SITENAME}}嘅搜尋功能已經關閉。你可以利用Google嚟搵。不過佢哋對{{SITENAME}}嘅索引可能唔係最新嘅。",
        "search-error": "搵嘢嗰陣出錯:$1",
+       "search-warning": "搵嘢嗰陣出錯:$1",
        "preferences": "喜好設定",
        "mypreferences": "自訂喜好",
        "prefs-edits": "編輯數:",
        "default": "預設",
        "prefs-files": "檔案",
        "prefs-custom-css": "自定 CSS",
+       "prefs-custom-json": "自訂JSON",
        "prefs-custom-js": "自定 JavaScript",
        "prefs-common-config": "共有嘅CSS、JSON同埋JavaScript畀所有畫面用:",
        "prefs-reset-intro": "你可以用呢版去重設你嘅喜好設定到網站預設值。呢個動作無得番轉頭。",
        "right-editmyuserjson": "編輯你自己嘅用戶JSON檔",
        "right-editmyuserjs": "編輯你自己嘅用戶JavaScript檔",
        "right-viewmywatchlist": "睇你自己嘅監視一覽",
+       "right-editmywatchlist": "修改自己嘅監視清單。注意,就算無呢個權限,某啲操作仍然會加頁面去監視清單度。",
        "right-viewmyprivateinfo": "睇下個人信息(例如電郵或真名)",
        "right-editmyprivateinfo": "修改個人信息(例如電郵或真名)",
        "right-editmyoptions": "設定個人參數",
        "grant-editmycssjs": "改你嘅用戶CSS/JSON/JavaScript",
        "grant-editmyoptions": "改你嘅用戶設定",
        "grant-editmywatchlist": "改你嘅監視清單",
+       "grant-editsiteconfig": "改成個網站同用戶CSS/JS",
        "grant-editpage": "改已經有嘅版",
        "grant-editprotected": "改保護咗嘅版",
        "grant-highvolume": "大量編輯",
        "grant-oversight": "收埋用戶同禁止顯示修訂",
        "grant-sendemail": "寄電郵畀其他用戶",
+       "grant-uploadeditmovefile": "上載、𠖫同搬檔",
        "grant-uploadfile": "上載新檔案",
        "grant-basic": "基本權利",
        "grant-viewdeleted": "睇刪咗嘅檔同頁",
        "rcfilters-empty-filter": "無用到篩選條件。顯示晒全部貢獻。",
        "rcfilters-filterlist-title": "篩選條件",
        "rcfilters-filterlist-whatsthis": "搞緊乜嘢?",
-       "rcfilters-filterlist-feedbacklink": "å\90\8cæ\88\91å\93\8bè¬\9bä¸\8b你覺å¾\97å\80\8bï¼\88æ\96°ï¼\89篩選架撐點樣",
+       "rcfilters-filterlist-feedbacklink": "å\90\8cæ\88\91å\93\8bè¬\9bä¸\8b你覺å¾\97å\95²篩選架撐點樣",
        "rcfilters-highlightbutton-title": "螢光標示結果",
        "rcfilters-highlightmenu-title": "揀隻色",
        "rcfilters-highlightmenu-help": "揀隻色去螢光標示呢個屬性",
        "rcfilters-watchlist-showupdated": "標<strong>粗體字</strong>嘅頁響你上次嚟之後畀人改過。",
        "rcfilters-preference-label": "隱藏最近修改嘅改良版本。",
        "rcfilters-preference-help": "還原返2017年介面新設計同相關架撐。",
+       "rcfilters-filter-showlinkedfrom-label": "顯示鏈自呢版嘅版面上嘅修改",
+       "rcfilters-target-page-placeholder": "入版(或者類)名",
        "rcnotefrom": "下面嘅{{PLURAL:$5|改動}}由 <strong>$3 $4</strong> 開始(顯示到'''$1''')。",
+       "rclistfromreset": "重設日期選擇",
        "rclistfrom": "顯示由$3 $2嘅新更改",
        "rcshowhideminor": "$1小編輯",
        "rcshowhideminor-show": "顯示",
        "file-deleted-duplicate": "一個同名嘅檔案 ([[:$1]]) 響之前刪除過。你應該響重新上載之前檢查一下嗰個檔案嘅刪除紀錄。",
        "uploadwarning": "上載警告",
        "uploadwarning-text": "請修改下面嘅檔案描述再重試。",
+       "uploadwarning-text-nostash": "請重新上載個檔,改咗下面個説明之後再試過。",
        "savefile": "儲存檔案",
        "uploaddisabled": "上載已停用。",
        "copyuploaddisabled": "由URL嘅上載已經停用。",
        "uploaddisabledtext": "檔案上載已經停用。",
        "php-uploaddisabledtext": "PHP 檔案上載已經停用。請檢查 file_uploads 設定。",
        "uploadscripted": "呢個檔案包含可能會誤被瀏覽器解釋執行嘅 HTML 或 script 代碼。",
+       "uploaded-hostile-svg": "喺上載咗嘅SVG檔嘅樣式標籤度搵到唔安全嘅CSS。",
        "uploadscriptednamespace": "呢個SVG文件可能有“<nowiki>$1</nowiki>”嘅非法字詞響度",
        "uploadinvalidxml": "分析唔到已經上傳咗嘅XML文件",
        "uploadvirus": "呢個檔案有病毒!\n詳情:$1",
        "uploadstash-errclear": "清除檔案唔成功。",
        "uploadstash-refresh": "更新檔案清單",
        "uploadstash-thumbnail": "睇縮圖",
+       "uploadstash-bad-path": "路徑唔存在。",
+       "uploadstash-bad-path-invalid": "路徑無效。",
        "uploadstash-bad-path-unknown-type": "未知嘅類型「$1」。",
+       "uploadstash-zero-length": "檔案長度係零。",
        "invalid-chunk-offset": "非法偏移塊",
        "img-auth-accessdenied": "拒絕通行",
-       "img-auth-nopathinfo": "PATH_INFO唔見咗。\n你嘅伺服器重未設定呢個資料。\n佢可能係CGI為本,唔支援img_auth。\n睇吓 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 。",
+       "img-auth-nopathinfo": "無路徑資訊。\n你嘅伺服器一定要傳遞REQUEST_URI以及/或者係PATH_INFO變數。\n如果已經係噉,請試下開著$wgUsePathInfo。\n睇吓 https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization 。",
        "img-auth-notindir": "所請求嘅路徑唔響個已經設定咗嘅上載目錄。",
        "img-auth-badtitle": "唔能夠由\"$1\"整一個有效標題。",
        "img-auth-nologinnWL": "你而家無登入,\"$1\"唔響個白名單度。",
        "filerevert-submit": "回復",
        "filerevert-success": "'''[[Media:$1|$1]]'''已經回復到[$4 響$2 $3嘅版本]。",
        "filerevert-badversion": "呢個檔案所提供嘅時間截記並無之前嘅本地版本。",
+       "filerevert-identical": "而家版本嘅檔同揀咗嘅版本一模一樣。",
        "filedelete": "刪除$1",
        "filedelete-legend": "刪除檔案",
        "filedelete-intro": "你而家刪除緊個檔案'''[[Media:$1|$1]]'''。",
        "deadendpages": "掘頭頁",
        "deadendpagestext": "呢啲頁無連到{{SITENAME}}內嘅任何一頁。",
        "protectedpages": "保護頁",
+       "protectedpages-filters": "篩選條件:",
        "protectedpages-indef": "只有無期保謢頁",
        "protectedpages-cascade": "只有連串保護頁",
        "protectedpages-noredirect": "收埋跳轉",
        "protectedtitles-submit": "顯示標題",
        "listusers": "用戶一覽",
        "listusers-editsonly": "只顯示有編輯嘅用戶",
+       "listusers-temporarygroupsonly": "淨係顯示喺臨時用戶組度嘅用戶",
        "listusers-creationsort": "按建立日期排序",
        "listusers-desc": "反向排序",
        "usereditcount": "$1次編輯",
        "apisandbox": "API沙盤",
        "apisandbox-jsonly": "需要JavaScript來用API沙盤。",
        "apisandbox-api-disabled": "爾個網站閂咗API。",
+       "apisandbox-submit": "提交請求",
        "apisandbox-reset": "清除",
        "apisandbox-retry": "再試過",
+       "apisandbox-loading": "載入緊API模組「$1」嘅資訊...",
+       "apisandbox-load-error": "載入緊API模組「$1」嘅資訊嘅時候出錯:$2",
+       "apisandbox-no-parameters": "呢個API模組無參數。",
        "apisandbox-examples": "範例",
+       "apisandbox-dynamic-parameters-add-label": "加參數:",
+       "apisandbox-dynamic-parameters-add-placeholder": "參數名",
+       "apisandbox-dynamic-error-exists": "已經有個叫做「$1」嘅參數。",
        "apisandbox-deprecated-parameters": "停用嘅參數",
+       "apisandbox-add-multi": "加",
        "apisandbox-results": "結果",
        "apisandbox-request-url-label": "請求URL:",
        "apisandbox-request-json-label": "請求JSON:",
        "speciallogtitlelabel": "目標(題目或者用戶 {{ns:user}}:用戶名 ):",
        "log": "日誌",
        "logeventslist-submit": "顯示",
+       "logeventslist-patrol-log": "巡查日誌",
+       "logeventslist-tag-log": "標籤日誌",
        "all-logs-page": "全部嘅公共日誌",
        "alllogstext": "響{{SITENAME}}度全部日誌嘅綜合顯示。你可以選擇一個日誌類型、用戶名、或者受影響嘅頁面,嚟縮窄顯示嘅範圍。",
        "logempty": "日誌中冇符合嘅項目。",
        "log-title-wildcard": "搵以呢個文字開始嘅標題",
+       "showhideselectedlogentries": "顯示/收埋揀咗嘅日誌項目",
+       "log-edit-tags": "改揀咗嘅日誌項目嘅標籤",
        "checkbox-select": "揀:$1",
        "checkbox-all": "全部",
        "checkbox-none": "冇",
        "allpages-bad-ns": "{{SITENAME}}係無一個空間名叫做\"$1\"。",
        "allpages-hide-redirects": "收埋跳轉",
        "cachedspecial-viewing-cached-ttl": "以下資料,來自暫存,上次更新係$1之前嘅事。",
+       "cachedspecial-viewing-cached-ts": "你睇緊嘅係呢版嘅緩衝版本,可能唔完全同實際嘅相同。",
        "cachedspecial-refresh-now": "睇最新。",
        "categories": "類",
        "categories-submit": "顯示",
        "trackingcategories": "追蹤類",
        "trackingcategories-msg": "追蹤類",
        "trackingcategories-name": "訊息名",
+       "trackingcategories-desc": "分類收錄標準",
        "post-expand-template-inclusion-category-desc": "由於呢篇頁面嘥士喺擴展之前,已經超出咗<code>$wgMaxArticleSize</code>限制,所以好多模都擴展唔到。",
        "trackingcategories-nodesc": "冇解說資料",
        "trackingcategories-disabled": "類停用咗",
        "wlshowhideanons": "匿名用戶",
        "wlshowhidepatr": "巡過嘅編輯",
        "wlshowhidemine": "我嘅編輯",
+       "wlshowhidecategorization": "頁面分類",
        "watchlist-options": "監視清單選項",
        "watching": "監視緊...",
        "unwatching": "唔再監視緊...",
        "enotif_lastdiff": "睇$1去睇吓呢一次更改。",
        "enotif_anon_editor": "匿名用戶$1",
        "enotif_body": "$WATCHINGUSERNAME先生/小姐你好,\n\n{{SITENAME}}嘅頁面$PAGETITLE已經由$PAGEEDITOR喺$PAGEEDITDATE$CHANGEDORCREATED,現時修訂請睇$PAGETITLE_URL。\n\n$NEWPAGE\n\n編輯者留低嘅撮要:$PAGESUMMARY $PAGEMINOREDIT\n\n聯絡呢個編輯者:\nmail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\n今後唔會再有進一步嘅通知,除非你再來呢版。你亦都可以喺你嘅監視清單度復位所有監視頁面嘅通知標誌。\n\n            {{SITENAME}}通知系統\n\n--\n要修改你嘅監視清單設定,請睇{{canonicalurl:{{#special:EditWatchlist}}}}\n\n要刪除你嘅監視清單度嘅呢一版,請睇$UNWATCHURL\n\n回饋及更多幫助:\n$HELPPAGE",
+       "enotif_minoredit": "呢個係一個細編輯",
        "created": "建立過",
        "changed": "修改過",
        "deletepage": "刪除頁面",
        "dellogpage": "刪除日誌",
        "dellogpagetext": "以下係最近嘅刪除清單。",
        "deletionlog": "刪除日誌",
+       "log-name-create": "開新版日誌",
+       "log-description-create": "以下係最近新開嘅版一覽。",
+       "logentry-create-create": "$1{{GENDER:$2|開咗}}版面$3",
        "reverted": "恢復到先前嘅修訂",
        "deletecomment": "原因:",
        "deleteotherreason": "其它/附加嘅原因:",
        "changecontentmodel-success-title": "目錄類已經改咗",
        "changecontentmodel-success-text": "[[:$1]]目錄類已經改變咗",
        "changecontentmodel-cannot-convert": "唔可以喺[[:$1]]嘅目錄轉成$2嘅類。",
+       "log-name-contentmodel": "內容模型改動日誌",
        "logentry-contentmodel-change-revertlink": "反轉",
        "logentry-contentmodel-change-revert": "反轉",
        "protectlogpage": "保護日誌",
        "modifiedarticleprotection": "已經改咗 \"[[$1]]\" 嘅保護等級",
        "unprotectedarticle": "已經唔再保護「[[$1]]」",
        "movedarticleprotection": "已經改咗由「[[$2]]」到「[[$1]]」嘅保護設定",
+       "protectedarticle-comment": "{{GENDER:$2|保護咗}}《[[$1]]》",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|改咗}}《[[$1]]》嘅保護層級",
+       "unprotectedarticle-comment": "{{GENDER:$2|剷咗}}對《[[$1]]》嘅保護",
        "protect-title": "改緊「$1」嘅保護等級",
        "protect-title-notallowed": "睇下「$1」嘅保護等級",
        "prot_1movedto2": "[[$1]]搬到去[[$2]]",
        "undelete-search-title": "搵刪咗嘅版",
        "undelete-search-box": "搵刪除咗嘅頁面",
        "undelete-search-prefix": "顯示由以下開頭嘅頁面:",
+       "undelete-search-full": "顯示版面標題包含:",
        "undelete-search-submit": "搵嘢",
        "undelete-no-results": "響刪除存檔度搵唔到符合嘅頁面。",
        "undelete-filename-mismatch": "唔能夠刪除帶有時間截記嘅檔案修訂 $1: 檔案錯配",
        "uctop": "(最新)",
        "month": "由呢個月 (同更早):",
        "year": "由呢一年 (同更早):",
+       "date": "開始日期(同更早之前):",
        "sp-contributions-newbies": "只顯示新戶口嘅貢獻",
        "sp-contributions-newbies-sub": "新戶口嘅貢獻",
        "sp-contributions-newbies-title": "新戶口嘅用戶貢獻",
        "sp-contributions-username": "IP地址或用戶名:",
        "sp-contributions-toponly": "只顯示最新修訂嘅編輯",
        "sp-contributions-newonly": "只顯示開新版嘅編輯",
+       "sp-contributions-hideminor": "收埋細編輯",
        "sp-contributions-submit": "搵",
        "whatlinkshere": "有乜嘢連結來呢度",
        "whatlinkshere-title": "連到「$1」嘅頁",
        "blocklist": "封鎖用戶",
        "autoblocklist": "自動封鎖",
        "autoblocklist-submit": "揾",
+       "autoblocklist-legend": "列出自動封鎖",
+       "autoblocklist-localblocks": "本地{{PLURAL:$1|自動封鎖}}",
+       "autoblocklist-total-autoblocks": "自動封鎖總數:$1",
+       "autoblocklist-empty": "自動封鎖一覽係空嘅。",
+       "autoblocklist-otherblocks": "其他{{PLURAL:$1|自動封鎖}}",
        "ipblocklist": "封咗嘅用戶",
        "ipblocklist-legend": "搵一位封咗嘅用戶",
        "blocklist-userblocks": "收埋戶口封鎖",
        "block-log-flags-hiddenname": "隱藏用戶名",
        "range_block_disabled": "操作員嘅建立範圍封鎖已經停用。",
        "ipb_expiry_invalid": "無效嘅期限。",
+       "ipb_expiry_old": "到期時間過咗。",
        "ipb_expiry_temp": "隱藏用戶名封鎖定一定係要永久性嘅。",
        "ipb_hide_invalid": "唔能夠壓止呢個戶口;佢有多過{{PLURAL:$1|一次編輯|$1次編輯}}。",
        "ipb_already_blocked": "\"$1\"已經封鎖咗",
        "ipb_blocked_as_range": "錯誤:個IP $1 無直接封鎖,唔可以解封。但係佢係響 $2 嘅封鎖範圍之內,嗰段範圍係可以解封嘅。",
        "ip_range_invalid": "無效嘅IP範圍",
        "ip_range_toolarge": "大過 /$1 嘅封鎖範圍係唔容許嘅。",
+       "ip_range_toolow": "呢啲IP範圍唔用得。",
        "proxyblocker": "Proxy 封鎖器",
        "proxyblockreason": "你嘅IP係一個公開(指任何人都可以用,無須身份認證?)嘅代理地址,因此被封鎖。請聯絡你嘅Internet服務提供商或技術支援,向佢哋報告呢個嚴重嘅安全問題。",
        "sorbsreason": "你嘅IP地址已經畀響{{SITENAME}}度用嘅DNSBL列咗做公開代理。",
        "sorbs_create_account_reason": "你嘅IP地址已經畀響{{SITENAME}}度用嘅DNSBL列咗做公開代理。你唔可以開新戶口。",
+       "softblockrangesreason": "你嘅互聯網址($1)唔畀未簽到貢獻。請簽到。",
        "cant-see-hidden-user": "你試緊封鎖嘅用戶已經封鎖咗或者隱藏咗。\n你而家冇隱藏用戶嘅權限,你唔可以睇或者改呢位用戶嘅封鎖。",
        "ipbblocked": "你唔可以封鎖或者解封其他用戶,因為你自己已經俾人封鎖咗。",
        "ipbnounblockself": "你唔容許封鎖你自己。",
        "lockdbsuccesstext": "資料庫現已鎖住。<br />\n請一定要記得喺完成系統維護工作之後[[Special:UnlockDB|解鎖資料庫]]。",
        "unlockdbsuccesstext": "資料庫鎖定現已解開。",
        "lockfilenotwritable": "資料庫封鎖檔案係唔寫得嘅。要鎖定或解鎖資料庫,要由網頁伺服器度寫入。",
+       "databaselocked": "個資料庫已經鎖咗。",
        "databasenotlocked": "資料庫而家冇鎖到。",
+       "lockedbyandtime": "(由{{GENDER:$1|$1}}喺$2 $3執行)",
        "move-page": "搬$1",
        "move-page-legend": "搬頁",
        "movepagetext": "用下面個表改版名,搬埋佢嘅歷史。\n舊標題會變做跳轉。\n你可以自動噉更新指到原先標題嘅跳轉。\n如果你揀咗唔去做嘅話,請務必要檢查吓有冇[[Special:DoubleRedirects|雙重跳轉]]或者[[Special:BrokenRedirects|死跳轉]](嘅情況發生)。\n你有責任確保啲連結依然指去佢哋應該指去嘅地方。\n\n注意如果已經有一個同個新名同名嘅頁,噉呢個頁係搬'''唔到'''嘅,除非嗰個同名嘅頁係空嘅或者佢係一個跳轉頁,兼且要之前冇編輯過(冇編輯歷史)先得。噉即係講萬一你搞錯咗,你可以將呢個頁改返去佢改之前噉,你唔可以覆蓋一個現有嘅頁。\n\n<strong>提示:</strong>\n噉樣對於一個好多人經過嘅頁面嚟講可能係一個好大嘅同埋出人意表嘅修改;請你喺行動之前確認你清楚噉做嘅後果。",
        "cant-move-to-user-page": "你並無權限去搬到一個用戶版(佢嘅細版之外)。",
        "cant-move-category-page": "你無權去搬分類頁。",
        "cant-move-to-category-page": "你無權去搬一版去分類頁。",
+       "cant-move-subpages": "你無權去搬分頁。",
+       "namespace-nosubpages": "名空間「$1」唔畀有分頁。",
        "newtitle": "新標題:",
        "move-watch": "睇實來源同埋目標版",
        "movepagebtn": "搬頁",
        "export-download": "另存做檔案",
        "export-templates": "包含模",
        "export-pagelinks": "包含到一個深度嘅連結版:",
+       "export-manual": "人手加入版面:",
        "allmessages": "系統信息",
        "allmessagesname": "名稱",
        "allmessagesdefault": "預設訊息文字",
        "import-interwiki-submit": "倒入",
        "import-mapping-default": "輸入默認位置",
        "import-upload-filename": "檔名:",
+       "import-upload-username-prefix": "跨wiki字頭:",
        "import-comment": "註解:",
        "importtext": "請由原 wiki 嘅[[Special:Export|匯出工具]]匯出成檔案。\n儲存喺你部電腦度,然後再上載到呢度。",
        "importstart": "倒入緊...",
        "tooltip-ca-nstab-category": "睇吓分類頁",
        "tooltip-minoredit": "標做細嘅修訂",
        "tooltip-save": "保存你嘅修改",
+       "tooltip-publish": "發佈你嘅修改",
        "tooltip-preview": "預覽你嘅修改,保存之前請檢查一次先",
        "tooltip-diff": "顯示你對頁面所作嘅修改",
        "tooltip-compareselectedversions": "顯示該頁面兩個所選修訂嘅唔同之處。",
        "tooltip-summary": "輸入一個簡短嘅摘要",
        "common.css": "/* 響呢度放 CSS 碼來改成個網站嘅畫面 */",
        "print.css": "/* 響呢度放 CSS 碼去改打印輸出 */",
+       "common.json": "/* 響每一個頁面載入時,所有用戶都會載入呢度任何嘅JSON。 */",
        "common.js": "/* 響每一次個頁面載入時,所有用戶都會載入呢度任何嘅JavaScript。 */",
        "anonymous": "{{SITENAME}}嘅匿名{{PLURAL:$1|用戶|用戶}}",
        "siteuser": "{{SITENAME}}嘅用戶$1",
        "pageinfo-category-subcats": "子類數",
        "pageinfo-category-files": "檔案數",
        "pageinfo-user-id": "用戶ID",
+       "pageinfo-file-hash": "雜湊值",
        "markaspatrolleddiff": "標示為已巡查嘅",
        "markaspatrolledtext": "標示呢版做查咗嘅",
+       "markaspatrolledtext-file": "嘜呢個檔案版本為巡查咗",
        "markedaspatrolled": "已經標示做已巡查嘅",
        "markedaspatrolledtext": "已經選擇咗[[:$1]]嘅修訂已經標示咗做已巡查嘅。",
        "rcpatroldisabled": "最近修改巡查已經停用",
        "newimages-legend": "過濾",
        "newimages-label": "檔名(或佢嘅一部份):",
        "newimages-showbots": "顯示機械人嘅上載",
+       "newimages-mediatype": "媒體類:",
        "noimages": "冇嘢去睇。",
        "ilsubmit": "搵嘢",
        "bydate": "以時間",
        "exif-contact": "聯繫信息",
        "exif-writer": "作家",
        "exif-languagecode": "語言",
+       "exif-iimversion": "IIM版本",
        "exif-iimcategory": "類",
        "exif-identifier": "識別碼",
        "exif-label": "標籤",
        "exif-gpslatitude-s": "南緯",
        "exif-gpslongitude-e": "東經",
        "exif-gpslongitude-w": "西經",
+       "exif-gpsaltitude-above-sealevel": "海拔$1{{PLURAL:$1|米}}",
+       "exif-gpsaltitude-below-sealevel": "海拔負$1{{PLURAL:$1|米}}",
        "exif-gpsstatus-a": "度緊",
        "exif-gpsstatus-v": "互度",
        "exif-gpsmeasuremode-2": "二維量度",
        "exif-dc-contributor": "貢獻者",
        "exif-dc-date": "日子",
        "exif-dc-publisher": "發佈者",
+       "exif-dc-relation": "相關媒體",
        "exif-dc-rights": "權",
+       "exif-dc-source": "來源媒體",
+       "exif-dc-type": "媒體類",
        "exif-rating-rejected": "拒絕咗",
        "exif-isospeedratings-overflow": "超出咗65535嘅限制",
+       "exif-iimcategory-ace": "藝術、文化同娛樂",
+       "exif-iimcategory-clj": "犯罪同法律",
+       "exif-iimcategory-dis": "災​​難同事故",
+       "exif-iimcategory-fin": "經濟同商業",
        "exif-iimcategory-edu": "教育",
        "exif-iimcategory-evn": "環境",
        "exif-iimcategory-hth": "健康",
+       "exif-iimcategory-hum": "人情世故",
        "exif-iimcategory-lab": "勞工",
+       "exif-iimcategory-lif": "生活同休閒",
        "exif-iimcategory-pol": "政治",
+       "exif-iimcategory-rel": "宗教同信仰",
+       "exif-iimcategory-sci": "科學同科技",
+       "exif-iimcategory-soi": "社會問題",
        "exif-iimcategory-spo": "體育",
        "exif-iimcategory-war": "戰爭,衝突同動蕩",
        "exif-iimcategory-wea": "天氣",
        "exif-urgency-normal": "正常 ($1)",
        "exif-urgency-low": "低 ($1)",
        "exif-urgency-high": "高 ($1)",
+       "exif-urgency-other": "用戶自訂優先權($1)",
        "namespacesall": "全部",
        "monthsall": "全部",
        "confirmemail": "確認電郵地址",
        "confirmemail_body_set": "有個人,可能係你,來自$1呢個IP,\n幫係{{SITENAME}}嘅用戶\"$2\"設定左個電郵地址。\n\n要確認呢個電郵真係你嘅同埋再次啟動{{SITENAME}}嘅電郵功能,請開啟呢個網址確認:\n\n$3\n\n如果呢個*唔係*你嘅戶口,用下面呢個網址去取消呢個電郵確認:\n\n$5\n\n呢個確認碼會喺$4到期。",
        "confirmemail_invalidated": "電郵地址確認取消咗",
        "invalidateemail": "取消電郵確認",
+       "notificationemail_subject_changed": "{{SITENAME}}註冊嘅電郵地址改咗",
+       "notificationemail_subject_removed": "{{SITENAME}}註冊嘅電郵地址剷咗",
+       "notificationemail_body_changed": "來自互聯網址$1嘅某個人(可能是您),喺{{SITENAME}}度將戶口「$2」嘅電郵地址改成「$3」。\n\n如果唔係你本人所為,請即刻同網站管理員聯絡。",
        "scarytranscludedisabled": "[跨 wiki 滲漏正停用]",
        "scarytranscludefailed": "[$1嘅頡取模動作失敗]",
+       "scarytranscludefailed-httpstatus": "[模$1讀取唔到:HTTP $2]",
        "scarytranscludetoolong": "[URL 太長]",
        "deletedwhileediting": "警告:你寫緊文嗰陣,有用戶洗咗呢版!",
        "confirmrecreate": "你寫緊文嗰陣,阿用戶 [[User:$1|$1]] ([[User talk:$1|talk]]) {{GENDER:$1|洗}}咗呢一頁。以下係佢個理由:\n: <em>$2</em>\n請確認你係咪真係想重新整過呢版。",
+       "confirmrecreate-noreason": "你寫緊文嗰陣,用戶[[User:$1|$1]] ([[User talk:$1|talk]]) {{GENDER:$1|刪}}咗呢一頁。請確認你係咪真係想重新開過呢版。",
        "recreate": "重新整過",
+       "confirm-purge-title": "洗咗呢版個緩衝版本",
        "confirm_purge_button": "肯定",
        "confirm-purge-top": "肯定要洗咗呢版個快取版本?",
        "confirm-purge-bottom": "清理一版係會清除快取同埋強迫顯示最現時嘅修訂。",
        "authmanager-realname-label": "真名",
        "authmanager-realname-help": "用戶嘅真名",
        "authprovider-resetpass-skip-label": "跳過",
-       "interfaceadmin-info": "$1\n\n改全站通用 CSS/JS/JSON 檔嘅權限由 <code>editinterface</code> 權限拆咗出嚟。如果你唔明點解會出呢個錯誤訊息,請睇[[mw:MediaWiki_1.32/interface-admin]]。",
+       "interfaceadmin-info": "$1\n\n改全站通用 CSS/JS/JSON 檔嘅權限最近由 <code>editinterface</code> 權限拆咗出嚟。如果你唔明點解會出呢個錯誤訊息,請睇[[mw:MediaWiki_1.32/interface-admin]]。",
        "passwordpolicies": "密碼政策",
        "passwordpolicies-summary": "爾度係對爾個wiki定義咗嘅用戶組來講有效嘅密碼政策一覽。",
        "passwordpolicies-group": "組",
index ce13ba8..ccb3509 100644 (file)
                        "RyRubyy",
                        "Wxyveronica",
                        "夢蝶葬花",
-                       "Dcljr"
+                       "Dcljr",
+                       "Phenolla"
                ]
        },
        "tog-underline": "链接下划线:",
        "botpasswords-invalid-name": "指定的用户名不包含机器人密码分隔符(“$1”)。",
        "botpasswords-not-exist": "用户“$1”没有名叫“$2”的机器人密码。",
        "botpasswords-needs-reset": "用于{{GENDER:$1|用户}}“$1”的机器人名称“$2”的机器人密码必须重置。",
+       "botpasswords-locked": "由于您的账户已被锁定,您不可以使用机器人密码进行登录。",
        "resetpass_forbidden": "无法更改密码",
        "resetpass_forbidden-reason": "密码不能更改:$1",
        "resetpass-no-info": "您必须登录后直接进入这个页面。",
        "confirm-unwatch-top": "从监视列表中删除此页吗?",
        "confirm-rollback-button": "确定",
        "confirm-rollback-top": "回退此页面的编辑么?",
+       "confirm-mcrrestore-title": "还原版本",
        "confirm-mcrundo-title": "撤销一次更改",
        "mcrundofailed": "撤销失败",
        "mcrundo-missingparam": "请求中缺少必需参数。",
        "redirect-file": "文件名",
        "redirect-logid": "日志ID",
        "redirect-not-exists": "没找到相应值",
+       "redirect-not-numeric": "输入的数值并不是数字",
        "fileduplicatesearch": "搜索重复文件",
        "fileduplicatesearch-summary": "根据哈希(hash)值搜索重复文件。",
        "fileduplicatesearch-filename": "文件名:",
index 96bfbd7..ad0fffe 100644 (file)
        "botpasswords-invalid-name": "指定的使用者名稱未包含機器人密碼分隔字元 (\"$1\")。",
        "botpasswords-not-exist": "使用者 \"$1\" 並沒有名稱為 \"$2\" 的機器人密碼。",
        "botpasswords-needs-reset": "給{{GENDER:$1|使用者}}「$1」的機器人名稱「$2」該機器人密碼已重新設定。",
+       "botpasswords-locked": "因您的帳號被鎖定,您不能以機器人的密碼登入。",
        "resetpass_forbidden": "無法變更密碼",
        "resetpass_forbidden-reason": "無法變更密碼:$1",
        "resetpass-no-info": "您必須直接登入存取這個頁面。",
        "permissionserrorstext-withaction": "由於下列{{PLURAL:$1|原因}},您沒有權限進行 $2 的動作:",
        "contentmodelediterror": "您無法編輯此修訂,因為它的內容模型為<code>$1</code>,與目前使用的頁面內容模型<code>$2</code>不同。",
        "recreate-moveddeleted-warn": "<strong>警告:您正重新建立先前已刪除的頁面。</strong>\n\n您應考慮是否繼續編輯此頁。\n在此提供刪除與移動日誌方便作為參考:",
-       "moveddeleted-notice": "此頁面已刪除。\n下方提供此頁面的刪除、保護和移動日誌以便參考。",
+       "moveddeleted-notice": "此頁面已遭刪除。\n請參考下方關於此頁面的刪除、保護和移動日誌。",
        "moveddeleted-notice-recent": "對不起,此頁面剛剛被刪除(在最近24小時內)。頁面的刪除、保護和移動日誌在下方提供以供參考。",
        "log-fulllog": "檢視完整日誌",
        "edit-hook-aborted": "編輯已被 Hook 中止。\n且未回應無任何說明。",
        "lineno": "行 $1:",
        "compareselectedversions": "比較已選擇的修訂",
        "showhideselectedversions": "變更已選擇修訂的顯示設定",
-       "editundo": "撤銷",
+       "editundo": "復原",
        "diff-empty": "(無差異)",
        "diff-multi-sameuser": "(未顯示同一使用者於中間所作的 $1 次修訂)",
        "diff-multi-otherusers": "(未顯示由 $2 位使用者於中間所作的 $1 次修訂)",
        "confirm-unwatch-top": "從您的監視清單中移除此頁面?",
        "confirm-rollback-button": "確定",
        "confirm-rollback-top": "還原編輯到此頁面?",
+       "confirm-mcrrestore-title": "還原修訂",
        "confirm-mcrundo-title": "還原變更",
        "mcrundofailed": "還原失敗",
        "mcrundo-missingparam": "請求缺少必要參數。",
        "mcrundo-changed": "自您檢視差異之後,頁面有被變更過。請檢閱新的變更。",
+       "mcrundo-parse-failed": "解析新修訂失敗:$1",
        "semicolon-separator": ";",
        "comma-separator": "、",
        "colon-separator": ":",
        "redirect-file": "檔案名稱",
        "redirect-logid": "日誌 ID",
        "redirect-not-exists": "查無值",
+       "redirect-not-numeric": "值不是數字",
        "fileduplicatesearch": "搜尋重複檔案",
        "fileduplicatesearch-summary": "依據雜湊值 (Hash) 來搜尋重複的檔案。",
        "fileduplicatesearch-filename": "檔案名稱:",
index d64859f..0ee1293 100644 (file)
        "rev-deleted-comment": "(註釋已除)",
        "rev-deleted-event": "(日誌已除)",
        "revdelete-suppress-text": "壓制'''只'''應用於以下的情況:\n* 不合適的個人資料\n*: ''地址、電話號碼、身份證號碼等。''",
-       "editundo": "撤銷",
+       "editundo": "復原",
        "prefs-user-pages": "用戶頁面",
        "username": "{{GENDER:$1|用戶名稱}}:",
        "prefs-help-gender": "可選:用於軟件中的性別指定。此項資料將會被公開。",
index 3bc2245..60be21c 100644 (file)
@@ -86,21 +86,21 @@ $dateFormats = [
 ];
 
 $digitTransformTable = [
-       '0' => '٠', # &#x0660;
-       '1' => '١', # &#x0661;
-       '2' => '٢', # &#x0662;
-       '3' => '٣', # &#x0663;
-       '4' => '٤', # &#x0664;
-       '5' => '٥', # &#x0665;
-       '6' => '٦', # &#x0666;
-       '7' => '٧', # &#x0667;
-       '8' => '٨', # &#x0668;
-       '9' => '٩', # &#x0669;
+       '0' => '٠', # U+0660
+       '1' => '١', # U+0661
+       '2' => '٢', # U+0662
+       '3' => '٣', # U+0663
+       '4' => '٤', # U+0664
+       '5' => '٥', # U+0665
+       '6' => '٦', # U+0666
+       '7' => '٧', # U+0667
+       '8' => '٨', # U+0668
+       '9' => '٩', # U+0669
 ];
 
 $separatorTransformTable = [
-       '.' => '٫', # &#x066b;
-       ',' => '٬', # &#x066c;
+       '.' => '٫', # U+066B
+       ',' => '٬', # U+066C
 ];
 
 $namespaceNames = [
index 2516fc7..55a2323 100644 (file)
@@ -152,16 +152,16 @@ $magicWords = [
 ];
 
 $digitTransformTable = [
-       '0' => '০', # &#x09e6;
-       '1' => '১', # &#x09e7;
-       '2' => '২', # &#x09e8;
-       '3' => '৩', # &#x09e9;
-       '4' => '৪', # &#x09ea;
-       '5' => '৫', # &#x09eb;
-       '6' => '৬', # &#x09ec;
-       '7' => '৭', # &#x09ed;
-       '8' => '৮', # &#x09ee;
-       '9' => '৯', # &#x09ef;
+       '0' => '০', # U+09E6
+       '1' => '১', # U+09E7
+       '2' => '২', # U+09E8
+       '3' => '৩', # U+09E9
+       '4' => '৪', # U+09EA
+       '5' => '৫', # U+09EB
+       '6' => '৬', # U+09EC
+       '7' => '৭', # U+09ED
+       '8' => '৮', # U+09EE
+       '9' => '৯', # U+09EF
 ];
 
 $digitGroupingPattern = "##,##,###";
index 548a8d6..8ad1b1e 100644 (file)
@@ -52,14 +52,14 @@ $specialPageAliases = [
 ];
 
 $digitTransformTable = [
-       '0' => '०', # &#x0966;
-       '1' => '१', # &#x0967;
-       '2' => '२', # &#x0968;
-       '3' => '३', # &#x0969;
-       '4' => '४', # &#x096a;
-       '5' => '५', # &#x096b;
-       '6' => '६', # &#x096c;
-       '7' => '७', # &#x096d;
-       '8' => '८', # &#x096e;
-       '9' => '९', # &#x096f;
+       '0' => '०', # U+0966
+       '1' => '१', # U+0967
+       '2' => '२', # U+0968
+       '3' => '३', # U+0969
+       '4' => '४', # U+096A
+       '5' => '५', # U+096B
+       '6' => '६', # U+096C
+       '7' => '७', # U+096D
+       '8' => '८', # U+096E
+       '9' => '९', # U+096F
 ];
diff --git a/languages/messages/MessagesBi.php b/languages/messages/MessagesBi.php
new file mode 100644 (file)
index 0000000..eebe4fd
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Bislama (Bislama)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'en';
index 043f4d1..89cd03c 100644 (file)
@@ -9,14 +9,14 @@
  */
 
 $digitTransformTable = [
-       '0' => '༠', # &#x0f20;
-       '1' => '༡', # &#x0f21;
-       '2' => '༢', # &#x0f22;
-       '3' => '༣', # &#x0f23;
-       '4' => '༤', # &#x0f24;
-       '5' => '༥', # &#x0f25;
-       '6' => '༦', # &#x0f26;
-       '7' => '༧', # &#x0f27;
-       '8' => '༨', # &#x0f28;
-       '9' => '༩', # &#x0f29;
+       '0' => '༠', # U+0F20
+       '1' => '༡', # U+0F21
+       '2' => '༢', # U+0F22
+       '3' => '༣', # U+0F23
+       '4' => '༤', # U+0F24
+       '5' => '༥', # U+0F25
+       '6' => '༦', # U+0F26
+       '7' => '༧', # U+0F27
+       '8' => '༨', # U+0F28
+       '9' => '༩', # U+0F29
 ];
index e615462..a9131fd 100644 (file)
@@ -120,21 +120,21 @@ $magicWords = [
 ];
 
 $digitTransformTable = [
-       '0' => '٠', # &#x0660;
-       '1' => '١', # &#x0661;
-       '2' => '٢', # &#x0662;
-       '3' => '٣', # &#x0663;
-       '4' => '٤', # &#x0664;
-       '5' => '٥', # &#x0665;
-       '6' => '٦', # &#x0666;
-       '7' => '٧', # &#x0667;
-       '8' => '٨', # &#x0668;
-       '9' => '٩', # &#x0669;
+       '0' => '٠', # U+0660
+       '1' => '١', # U+0661
+       '2' => '٢', # U+0662
+       '3' => '٣', # U+0663
+       '4' => '٤', # U+0664
+       '5' => '٥', # U+0665
+       '6' => '٦', # U+0666
+       '7' => '٧', # U+0667
+       '8' => '٨', # U+0668
+       '9' => '٩', # U+0669
 ];
 
 $separatorTransformTable = [
-       '.' => '٫', # &#x066b;
-       ',' => '٬', # &#x066c;
+       '.' => '٫', # U+066B
+       ',' => '٬', # U+066C
 ];
 
 $datePreferences = [
index 50ae191..46015a8 100644 (file)
@@ -9,14 +9,14 @@
  */
 
 $digitTransformTable = [
-       '0' => '༠', # &#x0f20;
-       '1' => '༡', # &#x0f21;
-       '2' => '༢', # &#x0f22;
-       '3' => '༣', # &#x0f23;
-       '4' => '༤', # &#x0f24;
-       '5' => '༥', # &#x0f25;
-       '6' => '༦', # &#x0f26;
-       '7' => '༧', # &#x0f27;
-       '8' => '༨', # &#x0f28;
-       '9' => '༩', # &#x0f29;
+       '0' => '༠', # U+0F20
+       '1' => '༡', # U+0F21
+       '2' => '༢', # U+0F22
+       '3' => '༣', # U+0F23
+       '4' => '༤', # U+0F24
+       '5' => '༥', # U+0F25
+       '6' => '༦', # U+0F26
+       '7' => '༧', # U+0F27
+       '8' => '༨', # U+0F28
+       '9' => '༩', # U+0F29
 ];
diff --git a/languages/messages/MessagesEn_ca.php b/languages/messages/MessagesEn_ca.php
new file mode 100644 (file)
index 0000000..698541f
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Canadian English (Canadian English)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'en';
index 61addfa..df906d5 100644 (file)
@@ -8,6 +8,8 @@
  *
  */
 
+$fallback = 'en';
+
 $specialPageAliases = [
        'Uncategorizedcategories'   => [ 'UncategorisedCategories' ],
        'Uncategorizedimages'       => [ 'UncategorisedFiles', 'UncategorisedImages' ],
index 4e10908..bda468c 100644 (file)
@@ -318,22 +318,22 @@ $magicWords = [
 ];
 
 $digitTransformTable = [
-       '0' => '۰', # &#x06f0;
-       '1' => '۱', # &#x06f1;
-       '2' => '۲', # &#x06f2;
-       '3' => '۳', # &#x06f3;
-       '4' => '۴', # &#x06f4;
-       '5' => '۵', # &#x06f5;
-       '6' => '۶', # &#x06f6;
-       '7' => '۷', # &#x06f7;
-       '8' => '۸', # &#x06f8;
-       '9' => '۹', # &#x06f9;
-       '%' => '٪', # &#x066a;
+       '0' => '۰', # U+06F0
+       '1' => '۱', # U+06F1
+       '2' => '۲', # U+06F2
+       '3' => '۳', # U+06F3
+       '4' => '۴', # U+06F4
+       '5' => '۵', # U+06F5
+       '6' => '۶', # U+06F6
+       '7' => '۷', # U+06F7
+       '8' => '۸', # U+06F8
+       '9' => '۹', # U+06F9
+       '%' => '٪', # U+066A
 ];
 
 $separatorTransformTable = [
-       '.' => '٫', # &#x066b;
-       ',' => '٬', # &#x066c;
+       '.' => '٫', # U+066B
+       ',' => '٬', # U+066C
 ];
 
 /**
index aec3a76..a011808 100644 (file)
@@ -112,16 +112,16 @@ $specialPageAliases = [
 ];
 
 $digitTransformTable = [
-       '0' => '૦', # &#x0ae6;
-       '1' => '૧', # &#x0ae7;
-       '2' => '૨', # &#x0ae8;
-       '3' => '૩', # &#x0ae9;
-       '4' => '૪', # &#x0aea;
-       '5' => '૫', # &#x0aeb;
-       '6' => '૬', # &#x0aec;
-       '7' => '૭', # &#x0aed;
-       '8' => '૮', # &#x0aee;
-       '9' => '૯', # &#x0aef;
+       '0' => '૦', # U+0AE6
+       '1' => '૧', # U+0AE7
+       '2' => '૨', # U+0AE8
+       '3' => '૩', # U+0AE9
+       '4' => '૪', # U+0AEA
+       '5' => '૫', # U+0AEB
+       '6' => '૬', # U+0AEC
+       '7' => '૭', # U+0AED
+       '8' => '૮', # U+0AEE
+       '9' => '૯', # U+0AEF
 ];
 
 $digitGroupingPattern = "##,##,###";
index 5a70a83..5bcad86 100644 (file)
@@ -285,16 +285,16 @@ $magicWords = [
 ];
 
 $digitTransformTable = [
-       '0' => '०', # &#x0966;
-       '1' => '१', # &#x0967;
-       '2' => '२', # &#x0968;
-       '3' => '३', # &#x0969;
-       '4' => '४', # &#x096a;
-       '5' => '५', # &#x096b;
-       '6' => '६', # &#x096c;
-       '7' => '७', # &#x096d;
-       '8' => '८', # &#x096e;
-       '9' => '९', # &#x096f;
+       '0' => '०', # U+0966
+       '1' => '१', # U+0967
+       '2' => '२', # U+0968
+       '3' => '३', # U+0969
+       '4' => '४', # U+096A
+       '5' => '५', # U+096B
+       '6' => '६', # U+096C
+       '7' => '७', # U+096D
+       '8' => '८', # U+096E
+       '9' => '९', # U+096F
 ];
 $linkTrail = "/^([a-z\x{0900}-\x{0963}\x{0966}-\x{A8E0}-\x{A8FF}]+)(.*)$/sDu";
 
diff --git a/languages/messages/MessagesJam.php b/languages/messages/MessagesJam.php
new file mode 100644 (file)
index 0000000..d199048
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Jamaican Creole English (Patois)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'en';
index 6032773..2ff8c61 100644 (file)
@@ -17,21 +17,21 @@ $fallback = 'kk-cyrl';
 $rtl = true;
 
 $digitTransformTable = [
-       '0' => '۰', # &#x06f0;
-       '1' => '۱', # &#x06f1;
-       '2' => '۲', # &#x06f2;
-       '3' => '۳', # &#x06f3;
-       '4' => '۴', # &#x06f4;
-       '5' => '۵', # &#x06f5;
-       '6' => '۶', # &#x06f6;
-       '7' => '۷', # &#x06f7;
-       '8' => '۸', # &#x06f8;
-       '9' => '۹', # &#x06f9;
+       '0' => '۰', # U+06F0
+       '1' => '۱', # U+06F1
+       '2' => '۲', # U+06F2
+       '3' => '۳', # U+06F3
+       '4' => '۴', # U+06F4
+       '5' => '۵', # U+06F5
+       '6' => '۶', # U+06F6
+       '7' => '۷', # U+06F7
+       '8' => '۸', # U+06F8
+       '9' => '۹', # U+06F9
 ];
 
 $separatorTransformTable = [
-       '.' => '٫', # &#x066b;
-       ',' => '٬', # &#x066c;
+       '.' => '٫', # U+066B
+       ',' => '٬', # U+066C
 ];
 
 $fallback8bitEncoding = 'windows-1256';
index 299beb8..65577a9 100644 (file)
@@ -61,16 +61,16 @@ $namespaceAliases = [
 ];
 
 $digitTransformTable = [
-       '0' => '០', # &#x17e0;
-       '1' => '១', # &#x17e1;
-       '2' => '២', # &#x17e2;
-       '3' => '៣', # &#x17e3;
-       '4' => '៤', # &#x17e4;
-       '5' => '៥', # &#x17e5;
-       '6' => '៦', # &#x17e6;
-       '7' => '៧', # &#x17e7;
-       '8' => '៨', # &#x17e8;
-       '9' => '៩', # &#x17e9;
+       '0' => '០', # U+17E0
+       '1' => '១', # U+17E1
+       '2' => '២', # U+17E2
+       '3' => '៣', # U+17E3
+       '4' => '៤', # U+17E4
+       '5' => '៥', # U+17E5
+       '6' => '៦', # U+17E6
+       '7' => '៧', # U+17E7
+       '8' => '៨', # U+17E8
+       '9' => '៩', # U+17E9
 ];
 
 $separatorTransformTable = [
index 5fa77e9..0078261 100644 (file)
@@ -49,16 +49,16 @@ $namespaceNames = [
 ];
 
 $digitTransformTable = [
-       '0' => '೦', # &#x0ce6;
-       '1' => '೧', # &#x0ce7;
-       '2' => '೨', # &#x0ce8;
-       '3' => '೩', # &#x0ce9;
-       '4' => '೪', # &#x0cea;
-       '5' => '೫', # &#x0ceb;
-       '6' => '೬', # &#x0cec;
-       '7' => '೭', # &#x0ced;
-       '8' => '೮', # &#x0cee;
-       '9' => '೯', # &#x0cef;
+       '0' => '೦', # U+0CE6
+       '1' => '೧', # U+0CE7
+       '2' => '೨', # U+0CE8
+       '3' => '೩', # U+0CE9
+       '4' => '೪', # U+0CEA
+       '5' => '೫', # U+0CEB
+       '6' => '೬', # U+0CEC
+       '7' => '೭', # U+0CED
+       '8' => '೮', # U+0CEE
+       '9' => '೯', # U+0CEF
 ];
 
 $digitGroupingPattern = "##,##,###";
index 27ac9f1..f4ee3a0 100644 (file)
@@ -33,19 +33,19 @@ $namespaceNames = [
 ];
 
 $digitTransformTable = [
-       '0' => '٠', # &#x0660;
-       '1' => '١', # &#x0661;
-       '2' => '٢', # &#x0662;
-       '3' => '٣', # &#x0663;
-       '4' => '٤', # &#x0664;
-       '5' => '٥', # &#x0665;
-       '6' => '٦', # &#x0666;
-       '7' => '٧', # &#x0667;
-       '8' => '٨', # &#x0668;
-       '9' => '٩', # &#x0669;
+       '0' => '٠', # U+0660
+       '1' => '١', # U+0661
+       '2' => '٢', # U+0662
+       '3' => '٣', # U+0663
+       '4' => '٤', # U+0664
+       '5' => '٥', # U+0665
+       '6' => '٦', # U+0666
+       '7' => '٧', # U+0667
+       '8' => '٨', # U+0668
+       '9' => '٩', # U+0669
 ];
 
 $separatorTransformTable = [
-       '.' => '٫', # &#x066b;
-       ',' => '٬', # &#x066c;
+       '.' => '٫', # U+066B
+       ',' => '٬', # U+066C
 ];
index 55dc004..ad84b77 100644 (file)
@@ -30,14 +30,14 @@ $namespaceNames = [
 ];
 
 $digitTransformTable = [
-       '0' => '०', # &#x0966;
-       '1' => '१', # &#x0967;
-       '2' => '२', # &#x0968;
-       '3' => '३', # &#x0969;
-       '4' => '४', # &#x096a;
-       '5' => '५', # &#x096b;
-       '6' => '६', # &#x096c;
-       '7' => '७', # &#x096d;
-       '8' => '८', # &#x096e;
-       '9' => '९', # &#x096f;
+       '0' => '०', # U+0966
+       '1' => '१', # U+0967
+       '2' => '२', # U+0968
+       '3' => '३', # U+0969
+       '4' => '४', # U+096A
+       '5' => '५', # U+096B
+       '6' => '६', # U+096C
+       '7' => '७', # U+096D
+       '8' => '८', # U+096E
+       '9' => '९', # U+096F
 ];
index 0a80a62..4d53e36 100644 (file)
@@ -19,19 +19,19 @@ $fallback = 'ckb';
 $rtl = true;
 
 $digitTransformTable = [
-       '0' => '٠', # &#x0660;
-       '1' => '١', # &#x0661;
-       '2' => '٢', # &#x0662;
-       '3' => '٣', # &#x0663;
-       '4' => '٤', # &#x0664;
-       '5' => '٥', # &#x0665;
-       '6' => '٦', # &#x0666;
-       '7' => '٧', # &#x0667;
-       '8' => '٨', # &#x0668;
-       '9' => '٩', # &#x0669;
+       '0' => '٠', # U+0660
+       '1' => '١', # U+0661
+       '2' => '٢', # U+0662
+       '3' => '٣', # U+0663
+       '4' => '٤', # U+0664
+       '5' => '٥', # U+0665
+       '6' => '٦', # U+0666
+       '7' => '٧', # U+0667
+       '8' => '٨', # U+0668
+       '9' => '٩', # U+0669
 ];
 
 $separatorTransformTable = [
-       '.' => '٫', # &#x066b;
-       ',' => '٬', # &#x066c;
+       '.' => '٫', # U+066B
+       ',' => '٬', # U+066C
 ];
index 665b222..a3f29da 100644 (file)
@@ -80,14 +80,14 @@ $specialPageAliases = [
 ];
 
 $digitTransformTable = [
-       '0' => '໐', # &#x0ed0;
-       '1' => '໑', # &#x0ed1;
-       '2' => '໒', # &#x0ed2;
-       '3' => '໓', # &#x0ed3;
-       '4' => '໔', # &#x0ed4;
-       '5' => '໕', # &#x0ed5;
-       '6' => '໖', # &#x0ed6;
-       '7' => '໗', # &#x0ed7;
-       '8' => '໘', # &#x0ed8;
-       '9' => '໙', # &#x0ed9;
+       '0' => '໐', # U+0ED0
+       '1' => '໑', # U+0ED1
+       '2' => '໒', # U+0ED2
+       '3' => '໓', # U+0ED3
+       '4' => '໔', # U+0ED4
+       '5' => '໕', # U+0ED5
+       '6' => '໖', # U+0ED6
+       '7' => '໗', # U+0ED7
+       '8' => '໘', # U+0ED8
+       '9' => '໙', # U+0ED9
 ];
index c172d08..03e2f87 100644 (file)
@@ -311,16 +311,16 @@ $magicWords = [
 ];
 
 $digitTransformTable = [
-       '0' => '०', # &#x0966;
-       '1' => '१', # &#x0967;
-       '2' => '२', # &#x0968;
-       '3' => '३', # &#x0969;
-       '4' => '४', # &#x096a;
-       '5' => '५', # &#x096b;
-       '6' => '६', # &#x096c;
-       '7' => '७', # &#x096d;
-       '8' => '८', # &#x096e;
-       '9' => '९', # &#x096f;
+       '0' => '०', # U+0966
+       '1' => '१', # U+0967
+       '2' => '२', # U+0968
+       '3' => '३', # U+0969
+       '4' => '४', # U+096A
+       '5' => '५', # U+096B
+       '6' => '६', # U+096C
+       '7' => '७', # U+096D
+       '8' => '८', # U+096E
+       '9' => '९', # U+096F
 ];
 
 $linkTrail = "/^([\u{0900}-\u{0963}\u{0971}-\u{097F}\u{FEFF}\u{200D}]+)(.*)$/sDu";
index c6ab806..32cf115 100644 (file)
@@ -46,14 +46,14 @@ $specialPageAliases = [
 ];
 
 $digitTransformTable = [
-       '0' => '०', # &#x0966;
-       '1' => '१', # &#x0967;
-       '2' => '२', # &#x0968;
-       '3' => '३', # &#x0969;
-       '4' => '४', # &#x096a;
-       '5' => '५', # &#x096b;
-       '6' => '६', # &#x096c;
-       '7' => '७', # &#x096d;
-       '8' => '८', # &#x096e;
-       '9' => '९', # &#x096f;
+       '0' => '०', # U+0966
+       '1' => '१', # U+0967
+       '2' => '२', # U+0968
+       '3' => '३', # U+0969
+       '4' => '४', # U+096A
+       '5' => '५', # U+096B
+       '6' => '६', # U+096C
+       '7' => '७', # U+096D
+       '8' => '८', # U+096E
+       '9' => '९', # U+096F
 ];
index 65a7595..86ef77b 100644 (file)
@@ -28,14 +28,14 @@ $namespaceNames = [
 ];
 
 $digitTransformTable = [
-       '0' => '०', # &#x0966;
-       '1' => '१', # &#x0967;
-       '2' => '२', # &#x0968;
-       '3' => '३', # &#x0969;
-       '4' => '४', # &#x096a;
-       '5' => '५', # &#x096b;
-       '6' => '६', # &#x096c;
-       '7' => '७', # &#x096d;
-       '8' => '८', # &#x096e;
-       '9' => '९', # &#x096f;
+       '0' => '०', # U+0966
+       '1' => '१', # U+0967
+       '2' => '२', # U+0968
+       '3' => '३', # U+0969
+       '4' => '४', # U+096A
+       '5' => '५', # U+096B
+       '6' => '६', # U+096C
+       '7' => '७', # U+096D
+       '8' => '८', # U+096E
+       '9' => '९', # U+096F
 ];
index d17105a..022da81 100644 (file)
  */
 
 $digitTransformTable = [
-       '0' => '୦', # &#x0b66;
-       '1' => '୧', # &#x0b67;
-       '2' => '୨', # &#x0b68;
-       '3' => '୩', # &#x0b69;
-       '4' => '୪', # &#x0b6a;
-       '5' => '୫', # &#x0b6b;
-       '6' => '୬', # &#x0b6c;
-       '7' => '୭', # &#x0b6d;
-       '8' => '୮', # &#x0b6e;
-       '9' => '୯', # &#x0b6f;
+       '0' => '୦', # U+0B66
+       '1' => '୧', # U+0B67
+       '2' => '୨', # U+0B68
+       '3' => '୩', # U+0B69
+       '4' => '୪', # U+0B6A
+       '5' => '୫', # U+0B6B
+       '6' => '୬', # U+0B6C
+       '7' => '୭', # U+0B6D
+       '8' => '୮', # U+0B6E
+       '9' => '୯', # U+0B6F
 ];
 
 $linkTrail = "/^([a-z\x{0B00}-\x{0B7F}]+)(.*)$/sDu";
index 7062e07..8a3ecd0 100644 (file)
@@ -31,14 +31,14 @@ $namespaceNames = [
 ];
 
 $digitTransformTable = [
-       '0' => '०', # &#x0966;
-       '1' => '१', # &#x0967;
-       '2' => '२', # &#x0968;
-       '3' => '३', # &#x0969;
-       '4' => '४', # &#x096a;
-       '5' => '५', # &#x096b;
-       '6' => '६', # &#x096c;
-       '7' => '७', # &#x096d;
-       '8' => '८', # &#x096e;
-       '9' => '९', # &#x096f;
+       '0' => '०', # U+0966
+       '1' => '१', # U+0967
+       '2' => '२', # U+0968
+       '3' => '३', # U+0969
+       '4' => '४', # U+096A
+       '5' => '५', # U+096B
+       '6' => '६', # U+096C
+       '7' => '७', # U+096D
+       '8' => '८', # U+096E
+       '9' => '९', # U+096F
 ];
diff --git a/languages/messages/MessagesPih.php b/languages/messages/MessagesPih.php
new file mode 100644 (file)
index 0000000..25f62b2
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Pitkern (Pitkern)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'en';
index 0b203b0..3f01876 100644 (file)
 $rtl = true;
 
 $digitTransformTable = [
-       '0' => '۰', # &#x1776;
-       '1' => '۱', # &#x1777;
-       '2' => '۲', # &#x1778;
-       '3' => '۳', # &#x1779;
-       '4' => '۴', # &#x1780;
-       '5' => '۵', # &#x1781;
-       '6' => '۶', # &#x1782;
-       '7' => '۷', # &#x1783;
-       '8' => '۸', # &#x1784;
-       '9' => '۹', # &#x1785;
+       '0' => '۰', # U+06F0
+       '1' => '۱', # U+06F1
+       '2' => '۲', # U+06F2
+       '3' => '۳', # U+06F3
+       '4' => '۴', # U+06F4
+       '5' => '۵', # U+06F5
+       '6' => '۶', # U+06F6
+       '7' => '۷', # U+06F7
+       '8' => '۸', # U+06F8
+       '9' => '۹', # U+06F9
 ];
 
 $separatorTransformTable = [
-       '.' => '٫', # &#x066b;
-       ',' => '٬', # &#x066c;
+       '.' => '٫', # U+066B
+       ',' => '٬', # U+066C
 ];
 
 $namespaceNames = [
index 81a8a14..72dec65 100644 (file)
 $fallback = 'hi';
 
 $digitTransformTable = [
-       '0' => '०', # &#x0966;
-       '1' => '१', # &#x0967;
-       '2' => '२', # &#x0968;
-       '3' => '३', # &#x0969;
-       '4' => '४', # &#x096a;
-       '5' => '५', # &#x096b;
-       '6' => '६', # &#x096c;
-       '7' => '७', # &#x096d;
-       '8' => '८', # &#x096e;
-       '9' => '९', # &#x096f;
+       '0' => '०', # U+0966
+       '1' => '१', # U+0967
+       '2' => '२', # U+0968
+       '3' => '३', # U+0969
+       '4' => '४', # U+096A
+       '5' => '५', # U+096B
+       '6' => '६', # U+096C
+       '7' => '७', # U+096D
+       '8' => '८', # U+096E
+       '9' => '९', # U+096F
 ];
 
 $linkPrefixExtension = false;
diff --git a/languages/messages/MessagesSco.php b/languages/messages/MessagesSco.php
new file mode 100644 (file)
index 0000000..1069bbb
--- /dev/null
@@ -0,0 +1,30 @@
+<?php
+/** Scots (Scots)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'en';
+
+$namespaceNames = [
+       NS_MEDIA            => 'Media',
+       NS_SPECIAL          => 'Special',
+       NS_TALK             => 'Collogue',
+       NS_USER             => 'Uiser',
+       NS_USER_TALK        => 'Uiser_collogue',
+       NS_PROJECT_TALK     => '$1_collogue',
+       NS_FILE             => 'File',
+       NS_FILE_TALK        => 'File_collogue',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki_collogue',
+       NS_TEMPLATE         => 'Template',
+       NS_TEMPLATE_TALK    => 'Template_collogue',
+       NS_HELP             => 'Help',
+       NS_HELP_TALK        => 'Help_collogue',
+       NS_CATEGORY         => 'Category',
+       NS_CATEGORY_TALK    => 'Category_collogue',
+];
index 27276aa..f5a7c01 100644 (file)
@@ -13,15 +13,15 @@ $fallback = 'ur, pnb';
 $rtl = true;
 
 $digitTransformTable = [
-       '0' => '۰', # &#x06f0;
-       '1' => '۱', # &#x06f1;
-       '2' => '۲', # &#x06f2;
-       '3' => '۳', # &#x06f3;
-       '4' => '۴', # &#x06f4;
-       '5' => '۵', # &#x06f5;
-       '6' => '۶', # &#x06f6;
-       '7' => '۷', # &#x06f7;
-       '8' => '۸', # &#x06f8;
-       '9' => '۹', # &#x06f9;
-       '%' => '٪', # &#x066a;
+       '0' => '۰', # U+06F0
+       '1' => '۱', # U+06F1
+       '2' => '۲', # U+06F2
+       '3' => '۳', # U+06F3
+       '4' => '۴', # U+06F4
+       '5' => '۵', # U+06F5
+       '6' => '۶', # U+06F6
+       '7' => '۷', # U+06F7
+       '8' => '۸', # U+06F8
+       '9' => '۹', # U+06F9
+       '%' => '٪', # U+066A
 ];
index b446cc1..6219476 100644 (file)
@@ -1669,7 +1669,6 @@ class FakeMaintenance extends Maintenance {
        protected $mSelf = "FakeMaintenanceScript";
 
        public function execute() {
-               return;
        }
 }
 
index 5fe241c..72d5ef9 100644 (file)
@@ -1,6 +1,6 @@
 --
--- parsercache table, for cacheing complete parsed articles
--- before they are imbedded in the skin.
+-- parsercache table, for caching completly parsed articles
+-- before they are embedded in the skin.
 --
 
 CREATE TABLE /*$wgDBprefix*/parsercache (
index e9a30f9..558fec8 100644 (file)
@@ -69,7 +69,7 @@ class BenchmarkTidy extends Benchmarker {
                print "Median: $median ms\n";
                print "Mean: $mean ms\n";
                print "Maximum: $max ms\n";
-               print "Memory usage: " .  $contLang->formatSize( memory_get_usage( true ) ) . "\n";
+               print "Memory usage: " . $contLang->formatSize( memory_get_usage( true ) ) . "\n";
                print "Peak memory usage: " .
                        $contLang->formatSize( memory_get_peak_usage( true ) ) . "\n";
        }
index b933434..a1820b8 100644 (file)
@@ -286,7 +286,6 @@ TEXT
                }
 
                $this->outputStatus( "\n" );
-               return;
        }
 
        /**
index fe6e604..b01dde6 100644 (file)
@@ -95,9 +95,8 @@ class CompareParsers extends DumpIterator {
                $this->options = ParserOptions::newFromUser( $user );
 
                if ( $this->hasOption( 'tidy' ) ) {
-                       global $wgUseTidy;
-                       if ( !$wgUseTidy ) {
-                               $this->fatalError( 'Tidy was requested but $wgUseTidy is not set in LocalSettings.php' );
+                       if ( !MWTidy::isEnabled() ) {
+                               $this->fatalError( 'Tidy was requested but $wgTidyConfig is not set in LocalSettings.php' );
                        }
                        $this->options->setTidy( true );
                }
index 0aa8ce8..7f12252 100644 (file)
@@ -94,7 +94,7 @@ class CreateCommonPasswordCdb extends Maintenance {
                                        continue;
                                }
                                if ( isset( $alreadyWritten[$line] ) ) {
-                                       $this->output( "Password '$line' already written (line " . ( $i + 1 ) .")\n" );
+                                       $this->output( "Password '$line' already written (line " . ( $i + 1 ) . ")\n" );
                                        $skipped++;
                                        continue;
                                }
index ff06e49..a0177b1 100644 (file)
@@ -4322,7 +4322,6 @@ useemail
 uselang
 uselivepreview
 usemod
-usemsgcache
 usenewrc
 user
 useragent
index e9a6bc5..751932d 100644 (file)
@@ -146,12 +146,10 @@ abstract class DumpIterator extends Maintenance {
 
        /* Stub function for processing additional options */
        public function checkOptions() {
-               return;
        }
 
        /* Stub function for giving data about what was computed */
        public function conclusions() {
-               return;
        }
 
        /* Core function which does whatever the maintenance script is designed to do */
index 60ed252..eb03b38 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\Storage\SlotRecord;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -34,12 +36,14 @@ class EditCLI extends Maintenance {
                $this->addDescription( 'Edit an article from the command line, text is from stdin' );
                $this->addOption( 'user', 'Username', false, true, 'u' );
                $this->addOption( 'summary', 'Edit summary', false, true, 's' );
+               $this->addOption( 'remove', 'Remove a slot (requires --slot).', false, false );
                $this->addOption( 'minor', 'Minor edit', false, false, 'm' );
                $this->addOption( 'bot', 'Bot edit', false, false, 'b' );
                $this->addOption( 'autosummary', 'Enable autosummary', false, false, 'a' );
                $this->addOption( 'no-rc', 'Do not show the change in recent changes', false, false, 'r' );
                $this->addOption( 'nocreate', 'Don\'t create new pages', false, false );
                $this->addOption( 'createonly', 'Only create new pages', false, false );
+               $this->addOption( 'slot', 'Slot role name', false, true );
                $this->addArg( 'title', 'Title of article to edit' );
        }
 
@@ -48,10 +52,12 @@ class EditCLI extends Maintenance {
 
                $userName = $this->getOption( 'user', false );
                $summary = $this->getOption( 'summary', '' );
+               $remove = $this->hasOption( 'remove' );
                $minor = $this->hasOption( 'minor' );
                $bot = $this->hasOption( 'bot' );
                $autoSummary = $this->hasOption( 'autosummary' );
                $noRC = $this->hasOption( 'no-rc' );
+               $slot = $this->getOption( 'slot', SlotRecord::MAIN );
 
                if ( $userName === false ) {
                        $wgUser = User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
@@ -78,17 +84,36 @@ class EditCLI extends Maintenance {
 
                $page = WikiPage::factory( $title );
 
-               # Read the text
-               $text = $this->getStdin( Maintenance::STDIN_ALL );
-               $content = ContentHandler::makeContent( $text, $title );
+               if ( $remove ) {
+                       if ( $slot === SlotRecord::MAIN ) {
+                               $this->fatalError( "Cannot remove main slot! Use --slot to specify." );
+                       }
+
+                       $content = false;
+               } else {
+                       # Read the text
+                       $text = $this->getStdin( Maintenance::STDIN_ALL );
+                       $content = ContentHandler::makeContent( $text, $title );
+               }
 
                # Do the edit
                $this->output( "Saving... " );
-               $status = $page->doEditContent( $content, $summary,
-                       ( $minor ? EDIT_MINOR : 0 ) |
+               $updater = $page->newPageUpdater( $wgUser );
+
+               $flags = ( $minor ? EDIT_MINOR : 0 ) |
                        ( $bot ? EDIT_FORCE_BOT : 0 ) |
                        ( $autoSummary ? EDIT_AUTOSUMMARY : 0 ) |
-                       ( $noRC ? EDIT_SUPPRESS_RC : 0 ) );
+                       ( $noRC ? EDIT_SUPPRESS_RC : 0 );
+
+               if ( $content === false ) {
+                       $updater->removeSlot( $slot );
+               } else {
+                       $updater->setContent( $slot, $content );
+               }
+
+               $updater->saveRevision( CommentStoreComment::newUnsavedComment( $summary ), $flags );
+               $status = $updater->getStatus();
+
                if ( $status->isOK() ) {
                        $this->output( "done\n" );
                        $exit = 0;
diff --git a/maintenance/emptyUserGroup.php b/maintenance/emptyUserGroup.php
new file mode 100644 (file)
index 0000000..03a38fc
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * Removes all users from a given user group.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @ingroup Maintenance
+ */
+
+require_once __DIR__ . '/Maintenance.php';
+
+use MediaWiki\MediaWikiServices;
+
+class EmptyUserGroup extends Maintenance {
+       public function __construct() {
+               parent::__construct();
+               $this->addDescription( 'Remove all users from a given user group' );
+               $this->addArg( 'group', 'Group to be removed', true );
+       }
+
+       public function execute() {
+               $group = $this->getArg( 0 );
+
+               $lb = MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+
+               $users = User::findUsersByGroup( $group );
+
+               $count = iterator_count( $users );
+
+               $this->output( "Removing $count users from $group..." );
+
+               /**
+                * @var User $user
+                */
+               foreach ( $users as $user ) {
+                       $user->removeGroup( $group );
+
+                       $lb->waitForReplication();
+               }
+
+               $this->output( " Done!\n" );
+       }
+}
+
+$maintClass = EmptyUserGroup::class;
+require_once RUN_MAINTENANCE_IF_MAIN;
index e8993e4..4c2b64c 100644 (file)
@@ -257,7 +257,7 @@ abstract class BackupDumper extends Maintenance {
                $this->initProgress( $history );
 
                $db = $this->backupDb();
-               $exporter = new WikiExporter( $db, $history, WikiExporter::STREAM, $text );
+               $exporter = new WikiExporter( $db, $history, $text );
                $exporter->dumpUploads = $this->dumpUploads;
                $exporter->dumpUploadFileContents = $this->dumpUploadFileContents;
 
index bfbbcdc..747319d 100644 (file)
@@ -143,6 +143,7 @@ ERROR
                        );
                }
                $this->total += $dbw->affectedRows();
+               MediaWikiServices::getInstance()->getDBLoadBalancerFactory()->waitForReplication();
        }
 
        /**
@@ -169,7 +170,7 @@ ERROR
                                'user',
                                'user_name',
                                [
-                                       'user_name > ' .$dbw->addQuotes( $lastUsername ),
+                                       'user_name > ' . $dbw->addQuotes( $lastUsername ),
                                ],
                                __METHOD__,
                                [
index d9a247c..f01d8f5 100644 (file)
@@ -71,7 +71,7 @@ class CLIParser extends Maintenance {
                        false,
                        true
                );
-               $this->addOption( 'tidy', 'Tidy the output' );
+               $this->addOption( 'no-tidy', 'Don\'t tidy the output (deprecated)' );
                $this->addArg( 'file', 'File containing wikitext (Default: stdin)', false );
        }
 
@@ -85,7 +85,7 @@ class CLIParser extends Maintenance {
         * @return string HTML Rendering
         */
        public function render( $wikitext ) {
-               return $this->parse( $wikitext )->getText();
+               return $this->parse( $wikitext )->getText( [ 'wrapperDivClass' => '' ] );
        }
 
        /**
@@ -129,9 +129,10 @@ class CLIParser extends Maintenance {
         * @return ParserOutput
         */
        protected function parse( $wikitext ) {
-               $options = new ParserOptions;
-               if ( $this->getOption( 'tidy' ) ) {
-                       $options->setTidy( true );
+               $options = ParserOptions::newCanonical();
+               $options->setOption( 'enableLimitReport', false );
+               if ( $this->getOption( 'no-tidy' ) ) {
+                       $options->setTidy( false );
                }
                return $this->parser->parse(
                        $wikitext,
index 60f5e8a..6eb2d6d 100644 (file)
@@ -116,8 +116,8 @@ class PopulateArchiveRevId extends LoggedUpdateMaintenance {
                                        $toDelete[] = $id;
 
                                        $maxId = max(
-                                               (int)$dbw->selectField( 'archive', 'MAX(ar_rev_id)', [], __METHOD__ ),
-                                               (int)$dbw->selectField( 'slots', 'MAX(slot_revision_id)', [], __METHOD__ )
+                                               (int)$dbw->selectField( 'archive', 'MAX(ar_rev_id)', [], $fname ),
+                                               (int)$dbw->selectField( 'slots', 'MAX(slot_revision_id)', [], $fname )
                                        );
                                        if ( $id <= $maxId ) {
                                                $dbw->insert( 'revision', [ 'rev_id' => $maxId + 1 ] + self::$dummyRev, $fname );
@@ -220,7 +220,43 @@ class PopulateArchiveRevId extends LoggedUpdateMaintenance {
                        );
                }
                if ( !$rev ) {
-                       throw new UnexpectedValueException( 'No revisions are available to copy' );
+                       // Since no revisions are available to copy, generate a dummy
+                       // revision to a dummy page, then rollback the commit
+                       wfDebug( __METHOD__ . ": No revisions are available to copy\n" );
+
+                       $dbw->begin();
+
+                       // Make a title and revision and insert them
+                       $title = Title::newFromText( "PopulateArchiveRevId_4b05b46a81e29" );
+                       $page = WikiPage::factory( $title );
+                       $updater = $page->newPageUpdater(
+                               User::newSystemUser( 'Maintenance script', [ 'steal' => true ] )
+                       );
+                       $updater->setContent(
+                               'main',
+                               ContentHandler::makeContent( "Content for dummy rev", $title )
+                       );
+                       $updater->saveRevision(
+                               CommentStoreComment::newUnsavedComment( 'dummy rev summary' ),
+                               EDIT_NEW | EDIT_SUPPRESS_RC
+                       );
+
+                       // get the revision row just inserted
+                       $rev = $dbw->selectRow(
+                               'revision',
+                               '*',
+                               [],
+                               __METHOD__,
+                               [ 'ORDER BY' => 'rev_timestamp ASC' ]
+                       );
+
+                       $dbw->rollback();
+               }
+               if ( !$rev ) {
+                       // This should never happen.
+                       throw new UnexpectedValueException(
+                               'No revisions are available to copy, and one couldn\'t be created'
+                       );
                }
 
                unset( $rev->rev_id );
index 49db4fb..93d5baf 100644 (file)
@@ -21,6 +21,7 @@
 
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\NameTableStore;
+use MediaWiki\Storage\SlotRecord;
 use MediaWiki\Storage\SqlBlobStore;
 use Wikimedia\Assert\Assert;
 use Wikimedia\Rdbms\IDatabase;
@@ -66,7 +67,8 @@ class PopulateContentTables extends Maintenance {
        private function initServices() {
                $this->dbw = $this->getDB( DB_MASTER );
                $this->contentModelStore = MediaWikiServices::getInstance()->getContentModelStore();
-               $this->mainRoleId = MediaWikiServices::getInstance()->getSlotRoleStore()->acquireId( 'main' );
+               $this->mainRoleId = MediaWikiServices::getInstance()->getSlotRoleStore()
+                       ->acquireId( SlotRecord::MAIN );
        }
 
        public function execute() {
index a54f1fd..8c496b4 100644 (file)
@@ -39,6 +39,22 @@ CLDRPluralRuleParser:
   src: https://raw.githubusercontent.com/santhoshtr/CLDRPluralRuleParser/v1.1.3/src/CLDRPluralRuleParser.js
   integrity: sha384-Y0qxTEDVQgh+N5In+vLbZLL2H7PEROnicj8vxof0mxR8kXcGysGE6OcF+cS+Ao0u
 
+easy-deflate:
+  type: multi-file
+  files:
+    deflate.js:
+      src: https://raw.githubusercontent.com/edg2s/Easy-Deflate/7a6056e5302f6f385ff2efa60afda45b4ad81e51/deflate.js
+      integrity: sha384-sHnZLDSWMUhA2w9ygkzCK8YFvoh/fQKY6lXMbvmrYzjuNURiLB0DZFCDNMpGyZ77
+    easydeflate.js:
+      src: https://raw.githubusercontent.com/edg2s/Easy-Deflate/7a6056e5302f6f385ff2efa60afda45b4ad81e51/easydeflate.js
+      integrity: sha384-EwPfP2RMkDPa1HkzQsXgzTsy1KEjcIzQPA1HDS/JPHjvEMvVUsCxWwm1oXql/jk2
+    inflate.js:
+      src: https://raw.githubusercontent.com/edg2s/Easy-Deflate/7a6056e5302f6f385ff2efa60afda45b4ad81e51/inflate.js
+      integrity: sha384-hMg44Hw424mUYvmzKl0JT4J8UU/1YYhTiGRtR0YX/MXNLK9qWTK0d62FBCDGxmxw
+    README.md:
+      src: https://raw.githubusercontent.com/edg2s/Easy-Deflate/7a6056e5302f6f385ff2efa60afda45b4ad81e51/README.md
+      integrity: sha384-6kwcfCLivvqXBZy2ATyya+mTVWLk3eaQyBdC6tbpBtkygnBrM2SNkq3jz/l7IkvP
+
 html5shiv:
   type: file
   src: https://raw.githubusercontent.com/aFarkas/html5shiv/3.7.3/src/html5shiv.js
@@ -51,6 +67,29 @@ jquery:
   integrity: sha256-2Kok7MbOyxpgUVvAk/HJ2jigOSYS2auK4Pfzbm7uH60=
   dest: jquery.js
 
+jquery.cookie:
+  type: multi-file
+  files:
+    jquery.cookie.js:
+      src: https://raw.githubusercontent.com/carhartl/jquery-cookie/v1.3.1/jquery.cookie.js
+      integrity: sha384-Xxq63E9KDgzUJ6WPNPqVeOtRIwZyx6y9DzEwY2u6LYKSnWrjSoGtWSKmTindYBf2
+    MIT-LICENSE.txt:
+      src: https://raw.githubusercontent.com/carhartl/jquery-cookie/v1.3.1/MIT-LICENSE.txt
+      integrity: sha384-zYsGf3KJ7S0AhOICjcoh0kkn7aGZlzYUXXX5xz8dwR9KjLMM+/JPR2g/jVOGGeId
+    CHANGELOG.md:
+      src: https://raw.githubusercontent.com/carhartl/jquery-cookie/v1.3.1/CHANGELOG.md
+      integrity: sha384-SQOHhLc7PHxHDQpGE/zv9XfXKL0A7OBu8kuyVDnHVp+zSoWyRw4xUJ+LSm5ql4kS
+
+mustache:
+  type: multi-file
+  files:
+    mustache.js:
+      src: https://raw.githubusercontent.com/janl/mustache.js/v1.0.0/mustache.js
+      integrity: sha384-k2UYqmzoiq/qgIzZvcYBxbXQW4YdPAsXDOTkHTGb9TCZ9sjCkyT4TlaUN0wQRkql
+    LICENSE:
+      src: https://raw.githubusercontent.com/janl/mustache.js/v1.0.0/LICENSE
+      integrity: sha384-MYVwXwula9+YkyXexOJVZ0v0DaVvG22uX57mNq5Di+7u8OH9EG9q3yuXkp1Iehiq
+
 oojs:
   type: tar
   src: https://registry.npmjs.org/oojs/-/oojs-2.2.2.tgz
@@ -102,3 +141,9 @@ qunitjs:
     qunit.css:
       src: https://code.jquery.com/qunit/qunit-2.6.2.css
       integrity: sha256-qpkurjTvVTJJCSpMABcvF4IlYUJkd8saxiHgUQpEjX8=
+
+sinonjs:
+  type: file
+  src: https://sinonjs.org/releases/sinon-1.17.3.js
+  integrity: sha384-8+RlaM2FW7qMqjxpM5NTVM0y6sTY+vTi/AHnk7Fd7NHjBye9sVxxsMjyxVJnPBtU
+  dest: sinon-1.17.3.js
index 91a5f3b..0f0073c 100644 (file)
@@ -22,6 +22,7 @@
  */
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\SlotRecord;
 
 require_once __DIR__ . '/../Maintenance.php';
 
@@ -46,13 +47,13 @@ class DumpRev extends Maintenance {
                        $this->fatalError( "Row not found" );
                }
 
-               $content = $rev->getContent( 'main' );
+               $content = $rev->getContent( SlotRecord::MAIN );
                if ( !$content ) {
                        $this->fatalError( "Text not found" );
                }
 
                $blobStore = MediaWikiServices::getInstance()->getBlobStore();
-               $slot = $rev->getSlot( 'main' );
+               $slot = $rev->getSlot( SlotRecord::MAIN );
                $text = $blobStore->getBlob( $slot->getAddress() );
 
                $this->output( "Text length: " . strlen( $text ) . "\n" );
index 99290f4..74bdcf8 100644 (file)
@@ -1,5 +1,5 @@
 /* global extDependencyMap */
-( function ( $ ) {
+( function () {
        $( function () {
                var $label, labelText;
 
                        } );
                } );
        } );
-}( jQuery ) );
+}() );
index 4f7523e..b3de151 100644 (file)
@@ -12,7 +12,7 @@
   "devDependencies": {
     "deepmerge": "1.3.2",
     "eslint": "5.0.1",
-    "eslint-config-wikimedia": "0.7.2",
+    "eslint-config-wikimedia": "0.8.1",
     "eslint-plugin-qunit": "3.3.1",
     "grunt": "1.0.3",
     "grunt-banana-checker": "0.6.0",
index e57fce9..9c832dc 100644 (file)
@@ -221,7 +221,7 @@ return [
                'dependencies' => 'mediawiki.jqueryMsg',
        ],
        'jquery.cookie' => [
-               'scripts' => 'resources/lib/jquery.cookie.js',
+               'scripts' => 'resources/lib/jquery.cookie/jquery.cookie.js',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'jquery.form' => [
diff --git a/resources/lib/jquery.cookie.js b/resources/lib/jquery.cookie.js
deleted file mode 100644 (file)
index 3fb201c..0000000
+++ /dev/null
@@ -1,90 +0,0 @@
-/*!
- * jQuery Cookie Plugin v1.3.1
- * https://github.com/carhartl/jquery-cookie
- *
- * Copyright 2013 Klaus Hartl
- * Released under the MIT license
- */
-(function ($, document, undefined) {
-
-       var pluses = /\+/g;
-
-       function raw(s) {
-               return s;
-       }
-
-       function decoded(s) {
-               return unRfc2068(decodeURIComponent(s.replace(pluses, ' ')));
-       }
-
-       function unRfc2068(value) {
-               if (value.indexOf('"') === 0) {
-                       // This is a quoted cookie as according to RFC2068, unescape
-                       value = value.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
-               }
-               return value;
-       }
-
-       function fromJSON(value) {
-               return config.json ? JSON.parse(value) : value;
-       }
-
-       var config = $.cookie = function (key, value, options) {
-
-               // write
-               if (value !== undefined) {
-                       options = $.extend({}, config.defaults, options);
-
-                       if (value === null) {
-                               options.expires = -1;
-                       }
-
-                       if (typeof options.expires === 'number') {
-                               var days = options.expires, t = options.expires = new Date();
-                               t.setDate(t.getDate() + days);
-                       }
-
-                       value = config.json ? JSON.stringify(value) : String(value);
-
-                       return (document.cookie = [
-                               encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value),
-                               options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
-                               options.path    ? '; path=' + options.path : '',
-                               options.domain  ? '; domain=' + options.domain : '',
-                               options.secure  ? '; secure' : ''
-                       ].join(''));
-               }
-
-               // read
-               var decode = config.raw ? raw : decoded;
-               var cookies = document.cookie.split('; ');
-               var result = key ? null : {};
-               for (var i = 0, l = cookies.length; i < l; i++) {
-                       var parts = cookies[i].split('=');
-                       var name = decode(parts.shift());
-                       var cookie = decode(parts.join('='));
-
-                       if (key && key === name) {
-                               result = fromJSON(cookie);
-                               break;
-                       }
-
-                       if (!key) {
-                               result[name] = fromJSON(cookie);
-                       }
-               }
-
-               return result;
-       };
-
-       config.defaults = {};
-
-       $.removeCookie = function (key, options) {
-               if ($.cookie(key) !== null) {
-                       $.cookie(key, null, options);
-                       return true;
-               }
-               return false;
-       };
-
-})(jQuery, document);
diff --git a/resources/lib/jquery.cookie/CHANGELOG.md b/resources/lib/jquery.cookie/CHANGELOG.md
new file mode 100644 (file)
index 0000000..f3ac692
--- /dev/null
@@ -0,0 +1,34 @@
+1.3.1
+-----
+- Fixing issue where it was no longer possible to check for an arbitrary cookie,
+  while json is set to true, there was a SyntaxError thrown from JSON.parse.
+
+1.3.0
+-----
+- Configuration options: `raw`, `json`. Replaces raw option, becomes config:
+
+  ```javascript
+  $.cookie.raw = true; // bypass encoding/decoding the cookie value
+  $.cookie.json = true; // automatically JSON stringify/parse value
+  ```
+  
+  Thus the default options now cleanly contain cookie attributes only.
+
+- Removing licensing under GPL Version 2, the plugin is now released under MIT License only
+(keeping it simple and following the jQuery library itself here).
+
+- Bugfix: Properly handle RFC 2068 quoted cookie values.
+
+- Added component.json for bower.
+
+- Added jQuery plugin package manifest.
+
+- `$.cookie()` returns all available cookies.
+
+1.2.0
+-----
+- Adding `$.removeCookie('foo')` for deleting a cookie, using `$.cookie('foo', null)` is now deprecated.
+
+1.1
+---
+- Adding default options.
diff --git a/resources/lib/jquery.cookie/MIT-LICENSE.txt b/resources/lib/jquery.cookie/MIT-LICENSE.txt
new file mode 100644 (file)
index 0000000..8ae647b
--- /dev/null
@@ -0,0 +1,20 @@
+Copyright 2013 Klaus Hartl
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
\ No newline at end of file
diff --git a/resources/lib/jquery.cookie/jquery.cookie.js b/resources/lib/jquery.cookie/jquery.cookie.js
new file mode 100644 (file)
index 0000000..3fb201c
--- /dev/null
@@ -0,0 +1,90 @@
+/*!
+ * jQuery Cookie Plugin v1.3.1
+ * https://github.com/carhartl/jquery-cookie
+ *
+ * Copyright 2013 Klaus Hartl
+ * Released under the MIT license
+ */
+(function ($, document, undefined) {
+
+       var pluses = /\+/g;
+
+       function raw(s) {
+               return s;
+       }
+
+       function decoded(s) {
+               return unRfc2068(decodeURIComponent(s.replace(pluses, ' ')));
+       }
+
+       function unRfc2068(value) {
+               if (value.indexOf('"') === 0) {
+                       // This is a quoted cookie as according to RFC2068, unescape
+                       value = value.slice(1, -1).replace(/\\"/g, '"').replace(/\\\\/g, '\\');
+               }
+               return value;
+       }
+
+       function fromJSON(value) {
+               return config.json ? JSON.parse(value) : value;
+       }
+
+       var config = $.cookie = function (key, value, options) {
+
+               // write
+               if (value !== undefined) {
+                       options = $.extend({}, config.defaults, options);
+
+                       if (value === null) {
+                               options.expires = -1;
+                       }
+
+                       if (typeof options.expires === 'number') {
+                               var days = options.expires, t = options.expires = new Date();
+                               t.setDate(t.getDate() + days);
+                       }
+
+                       value = config.json ? JSON.stringify(value) : String(value);
+
+                       return (document.cookie = [
+                               encodeURIComponent(key), '=', config.raw ? value : encodeURIComponent(value),
+                               options.expires ? '; expires=' + options.expires.toUTCString() : '', // use expires attribute, max-age is not supported by IE
+                               options.path    ? '; path=' + options.path : '',
+                               options.domain  ? '; domain=' + options.domain : '',
+                               options.secure  ? '; secure' : ''
+                       ].join(''));
+               }
+
+               // read
+               var decode = config.raw ? raw : decoded;
+               var cookies = document.cookie.split('; ');
+               var result = key ? null : {};
+               for (var i = 0, l = cookies.length; i < l; i++) {
+                       var parts = cookies[i].split('=');
+                       var name = decode(parts.shift());
+                       var cookie = decode(parts.join('='));
+
+                       if (key && key === name) {
+                               result = fromJSON(cookie);
+                               break;
+                       }
+
+                       if (!key) {
+                               result[name] = fromJSON(cookie);
+                       }
+               }
+
+               return result;
+       };
+
+       config.defaults = {};
+
+       $.removeCookie = function (key, options) {
+               if ($.cookie(key) !== null) {
+                       $.cookie(key, null, options);
+                       return true;
+               }
+               return false;
+       };
+
+})(jQuery, document);
index dbc9823..c7ffbef 100644 (file)
   };
 
   mustache.name = "mustache.js";
-  mustache.version = "0.8.2";
+  mustache.version = "1.0.0";
   mustache.tags = [ "{{", "}}" ];
 
   // All high-level mustache.* functions use this writer.
index 9079cc0..5024688 100644 (file)
@@ -5,7 +5,7 @@
  *
  * @class jQuery.plugin.spinner
  */
-( function ( $ ) {
+( function () {
 
        // Default options for new spinners,
        // stored outside the function to share between calls.
         * @mixins jQuery.plugin.spinner
         */
 
-}( jQuery ) );
+}() );
index cbdc2fa..a37bcf7 100644 (file)
@@ -43,7 +43,7 @@
  *
  * @author Christian Bach/christian.bach@polyester.se
  */
-( function ( $, mw ) {
+( function () {
        var ts,
                parsers = [];
 
                type: 'numeric'
        } );
 
-}( jQuery, mediaWiki ) );
+}() );
index ddda432..a5e5184 100644 (file)
@@ -6,7 +6,7 @@
 // * This installation of tipsy includes several local modifications to both Javascript and CSS.
 //   Please be careful when upgrading.
 
-( function ( mw, $ ) {
+( function () {
 
     function maybeCall(thing, ctx) {
         return (typeof thing == 'function') ? (thing.call(ctx)) : thing;
         }
     };
 
-}( mediaWiki, jQuery ) );
+}() );
index 674f62c..cdc5808 100644 (file)
@@ -3,7 +3,7 @@
  *
  * @class jQuery.plugin.accessKeyLabel
  */
-( function ( $, mw ) {
+( function () {
 
        // Cached access key modifiers for used browser
        var cachedAccessKeyModifiers,
         * @mixins jQuery.plugin.accessKeyLabel
         */
 
-}( jQuery, mediaWiki ) );
+}() );
index 5764ae9..2e1a338 100644 (file)
@@ -12,7 +12,7 @@
  * @param {string} str
  * @return {number}
  */
-mediaWiki.log.deprecate( jQuery, 'byteLength', require( 'mediawiki.String' ).byteLength,
+mw.log.deprecate( $, 'byteLength', require( 'mediawiki.String' ).byteLength,
        'Use require( \'mediawiki.String\' ).byteLength instead.', '$.byteLength' );
 
 /**
index d99e9f0..63cf28c 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * @class jQuery.plugin.checkboxShiftClick
  */
-( function ( $ ) {
+( function () {
 
        /**
         * Enable checkboxes to be checked or unchecked in a row by clicking one,
@@ -40,4 +40,4 @@
         * @mixins jQuery.plugin.checkboxShiftClick
         */
 
-}( jQuery ) );
+}() );
index 894cf86..6df02ad 100644 (file)
@@ -7,7 +7,7 @@
  *
  * - 2011-01-05: Forked for MediaWiki. See also jQuery.colorUtil plugin
  */
-( function ( $ ) {
+( function () {
 
        function getColor( elem, attr ) {
                var color;
@@ -52,4 +52,4 @@
                };
        } );
 
-}( jQuery ) );
+}() );
index d46d009..009be1a 100644 (file)
@@ -6,7 +6,7 @@
  * Mostly based on other plugins and functions (linted and optimized a little).
  * Sources cited inline.
  */
-( function ( $ ) {
+( function () {
        /**
         * @class jQuery.colorUtil
         * @singleton
 
        };
 
-}( jQuery ) );
+}() );
index 7931c81..028b4b9 100644 (file)
@@ -7,7 +7,7 @@
  *
  * @class jQuery.plugin.confirmable
  */
-( function ( $ ) {
+( function () {
        var identity = function ( data ) {
                return data;
        };
                        noTitle: undefined
                }
        };
-}( jQuery ) );
+}() );
index daf23a9..aa1e90e 100644 (file)
@@ -4,7 +4,7 @@
  * This file serves to inject our localised messages into it.
  */
 
-( function ( mw, $ ) {
+( function () {
        $.fn.confirmable.defaultOptions.i18n = {
                space: mw.message( 'word-separator' ).text(),
                confirm: mw.message( 'confirmable-confirm', mw.user ).text(),
@@ -13,4 +13,4 @@
                yesTitle: undefined,
                noTitle: undefined
        };
-}( mediaWiki, jQuery ) );
+}() );
index e00298f..e464c90 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * @class jQuery.plugin.getAttrs
  */
-( function ( $ ) {
+( function () {
        function serializeControls( controls ) {
                var i,
                        data = {},
@@ -34,4 +34,4 @@
        $.fn.serializeObject = function () {
                return serializeControls( this.serializeArray() );
        };
-}( jQuery ) );
+}() );
index 7a7109c..025e6c2 100644 (file)
@@ -9,7 +9,7 @@
  *
  * @class jQuery.plugin.hidpi
  */
-( function ( $ ) {
+( function () {
 
        /**
         * Get reported or approximate device pixel ratio.
         * @mixins jQuery.plugin.hidpi
         */
 
-}( jQuery ) );
+}() );
index a14e3eb..782d711 100644 (file)
@@ -3,7 +3,7 @@
  * TODO: Add a function for restoring the previous text.
  * TODO: Accept mappings for converting shortcuts like WP: to Wikipedia:.
  */
-( function ( $, mw ) {
+( function () {
 
        $.highlightText = {
 
@@ -94,4 +94,4 @@
                } );
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index 3823395..26f8f9b 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * @class jQuery.plugin.lengthLimit
  */
-( function ( $, mw ) {
+( function () {
 
        var
                eventKeys = [
         * @class jQuery
         * @mixins jQuery.plugin.lengthLimit
         */
-}( jQuery, mediaWiki ) );
+}() );
index 20dc1b2..ab269f0 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * @class jQuery.plugin.localize
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Gets a localized message, using parameters from options if present.
         * @mixins jQuery.plugin.localize
         */
 
-}( jQuery, mediaWiki ) );
+}() );
index 082603a..43b8f0d 100644 (file)
@@ -10,7 +10,7 @@
  *
  * @class jQuery.plugin.makeCollapsible
  */
-( function ( $, mw ) {
+( function () {
        /**
         * Handler for a click on a collapsible toggler.
         *
         * @mixins jQuery.plugin.makeCollapsible
         */
 
-}( jQuery, mediaWiki ) );
+}() );
index 5eae0be..ad1c96d 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * JavaScript to show jump links to motor-impaired users when they are focused.
  */
-jQuery( function ( $ ) {
+$( function () {
 
        $( '.mw-jump' ).on( 'focus blur', 'a', function ( e ) {
                // Confusingly jQuery leaves e.type as focusout for delegated blur events
index 35c6a5d..f2d6a04 100644 (file)
@@ -90,7 +90,7 @@
  *  input or not.
  */
 
-( function ( $, mw ) {
+( function () {
 
        var hasOwn = Object.hasOwnProperty;
 
         * @mixins jQuery.plugin.suggestions
         */
 
-}( jQuery, mediaWiki ) );
+}() );
index 5fb28aa..dab437d 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * @class jQuery.plugin.tabIndex
  */
-( function ( $ ) {
+( function () {
 
        /**
         * Find the lowest tabindex in use within a selection.
@@ -54,4 +54,4 @@
         * @mixins jQuery.plugin.tabIndex
         */
 
-}( jQuery ) );
+}() );
index da88270..6b4ab97 100644 (file)
@@ -19,7 +19,7 @@
  *     $textbox.textSelection( 'encapsulateSelection', { pre: '<b>', post: '</b>' } );
  *     // Result: Textbox contains 'This is <b>bold</b>!', with cursor before the '!'
  */
-( function ( $ ) {
+( function () {
        /**
         * Do things to the selection in a `<textarea>`, or a textarea-like editable element.
         *
         * @inheritdoc jQuery.plugin.textSelection#textSelection
         */
 
-}( jQuery ) );
+}() );
index 1a3cdd5..4b6313b 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
 
        /**
         * Create an object like mw.Api, but automatically handling everything required to communicate
        // Expose
        mw.ForeignApi = CoreForeignApi;
 
-}( mediaWiki, jQuery ) );
+}() );
index ae1b590..9974e2b 100644 (file)
@@ -1,5 +1,5 @@
 /* global moment, Uint8Array */
-( function ( $, mw ) {
+( function () {
 
        /**
         * mw.ForeignStructuredUpload.BookletLayout encapsulates the process
                this.dateWidget.setValue( '' ).setValidityFlag( true );
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index 177861e..2a167fe 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $, OO ) {
+( function () {
        /**
         * Used to represent an upload in progress on the frontend.
         *
        };
 
        mw.ForeignStructuredUpload = ForeignStructuredUpload;
-}( mediaWiki, jQuery, OO ) );
+}() );
index 08fc01d..79c2562 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, OO, $ ) {
+( function () {
        /**
         * Used to represent an upload in progress on the frontend.
         *
        };
 
        mw.ForeignUpload = ForeignUpload;
-}( mediaWiki, OO, jQuery ) );
+}() );
index 91cdc2d..5323d4f 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * @class mw.RegExp
         */
@@ -19,4 +19,4 @@
                        return str.replace( /([\\{}()|.?*+\-^$\[\]])/g, '\\$1' ); // eslint-disable-line no-useless-escape
                }
        };
-}( mediaWiki ) );
+}() );
index 4491634..0bcb2b6 100644 (file)
@@ -4,7 +4,7 @@
  * @since 1.18
  */
 
-( function ( mw, $ ) {
+( function () {
        /**
         * Parse titles into an object structure. Note that when using the constructor
         * directly, passing invalid titles will result in an exception. Use #newFromText to use the
                return null;
        };
 
+       /**
+        * Check if a given namespace is a talk namespace
+        * @param {number} namespaceId Namespace ID
+        * @return {boolean} Namespace is a talk namespace
+        */
+       Title.isTalkNamespace = function ( namespaceId ) {
+               return !!( namespaceId > NS_MAIN && namespaceId % 2 );
+       };
+
        /**
         * Whether this title exists on the wiki.
         *
         * @static
         * @param {string|mw.Title} title prefixed db-key name (string) or instance of Title
         * @return {boolean|null} Boolean if the information is available, otherwise null
+        * @throws {Error} If title is not a string or mw.Title
         */
        Title.exists = function ( title ) {
                var match,
                        }
                },
 
+               /**
+                * Check if the title is in a talk namespace
+                *
+                * @return {boolean} The title is in a talk namespace
+                */
+               isTalkPage: function () {
+                       return Title.isTalkNamespace( this.getNamespaceId() );
+               },
+
+               /**
+                * Get the title for the associated talk page
+                *
+                * @return {mw.Title|null} The title for the associated talk page, null if not available
+                */
+               getTalkPage: function () {
+                       if ( !this.canHaveTalkPage() ) {
+                               return null;
+                       }
+                       return this.isTalkPage() ?
+                               this :
+                               Title.makeTitle( this.getNamespaceId() + 1, this.getMainText() );
+               },
+
+               /**
+                * Get the title for the subject page of a talk page
+                *
+                * @return {mw.Title|null} The title for the subject page of a talk page, null if not available
+                */
+               getSubjectPage: function () {
+                       return this.isTalkPage() ?
+                               Title.makeTitle( this.getNamespaceId() - 1, this.getMainText() ) :
+                               this;
+               },
+
+               /**
+                * Check the the title can have an associated talk page
+                *
+                * @return {boolean} The title can have an associated talk page
+                */
+               canHaveTalkPage: function () {
+                       return this.getNamespaceId() >= NS_MAIN;
+               },
+
                /**
                 * Whether this title exists on the wiki.
                 *
        // Expose
        mw.Title = Title;
 
-}( mediaWiki, jQuery ) );
+}() );
index 2b39c9a..ed700f0 100644 (file)
@@ -2,7 +2,7 @@
 // (It is excluded in jsduck.json.)
 // ESLint suggests unquoting some object keys, which would render the file unparseable by Opera 12.
 /* eslint-disable quote-props */
-( function ( mw ) {
+( function () {
        var toUpperMapping = {
                'ß': 'ß',
                'ʼn': 'ʼn',
                var mapped = toUpperMapping[ chr ];
                return mapped || chr.toUpperCase();
        };
-}( mediaWiki ) );
+}() );
index 06788f5..6b37dd1 100644 (file)
@@ -1,5 +1,5 @@
 /* global moment */
-( function ( $, mw, moment ) {
+( function () {
 
        /**
         * mw.Upload.BookletLayout encapsulates the process of uploading a file
                this.filenameUsageWidget.setValue( null );
        };
 
-}( jQuery, mediaWiki, moment ) );
+}() );
index 00c04bc..5d88c5c 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $, mw ) {
+( function () {
 
        /**
         * mw.Upload.Dialog controls a {@link mw.Upload.BookletLayout BookletLayout}.
                                this.uploadBooklet.clear();
                        }, this );
        };
-}( jQuery, mediaWiki ) );
+}() );
index 7e6cfb6..951efbd 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        var UP;
 
        /**
        };
 
        mw.Upload = Upload;
-}( mediaWiki, jQuery ) );
+}() );
index bfdfc88..178f169 100644 (file)
@@ -50,7 +50,7 @@
  * @class mw.Uri
  */
 
-( function ( mw, $ ) {
+( function () {
        var parser, properties;
 
        /**
                return location.href;
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index c282d6a..7996ea4 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:RevisionDelete
  */
-( function ( mw, $ ) {
+( function () {
        $( function () {
                var colonSeparator = mw.message( 'colon-separator' ).text(),
                        summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
@@ -28,4 +28,4 @@
                }
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 005a8df..a7228ed 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * Scripts for action=delete at domready
  */
-( function ( mw, $ ) {
+( function () {
        $( function () {
                var colonSeparator = mw.message( 'colon-separator' ).text(),
                        summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
@@ -27,4 +27,4 @@
                        reason.$input.byteLimit( summaryByteLimit, filterFn );
                }
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 938962f..a8ea6b8 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        var collapsibleLists, handleOne;
 
        // Collapsible lists of categories and templates
@@ -63,4 +63,4 @@
                        );
                }
        } );
-}( mediaWiki ) );
+}() );
index 56dba70..4c4f5eb 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Javascript for module editWarning
  */
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        $( function () {
@@ -39,4 +39,4 @@
                } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index a85e740..966b5bc 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * Scripts for action=edit at domready
  */
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        /**
@@ -48,4 +48,4 @@
                        } );
                }
        } );
-}( mediaWiki, jQuery ) );
+}() );
index dc1f33b..b90427e 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * Live edit preview.
  */
-( function ( mw, $ ) {
+( function () {
 
        /**
         * @ignore
                $( document.body ).on( 'click', '#wpPreview, #wpDiff', doLivePreview );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 1be0052..ea3c0da 100644 (file)
@@ -2,7 +2,7 @@
  * Scripts for pre-emptive edit preparing on action=edit
  */
 
-( function ( mw, $ ) {
+( function () {
        if ( !mw.config.get( 'wgAjaxEditStash' ) ) {
                return;
        }
                        checkStash();
                }
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 6f49fa6..4e7ebcd 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for History action
  */
-jQuery( function ( $ ) {
+$( function () {
        var     $historyCompareForm = $( '#mw-history-compare' ),
                $historySubmitter,
                $lis = $( '#pagehistory > li' );
index d89cd4a..4b0e49b 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * Enables double-click-to-edit functionality.
  */
-( function ( mw, $ ) {
+( function () {
        $( function () {
                mw.util.$content.dblclick( function ( e ) {
                        var $a;
@@ -17,4 +17,4 @@
                        }
                } );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index bbe3032..e76ea33 100644 (file)
@@ -6,7 +6,7 @@
  *
  * See also ImagePage.php#makeMetadataTable (creates the HTML)
  */
-( function ( mw, $ ) {
+( function () {
        $( function () {
                var $tables = $( '.mw_metadata' );
                if ( !$tables.find( '.mw-metadata-collapsible, .collapsable' ).length ) {
@@ -54,4 +54,4 @@
                $tables.addClass( 'collapsed' );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 5e859ac..68b5214 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        /**
@@ -80,4 +80,4 @@
                } );
        }
 
-}( mediaWiki, jQuery ) );
+}() );
index 4e73354..2a2a01d 100644 (file)
@@ -5,7 +5,7 @@
  * This is loaded in the top queue, so avoid unnecessary dependencies
  * like mediawiki.Title or mediawiki.Uri.
  */
-( function ( mw, $ ) {
+( function () {
        var profile = $.client.profile(),
                canonical = mw.config.get( 'wgInternalRedirectTargetUrl' ),
                fragment = null,
@@ -62,4 +62,4 @@
                } );
        }
 
-}( mediaWiki, jQuery ) );
+}() );
index 35f948e..59d1d4f 100644 (file)
@@ -3,7 +3,7 @@
  * When the user right-clicks in a heading, it will open the
  * edit screen.
  */
-( function ( $ ) {
+( function () {
        // Trigger this when a contextmenu click on the page targets an h1-h6 element.
        // This uses a delegate handler which 1) starts immediately instead of blocking
        // response on dom-ready, and 2) selects and binds once instead of N times.
@@ -24,4 +24,4 @@
                        $edit.get( 0 ).click();
                }
        } );
-}( jQuery ) );
+}() );
index 85df90e..1c0fcbf 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * @class mw.Api.plugin.category
  */
-( function ( mw, $ ) {
+( function () {
 
        $.extend( mw.Api.prototype, {
                /**
@@ -98,4 +98,4 @@
         * @mixins mw.Api.plugin.category
         */
 
-}( mediaWiki, jQuery ) );
+}() );
index e6f5668..0656c93 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * @class mw.Api.plugin.edit
  */
-( function ( mw, $ ) {
+( function () {
 
        $.extend( mw.Api.prototype, {
 
         * @mixins mw.Api.plugin.edit
         */
 
-}( mediaWiki, jQuery ) );
+}() );
index 8c9b309..81c55e8 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
 
        /**
         * @class mw.Api
        ];
        mw.log.deprecate( mw.Api, 'warnings', mw.Api.warnings, null, 'mw.Api.warnings' );
 
-}( mediaWiki, jQuery ) );
+}() );
index 2b709aa..4432596 100644 (file)
@@ -5,7 +5,7 @@
  * @class mw.Api.plugin.login
  * @since 1.22
  */
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        $.extend( mw.Api.prototype, {
@@ -57,4 +57,4 @@
         * @mixins mw.Api.plugin.login
         */
 
-}( mediaWiki, jQuery ) );
+}() );
index 824cc19..c5287fc 100644 (file)
@@ -6,7 +6,7 @@
  * @class mw.Api.plugin.messages
  * @since 1.27
  */
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        $.extend( mw.Api.prototype, {
@@ -75,4 +75,4 @@
         * @mixins mw.Api.plugin.messages
         */
 
-}( mediaWiki, jQuery ) );
+}() );
index 4930c4f..f0ca272 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * @class mw.Api.plugin.options
  */
-( function ( mw, $ ) {
+( function () {
 
        $.extend( mw.Api.prototype, {
 
@@ -99,4 +99,4 @@
         * @mixins mw.Api.plugin.options
         */
 
-}( mediaWiki, jQuery ) );
+}() );
index f38e88b..42b0771 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * @class mw.Api.plugin.parse
  */
-( function ( mw, $ ) {
+( function () {
 
        $.extend( mw.Api.prototype, {
                /**
@@ -46,4 +46,4 @@
         * @mixins mw.Api.plugin.parse
         */
 
-}( mediaWiki, jQuery ) );
+}() );
index 322143d..18a7efc 100644 (file)
@@ -2,7 +2,7 @@
  * @class mw.Api.plugin.rollback
  * @since 1.28
  */
-( function ( mw, $ ) {
+( function () {
 
        $.extend( mw.Api.prototype, {
                /**
@@ -30,4 +30,4 @@
         * @mixins mw.Api.plugin.rollback
         */
 
-}( mediaWiki, jQuery ) );
+}() );
index dc82fb5..1785ab3 100644 (file)
@@ -4,7 +4,7 @@
  * @class mw.Api.plugin.upload
  * @singleton
  */
-( function ( mw, $ ) {
+( function () {
        var nonce = 0,
                fieldsAllowed = {
                        stash: true,
         * @class mw.Api
         * @mixins mw.Api.plugin.upload
         */
-}( mediaWiki, jQuery ) );
+}() );
index e7b4b6d..3100b28 100644 (file)
@@ -2,7 +2,7 @@
  * @class mw.Api.plugin.user
  * @since 1.27
  */
-( function ( mw, $ ) {
+( function () {
 
        $.extend( mw.Api.prototype, {
 
@@ -34,4 +34,4 @@
         * @mixins mw.Api.plugin.user
         */
 
-}( mediaWiki, jQuery ) );
+}() );
index 025c111..eead10c 100644 (file)
@@ -2,7 +2,7 @@
  * @class mw.Api.plugin.watch
  * @since 1.19
  */
-( function ( mw, $ ) {
+( function () {
 
        /**
         * @private
@@ -67,4 +67,4 @@
         * @mixins mw.Api.plugin.watch
         */
 
-}( mediaWiki, jQuery ) );
+}() );
index 16994f5..5820b83 100644 (file)
                } );
        };
 
-       // Fire events from before track() triggred fire()
+       // Fire events from before track() triggered fire()
        trackCallbacks.fire( mw.trackQueue );
 
        /**
                                                } else if ( contents instanceof this.Cdata ) {
                                                        // CDATA
                                                        if ( /<\/[a-zA-z]/.test( contents.value ) ) {
-                                                               throw new Error( 'mw.html.element: Illegal end tag found in CDATA' );
+                                                               throw new Error( 'Illegal end tag found in CDATA' );
                                                        }
                                                        s += contents.value;
                                                } else {
-                                                       throw new Error( 'mw.html.element: Invalid type of contents' );
+                                                       throw new Error( 'Invalid type of contents' );
                                                }
                                }
                                s += '</' + name + '>';
index 76bc86c..a89293d 100644 (file)
@@ -9,7 +9,7 @@
  * Jeroen De Dauw <jeroendedauw at gmail dot com>
  */
 
-( function ( $ ) {
+( function () {
        'use strict';
 
        $( function () {
@@ -35,4 +35,4 @@
 
        } );
 
-}( jQuery ) );
+}() );
index 4510b2c..27b1471 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        /**
         * Prevent the closing of a window with a confirm message (the onbeforeunload event seems to
         * work in most browsers.)
                        }
                };
        };
-}( mediaWiki, jQuery ) );
+}() );
index d260fca..5923ff8 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        /**
                }
        };
 
-}( mediaWiki, jQuery ) );
+}() );
index 37c0fac..f0c2601 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        var debug,
                debug.init();
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 091aa25..ef8afdf 100644 (file)
@@ -2,7 +2,7 @@
  * @private
  * @class jQuery.plugin.footHovzer
  */
-( function ( $ ) {
+( function () {
        var $hovzer, footHovzer, $spacer;
 
        function getHovzer() {
@@ -64,4 +64,4 @@
         * @mixins jQuery.plugin.footHovzer
         */
 
-}( jQuery ) );
+}() );
index 4fedbea..e91902a 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
 
        var CONTROL_BUCKET = 'control',
                MAX_INT32_UNSIGNED = 4294967295;
                }
        };
 
-}( mediaWiki, jQuery ) );
+}() );
index ca4d239..d1fb98b 100644 (file)
@@ -6,7 +6,7 @@
  * @author Moriel Schottlender, 2015
  * @since 1.19
  */
-( function ( mw, $ ) {
+( function () {
        /**
         * This is a way of getting simple feedback from users. It's useful
         * for testing new features -- users can give you feedback without
                return this.bugReportLink;
        };
 
-}( mediaWiki, jQuery ) );
+}() );
index 72bf3d7..572d830 100644 (file)
@@ -4,7 +4,7 @@
  * @author Mark Holmquist, 2015
  * @since 1.25
  */
-( function ( mw, $, oo ) {
+( function () {
        var warningConfig = mw.config.get( 'wgFileWarning' ),
                warningMessages = warningConfig.messages,
                warningLink = warningConfig.link,
@@ -18,7 +18,7 @@
                        .addClass( 'mediawiki-filewarning-info empty' ),
                $footer = $( '<p>' )
                        .addClass( 'mediawiki-filewarning-footer empty' ),
-               dialog = new oo.ui.PopupButtonWidget( {
+               dialog = new OO.ui.PopupButtonWidget( {
                        classes: [ 'mediawiki-filewarning-anchor' ],
                        label: $mimetype,
                        flags: [ 'warning' ],
@@ -64,4 +64,4 @@
                // object at all. Sort of nasty, but it gets the job done.
                dialog.getPopup().toggle = $.noop;
        }
-}( mediaWiki, jQuery, OO ) );
+}() );
index a9f08db..beecfea 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
 
        // FIXME: mw.htmlform.Element also sets this to empty object
        mw.htmlform = {};
                return this;
        };
 
-}( mediaWiki, jQuery ) );
+}() );
index e195ccb..6d4fefb 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
 
        // FIXME: mw.htmlform.Checker also sets this to empty object
        mw.htmlform = {};
@@ -44,4 +44,4 @@
        OO.inheritClass( mw.htmlform.ActionFieldLayout, OO.ui.ActionFieldLayout );
        OO.mixinClass( mw.htmlform.ActionFieldLayout, mw.htmlform.Element );
 
-}( mediaWiki ) );
+}() );
index 2f62371..b49db93 100644 (file)
@@ -2,7 +2,7 @@
  * HTMLForm enhancements:
  * Set up autocomplete fields.
  */
-( function ( mw, $ ) {
+( function () {
 
        mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
                var $autocomplete = $root.find( '.mw-htmlform-autocomplete' );
@@ -22,4 +22,4 @@
                }
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 1628c5a..00ca581 100644 (file)
@@ -2,7 +2,7 @@
  * HTMLForm enhancements:
  * Infuse some OOUI HTMLForm fields (those which benefit from always being infused).
  */
-( function ( mw, $ ) {
+( function () {
 
        mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
                var $oouiNodes, modules, extraModules;
@@ -34,4 +34,4 @@
 
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index b825f12..955e1ce 100644 (file)
@@ -2,7 +2,7 @@
  * HTMLForm enhancements:
  * Show fancy tooltips for checkmatrix fields.
  */
-( function ( mw ) {
+( function () {
 
        mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
                var $matrixTooltips = $root.find( '.mw-htmlform-matrix .mw-htmlform-tooltip' );
@@ -13,4 +13,4 @@
                }
        } );
 
-}( mediaWiki ) );
+}() );
index ab81580..4d94deb 100644 (file)
@@ -2,7 +2,7 @@
  * HTMLForm enhancements:
  * Add/remove cloner clones without having to resubmit the form.
  */
-( function ( mw, $ ) {
+( function () {
 
        var cloneCounter = 0;
 
@@ -33,4 +33,4 @@
                } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 6d3c9fd..c8f8cc9 100644 (file)
@@ -2,7 +2,7 @@
  * HTMLForm enhancements:
  * Set up 'hide-if' behaviors for form fields that have them.
  */
-( function ( mw, $ ) {
+( function () {
 
        /**
         * Helper function for hide-if to find the nearby form field.
                                }
                                v = spec[ 2 ];
 
-                               if ( !( field instanceof jQuery ) ) {
+                               if ( !( field instanceof $ ) ) {
                                        // field is a OO.ui.Widget
                                        if ( field.supports( 'isSelected' ) ) {
                                                getVal = function () {
                                        // It is impossible to submit a form with hidden fields failing validation, e.g. one that
                                        // is required. However, validity is not checked for disabled fields, as these are not
                                        // submitted with the form. So we should also disable fields when hiding them.
-                                       if ( self instanceof jQuery ) {
+                                       if ( self instanceof $ ) {
                                                // This also finds elements inside any nested fields (in case of HTMLFormFieldCloner),
                                                // which is problematic. But it works because:
                                                // * HTMLFormFieldCloner::createFieldsForKey() copies 'hide-if' rules to nested fields
                } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index bc835b5..f8b9c06 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
 
        $( function () {
                mw.hook( 'htmlform.enhance' ).fire( $( document ) );
@@ -11,4 +11,4 @@
                $root.find( '.mw-htmlform' ).removeAttr( 'novalidate' );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index e483763..ab11f85 100644 (file)
@@ -2,11 +2,11 @@
  * HTMLForm enhancements:
  * Convert multiselect fields from checkboxes to Chosen selector when requested.
  */
-( function ( mw, $ ) {
+( function () {
 
        function addMulti( $oldContainer, $container ) {
                var name = $oldContainer.find( 'input:first-child' ).attr( 'name' ),
-                       oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-chosen|mw-htmlform-dropdown)/g, '' ),
+                       oldClass = ( ' ' + $oldContainer.attr( 'class' ) + ' ' ).replace( /(mw-htmlform-field-HTMLMultiSelectField|mw-htmlform-dropdown)/g, '' ),
                        $select = $( '<select>' ),
                        dataPlaceholder = mw.message( 'htmlform-chosen-placeholder' );
                oldClass = oldClass.trim();
                }
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index fda6742..7a643a5 100644 (file)
@@ -2,7 +2,7 @@
  * HTMLForm enhancements:
  * Add a dynamic max length to the reason field of SelectAndOther.
  */
-( function ( mw, $ ) {
+( function () {
 
        // cache the separator to avoid object creation on each keypress
        var colonSeparator = mw.message( 'colon-separator' ).text();
@@ -63,4 +63,4 @@
                        } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index b6899d9..dec832d 100644 (file)
@@ -2,7 +2,7 @@
  * HTMLForm enhancements:
  * Animate the SelectOrOther fields, to only show the text field when 'other' is selected.
  */
-( function ( mw, $ ) {
+( function () {
 
        /**
         * @class jQuery.plugin.htmlform
@@ -59,4 +59,4 @@
                        } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 3a649a9..f5c2c93 100644 (file)
@@ -7,7 +7,7 @@
 
 /* eslint-disable no-console */
 
-( function ( mw, $ ) {
+( function () {
 
        // mw.inspect is a singleton class with static methods
        // that itself can also be invoked as a function (mediawiki.base/mw#inspect).
                mw.log( 'mw.inspect: reports are not available in debug mode.' );
        }
 
-}( mediaWiki, jQuery ) );
+}() );
index b3154e1..12ef1ba 100644 (file)
@@ -6,7 +6,7 @@
 * @author neilk@wikimedia.org
 * @author mflaschen@wikimedia.org
 */
-( function ( mw, $ ) {
+( function () {
        /**
         * @class mw.jqueryMsg
         * @singleton
@@ -82,7 +82,7 @@
                        if ( typeof children[ i ] !== 'object' ) {
                                children[ i ] = document.createTextNode( children[ i ] );
                        }
-                       if ( children[ i ] instanceof jQuery && children[ i ].hasClass( 'mediaWiki_htmlEmitter' ) ) {
+                       if ( children[ i ] instanceof $ && children[ i ].hasClass( 'mediaWiki_htmlEmitter' ) ) {
                                children[ i ] = children[ i ].contents();
                        }
                }
         * @return {string} Textual value of input
         */
        function textify( input ) {
-               if ( input instanceof jQuery ) {
+               if ( input instanceof $ ) {
                        input = input.text();
                }
                return String( input );
                 *
                 * @param {Array} nodes List of one element, integer, n >= 0
                 * @param {Array} replacements List of at least n strings
-                * @return {string} replacement
+                * @return {string|jQuery} replacement
                 */
                replace: function ( nodes, replacements ) {
                        var index = parseInt( nodes[ 0 ], 10 );
                 * Handles an (already-validated) HTML element.
                 *
                 * @param {Array} nodes Nodes to process when creating element
-                * @return {jQuery|Array} jQuery node for valid HTML or array for disallowed element
+                * @return {jQuery}
                 */
                htmlelement: function ( nodes ) {
                        var tagName, attributes, contents, $element;
                        var $el,
                                arg = nodes[ 0 ],
                                contents = nodes[ 1 ];
-                       if ( arg instanceof jQuery && !arg.hasClass( 'mediaWiki_htmlEmitter' ) ) {
+                       if ( arg instanceof $ && !arg.hasClass( 'mediaWiki_htmlEmitter' ) ) {
                                $el = arg;
                        } else {
                                $el = $( '<a>' );
                 * So convert it back with the current language's convertNumber.
                 *
                 * @param {Array} nodes List of nodes, [ {string|number}, {string}, {string} ... ]
-                * @return {string} selected pluralized form according to current language
+                * @return {string|jQuery} selected pluralized form according to current language
                 */
                plural: function ( nodes ) {
                        var forms, firstChild, firstChildText, explicitPluralFormNumber, formIndex, form, count,
                                explicitPluralForms = {};
 
-                       count = parseFloat( this.language.convertNumber( nodes[ 0 ], true ) );
+                       count = parseFloat( this.language.convertNumber( textify( nodes[ 0 ] ), true ) );
                        forms = nodes.slice( 1 );
                        for ( formIndex = 0; formIndex < forms.length; formIndex++ ) {
                                form = forms[ formIndex ];
 
-                               if ( form instanceof jQuery && form.hasClass( 'mediaWiki_htmlEmitter' ) ) {
+                               if ( form instanceof $ && form.hasClass( 'mediaWiki_htmlEmitter' ) ) {
                                        // This is a nested node, may be an explicit plural form like 5=[$2 linktext]
                                        firstChild = form.contents().get( 0 );
                                        if ( firstChild && firstChild.nodeType === Node.TEXT_NODE ) {
                 * - a gender string ('male', 'female' or 'unknown')
                 *
                 * @param {Array} nodes List of nodes, [ {string|mw.user}, {string}, {string}, {string} ]
-                * @return {string} Selected gender form according to current language
+                * @return {string|jQuery} Selected gender form according to current language
                 */
                gender: function ( nodes ) {
                        var gender,
                        if ( maybeUser && maybeUser.options instanceof mw.Map ) {
                                gender = maybeUser.options.get( 'gender' );
                        } else {
-                               gender = maybeUser;
+                               gender = textify( maybeUser );
                        }
 
                        return this.language.gender( gender, forms );
                 * Invoked by putting `{{grammar:form|word}}` in a message
                 *
                 * @param {Array} nodes List of nodes [{Grammar case eg: genitive}, {string word}]
-                * @return {string} selected grammatical form according to current language
+                * @return {string|jQuery} selected grammatical form according to current language
                 */
                grammar: function ( nodes ) {
                        var form = nodes[ 0 ],
                                word = nodes[ 1 ];
-                       return word && form && this.language.convertGrammar( word, form );
+                       // These could be jQuery objects (passed as message parameters),
+                       // in which case we can't transform them (like rawParams() in PHP).
+                       if ( typeof form === 'string' && typeof word === 'string' ) {
+                               return this.language.convertGrammar( word, form );
+                       }
+                       return word;
                },
 
                /**
                 * Tranform parsed structure into a int: (interface language) message include
                 * Invoked by putting `{{int:othermessage}}` into a message
                 *
+                * TODO Syntax in the included message is not parsed, this seems like a bug?
+                *
                 * @param {Array} nodes List of nodes
                 * @return {string} Other message
                 */
                'int': function ( nodes ) {
-                       var msg = nodes[ 0 ];
+                       var msg = textify( nodes[ 0 ] );
                        return mw.jqueryMsg.getMessageFunction()( msg.charAt( 0 ).toLowerCase() + msg.slice( 1 ) );
                },
 
                 * separator, according to the current language.
                 *
                 * @param {Array} nodes List of nodes
-                * @return {number|string} Formatted number
+                * @return {number|string|jQuery} Formatted number
                 */
                formatnum: function ( nodes ) {
                        var isInteger = !!nodes[ 1 ] && nodes[ 1 ] === 'R',
                                number = nodes[ 0 ];
 
-                       return this.language.convertNumber( number, isInteger );
+                       // These could be jQuery objects (passed as message parameters),
+                       // in which case we can't transform them (like rawParams() in PHP).
+                       if ( typeof number === 'string' || typeof number === 'number' ) {
+                               return this.language.convertNumber( number, isInteger );
+                       }
+                       return number;
                },
 
                /**
                };
        }() );
 
-}( mediaWiki, jQuery ) );
+}() );
index cb9e19e..da656f9 100644 (file)
@@ -2,8 +2,8 @@
  * Bosnian (bosanski) language functions
  */
 
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'bs', 'grammarForms' );
+mw.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mw.language.getData( 'bs', 'grammarForms' );
        if ( grammarForms && grammarForms[ form ] ) {
                return grammarForms[ form ][ word ];
        }
index dc4447a..73c5052 100644 (file)
@@ -2,8 +2,8 @@
  * Lower Sorbian (Dolnoserbski) language functions
  */
 
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'dsb', 'grammarForms' );
+mw.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mw.language.getData( 'dsb', 'grammarForms' );
        if ( grammarForms && grammarForms[ form ] ) {
                return grammarForms[ form ][ word ];
        }
index 2bbfc6b..1694663 100644 (file)
@@ -3,10 +3,10 @@
  * @author Santhosh Thottingal
  */
 
-mediaWiki.language.convertGrammar = function ( word, form ) {
+mw.language.convertGrammar = function ( word, form ) {
        var grammarForms, aou, origWord;
 
-       grammarForms = mediaWiki.language.getData( 'fi', 'grammarForms' );
+       grammarForms = mw.language.getData( 'fi', 'grammarForms' );
        if ( grammarForms && grammarForms[ form ] ) {
                return grammarForms[ form ][ word ];
        }
index e136211..7f833dc 100644 (file)
@@ -2,8 +2,8 @@
  * Irish (Gaeilge) language functions
  */
 
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'ga', 'grammarForms' );
+mw.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mw.language.getData( 'ga', 'grammarForms' );
        if ( grammarForms && grammarForms[ form ] ) {
                return grammarForms[ form ][ word ];
        }
index 8e9b129..3329a4b 100644 (file)
@@ -2,8 +2,8 @@
  * Upper Sorbian (Hornjoserbsce) language functions
  */
 
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'hsb', 'grammarForms' );
+mw.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mw.language.getData( 'hsb', 'grammarForms' );
        if ( grammarForms && grammarForms[ form ] ) {
                return grammarForms[ form ][ word ];
        }
index 4f8f74d..4f98f19 100644 (file)
@@ -3,8 +3,8 @@
  * @author Santhosh Thottingal
  */
 
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'hu', 'grammarForms' );
+mw.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mw.language.getData( 'hu', 'grammarForms' );
        if ( grammarForms && grammarForms[ form ] ) {
                return grammarForms[ form ][ word ];
        }
index bb6f61d..0ef9b20 100644 (file)
@@ -2,8 +2,8 @@
  * Armenian (Հայերեն) language functions
  */
 
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'hy', 'grammarForms' );
+mw.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mw.language.getData( 'hy', 'grammarForms' );
        if ( grammarForms && grammarForms[ form ] ) {
                return grammarForms[ form ][ word ];
        }
index 29e04a6..849e90b 100644 (file)
@@ -3,8 +3,8 @@
  * @author Santhosh Thottingal
  */
 
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'la', 'grammarForms' );
+mw.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mw.language.getData( 'la', 'grammarForms' );
        if ( grammarForms && grammarForms[ form ] ) {
                return grammarForms[ form ][ word ];
        }
index 3e0f279..14c9840 100644 (file)
@@ -3,8 +3,8 @@
  * @author Santhosh Thottingal
  */
 
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'os', 'grammarForms' ),
+mw.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mw.language.getData( 'os', 'grammarForms' ),
                // Ending for allative case
                endAllative = 'мæ',
                // Variable for 'j' beetwen vowels
index 3d8bdfd..17b5819 100644 (file)
@@ -2,8 +2,8 @@
  * Slovenian (Slovenščina) language functions
  */
 
-mediaWiki.language.convertGrammar = function ( word, form ) {
-       var grammarForms = mediaWiki.language.getData( 'sl', 'grammarForms' );
+mw.language.convertGrammar = function ( word, form ) {
+       var grammarForms = mw.language.getData( 'sl', 'grammarForms' );
        if ( grammarForms && grammarForms[ form ] ) {
                return grammarForms[ form ][ word ];
        }
index a13f059..5054810 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        'use strict';
 
        /**
@@ -29,4 +29,4 @@
                }
        };
 
-}( mediaWiki ) );
+}() );
index b1bab02..09bf725 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Language-fallback-chain-related utilities for mediawiki.language.
  */
-( function ( mw, $ ) {
+( function () {
        /**
         * @class mw.language
         */
@@ -32,4 +32,4 @@
 
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 34add28..33f8fd7 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Base language object with methods related to language support, attempting to mirror some of the
         * functionality of the Language class in MediaWiki:
@@ -85,4 +85,4 @@
                }
        };
 
-}( mediaWiki ) );
+}() );
index 45863a3..dfb7112 100644 (file)
@@ -1,41 +1,13 @@
 /*
  * Methods for transforming message syntax.
  */
-( function ( mw, $ ) {
+( function () {
 
        /**
         * @class mw.language
         */
        $.extend( mw.language, {
 
-               /**
-                * Process the PLURAL template substitution
-                *
-                * @private
-                * @param {Object} template Template object
-                * @param {string} template.title
-                * @param {Array} template.parameters
-                * @return {string}
-                */
-               procPLURAL: function ( template ) {
-                       var count;
-                       if ( template.title && template.parameters && mw.language.convertPlural ) {
-                               // Check if we have forms to replace
-                               if ( template.parameters.length === 0 ) {
-                                       return '';
-                               }
-                               // Restore the count into a Number ( if it got converted earlier )
-                               count = mw.language.convertNumber( template.title, true );
-                               // Do convertPlural call
-                               return mw.language.convertPlural( parseInt( count, 10 ), template.parameters );
-                       }
-                       // Could not process plural return first form or nothing
-                       if ( template.parameters[ 0 ] ) {
-                               return template.parameters[ 0 ];
-                       }
-                       return '';
-               },
-
                /**
                 * Plural form transformations, needed for some languages.
                 *
                                return forms[ form ][ word ];
                        }
 
-                       transformations = mediaWiki.language.getData( userLanguage, 'grammarTransformations' );
+                       transformations = mw.language.getData( userLanguage, 'grammarTransformations' );
 
                        if ( !( transformations && transformations[ form ] ) ) {
                                return word;
                }
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 7b78562..ca6429c 100644 (file)
@@ -3,7 +3,7 @@
  *
  * Loading this module also ensures the availability of appropriate messages via mw.msg.
  */
-( function ( mw ) {
+( function () {
        var
                monthMessages = [
                        'january', 'february', 'march', 'april',
@@ -53,4 +53,4 @@
                abbrev: monthAbbrevMessages.map( mwMsgMapper )
        };
 
-}( mediaWiki ) );
+}() );
index f4194d3..981beac 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * Number-related utilities for mediawiki.language.
  */
-( function ( mw, $ ) {
+( function () {
        /**
         * @class mw.language
         */
 
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 676ddb0..829052d 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable no-restricted-properties */
-( function ( mw, $ ) {
+( function () {
        var ProtectionForm,
                reasonCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
                reasonByteLimit = mw.config.get( 'wgCommentByteLimit' );
 
        $( ProtectionForm.init.bind( ProtectionForm ) );
 
-}( mediaWiki, jQuery ) );
+}() );
index 27d049e..d4c3621 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * MediaWiki legacy wikibits
  */
-( function ( mw, $ ) {
+( function () {
        var msg,
                loadedScripts = {};
 
                }, 'Use jQuery or mw.loader.load instead.', 'document.' + method );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index e8913aa..a28bd8f 100644 (file)
@@ -1,5 +1,5 @@
 /* global JpegMeta */
-( function ( mw ) {
+( function () {
 
        // Export as module
        module.exports = function ( fileReaderResult, fileName ) {
@@ -9,4 +9,4 @@
        // Back-compat: Also expose via mw.lib
        // @deprecated since 1.31
        mw.log.deprecate( mw.libs, 'jpegmeta', module.exports );
-}( mediaWiki ) );
+}() );
index 28449d3..5edb398 100644 (file)
@@ -2,4 +2,4 @@
 module.exports = window.pluralRuleParser;
 
 // Back-compat: Also expose via mw.lib
-mediaWiki.libs.pluralRuleParser = window.pluralRuleParser;
+mw.libs.pluralRuleParser = window.pluralRuleParser;
index a2dbcd4..20621d2 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        /**
         * This is an implementation of MessagePoster for wikitext talk pages.
         *
@@ -50,4 +50,4 @@
 
        mw.messagePoster.factory.register( 'wikitext', WikitextMessagePoster );
        mw.messagePoster.WikitextMessagePoster = WikitextMessagePoster;
-}( mediaWiki, jQuery ) );
+}() );
index 64642b2..7f217e9 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * This is the abstract base class for MessagePoster implementations.
         *
@@ -37,4 +37,4 @@
         * something.
         */
        mw.messagePoster.MessagePoster.prototype.post = function () {};
-}( mediaWiki ) );
+}() );
index e20b422..cadf62b 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        /**
         * Factory for MessagePoster objects. This provides a pluggable to way to script the action
         * of adding a message to someone's talk page.
        mw.messagePoster = {
                factory: new MessagePosterFactory()
        };
-}( mediaWiki, jQuery ) );
+}() );
index 5d46de6..d496d7a 100644 (file)
@@ -6,7 +6,7 @@
  * @class mw.plugin.convertmessagebox
  * @singleton
  */
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        /**
@@ -61,4 +61,4 @@
 
        module.exports = convertmessagebox;
 
-}( mediaWiki, jQuery ) );
+}() );
index cb3e4ae..0ec010e 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        var notification,
 
        mw.notification = notification;
 
-}( mediaWiki, jQuery ) );
+}() );
index 0f3a086..f0833eb 100644 (file)
@@ -1,7 +1,7 @@
 /**
  * @class mw.plugin.notify
  */
-( function ( mw ) {
+( function () {
        'use strict';
 
        /**
@@ -25,4 +25,4 @@
         * @mixins mw.plugin.notify
         */
 
-}( mediaWiki ) );
+}() );
index ff27c58..3f35c4b 100644 (file)
@@ -4,7 +4,7 @@
  * - Toggle gallery captions when focused.
  * - Dynamically resize images to fill horizontal space.
  */
-( function ( mw, $ ) {
+( function () {
        var $galleries,
                bound = false,
                lastWidth = window.innerWidth,
                        }
                } );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 6e9ff0e..204d915 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * mw.GallerySlideshow: Interface controls for the slideshow gallery
  */
-( function ( mw, $, OO ) {
+( function () {
        /**
         * mw.GallerySlideshow encapsulates the user interface of the slideshow
         * galleries. An object is instantiated for each `.mw-gallery-slideshow`
                        new mw.GallerySlideshow( this );
                } );
        } );
-}( mediaWiki, jQuery, OO ) );
+}() );
index 1823ef0..4541c58 100644 (file)
@@ -2,7 +2,7 @@
  * Implement AJAX navigation for multi-page images so the user may browse without a full page reload.
  */
 
-( function ( mw, $ ) {
+( function () {
        var jqXhr, $multipageimage, $spinner,
                cache = {},
                cacheOrder = [];
                        } );
                }
        } );
-}( mediaWiki, jQuery ) );
+}() );
index d8fb249..27d9e55 100644 (file)
@@ -5,7 +5,7 @@
  * @since 1.21
  * @author Marius Hoch <hoo@online.de>
  */
-( function ( mw, $ ) {
+( function () {
        if ( !mw.user.tokens.exists( 'patrolToken' ) ) {
                // Current user has no patrol right, or an old cached version of user.tokens
                // that didn't have patrolToken yet.
@@ -61,4 +61,4 @@
                        e.preventDefault();
                } );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index e147664..71e7f80 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        mw.hook( 'wikipage.content' ).add( function ( $content ) {
                var $sortable, $collapsible;
 
@@ -55,4 +55,4 @@
                } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 6db518d..2896f40 100644 (file)
@@ -5,7 +5,7 @@
  * @since 1.28
  * @author Timo Tijhof
  */
-( function ( mw, $ ) {
+( function () {
 
        $( function () {
                $( '.mw-rollback-link' ).on( 'click', 'a[data-mw="interface"]', function ( e ) {
@@ -64,4 +64,4 @@
                } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 7514044..0088ec0 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        // Break out of framesets
        if ( mw.config.get( 'wgBreakFrames' ) ) {
                // Note: In IE < 9 strict comparison to window is non-standard (the standard didn't exist yet)
@@ -46,4 +46,4 @@
                }
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 2002b9f..f7fbeef 100644 (file)
@@ -14,7 +14,7 @@
  * @class mw.plugin.page.watch.ajax
  * @singleton
  */
-( function ( mw, $ ) {
+( function () {
        var watch,
                // The name of the page to watch or unwatch
                title = mw.config.get( 'wgRelevantPageName' );
                                .done( function ( watchResponse ) {
                                        var message, otherAction = action === 'watch' ? 'unwatch' : 'watch';
 
-                                       if ( mwTitle.getNamespaceId() > 0 && mwTitle.getNamespaceId() % 2 === 1 ) {
+                                       if ( mwTitle.isTalkPage() ) {
                                                message = action === 'watch' ? 'addedwatchtext-talk' : 'removedwatchtext-talk';
                                        } else {
                                                message = action === 'watch' ? 'addedwatchtext' : 'removedwatchtext';
                } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 96b4410..e51829c 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * View model for the changes list
         *
        mw.rcfilters.dm.ChangesListViewModel.prototype.hasUnseenWatchedChanges = function () {
                return this.unseenWatchedChanges;
        };
-}( mediaWiki ) );
+}() );
index 7aceed6..e08e28c 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable no-restricted-properties */
-( function ( mw ) {
+( function () {
        /**
         * View model for a filter group
         *
                        itemModel.toggleVisible( visibleItems.indexOf( itemModel ) !== -1 );
                } );
        };
-}( mediaWiki ) );
+}() );
index 7e35b33..0204013 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Filter item model
         *
                return this.visible;
        };
 
-}( mediaWiki ) );
+}() );
index 45d54a0..c76cd25 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable no-restricted-properties */
-( function ( mw, $ ) {
+( function () {
        /**
         * View model for the filters selection and display
         *
                this.getItemByName( filterName ).clearHighlightColor();
        };
 
-}( mediaWiki, jQuery ) );
+}() );
index 63b0b03..c3283c1 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * RCFilter base item model
         *
        mw.rcfilters.dm.ItemModel.prototype.isHighlighted = function () {
                return !!this.getHighlightColor();
        };
-}( mediaWiki ) );
+}() );
index e7cb6b6..9d8f977 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable no-restricted-properties */
-( function ( mw, $ ) {
+( function () {
        /**
         * View model for saved queries
         *
        mw.rcfilters.dm.SavedQueriesModel.prototype.isConverted = function () {
                return this.converted;
        };
-}( mediaWiki, jQuery ) );
+}() );
index c74648e..46344cb 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * View model for a single saved query
         *
                        this.emit( 'update' );
                }
        };
-}( mediaWiki ) );
+}() );
index 1664e86..7284131 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable no-restricted-properties */
-( function ( mw, $ ) {
+( function () {
 
        var byteLength = require( 'mediawiki.String' ).byteLength;
 
@@ -75,8 +75,8 @@
                                        label: label || mw.msg( 'blanknamespace' ),
                                        description: '',
                                        identifiers: [
-                                               ( namespaceID < 0 || namespaceID % 2 === 0 ) ?
-                                                       'subject' : 'talk'
+                                               mw.Title.isTalkNamespace( namespaceID ) ?
+                                                       'talk' : 'subject'
                                        ],
                                        cssClass: 'mw-changeslist-ns-' + namespaceID
                                } );
                        this.filtersModel.getViewTrigger( view )
                );
        };
-}( mediaWiki, jQuery ) );
+}() );
index 0bef902..6231f28 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Supported highlight colors.
         * Warning: These are also hardcoded in "styles/mw.rcfilters.variables.less"
@@ -7,4 +7,4 @@
         * @property {string[]}
         */
        mw.rcfilters.HighlightColors = [ 'c1', 'c2', 'c3', 'c4', 'c5' ];
-}( mediaWiki ) );
+}() );
index b8ff22e..5344af4 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        /* eslint no-underscore-dangle: "off" */
        /**
         * URI Processor for RCFilters
                        { urlversion: '2' }
                );
        };
-}( mediaWiki, jQuery ) );
+}() );
index 9724927..2adfa7d 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:RecentChanges
  */
-( function ( mw, $ ) {
+( function () {
        var rcfilters = {
                /**
                 * @member mw.rcfilters
 
        module.exports = rcfilters;
 
-}( mediaWiki, jQuery ) );
+}() );
index c62d6f2..f30c278 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * @class
         * @singleton
@@ -46,4 +46,4 @@
                        }
                }
        };
-}( mediaWiki ) );
+}() );
index 1ed597d..e907a15 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Widget defining the button controlling the popup for the number of results
         *
                }
        };
 
-}( mediaWiki ) );
+}() );
index 9dd87d8..8cf9657 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Widget defining the popup to choose number of results
         *
@@ -75,4 +75,4 @@
        mw.rcfilters.ui.ChangesLimitPopupWidget.prototype.onGroupByPageModelUpdate = function () {
                this.groupByPageCheckbox.setSelected( this.groupByPageItemModel.isSelected() );
        };
-}( mediaWiki ) );
+}() );
index 3a83eec..c102e59 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * List of changes
         *
                // Turn off highlights
                this.$element.removeClass( 'mw-rcfilters-ui-changesListWrapperWidget-highlighted' );
        };
-}( mediaWiki ) );
+}() );
index 9fd4593..b273a01 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * A widget representing a single toggle filter
         *
@@ -60,4 +60,4 @@
        mw.rcfilters.ui.CheckboxInputWidget.prototype.onUserChange = function () {
                this.emit( 'userChange', this.$input.prop( 'checked' ) );
        };
-}( mediaWiki ) );
+}() );
index 2014ef7..792ea4b 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Widget defining the popup to choose date for the results
         *
@@ -63,4 +63,4 @@
         *
         * A days item was chosen
         */
-}( mediaWiki ) );
+}() );
index e3de55e..f4a40cb 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        /**
         * A button to configure highlight for a filter item
         *
@@ -77,4 +77,4 @@
                                );
                } );
        };
-}( mediaWiki, jQuery ) );
+}() );
index c047e83..1fef7a0 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        /**
         * Menu header for the RCFilters filters menu
         *
@@ -37,7 +37,7 @@
 
                // Help icon for Tagged edits
                this.helpIcon = new OO.ui.ButtonWidget( {
-                       icon: 'help',
+                       icon: 'helpNotice',
                        framed: false,
                        title: mw.msg( 'rcfilters-view-tags-help-icon-tooltip' ),
                        classes: [ 'mw-rcfilters-ui-filterMenuHeaderWidget-helpIcon' ],
        mw.rcfilters.ui.FilterMenuHeaderWidget.prototype.onInvertNamespacesButtonClick = function () {
                this.controller.toggleInvertedNamespaces();
        };
-}( mediaWiki, jQuery ) );
+}() );
index 65b4420..8840155 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * A widget representing a single toggle filter
         *
@@ -87,4 +87,4 @@
                        } );
                }
        };
-}( mediaWiki ) );
+}() );
index 20bf73f..3d598c9 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * A widget representing a menu section for filter groups
         *
                return this.model.getName();
        };
 
-}( mediaWiki ) );
+}() );
index 41c7bae..411ada9 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Extend OOUI's FilterTagItemWidget to also display a popup on hover.
         *
@@ -42,4 +42,4 @@
                        invalid: this.itemModel.isSelected() && this.itemModel.isConflicted()
                } );
        };
-}( mediaWiki, jQuery ) );
+}() );
index 6d36c71..6c2fda7 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * List displaying all filter groups
         *
                        } );
                }
        };
-}( mediaWiki ) );
+}() );
index a5a8187..567d86d 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * List displaying all filter groups
         *
        mw.rcfilters.ui.FilterWrapperWidget.prototype.onNewChangesExist = function ( newChangesExist ) {
                this.showNewChangesLink.toggle( newChangesExist );
        };
-}( mediaWiki ) );
+}() );
index 237a635..a28cde0 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Wrapper for the RC form with hide/show links
         * Must be constructed after the model is initialized.
                        this.$element.detach();
                }
        };
-}( mediaWiki ) );
+}() );
index 7a95e3d..491651a 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * A group widget to allow for aggregation of events
         *
@@ -39,4 +39,4 @@
 
        OO.inheritClass( mw.rcfilters.ui.GroupWidget, OO.ui.Widget );
        OO.mixinClass( mw.rcfilters.ui.GroupWidget, OO.ui.mixin.GroupWidget );
-}( mediaWiki ) );
+}() );
index fda0772..a55246f 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        /**
         * A widget representing a filter item highlight color picker
         *
                }
                this.emit( 'chooseColor', color );
        };
-}( mediaWiki, jQuery ) );
+}() );
index aedecc4..2dd0379 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        /**
         * A popup containing a color picker, for setting highlight colors.
         *
@@ -60,4 +60,4 @@
                this.toggle( false );
        };
 
-}( mediaWiki, jQuery ) );
+}() );
index 83d510b..cda13eb 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * A widget representing a base toggle item
         *
                                classes.push( 'mw-rcfilters-ui-itemMenuOptionWidget-identifier-' + ident );
                        } );
 
-                       this.$element.addClass( classes.join( ' ' ) );
+                       this.$element.addClass( classes );
                }
 
                this.updateUiBasedOnState();
                return this.itemModel;
        };
 
-}( mediaWiki ) );
+}() );
index 0fb3cb7..926ff4a 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Widget for toggling live updates
         *
@@ -66,4 +66,4 @@
                this.setState( enable );
        };
 
-}( mediaWiki ) );
+}() );
index eab8499..b402627 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $, mw ) {
+( function () {
        /**
         * Wrapper for changes list content
         *
                return new mw.rcfilters.ui.FormWrapperWidget(
                        this.model, this.changesListModel, this.controller, this.$formContainer );
        };
-}( jQuery, mediaWiki ) );
+}() );
index d447f91..328be8c 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Button for marking all changes as seen on the Watchlist
         *
@@ -52,4 +52,4 @@
                this.setDisabled( !this.model.hasUnseenWatchedChanges() );
        };
 
-}( mediaWiki ) );
+}() );
index d4f0aea..46e8208 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * A floating menu widget for the filter list
         *
        mw.rcfilters.ui.MenuSelectWidget.prototype.setUserSelecting = function ( isSelecting ) {
                this.userSelecting = !!isSelecting;
        };
-}( mediaWiki ) );
+}() );
index fce1cb7..e3d5575 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Top section (between page title and filters) on Special:Recentchanges
         *
                }
                this.$topLinks.toggleClass( 'mw-recentchanges-toplinks-collapsed', state === 'collapsed' );
        };
-}( mediaWiki ) );
+}() );
index 527d790..426c47f 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Widget to select and display target page on Special:RecentChangesLinked (AKA Related Changes)
         *
@@ -76,4 +76,4 @@
                this.titleSearch.setValue( text );
                this.titleSearch.setTitle( text );
        };
-}( mediaWiki ) );
+}() );
index 4fce08c..8925dcf 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Widget to select to view changes that link TO or FROM the target page
         * on Special:RecentChangesLinked (AKA Related Changes)
@@ -70,4 +70,4 @@
                                'rcfilters-filter-showlinkedfrom-label'
                ) );
        };
-}( mediaWiki ) );
+}() );
index 2fdf365..7488254 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Top section (between page title and filters) on Special:RecentChangesLinked (AKA RelatedChanges)
         *
@@ -63,4 +63,4 @@
        /* Initialization */
 
        OO.inheritClass( mw.rcfilters.ui.RclTopSectionWidget, OO.ui.Widget );
-}( mediaWiki ) );
+}() );
index 89ad382..ae1ec90 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Save filters widget. This widget is displayed in the tag area
         * and allows the user to save the current state of the system
                        this.emit( 'saveCurrent' );
                }
        };
-}( mediaWiki ) );
+}() );
index c13c2f7..3645b20 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Quick links menu option widget
         *
                return this.model.getID();
        };
 
-}( mediaWiki ) );
+}() );
index 088aa5b..034a1c9 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Quick links widget
         *
                this.menu.removeItems( [ this.menu.findItemFromData( item.getID() ) ] );
                this.placeholderItem.toggle( this.model.isEmpty() );
        };
-}( mediaWiki ) );
+}() );
index 188650a..88117e7 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        /**
         * Extend OOUI's TagItemWidget to also display a popup on hover.
         *
                this.itemModel.disconnect( this );
                this.closeButton.disconnect( this );
        };
-}( mediaWiki, jQuery ) );
+}() );
index 304929b..ca85a6e 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Widget defining the behavior used to choose from a set of values
         * in a single_value group
                        this.selectWidget.selectItemByData( selectedItem.getName() );
                }
        };
-}( mediaWiki ) );
+}() );
index aadded1..72d2203 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * A widget for the footer for the default view, allowing to switch views
         *
@@ -75,4 +75,4 @@
        mw.rcfilters.ui.ViewSwitchWidget.prototype.onButtonClick = function ( buttonWidget ) {
                this.controller.switchView( buttonWidget.getData() );
        };
-}( mediaWiki ) );
+}() );
index b9d9bdf..423c105 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Top section (between page title and filters) on Special:Watchlist
         *
@@ -80,4 +80,4 @@
        /* Initialization */
 
        OO.inheritClass( mw.rcfilters.ui.WatchlistTopSectionWidget, OO.ui.Widget );
-}( mediaWiki ) );
+}() );
index bd94f29..044ac3f 100644 (file)
@@ -2,7 +2,7 @@
 /*!
  * Add search suggestions to the search form.
  */
-( function ( mw, $ ) {
+( function () {
        var searchNS = $.map( mw.config.get( 'wgFormattedNamespaces' ), function ( nsName, nsID ) {
                if ( nsID >= 0 && mw.user.options.get( 'searchNs' + nsID ) ) {
                        // Cast string key to number
@@ -22,6 +22,7 @@
                        } ).done( function ( data, jqXHR ) {
                                response( data[ 1 ], {
                                        type: jqXHR.getResponseHeader( 'X-OpenSearch-Type' ),
+                                       searchId: jqXHR.getResponseHeader( 'X-Search-ID' ),
                                        query: query
                                } );
                        } );
                                action: 'impression-results',
                                numberOfResults: context.config.suggestions.length,
                                resultSetType: metadata.type || 'unknown',
+                               searchId: metadata.searchId || null,
                                query: metadata.query,
                                inputLocation: getInputLocation( context )
                        } );
                        .find( '.mw-fallbackSearchButton' ).remove();
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index d880e8b..3f33837 100644 (file)
@@ -135,6 +135,7 @@ figure[ typeof~='mw:Audio/Frame' ] {
 
        > figcaption {
                display: block;
+               word-break: break-word;
 
                /* In mw-core the font-size is duplicated, 94% in thumbiner
                 * and again 94% in thumbcaption. 88.4% for font size of the
index ad5fb06..48b3269 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable no-restricted-properties */
-( function ( $, mw, OO ) {
+( function () {
        'use strict';
        var ApiSandbox, Util, WidgetMethods, Validators,
                $content, panel, booklet, oldhash, windowManager,
 
        module.exports = ApiSandbox;
 
-}( jQuery, mediaWiki, OO ) );
+}() );
index 180f040..cb54e71 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:Block
  */
-( function ( mw, $ ) {
+( function () {
        // Like OO.ui.infuse(), but if the element doesn't exist, return null instead of throwing an exception.
        function infuseOrNull( elem ) {
                try {
@@ -55,4 +55,4 @@
                        updateBlockOptions();
                }
        } );
-}( mediaWiki, jQuery ) );
+}() );
index ad8a4f4..36ad252 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for change credentials form.
  */
-( function ( mw, $, OO ) {
+( function () {
        mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
                var api = new mw.Api();
 
@@ -52,4 +52,4 @@
                        } );
                } );
        } );
-}( mediaWiki, jQuery, OO ) );
+}() );
index 0792762..0cdb110 100644 (file)
@@ -3,7 +3,7 @@
  */
 
 /* Remember the collapse state of the legend on recent changes and watchlist pages. */
-( function ( mw ) {
+( function () {
        var
                cookieName = 'changeslist-state',
                // Expanded by default
@@ -21,4 +21,4 @@
                };
 
        mw.hook( 'wikipage.content' ).add( doCollapsibleLegend );
-}( mediaWiki ) );
+}() );
index 6558bda..275e96a 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
 
        // Return a promise that is resolved when the element is blurred (loses focus).
        // If it already is blurred, resolved immediately.
@@ -35,4 +35,4 @@
                } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 4f51e9b..2d12b53 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:EditTags
  */
-( function ( mw, $ ) {
+( function () {
        $( function () {
                var summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
                        summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
@@ -35,4 +35,4 @@
                }
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 2cb96af..ba34eb3 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:Import
  */
-( function ( $ ) {
+( function () {
        var subprojectListAlreadyShown;
        function updateImportSubprojectList() {
                var $projectField = $( '#mw-import-table-interwiki #interwiki' ),
@@ -34,4 +34,4 @@
                        updateImportSubprojectList();
                }
        } );
-}( jQuery ) );
+}() );
index 0968e84..8004a44 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:MovePage
  */
-( function ( mw, $ ) {
+( function () {
        $( function () {
                var summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
                        summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
@@ -16,4 +16,4 @@
                        mw.widgets.visibleByteLimit( wpReason, summaryByteLimit );
                }
        } );
-}( mediaWiki, jQuery ) );
+}() );
index edfbe1e..589182a 100644 (file)
@@ -1,11 +1,11 @@
 /*!
  * JavaScript module used on Special:PageLanguage
  */
-( function ( $, OO ) {
+( function () {
        $( function () {
                // Select the 'Language select' option if user is trying to select language
                OO.ui.infuse( 'mw-pl-languageselector' ).on( 'change', function () {
                        OO.ui.infuse( 'mw-pl-options' ).setValue( '2' );
                } );
        } );
-}( jQuery, OO ) );
+}() );
index 7c98ece..9827dab 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:Preferences: editfont field enhancements.
  */
-( function ( mw ) {
+( function () {
        mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
                var widget, lastValue,
                        $target = $root.find( '#mw-input-wpeditfont' );
@@ -37,4 +37,4 @@
                updateLabel( widget.getValue() );
 
        } );
-}( mediaWiki ) );
+}() );
index cc87f43..5642046 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:Preferences: Tab navigation.
  */
-( function ( mw, $ ) {
+( function () {
        $( function () {
                var $preferences, tabs, wrapper, previousTab, switchingNoHash;
 
                } );
 
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 23cca21..baa9beb 100644 (file)
        .mixin-screen-reader-text;
 }
 
-/* Override OOUI styles so that dropdowns near the bottom of the form don't get clipped,
- * e.g.'Appearance' / 'Threshold for stub link formatting'. This is hacky and bad, it would be
- * better solved by setting overlays for the widgets, but we can't do it from PHP... */
-#preferences .oo-ui-panelLayout {
-       position: static;
-       overflow: visible;
-       .transform( none );
+/* Most outer Panellayout:
+ * Decrease contrast of `border` slightly as padding/border combination is sufficient
+ * accessibility wise and focus of content is more important here. */
+#preferences .oo-ui-panelLayout-framed {
+       border-color: #c8ccd1;
 }
 
 #preferences .oo-ui-menuLayout .oo-ui-panelLayout-framed .oo-ui-panelLayout-framed {
index c092682..03309de 100644 (file)
@@ -2,7 +2,7 @@
  * JavaScript for Special:Preferences: Enable save button and prevent the window being accidentally
  * closed when any form field is changed.
  */
-( function ( mw, $ ) {
+( function () {
        $( function () {
                var allowCloseWindow, saveButton, restoreButton,
                        oouiEnabled = $( '#mw-prefs-form' ).hasClass( 'mw-htmlform-ooui' );
@@ -93,4 +93,4 @@
                        $( '#mw-prefs-restoreprefs' ).on( 'click', allowCloseWindow.release );
                }
        } );
-}( mediaWiki, jQuery ) );
+}() );
index e6b7432..45bdda2 100644 (file)
@@ -1,9 +1,9 @@
 /*!
  * JavaScript for Special:Preferences: Check for successbox to replace with notifications.
  */
-( function ( $ ) {
+( function () {
        $( function () {
                var convertmessagebox = require( 'mediawiki.notification.convertmessagebox' );
                convertmessagebox();
        } );
-}( jQuery ) );
+}() );
index f934d59..10023ef 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:Preferences: Email preferences better UX
  */
-( function ( $ ) {
+( function () {
        $( function () {
                var allowEmail, allowEmailFromNewUsers;
 
@@ -21,4 +21,4 @@
                        toggleDisabled();
                }
        } );
-}( jQuery ) );
+}() );
index 598b8f8..4b058ce 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:Preferences: Tab navigation.
  */
-( function ( mw, $ ) {
+( function () {
        $( function () {
                var $preftoc, $preferences, $fieldsets, labelFunc, previousTab;
 
                } );
 
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 47a4bbc..bdfe9a1 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:Preferences: Timezone field enhancements.
  */
-( function ( mw, $ ) {
+( function () {
        mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
                var $tzSelect, $tzTextbox, timezoneWidget, $localtimeHolder, servertime,
                        $target = $root.find( '#wpTimeCorrection' ),
                }
 
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 29c0fea..d8f73b2 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:RecentChanges
  */
-( function ( mw, $ ) {
+( function () {
        var rc, $checkboxes, $select;
 
        /**
@@ -35,4 +35,4 @@
 
        module.exports = rc;
 
-}( mediaWiki, jQuery ) );
+}() );
index cad9db0..e9b0e6a 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:RevisionDelete
  */
-( function ( mw, $ ) {
+( function () {
        var colonSeparator = mw.message( 'colon-separator' ).text(),
                summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
                summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
@@ -26,4 +26,4 @@
                $wpReason.byteLimit( summaryByteLimit, filterFn );
        }
 
-}( mediaWiki, jQuery ) );
+}() );
index 648bf67..8e6d160 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
 
        var api = new mw.Api(),
                pageUrl = new mw.Uri(),
@@ -75,4 +75,4 @@
                } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index e809f2e..f0bc495 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:Search
  */
-( function ( mw, $ ) {
+( function () {
        $( function () {
                var $checkboxes, $headerLinks, updateHeaderLinks, searchWidget;
 
@@ -57,4 +57,4 @@
 
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index e3cf598..e8eb870 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:Undelete
  */
-( function ( mw, $ ) {
+( function () {
        $( function () {
                var summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
                        summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
@@ -20,4 +20,4 @@
                        mw.widgets.visibleByteLimit( wpComment, summaryByteLimit );
                }
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 0886f8c..7783ff7 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:UnwatchedPages
  */
-( function ( mw, $ ) {
+( function () {
        $( function () {
                $( 'a.mw-watch-link' ).click( function ( e ) {
                        var promise,
@@ -46,4 +46,4 @@
                        e.preventDefault();
                } );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index da54ad2..bfb4c5e 100644 (file)
@@ -8,7 +8,7 @@
 
 /* global Uint8Array */
 
-( function ( mw, $ ) {
+( function () {
        var uploadWarning, uploadTemplatePreview,
                ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
                $license = $( '#wpLicense' );
                $( '.mw-editTools' ).attr( 'tabindex', '0' );
                setEditTabindex( '-1' );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 8a61afb..777f5e9 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for signup form.
  */
-( function ( mw, $ ) {
+( function () {
        // When sending password by email, hide the password input fields.
        $( function () {
                // Always required if checked, otherwise it depends, so we use the original
                passwordChecker = new mw.htmlform.Checker( $passwordInput, checkPassword );
                passwordChecker.attach( $usernameInput.add( $emailInput ).add( $realNameInput ) );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 487e63a..a4f5d1a 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:UserRights
  */
-( function ( mw, $ ) {
+( function () {
        var convertmessagebox = require( 'mediawiki.notification.convertmessagebox' ),
                summaryCodePointLimit = mw.config.get( 'wgCommentCodePointLimit' ),
                summaryByteLimit = mw.config.get( 'wgCommentByteLimit' ),
@@ -22,4 +22,4 @@
                $wpReason.byteLimit( summaryByteLimit );
        }
 
-}( mediaWiki, jQuery ) );
+}() );
index 6b25327..f4e7b89 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:Watchlist
  */
-( function ( $ ) {
+( function () {
        $( function () {
                $( '.mw-changeslist-line-watched .mw-title a' ).on( 'click', function () {
                        $( this )
@@ -9,4 +9,4 @@
                                .removeClass( 'mw-changeslist-line-watched' );
                } );
        } );
-}( jQuery ) );
+}() );
index 565ed2c..b9be51f 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * JavaScript for Special:Watchlist
  */
-( function ( mw, $, OO ) {
+( function () {
        $( function () {
                var api = new mw.Api(), $progressBar, $resetForm = $( '#mw-watchlist-resetbutton' );
 
                                        $watchlistLine = $unwatchLink.closest( 'li, table' )
                                                .find( '[data-target-page]' ),
                                        pageTitle = $watchlistLine.data( 'targetPage' ),
-                                       isTalk = mw.Title.newFromText( pageTitle ).getNamespaceId() % 2 === 1;
+                                       isTalk = mw.Title.newFromText( pageTitle ).isTalkPage();
 
                                // Utility function for looping through each watchlist line that matches
                                // a certain page or its associated page (e.g. Talk)
                                function forEachMatchingTitle( title, callback ) {
 
                                        var titleObj = mw.Title.newFromText( title ),
-                                               pageNamespaceId = titleObj.getNamespaceId(),
-                                               isTalk = pageNamespaceId % 2 === 1,
-                                               associatedTitle = mw.Title.makeTitle( isTalk ? pageNamespaceId - 1 : pageNamespaceId + 1,
-                                                       titleObj.getMainText() ).getPrefixedText();
+                                               associatedTitleObj = titleObj.isTalkPage() ? titleObj.getSubjectPage() : titleObj.getTalkPage(),
+                                               associatedTitle = associatedTitleObj.getPrefixedText();
                                        $( '.mw-changeslist-line' ).each( function () {
                                                var $this = $( this ), $row, $unwatchLink;
 
                }
        } );
 
-}( mediaWiki, jQuery, OO )
-);
+}() );
index 84e146a..e9b2c9d 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        'use strict';
 
        // Catch exceptions to avoid fatal in Chrome's "Block data storage" mode
@@ -91,4 +91,4 @@
         */
        mw.storage.session = new SafeStorage( sessionStorage );
 
-}( mediaWiki ) );
+}() );
index 4a3157c..4cee91c 100644 (file)
@@ -2,7 +2,7 @@
  * @class mw.template
  * @singleton
  */
-( function ( mw, $ ) {
+( function () {
        var compiledTemplates = {},
                compilers = {};
 
                }
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index c3139a2..2b3e8bb 100644 (file)
@@ -1,5 +1,5 @@
 /* global Mustache */
-( function ( mw, $ ) {
+( function () {
        // Register mustache compiler
        mw.template.registerCompiler( 'mustache', {
                compile: function ( src ) {
@@ -32,4 +32,4 @@
                }
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 3ec0a1f..2418d53 100644 (file)
@@ -1,4 +1,4 @@
-mediaWiki.template.registerCompiler( 'regexp', {
+mw.template.registerCompiler( 'regexp', {
        compile: function ( src ) {
                return {
                        render: function () {
index 4c201a6..5781d88 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        // Table of contents toggle
@@ -58,4 +58,4 @@
                } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 827ef01..be49d26 100644 (file)
@@ -4,7 +4,7 @@
  * @class mw.toolbar
  * @singleton
  */
-( function ( mw, $ ) {
+( function () {
        var toolbar, isReady, $toolbar, queue, slice, $currentFocused;
 
        /**
                } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 5e96485..e41ed58 100644 (file)
@@ -3,7 +3,7 @@
  * @singleton
  */
 /* global Uint16Array */
-( function ( mw, $ ) {
+( function () {
        var userInfoPromise, pageviewRandomId;
 
        /**
         */
        mw.log.deprecate( mw.user, 'stickyRandomId', mw.user.getPageviewToken, 'Please use getPageviewToken instead' );
 
-}( mediaWiki, jQuery ) );
+}() );
index 43f0552..78fb1ea 100644 (file)
@@ -1,7 +1,7 @@
 /*!
  * Add autocomplete suggestions for names of registered users.
  */
-( function ( mw, $ ) {
+( function () {
        var api, config;
 
        config = {
@@ -39,4 +39,4 @@
        $( function () {
                $( '.mw-autocomplete-user' ).suggestions( config );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index ca0c303..69f6961 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        var util;
                 *         e.preventDefault();
                 *     } );
                 *
-                * @param {string} portlet ID of the target portlet ( 'p-cactions' or 'p-personal' etc.)
+                * @param {string} portletId ID of the target portlet (e.g. 'p-cactions' or 'p-personal')
                 * @param {string} href Link URL
                 * @param {string} text Link text
-                * @param {string} [id] ID of the new item, should be unique and preferably have
-                *  the appropriate prefix ( 'ca-', 'pt-', 'n-' or 't-' )
+                * @param {string} [id] ID of the list item, should be unique and preferably have
+                *  the appropriate prefix ('ca-', 'pt-', 'n-' or 't-')
                 * @param {string} [tooltip] Text to show when hovering over the link, without accesskey suffix
-                * @param {string} [accesskey] Access key to activate this link (one character, try
-                *  to avoid conflicts. Use `$( '[accesskey=x]' ).get()` in the console to
+                * @param {string} [accesskey] Access key to activate this link. One character only,
+                *  avoid conflicts with other links. Use `$( '[accesskey=x]' )` in the console to
                 *  see if 'x' is already used.
-                * @param {HTMLElement|jQuery|string} [nextnode] Element or jQuery-selector string to the item that
-                *  the new item should be added before, should be another item in the same
-                *  list, it will be ignored otherwise
-                *
-                * @return {HTMLElement|null} The added element (a ListItem or Anchor element,
-                * depending on the skin) or null if no element was added to the document.
+                * @param {HTMLElement|jQuery|string} [nextnode] Element that the new item should be added before.
+                *  Must be another item in the same list, it will be ignored otherwise.
+                *  Can be specified as DOM reference, as jQuery object, or as CSS selector string.
+                * @return {HTMLElement|null} The added list item, or null if no element was added.
                 */
-               addPortletLink: function ( portlet, href, text, id, tooltip, accesskey, nextnode ) {
-                       var $item, $link, $portlet, $ul;
+               addPortletLink: function ( portletId, href, text, id, tooltip, accesskey, nextnode ) {
+                       var item, link, $portlet, portlet, portletDiv, ul, next;
 
-                       // Check if there's at least 3 arguments to prevent a TypeError
-                       if ( arguments.length < 3 ) {
+                       if ( !portletId ) {
+                               // Avoid confusing id="undefined" lookup
                                return null;
                        }
-                       // Setup the anchor tag
-                       $link = $( '<a>' ).attr( 'href', href ).text( text );
-                       if ( tooltip ) {
-                               $link.attr( 'title', tooltip );
-                       }
 
-                       // Select the specified portlet
-                       $portlet = $( '#' + portlet );
-                       if ( $portlet.length === 0 ) {
+                       portlet = document.getElementById( portletId );
+                       if ( !portlet ) {
+                               // Invalid portlet ID
                                return null;
                        }
-                       // Select the first (most likely only) unordered list inside the portlet
-                       $ul = $portlet.find( 'ul' ).eq( 0 );
-
-                       // If it didn't have an unordered list yet, create it
-                       if ( $ul.length === 0 ) {
-
-                               $ul = $( '<ul>' );
 
-                               // If there's no <div> inside, append it to the portlet directly
-                               if ( $portlet.find( 'div:first' ).length === 0 ) {
-                                       $portlet.append( $ul );
-                               } else {
-                                       // otherwise if there's a div (such as div.body or div.pBody)
-                                       // append the <ul> to last (most likely only) div
-                                       $portlet.find( 'div' ).eq( -1 ).append( $ul );
-                               }
+                       // Setup the anchor tag and set any the properties
+                       link = document.createElement( 'a' );
+                       link.href = href;
+                       link.textContent = text;
+                       if ( tooltip ) {
+                               link.title = tooltip;
                        }
-                       // Just in case..
-                       if ( $ul.length === 0 ) {
-                               return null;
+                       if ( accesskey ) {
+                               link.accessKey = accesskey;
                        }
 
                        // Unhide portlet if it was hidden before
+                       $portlet = $( portlet );
                        $portlet.removeClass( 'emptyPortlet' );
 
-                       // Wrap the anchor tag in a list item (and a span if $portlet is a Vector tab)
-                       // and back up the selector to the list item
+                       // Setup the list item (and a span if $portlet is a Vector tab)
                        if ( $portlet.hasClass( 'vectorTabs' ) ) {
-                               $item = $link.wrap( '<li><span></span></li>' ).parent().parent();
+                               item = $( '<li>' ).append( $( '<span>' ).append( link )[ 0 ] )[ 0 ];
                        } else {
-                               $item = $link.wrap( '<li></li>' ).parent();
+                               item = $( '<li>' ).append( link )[ 0 ];
                        }
-
-                       // Implement the properties passed to the function
                        if ( id ) {
-                               $item.attr( 'id', id );
+                               item.id = id;
                        }
 
-                       if ( accesskey ) {
-                               $link.attr( 'accesskey', accesskey );
-                       }
-
-                       if ( tooltip ) {
-                               $link.attr( 'title', tooltip );
+                       // Select the first (most likely only) unordered list inside the portlet
+                       ul = portlet.querySelector( 'ul' );
+                       if ( !ul ) {
+                               // If it didn't have an unordered list yet, create one
+                               ul = document.createElement( 'ul' );
+                               portletDiv = portlet.querySelector( 'div' );
+                               if ( portletDiv ) {
+                                       // Support: Legacy skins have a div (such as div.body or div.pBody).
+                                       // Append the <ul> to that.
+                                       portletDiv.appendChild( ul );
+                               } else {
+                                       // Append it to the portlet directly
+                                       portlet.appendChild( ul );
+                               }
                        }
 
-                       if ( nextnode ) {
-                               // Case: nextnode is a DOM element (was the only option before MW 1.17, in wikibits.js)
-                               // Case: nextnode is a CSS selector for jQuery
-                               if ( nextnode.nodeType || typeof nextnode === 'string' ) {
-                                       nextnode = $ul.find( nextnode );
-                               } else if ( !nextnode.jquery ) {
-                                       // Error: Invalid nextnode
-                                       nextnode = undefined;
-                               }
-                               if ( nextnode && ( nextnode.length !== 1 || nextnode[ 0 ].parentNode !== $ul[ 0 ] ) ) {
-                                       // Error: nextnode must resolve to a single node
-                                       // Error: nextnode must have the associated <ul> as its parent
-                                       nextnode = undefined;
+                       if ( nextnode && ( typeof nextnode === 'string' || nextnode.nodeType || nextnode.jquery ) ) {
+                               nextnode = $( ul ).find( nextnode );
+                               if ( nextnode.length === 1 && nextnode[ 0 ].parentNode === ul ) {
+                                       // Insertion point: Before nextnode
+                                       nextnode.before( item );
+                                       next = true;
                                }
+                               // Else: Invalid nextnode value (no match, more than one match, or not a direct child)
+                               // Else: Invalid nextnode type
                        }
 
-                       // Case: nextnode is a jQuery-wrapped DOM element
-                       if ( nextnode ) {
-                               nextnode.before( $item );
-                       } else {
-                               // Fallback (this is the default behavior)
-                               $ul.append( $item );
+                       if ( !next ) {
+                               // Insertion point: End of list (default)
+                               ul.appendChild( item );
                        }
 
                        // Update tooltip for the access key after inserting into DOM
                        // to get a localized access key label (T69946).
                        if ( accesskey ) {
-                               $link.updateTooltipAccessKeys();
+                               $( link ).updateTooltipAccessKeys();
                        }
 
-                       return $item[ 0 ];
+                       return item;
                },
 
                /**
        mw.util = util;
        module.exports = util;
 
-}( mediaWiki, jQuery ) );
+}() );
index b453ac8..45cf597 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        /**
@@ -98,4 +98,4 @@
        };
 
        mw.viewport = viewport;
-}( mediaWiki, jQuery ) );
+}() );
index bac0674..11bac71 100644 (file)
@@ -1,7 +1,8 @@
-( function ( mw, document ) {
+( function () {
        var hidden, visibilityChange,
                nextVisibleTimeoutId = 0,
                activeTimeouts = {},
+               document = window.document,
                init = function ( overrideDoc ) {
                        if ( overrideDoc !== undefined ) {
                                document = overrideDoc;
                module.exports.setDocument = init;
        }
 
-}( mediaWiki, document ) );
+}() );
index fa05991..4c3d8d4 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $, mw ) {
+( function () {
 
        /**
         * CalendarWidget displays a calendar that can be used to select a date. It
                return this;
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index 038af95..d8ec5b5 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable no-restricted-properties */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Provides various methods needed for formatting dates and times.
                };
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index 77271f7..21aecd6 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $, mw ) {
+( function () {
 
        /**
         * DateTimeInputWidgets can be used to input a date, a time, or a date and
                this.focus();
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index f8f2642..370a19f 100644 (file)
@@ -83,7 +83,7 @@
                border: 0;
                border-radius: @border-radius-base;
                // Provide more top padding due to border not being part of the calculation
-               padding-top: 10 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
+               padding-top: 10 / @ooui-font-size-browser / @ooui-font-size-base;
                padding-bottom: @padding-bottom-base;
                box-shadow: none;
                font-size: inherit;
index 926c915..e1d4672 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable no-restricted-properties */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Provides various methods needed for formatting dates and times. This
                return ret;
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index b0b7d60..35d4365 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable no-restricted-properties */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Provides various methods needed for formatting dates and times. This
                return ret;
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index 2fd1993..58a5bc3 100644 (file)
@@ -33,8 +33,8 @@
 }
 
 // Variables taken from OOUI's WikimediaUI theme, see its common.less for further explanations
-@oo-ui-font-size-browser: 16; // assumed browser default of `16px`
-@oo-ui-font-size-base: 0.875em; // equals `14px` at browser default of `16px`
+@ooui-font-size-browser: 16; // assumed browser default of `16px`
+@ooui-font-size-base: 0.875em; // equals `14px` at browser default of `16px`
 
 @background-color-base: #fff;
 @background-color-base--hover: #eaecf0;
 @color-erroneous: #d33;
 
 @min-size-indicator: 12px;
-@size-base: 32 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@size-icon: 24 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@size-indicator: 12 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
+@size-base: 32 / @ooui-font-size-browser / @ooui-font-size-base;
+@size-icon: 24 / @ooui-font-size-browser / @ooui-font-size-base;
+@size-indicator: 12 / @ooui-font-size-browser / @ooui-font-size-base;
 @max-width-base: 50em;
 @max-width-input: @max-width-base;
 
 @padding-input-text: @padding-top-base @padding-horizontal-input-text @padding-bottom-base;
-@padding-horizontal-base: 12 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@padding-horizontal-input-text: 8 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@padding-top-base: 8 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@padding-bottom-base: 7 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@padding-start-input-text-icon: 6 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@padding-start-input-text-icon-label: 32 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
+@padding-horizontal-base: 12 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-horizontal-input-text: 8 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-top-base: 8 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-bottom-base: 7 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-start-input-text-icon: 6 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-start-input-text-icon-label: 32 / @ooui-font-size-browser / @ooui-font-size-base;
 
 @border-base: 1px solid #a2a9b1;
 @border-color-base--disabled: #c8ccd1;
@@ -75,7 +75,7 @@
 @box-shadow-widget: inset 0 0 0 1px transparent;
 @box-shadow-erroneous--focus: inset 0 0 0 1px @color-erroneous;
 
-@line-height-widget-singleline: 15 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
+@line-height-widget-singleline: 15 / @ooui-font-size-browser / @ooui-font-size-base;
 
 @text-shadow-base: 0 1px 1px @color-base--inverted; // 'coined' effect
 @text-shadow-base--disabled: @text-shadow-base;
index aab1e7c..63da95a 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
 
        var byteLength = require( 'mediawiki.String' ).byteLength,
                codePointLength = require( 'mediawiki.String' ).codePointLength;
@@ -63,4 +63,4 @@
                textInputWidget.$input.codePointLimit( limit );
        };
 
-}( mediaWiki ) );
+}() );
index dd07b92..8f8ef53 100644 (file)
@@ -3,7 +3,7 @@
  *
  * @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * API Results Provider object.
        mw.widgets.APIResultsProvider.prototype.setAjaxSettings = function ( settings ) {
                this.ajaxSettings = settings;
        };
-}( jQuery, mediaWiki ) );
+}() );
index 3bc1d51..86103d1 100644 (file)
@@ -3,7 +3,7 @@
  *
  * @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * API Results Queue object.
        mw.widgets.APIResultsQueue.prototype.getThreshold = function () {
                return this.threshold;
        };
-}( jQuery, mediaWiki ) );
+}() );
index d767109..23ee2c0 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * MediaWiki media resource provider.
                        this.apiurl !== undefined ||
                        this.scriptDirUrl !== undefined;
        };
-}( jQuery, mediaWiki ) );
+}() );
index 34fa44b..81cc217 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * MediaWiki media resource queue.
@@ -65,4 +65,4 @@
        mw.widgets.MediaResourceQueue.prototype.getMaxHeight = function () {
                return this.maxHeight;
        };
-}( jQuery, mediaWiki ) );
+}() );
index 7607e84..aaa5da5 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Creates an mw.widgets.MediaResultWidget object.
        mw.widgets.MediaResultWidget.prototype.hasSrc = function () {
                return !!this.src;
        };
-}( jQuery, mediaWiki ) );
+}() );
index a46d911..47df5c0 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * MediaWiki media search provider.
@@ -66,4 +66,4 @@
        mw.widgets.MediaSearchProvider.prototype.isValid = function () {
                return this.getUserParams().gsrsearch && mw.widgets.MediaSearchProvider.super.prototype.isValid.call( this );
        };
-}( jQuery, mediaWiki ) );
+}() );
index 3639525..bf83395 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( mw ) {
+( function () {
 
        /**
         * MediaWiki media resource queue.
@@ -79,4 +79,4 @@
        mw.widgets.MediaSearchQueue.prototype.getSearchQuery = function () {
                return this.getParams().gsrsearch;
        };
-}( mediaWiki ) );
+}() );
index 08266f0..9fc7edb 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Creates an mw.widgets.MediaSearchWidget object.
        mw.widgets.MediaSearchWidget.prototype.getLang = function () {
                return this.lang;
        };
-}( jQuery, mediaWiki ) );
+}() );
index b91617e..94aa3b9 100644 (file)
@@ -5,7 +5,7 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 /* global moment */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Creates an mw.widgets.CalendarWidget object.
                return this;
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index a71b3d1..54ddca7 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
        var hasOwn = Object.prototype.hasOwnProperty,
                NS_CATEGORY = mw.config.get( 'wgNamespaceIds' ).category;
 
                /** Search only parent categories */
                ParentCategories: 4
        };
-}( jQuery, mediaWiki ) );
+}() );
index 77c2c35..a15337c 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        var hasOwn = Object.prototype.hasOwnProperty;
 
        };
 
        /**
-        * Category selector capsule item widget. Extends OO.ui.CapsuleItemWidget with the ability to link
+        * Category selector tag item widget. Extends OO.ui.TagItemWidget with the ability to link
         * to the given page, and to show its existence status (i.e., whether it is a redlink).
         *
         * @class mw.widgets.CategoryTagItemWidget
                                .addClass( 'new' );
                }
        };
-
-       // For backwards compatibility. See T183299.
-       mw.widgets.CategoryCapsuleItemWidget = mw.widgets.CategoryTagItemWidget;
-}( jQuery, mediaWiki ) );
+}() );
index 64b7592..01165ca 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $, mw ) {
+( function () {
        /**
         * A JavaScript version of CheckMatrixWidget.
         *
                        } );
                }
        };
-}( jQuery, mediaWiki ) );
+}() );
index 9edd0bd..9bfe87d 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Namespace input widget. Displays a dropdown box with the choice of available namespaces, plus
                return this;
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index a01fbde..2c4044d 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Like TitleInputWidget, but the namespace has to be input through a separate dropdown field.
                return this;
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index 2265132..c7502da 100644 (file)
@@ -5,7 +5,7 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 /* global moment */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Creates an mw.widgets.DateInputWidget object.
                }
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index 74b5abc..3758bd7 100644 (file)
@@ -6,8 +6,8 @@
  */
 
 // Variables taken from OOUI's WikimediaUI theme
-@oo-ui-font-size-browser: 16; // assumed browser default of `16px`
-@oo-ui-font-size-base: 0.8em; // equals `12.8px` at browser default of `16px`
+@ooui-font-size-browser: 16; // assumed browser default of `16px`
+@ooui-font-size-base: 0.875em; // equals `14px` at browser default of `16px`
 
 @background-color-base: #fff;
 
 @border-radius-base: 2px;
 
 @padding-input-text: @padding-top-base @padding-horizontal-input-text @padding-bottom-base;
-@padding-horizontal-input-text: 8 / @oo-ui-font-size-browser / @oo-ui-font-size-base;
-@padding-top-base: 8 / @oo-ui-font-size-browser / @oo-ui-font-size-base; // equals `0.625em`≈`8px`
-@padding-bottom-base: 7 / @oo-ui-font-size-browser / @oo-ui-font-size-base; // equals `0.547em`≈`7px`
+@padding-horizontal-input-text: 8 / @ooui-font-size-browser / @ooui-font-size-base; // equals `0.57142857em`≈`7px`
+@padding-top-base: 8 / @ooui-font-size-browser / @ooui-font-size-base;
+@padding-bottom-base: 7 / @ooui-font-size-browser / @ooui-font-size-base; // equals `0.5em`≈`7px`
 
 @box-shadow-widget: inset 0 0 0 1px transparent;
 @box-shadow-widget--focus: inset 0 0 0 1px #36c;
 
-@line-height-widget-singleline: 1.172em; // Firefox needs a value, Chrome the unit; equals `15px` at base `font-size: 12.8px`
+@line-height-widget-singleline: 15 / @ooui-font-size-browser / @ooui-font-size-base; // equals `1.07142857em`≈`15px`; Firefox needs a value, Chrome the unit;
 
-@transition-ease-out-sine-medium: 200ms cubic-bezier( 0.39, 0.575, 0.565, 1 );
+@transition-ease-medium: @transition-duration-medium; // `ease` is the initial value
+@transition-duration-medium: 250ms;
 
 // Mixins taken from OOUI
 .oo-ui-box-sizing( @type: border-box ) {
@@ -93,8 +94,8 @@
                .mw-widget-dateInputWidget-handle {
                        box-shadow: @box-shadow-widget; // necessary for smooth transition
                        .oo-ui-transition(
-                               border-color @transition-ease-out-sine-medium,
-                               box-shadow @transition-ease-out-sine-medium
+                               border-color @transition-ease-medium,
+                               box-shadow @transition-ease-medium
                        );
 
                        &:hover {
index 54d4f2a..26f347a 100644 (file)
@@ -5,7 +5,7 @@
  * @license The MIT License (MIT); see LICENSE.txt
  */
 /* global moment */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Creates a mw.widgets.ExpiryWidget object.
                return this.relativeField.getValue();
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index 08d5b87..cca950f 100644 (file)
@@ -5,7 +5,7 @@
  * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Namespace input widget. Displays a dropdown box with the choice of available namespaces.
@@ -69,4 +69,4 @@
                return options;
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index 75bf891..18cd68a 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Creates a mw.widgets.SearchInputWidget object.
                // tracking purposes
                promise.done( function ( data, jqXHR ) {
                        self.requestType = jqXHR.getResponseHeader( 'X-OpenSearch-Type' );
+                       self.searchId = jqXHR.getResponseHeader( 'X-Search-ID' );
                } );
 
                return promise;
                        data: response || {},
                        metadata: {
                                type: this.requestType || 'unknown',
+                               searchId: this.searchId || null,
                                query: this.getQueryValue()
                        }
                };
                this.requestType = undefined;
+               this.searchId = undefined;
 
                return resp;
        };
                        action: 'impression-results',
                        numberOfResults: items.length,
                        resultSetType: data.metadata.type,
+                       searchId: data.metadata.searchId,
                        query: data.metadata.query,
                        inputLocation: this.dataLocation || 'header'
                } );
                return items;
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index 436ca2f..f61255a 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2017 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Select with input widget. Displays an OO.ui.TextInputWidget along with
                this.emit( 'change', this.getValue() );
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index 7c750f0..6484404 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2018 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * RadioSelectInputWidget and a TextInputWidget to set minimum or maximum byte size
                this.textinput.restorePreInfuseState( state.textinput );
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index cdcf5a2..bc6bc25 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2016 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw, OO ) {
+( function () {
 
        /**
         * Accepts a stashed file and displays the information for purposes of
 
                return $.Deferred().reject( 'No filekey' );
        };
-}( jQuery, mediaWiki, OO ) );
+}() );
index 4b1109b..fa8b967 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        var trimByteLength = require( 'mediawiki.String' ).trimByteLength;
 
                } ).newVal;
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index 76d4bfb..661f9ae 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Creates a mw.widgets.TitleOptionWidget object.
 
        OO.inheritClass( mw.widgets.TitleOptionWidget, OO.ui.MenuOptionWidget );
 
-}( jQuery, mediaWiki ) );
+}() );
index cd937f7..b9bd1e0 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( mw ) {
+( function () {
 
        /**
         * Creates an mw.widgets.TitleSearchWidget object.
                return response.query || {};
        };
 
-}( mediaWiki ) );
+}() );
index 44a7d61..c256f1f 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
        var hasOwn = Object.prototype.hasOwnProperty;
 
        /**
                return !!this.getMWTitle();
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index be3c10e..5540c64 100644 (file)
@@ -73,7 +73,8 @@
                }
        }
 
-       &:not( &-withDescriptions ) {
+       /* TODO: Should be able to use :not( &-withDescriptions ) but LESS version is buggy (T204816) */
+       &:not( .mw-widget-titleWidget-menu-withDescriptions ) {
                .mw-widget-titleOptionWidget-description {
                        display: none;
                }
index 2b3a59f..9c3772d 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2011-2015 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * Creates a mw.widgets.UserInputWidget object.
                return items;
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index f0ad056..e37da8b 100644 (file)
@@ -4,7 +4,7 @@
  * @copyright 2017 MediaWiki Widgets Team and others; see AUTHORS.txt
  * @license The MIT License (MIT); see LICENSE.txt
  */
-( function ( $, mw ) {
+( function () {
 
        /**
         * UsersMultiselectWidget can be used to input list of users in a single
                this.input.setValue( '' );
        };
 
-}( jQuery, mediaWiki ) );
+}() );
index bafb86a..04658b9 100644 (file)
@@ -1,6 +1,6 @@
-/* global mediaWiki, moment */
+/* global moment */
 
-( function ( mw ) {
+( function () {
        // HACK: Overwrite moment's i18n with MediaWiki's for the current language so that
        // wgTranslateNumerals is respected.
        moment.updateLocale( moment.locale(), {
@@ -41,4 +41,4 @@
                        return s;
                }
        } );
-}( mediaWiki ) );
+}() );
index 0c65512..14c9740 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        var isMobile;
        // Connect OOUI to MediaWiki's localisation system
        OO.ui.getUserLanguages = mw.language.getFallbackLanguageChain;
@@ -14,4 +14,4 @@
                }
                return isMobile;
        };
-}( mediaWiki ) );
+}() );
index ba8869b..fee69c0 100644 (file)
@@ -13,7 +13,6 @@
        'use strict';
 
        var mw, StringSet, log,
-               hasOwn = Object.prototype.hasOwnProperty,
                trackQueue = [];
 
        /**
 
        function defineFallbacks() {
                // <https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set>
-               StringSet = window.Set || ( function () {
-                       /**
-                        * @private
-                        * @class
-                        */
-                       function StringSet() {
-                               this.set = Object.create( null );
-                       }
-                       StringSet.prototype.add = function ( value ) {
-                               this.set[ value ] = true;
+               /**
+                * @private
+                * @class
+                */
+               StringSet = window.Set || function StringSet() {
+                       var set = Object.create( null );
+                       this.add = function ( value ) {
+                               set[ value ] = true;
                        };
-                       StringSet.prototype.has = function ( value ) {
-                               return value in this.set;
+                       this.has = function ( value ) {
+                               return value in set;
                        };
-                       return StringSet;
-               }() );
+               };
        }
 
        /**
 
        defineFallbacks();
 
-       /* eslint-disable no-console */
        log = ( function () {
                /**
                 * Write a verbose message to the browser's console in debug mode.
                 *
                 * @param {...string} msg Messages to output to console
                 */
-               log.warn = console && console.warn && Function.prototype.bind ?
+               log.warn = console && console.warn ?
                        Function.prototype.bind.call( console.warn, console ) :
                        function () {};
 
                 * @since 1.26
                 * @param {...Mixed} msg Messages to output to console
                 */
-               log.error = console && console.error && Function.prototype.bind ?
+               log.error = console && console.error ?
                        Function.prototype.bind.call( console.error, console ) :
                        function () {};
 
                 * @param {string} [logName=key] Optional custom name for the feature.
                 *  This is used instead of `key` in the message and `mw.deprecate` tracking.
                 */
-               log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
-                       obj[ key ] = val;
-               } : function ( obj, key, val, msg, logName ) {
+               log.deprecate = function ( obj, key, val, msg, logName ) {
                        var stacks;
                        function maybeLog() {
                                var name,
 
                return log;
        }() );
-       /* eslint-enable no-console */
 
        /**
         * @class mw
                         *    The contents are then stashed in the registry via mw.loader#implement.
                         * - `loaded`:
                         *    The module has been loaded from the server and stashed via mw.loader#implement.
-                        *    If the module has no more dependencies in-flight, the module will be executed
-                        *    immediately. Otherwise execution is deferred, controlled via #handlePending.
+                        *    Once the module has no more dependencies in-flight, the module will be executed,
+                        *    controlled via #requestPropagation and #doPropagation.
                         * - `executing`:
                         *    The module is being executed.
                         * - `ready`:
                         * @property
                         * @private
                         */
-                       var registry = {},
+                       var registry = Object.create( null ),
                                // Mapping of sources, keyed by source-id, values are strings.
                                //
                                // Format:
                                //         'sourceId': 'http://example.org/w/load.php'
                                //     }
                                //
-                               sources = {},
+                               sources = Object.create( null ),
 
                                // For queueModuleScript()
                                handlingPendingRequests = false,
                                /**
                                 * List of callback jobs waiting for modules to be ready.
                                 *
-                                * Jobs are created by #enqueue() and run by #handlePending().
-                                *
+                                * Jobs are created by #enqueue() and run by #doPropagation().
                                 * Typically when a job is created for a module, the job's dependencies contain
                                 * both the required module and all its recursive dependencies.
                                 *
                                 */
                                jobs = [],
 
+                               // For #requestPropagation() and #doPropagation()
+                               willPropagate = false,
+                               errorModules = [],
+
                                /**
                                 * @private
                                 * @property {Array} baseModules
                        }
 
                        /**
-                        * A module has entered state 'ready', 'error', or 'missing'. Automatically update
-                        * pending jobs and modules that depend upon this module. If the given module failed,
-                        * propagate the 'error' state up the dependency tree. Otherwise, go ahead and execute
-                        * all jobs/modules now having their dependencies satisfied.
+                        * Handle propagation of module state changes and reactions to them.
                         *
-                        * Jobs that depend on a failed module, will have their error callback ran (if any).
+                        * - When a module reaches a failure state, this should be propagated to
+                        *   modules that depend on the failed module.
+                        * - When a module reaches a final state, pending job callbacks for the
+                        *   module from mw.loader.using() should be called.
+                        * - When a module reaches the 'ready' state from #execute(), consider
+                        *   executing dependant modules now having their dependencies satisfied.
+                        * - When a module reaches the 'loaded' state from mw.loader.implement,
+                        *   consider executing it, if it has no unsatisfied dependencies.
                         *
                         * @private
-                        * @param {string} module Name of module that entered one of the states 'ready', 'error', or 'missing'.
                         */
-                       function handlePending( module ) {
-                               var j, job, hasErrors, m, stateChange, fromBaseModule;
-
-                               if ( registry[ module ].state === 'error' || registry[ module ].state === 'missing' ) {
-                                       fromBaseModule = baseModules.indexOf( module ) !== -1;
-                                       // If the current module failed, mark all dependent modules also as failed.
-                                       // Iterate until steady-state to propagate the error state upwards in the
-                                       // dependency tree.
-                                       do {
-                                               stateChange = false;
-                                               for ( m in registry ) {
-                                                       if ( registry[ m ].state !== 'error' && registry[ m ].state !== 'missing' ) {
-                                                               // Always propagate errors from base modules to regular modules (implicit dependency).
-                                                               // Between base modules or regular modules, consider direct dependencies only.
-                                                               if (
-                                                                       ( fromBaseModule && baseModules.indexOf( m ) === -1 ) ||
-                                                                       anyFailed( registry[ m ].dependencies )
-                                                               ) {
-                                                                       registry[ m ].state = 'error';
-                                                                       stateChange = true;
+                       function doPropagation() {
+                               var errorModule, baseModuleError, module, i, failed, job,
+                                       didPropagate = true;
+
+                               // Keep going until the last iteration performed no actions.
+                               do {
+                                       didPropagate = false;
+
+                                       // Stage 1: Propagate failures
+                                       while ( errorModules.length ) {
+                                               errorModule = errorModules.shift();
+                                               baseModuleError = baseModules.indexOf( errorModule ) !== -1;
+                                               for ( module in registry ) {
+                                                       if ( registry[ module ].state !== 'error' && registry[ module ].state !== 'missing' ) {
+                                                               if ( baseModuleError && baseModules.indexOf( module ) === -1 ) {
+                                                                       // Propate error from base module to all regular (non-base) modules
+                                                                       registry[ module ].state = 'error';
+                                                                       didPropagate = true;
+                                                               } else if ( registry[ module ].dependencies.indexOf( errorModule ) !== -1 ) {
+                                                                       // Propagate error from dependency to depending module
+                                                                       registry[ module ].state = 'error';
+                                                                       // .. and propagate it further
+                                                                       errorModules.push( module );
+                                                                       didPropagate = true;
                                                                }
                                                        }
                                                }
-                                       } while ( stateChange );
-                               }
+                                       }
 
-                               // Execute all jobs whose dependencies are either all satisfied or contain at least one failed module.
-                               for ( j = 0; j < jobs.length; j++ ) {
-                                       hasErrors = anyFailed( jobs[ j ].dependencies );
-                                       if ( hasErrors || allReady( jobs[ j ].dependencies ) ) {
-                                               // All dependencies satisfied, or some have errors
-                                               job = jobs[ j ];
-                                               jobs.splice( j, 1 );
-                                               j -= 1;
-                                               try {
-                                                       if ( hasErrors ) {
-                                                               if ( typeof job.error === 'function' ) {
-                                                                       job.error( new Error( 'Module ' + module + ' has failed dependencies' ), [ module ] );
-                                                               }
-                                                       } else {
-                                                               if ( typeof job.ready === 'function' ) {
+                                       // Stage 2: Execute 'loaded' modules with no unsatisfied dependencies
+                                       for ( module in registry ) {
+                                               if ( registry[ module ].state === 'loaded' && allWithImplicitReady( module ) ) {
+                                                       // Recursively execute all dependent modules that were already loaded
+                                                       // (waiting for execution) and no longer have unsatisfied dependencies.
+                                                       // Base modules may have dependencies amongst eachother to ensure correct
+                                                       // execution order. Regular modules wait for all base modules.
+                                                       // eslint-disable-next-line no-use-before-define
+                                                       execute( module );
+                                                       didPropagate = true;
+                                               }
+                                       }
+
+                                       // Stage 3: Invoke job callbacks that are no longer blocked
+                                       for ( i = 0; i < jobs.length; i++ ) {
+                                               job = jobs[ i ];
+                                               failed = anyFailed( job.dependencies );
+                                               if ( failed || allReady( job.dependencies ) ) {
+                                                       jobs.splice( i, 1 );
+                                                       i -= 1;
+                                                       try {
+                                                               if ( failed && job.error ) {
+                                                                       job.error( new Error( 'Module has failed dependencies' ), job.dependencies );
+                                                               } else if ( !failed && job.ready ) {
                                                                        job.ready();
                                                                }
+                                                       } catch ( e ) {
+                                                               // A user-defined callback raised an exception.
+                                                               // Swallow it to protect our state machine!
+                                                               mw.trackError( 'resourceloader.exception', {
+                                                                       exception: e,
+                                                                       source: 'load-callback'
+                                                               } );
                                                        }
-                                               } catch ( e ) {
-                                                       // A user-defined callback raised an exception.
-                                                       // Swallow it to protect our state machine!
-                                                       mw.trackError( 'resourceloader.exception', {
-                                                               exception: e,
-                                                               module: module,
-                                                               source: 'load-callback'
-                                                       } );
+                                                       didPropagate = true;
                                                }
                                        }
+                               } while ( didPropagate );
+
+                               willPropagate = false;
+                       }
+
+                       /**
+                        * Request a (debounced) call to doPropagation().
+                        *
+                        * @private
+                        */
+                       function requestPropagation() {
+                               if ( willPropagate ) {
+                                       // Already scheduled, or, we're already in a doPropagation stack.
+                                       return;
                                }
+                               willPropagate = true;
+                               // Yield for two reasons:
+                               // * Allow successive calls to mw.loader.implement() from the same
+                               //   load.php response, or from the same asyncEval() to be in the
+                               //   propagation batch.
+                               // * Allow the browser to breathe between the reception of
+                               //   module source code and the execution of it.
+                               //
+                               // Use a high priority because the user may be waiting for interactions
+                               // to start being possible. But, first provide a moment (up to 'timeout')
+                               // for native input event handling (e.g. scrolling/typing/clicking).
+                               mw.requestIdleCallback( doPropagation, { timeout: 1 } );
+                       }
 
-                               // The current module became 'ready'.
-                               if ( registry[ module ].state === 'ready' ) {
-                                       // Queue it for later syncing to the module store.
-                                       mw.loader.store.add( module );
-                                       // Recursively execute all dependent modules that were already loaded
-                                       // (waiting for execution) and no longer have unsatisfied dependencies.
-                                       for ( m in registry ) {
-                                               // Base modules may have dependencies amongst eachother to ensure correct
-                                               // execution order. Regular modules wait for all base modules.
-                                               if ( registry[ m ].state === 'loaded' && allWithImplicitReady( m ) ) {
-                                                       // eslint-disable-next-line no-use-before-define
-                                                       execute( m );
-                                               }
+                       /**
+                        * Update a module's state in the registry and make sure any neccesary
+                        * propagation will occur. See #doPropagation for more about propagation.
+                        * See #registry for more about how states are used.
+                        *
+                        * @private
+                        * @param {string} module
+                        * @param {string} state
+                        */
+                       function setAndPropagate( module, state ) {
+                               registry[ module ].state = state;
+                               if ( state === 'loaded' || state === 'ready' || state === 'error' || state === 'missing' ) {
+                                       if ( state === 'ready' ) {
+                                               // Queue to later be synced to the local module store.
+                                               mw.loader.store.add( module );
+                                       } else if ( state === 'error' || state === 'missing' ) {
+                                               errorModules.push( module );
                                        }
+                                       requestPropagation();
                                }
                        }
 
                        function sortDependencies( module, resolved, unresolved ) {
                                var i, deps, skip;
 
-                               if ( !hasOwn.call( registry, module ) ) {
+                               if ( !( module in registry ) ) {
                                        throw new Error( 'Unknown dependency: ' + module );
                                }
 
                                        if ( skip() ) {
                                                registry[ module ].skipped = true;
                                                registry[ module ].dependencies = [];
-                                               registry[ module ].state = 'ready';
-                                               handlePending( module );
+                                               setAndPropagate( module, 'ready' );
                                                return;
                                        }
                                }
                        function queueModuleScript( src, moduleName, callback ) {
                                pendingRequests.push( function () {
                                        // Keep in sync with execute()/runScript().
-                                       if ( moduleName !== 'jquery' && hasOwn.call( registry, moduleName ) ) {
+                                       if ( moduleName !== 'jquery' ) {
                                                window.require = mw.loader.require;
                                                window.module = registry[ moduleName ].module;
                                        }
                                                // Private modules must be embedded in the page. Don't bother queuing
                                                // these as the server will deny them anyway (T101806).
                                                if ( registry[ module ].group === 'private' ) {
-                                                       registry[ module ].state = 'error';
-                                                       handlePending( module );
+                                                       setAndPropagate( module, 'error' );
                                                        return;
                                                }
                                                queue.push( module );
                                var key, value, media, i, urls, cssHandle, siteDeps, siteDepErr, runScript,
                                        cssPending = 0;
 
-                               if ( !hasOwn.call( registry, module ) ) {
-                                       throw new Error( 'Module has not been registered yet: ' + module );
-                               }
                                if ( registry[ module ].state !== 'loaded' ) {
                                        throw new Error( 'Module in state "' + registry[ module ].state + '" may not be executed: ' + module );
                                }
                                        script = registry[ module ].script;
                                        markModuleReady = function () {
                                                $CODE.profileScriptEnd();
-                                               registry[ module ].state = 'ready';
-                                               handlePending( module );
+                                               setAndPropagate( module, 'ready' );
                                        };
                                        nestedAddScript = function ( arr, callback, i ) {
                                                // Recursively call queueModuleScript() in its own callback
                                        } catch ( e ) {
                                                // Use mw.track instead of mw.log because these errors are common in production mode
                                                // (e.g. undefined variable), and mw.log is only enabled in debug mode.
-                                               registry[ module ].state = 'error';
+                                               setAndPropagate( module, 'error' );
                                                $CODE.profileScriptEnd();
                                                mw.trackError( 'resourceloader.exception', {
-                                                       exception: e, module:
-                                                       module, source: 'module-execute'
+                                                       exception: e,
+                                                       module: module,
+                                                       source: 'module-execute'
                                                } );
-                                               handlePending( module );
                                        }
                                };
 
                         *  or null if the module does not exist
                         */
                        function getModuleKey( module ) {
-                               return hasOwn.call( registry, module ) ?
-                                       ( module + '@' + registry[ module ].version ) : null;
+                               return module in registry ? ( module + '@' + registry[ module ].version ) : null;
                        }
 
                        /**
                         * @param {string} [skip]
                         */
                        function registerOne( module, version, dependencies, group, source, skip ) {
-                               if ( hasOwn.call( registry, module ) ) {
+                               if ( module in registry ) {
                                        throw new Error( 'module already registered: ' + module );
                                }
                                registry[ module ] = {
                                        // Appends a list of modules from the queue to the batch
                                        for ( q = 0; q < queue.length; q++ ) {
                                                // Only load modules which are registered
-                                               if ( hasOwn.call( registry, queue[ q ] ) && registry[ queue[ q ] ].state === 'registered' ) {
+                                               if ( queue[ q ] in registry && registry[ queue[ q ] ].state === 'registered' ) {
                                                        // Prevent duplicate entries
                                                        if ( batch.indexOf( queue[ q ] ) === -1 ) {
                                                                batch.push( queue[ q ] );
                                addSource: function ( ids ) {
                                        var id;
                                        for ( id in ids ) {
-                                               if ( hasOwn.call( sources, id ) ) {
+                                               if ( id in sources ) {
                                                        throw new Error( 'source already registered: ' + id );
                                                }
                                                sources[ id ] = ids[ id ];
                                                name = split.name,
                                                version = split.version;
                                        // Automatically register module
-                                       if ( !hasOwn.call( registry, name ) ) {
+                                       if ( !( name in registry ) ) {
                                                mw.loader.register( name );
                                        }
                                        // Check for duplicate implementation
                                        registry[ name ].templates = templates || null;
                                        // The module may already have been marked as erroneous
                                        if ( registry[ name ].state !== 'error' && registry[ name ].state !== 'missing' ) {
-                                               registry[ name ].state = 'loaded';
-                                               if ( allWithImplicitReady( name ) ) {
-                                                       execute( name );
-                                               }
+                                               setAndPropagate( name, 'loaded' );
                                        }
                                },
 
                                /**
                                 * Change the state of one or more modules.
                                 *
-                                * @param {Object} modules Object of module name/state pairs
+                                * @param {Object} states Object of module name/state pairs
                                 */
-                               state: function ( modules ) {
+                               state: function ( states ) {
                                        var module, state;
-                                       for ( module in modules ) {
-                                               state = modules[ module ];
-                                               if ( !hasOwn.call( registry, module ) ) {
+                                       for ( module in states ) {
+                                               state = states[ module ];
+                                               if ( !( module in registry ) ) {
                                                        mw.loader.register( module );
                                                }
-                                               registry[ module ].state = state;
-                                               if ( state === 'ready' || state === 'error' || state === 'missing' ) {
-                                                       // Make sure pending modules depending on this one get executed if their
-                                                       // dependencies are now fulfilled!
-                                                       handlePending( module );
-                                               }
+                                               setAndPropagate( module, state );
                                        }
                                },
 
                                 *  in the registry.
                                 */
                                getVersion: function ( module ) {
-                                       return hasOwn.call( registry, module ) ? registry[ module ].version : null;
+                                       return module in registry ? registry[ module ].version : null;
                                },
 
                                /**
                                 *  in the registry.
                                 */
                                getState: function ( module ) {
-                                       return hasOwn.call( registry, module ) ? registry[ module ].state : null;
+                                       return module in registry ? registry[ module ].state : null;
                                },
 
                                /**
index 262eb35..603f4c2 100644 (file)
@@ -105,17 +105,16 @@ abstract class MWHttpRequestTestCase extends PHPUnit\Framework\TestCase {
                $this->assertHasCookie( 'foo', 'bar', $request->getCookieJar() );
 
                $this->markTestIncomplete( 'CookieJar does not handle deletion' );
-               return;
 
-               $request = MWHttpRequest::factory( 'http://httpbin.org/cookies/delete?foo' );
-               $cookieJar = new CookieJar();
-               $cookieJar->setCookie( 'foo', 'bar', [ 'domain' => 'httpbin.org' ] );
-               $cookieJar->setCookie( 'foo2', 'bar2', [ 'domain' => 'httpbin.org' ] );
-               $request->setCookieJar( $cookieJar );
-               $status = $request->execute();
-               $this->assertTrue( $status->isGood() );
-               $this->assertNotHasCookie( 'foo', $request->getCookieJar() );
-               $this->assertHasCookie( 'foo2', 'bar2', $request->getCookieJar() );
+               // $request = MWHttpRequest::factory( 'http://httpbin.org/cookies/delete?foo' );
+               // $cookieJar = new CookieJar();
+               // $cookieJar->setCookie( 'foo', 'bar', [ 'domain' => 'httpbin.org' ] );
+               // $cookieJar->setCookie( 'foo2', 'bar2', [ 'domain' => 'httpbin.org' ] );
+               // $request->setCookieJar( $cookieJar );
+               // $status = $request->execute();
+               // $this->assertTrue( $status->isGood() );
+               // $this->assertNotHasCookie( 'foo', $request->getCookieJar() );
+               // $this->assertHasCookie( 'foo2', 'bar2', $request->getCookieJar() );
        }
 
        public function testGetResponseHeaders() {
index 51fb86d..cc3ef1c 100644 (file)
@@ -830,7 +830,7 @@ class ParserTestRunner {
         * @return ParserTestResult|false false if skipped
         */
        public function runTest( $test ) {
-               wfDebug( __METHOD__.": running {$test['desc']}" );
+               wfDebug( __METHOD__ . ": running {$test['desc']}" );
                $opts = $this->parseOptions( $test['options'] );
                $teardownGuard = $this->perTestSetup( $test );
 
index 3e18370..be4bcab 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 
-require __DIR__.'/../../maintenance/Maintenance.php';
+require __DIR__ . '/../../maintenance/Maintenance.php';
 
 define( 'MW_PARSER_TEST', true );
 
index b151002..88797d7 100644 (file)
@@ -12670,10 +12670,13 @@ parsoid=wt2html
 <p about="#mwt1" typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"hi {{}}"}},"i":0}}]}'>hi {{}}</p>
 !! end
 
+# Ensure we're using a language without variants for this test; even
+# if $wgUsePigLatinVariant is true.  We've picked `de` arbitrarily.
 !! test
 Preprocessor precedence 18: another rightmost wins scenario
 !! options
 parsoid=wt2html
+language=de
 !! wikitext
 {{ -{{{{1|tplarg}}} }} }-
 !! html/php
index 114ad7e..d675e85 100644 (file)
@@ -196,9 +196,17 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
         *
         * @param Title|string|null $title
         * @return WikiPage
-        * @throws MWException
+        * @throws MWException If this test cases's needsDB() method doesn't return true.
+        *         Test cases can use "@group Database" to enable database test support,
+        *         or list the tables under testing in $this->tablesUsed, or override the
+        *         needsDB() method.
         */
        protected function getExistingTestPage( $title = null ) {
+               if ( !$this->needsDB() ) {
+                       throw new MWException( 'When testing which pages, the test cases\'s needsDB()' .
+                               ' method should return true. Use @group Database or $this->tablesUsed.' );
+               }
+
                $title = ( $title === null ) ? 'UTPage' : $title;
                $title = is_string( $title ) ? Title::newFromText( $title ) : $title;
                $page = WikiPage::factory( $title );
@@ -224,9 +232,17 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
         *
         * @param Title|string|null $title
         * @return WikiPage
-        * @throws MWException
+        * @throws MWException If this test cases's needsDB() method doesn't return true.
+        *         Test cases can use "@group Database" to enable database test support,
+        *         or list the tables under testing in $this->tablesUsed, or override the
+        *         needsDB() method.
         */
        protected function getNonexistingTestPage( $title = null ) {
+               if ( !$this->needsDB() ) {
+                       throw new MWException( 'When testing which pages, the test cases\'s needsDB()' .
+                               ' method should return true. Use @group Database or $this->tablesUsed.' );
+               }
+
                $title = ( $title === null ) ? 'UTPage-' . rand( 0, 100000 ) : $title;
                $title = is_string( $title ) ? Title::newFromText( $title ) : $title;
                $page = WikiPage::factory( $title );
@@ -536,6 +552,8 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                        }
                }
 
+               // Re-enable any disabled deprecation warnings
+               MWDebug::clearLog();
                // Restore mw globals
                foreach ( $this->mwGlobals as $key => $value ) {
                        $GLOBALS[$key] = $value;
@@ -1140,6 +1158,10 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
         * @param int|null $namespace Namespace id (name cannot already contain namespace)
         * @param User|null $user If null, static::getTestSysop()->getUser() is used.
         * @return array Title object and page id
+        * @throws MWException If this test cases's needsDB() method doesn't return true.
+        *         Test cases can use "@group Database" to enable database test support,
+        *         or list the tables under testing in $this->tablesUsed, or override the
+        *         needsDB() method.
         */
        protected function insertPage(
                $pageName,
@@ -1147,6 +1169,11 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                $namespace = null,
                User $user = null
        ) {
+               if ( !$this->needsDB() ) {
+                       throw new MWException( 'When testing which pages, the test cases\'s needsDB()' .
+                               ' method should return true. Use @group Database or $this->tablesUsed.' );
+               }
+
                if ( is_string( $pageName ) ) {
                        $title = Title::newFromText( $pageName, $namespace );
                } else {
@@ -1288,52 +1315,6 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                self::$dbSetup = false;
        }
 
-       /**
-        * Prepares the given database connection for usage in the context of usage tests.
-        * This sets up clones database tables and changes the table prefix as appropriate.
-        * If the database connection already has cloned tables, calling this method has no
-        * effect. The tables are not re-cloned or reset in that case.
-        *
-        * @param IMaintainableDatabase $db
-        */
-       protected function prepareConnectionForTesting( IMaintainableDatabase $db ) {
-               if ( !self::$dbSetup ) {
-                       throw new LogicException(
-                               'Cannot use prepareConnectionForTesting()'
-                               . ' if the test case is not defined to use the database!'
-                       );
-               }
-
-               if ( isset( $db->_originalTablePrefix ) ) {
-                       // The DB connection was already prepared for testing.
-                       return;
-               }
-
-               $testPrefix = self::getTestPrefixFor( $db );
-               $oldPrefix = $db->tablePrefix();
-
-               $tablesCloned = self::listTables( $db );
-
-               if ( $oldPrefix === $testPrefix ) {
-                       // The database connection already has the test prefix, but presumably not
-                       // the cloned tables. This is the typical case, since the LBFactory will
-                       // have the prefix set during testing, but LoadBalancers will still return
-                       // connections that don't have the cloned table structure.
-                       $oldPrefix = self::$oldTablePrefix;
-               }
-
-               $dbClone = new CloneDatabase( $db, $tablesCloned, $testPrefix, $oldPrefix );
-               $dbClone->useTemporaryTables( self::$useTemporaryTables );
-
-               $db->_originalTablePrefix = $oldPrefix;
-
-               if ( ( $db->getType() == 'oracle' || !self::$useTemporaryTables ) && self::$reuseDB ) {
-                       throw new LogicException( 'Cannot clone database tables' );
-               } else {
-                       $dbClone->cloneTableStructure();
-               }
-       }
-
        /**
         * Setups a database with cloned tables using the given prefix.
         *
@@ -2291,8 +2272,17 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
         * @param string $summary Optional summary string for the revision
         * @param int $defaultNs Optional namespace id
         * @return array Array as returned by WikiPage::doEditContent()
+        * @throws MWException If this test cases's needsDB() method doesn't return true.
+        *         Test cases can use "@group Database" to enable database test support,
+        *         or list the tables under testing in $this->tablesUsed, or override the
+        *         needsDB() method.
         */
        protected function editPage( $pageName, $text, $summary = '', $defaultNs = NS_MAIN ) {
+               if ( !$this->needsDB() ) {
+                       throw new MWException( 'When testing which pages, the test cases\'s needsDB()' .
+                               ' method should return true. Use @group Database or $this->tablesUsed.' );
+               }
+
                $title = Title::newFromText( $pageName, $defaultNs );
                $page = WikiPage::factory( $title );
 
index d28be7a..c938750 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use MediaWiki\User\UserIdentity;
+use MediaWiki\MediaWikiServices;
 use Wikimedia\TestingAccessWrapper;
 
 /**
@@ -635,8 +636,8 @@ class ActorMigrationTest extends MediaWikiLangTestCase {
                $userIdentity->method( 'getName' )->willReturn( $user->getName() );
                $userIdentity->method( 'getActorId' )->willReturn( 0 );
 
-               list( $cFields, $cCallback ) = CommentStore::newKey( 'rev_comment' )
-                       ->insertWithTempTable( $this->db, '' );
+               list( $cFields, $cCallback ) = MediaWikiServices::getInstance()->getCommentStore()
+                       ->insertWithTempTable( $this->db, 'rev_comment', '' );
                $m = $this->makeMigration( MIGRATION_WRITE_BOTH );
                list( $fields, $callback ) =
                        $m->getInsertValuesWithTempTable( $this->db, 'rev_user', $userIdentity );
index f9b592e..0c5d8e3 100644 (file)
@@ -35,6 +35,7 @@ class CommentStoreTest extends MediaWikiLangTestCase {
         * @return CommentStore
         */
        protected function makeStoreWithKey( $stage, $key ) {
+               $this->hideDeprecated( 'CommentStore::newKey' );
                $store = CommentStore::newKey( $key );
                TestingAccessWrapper::newFromObject( $store )->stage = $stage;
                return $store;
@@ -774,6 +775,7 @@ class CommentStoreTest extends MediaWikiLangTestCase {
        }
 
        public function testNewKey() {
+               $this->hideDeprecated( 'CommentStore::newKey' );
                $this->assertInstanceOf( CommentStore::class, CommentStore::newKey( 'dummy' ) );
        }
 
index 94de088..7ce4d1e 100644 (file)
@@ -215,4 +215,80 @@ class ExtraParserTest extends MediaWikiTestCase {
                $result = $parserOutput->getCategoryLinks();
                $this->assertEmpty( $result );
        }
+
+       /**
+        * @covers Parser::parseLinkParameter
+        * @dataProvider provideParseLinkParameter
+        */
+       public function testParseLinkParameter( $input, $expected, $expectedLinks, $desc ) {
+               $this->parser->startExternalParse( Title::newFromText( __FUNCTION__ ),
+                       $this->options, Parser::OT_HTML );
+               $output = $this->parser->parseLinkParameter( $input );
+
+               $this->assertEquals( $expected[0], $output[0], "$desc (type)" );
+
+               if ( $expected[0] === 'link-title' ) {
+                       $this->assertTrue( $expected[1]->equals( $output[1] ), "$desc (target)" );
+               } else {
+                       $this->assertEquals( $expected[1], $output[1], "$desc (target)" );
+               }
+
+               foreach ( $expectedLinks as $func => $expected ) {
+                       $output = $this->parser->getOutput()->$func();
+                       $this->assertEquals( $expected, $output, "$desc ($func)" );
+               }
+       }
+
+       public static function provideParseLinkParameter() {
+               return [
+                       [
+                               '',
+                               [ 'no-link', false ],
+                               [],
+                               'Return no link when requested',
+                       ],
+                       [
+                               'https://example.com/',
+                               [ 'link-url', 'https://example.com/' ],
+                               [ 'getExternalLinks' => [ 'https://example.com/' => 1 ] ],
+                               'External link',
+                       ],
+                       [
+                               '//example.com/',
+                               [ 'link-url', '//example.com/' ],
+                               [ 'getExternalLinks' => [ '//example.com/' => 1 ] ],
+                               'External link',
+                       ],
+                       [
+                               'Test',
+                               [ 'link-title', Title::newFromText( 'Test' ) ],
+                               [ 'getLinks' => [ 0 => [ 'Test' => 0 ] ] ],
+                               'Internal link',
+                       ],
+                       [
+                               'mw:Test',
+                               [ 'link-title', Title::newFromText( 'mw:Test' ) ],
+                               [ 'getInterwikiLinks' => [ 'mw' => [ 'Test' => 1 ] ] ],
+                               'Internal link (interwiki)',
+                       ],
+                       [
+                               'https://',
+                               [ null, false ],
+                               [],
+                               'Invalid link target',
+                       ],
+                       [
+                               '<>',
+                               [ null, false ],
+                               [],
+                               'Invalid link target',
+                       ],
+                       [
+                               ' ',
+                               [ null, false ],
+                               [],
+                               'Invalid link target',
+                       ],
+               ];
+       }
 }
index 42ea9ed..283e99f 100644 (file)
@@ -12,6 +12,16 @@ class OutputPageTest extends MediaWikiTestCase {
        const SCREEN_MEDIA_QUERY = 'screen and (min-width: 982px)';
        const SCREEN_ONLY_MEDIA_QUERY = 'only screen and (min-width: 982px)';
 
+       // Ensure that we don't affect the global ResourceLoader state.
+       protected function setUp() {
+               parent::setUp();
+               ResourceLoader::clearCache();
+       }
+       protected function tearDown() {
+               parent::tearDown();
+               ResourceLoader::clearCache();
+       }
+
        /**
         * @dataProvider provideRedirect
         *
@@ -174,11 +184,12 @@ class OutputPageTest extends MediaWikiTestCase {
 
        /**
         * Test the actual behavior of the method (in the case where it doesn't throw, e.g., in
-        * production).  Since it threw an exception once in this file, it won't when we call it again.
+        * production).
         *
         * @covers OutputPage::addScriptFile
         */
        public function testAddDeprecatedScriptFileNoOp() {
+               $this->hideDeprecated( 'OutputPage::addScriptFile' );
                $op = $this->newInstance();
                $op->addScriptFile( 'ignored-script.js' );
 
@@ -1378,6 +1389,8 @@ class OutputPageTest extends MediaWikiTestCase {
         * @covers OutputPage::addWikiText
         * @covers OutputPage::addWikiTextWithTitle
         * @covers OutputPage::addWikiTextTitle
+        * @covers OutputPage::addWikiTextTidy
+        * @covers OutputPage::addWikiTextTitleTidy
         * @covers OutputPage::getHTML
         */
        public function testAddWikiText( $method, array $args, $expected ) {
@@ -1410,7 +1423,7 @@ class OutputPageTest extends MediaWikiTestCase {
                                        '* Not a list',
                                ], 'Non-interface' => [
                                        [ "'''Bold'''", true, false ],
-                                       "<div class=\"mw-parser-output\"><p><b>Bold</b>\n</p></div>",
+                                       "<p><b>Bold</b>\n</p>",
                                ], 'No section edit links' => [
                                        [ '== Title ==' ],
                                        "<h2><span class=\"mw-headline\" id=\"Title\">Title</span></h2>\n",
@@ -1419,10 +1432,34 @@ class OutputPageTest extends MediaWikiTestCase {
                        'addWikiTextWithTitle' => [
                                'With title at start' => [
                                        [ '* {{PAGENAME}}', Title::newFromText( 'Talk:Some page' ) ],
-                                       "<div class=\"mw-parser-output\"><ul><li>Some page</li></ul>\n</div>",
+                                       "<ul><li>Some page</li></ul>\n",
+                               ], 'With title at start' => [
+                                       [ '* {{PAGENAME}}', Title::newFromText( 'Talk:Some page' ), false ],
+                                       "* Some page",
+                               ],
+                       ],
+                       'addWikiTextTidy' => [
+                               'SpecialNewimages' => [
+                                       [ "<p lang='en' dir='ltr'>\nMy message" ],
+                                       '<p lang="en" dir="ltr">' . "\nMy message\n</p>"
+                               ], 'List at start' => [
+                                       [ '* List' ],
+                                       "<ul><li>List</li></ul>\n",
+                               ], 'List not at start' => [
+                                       [ '* <b>Not a list', false ],
+                                       '<p>* <b>Not a list</b></p>',
+                               ],
+                       ],
+                       'addWikiTextTitleTidy' => [
+                               'With title at start' => [
+                                       [ '* {{PAGENAME}}', Title::newFromText( 'Talk:Some page' ) ],
+                                       "<ul><li>Some page</li></ul>\n",
                                ], 'With title at start' => [
                                        [ '* {{PAGENAME}}', Title::newFromText( 'Talk:Some page' ), false ],
-                                       "<div class=\"mw-parser-output\">* Some page</div>",
+                                       "<p>* Some page</p>",
+                               ], 'EditPage' => [
+                                       [ "<div class='mw-editintro'>{{PAGENAME}}", Title::newFromText( 'Talk:Some page' ) ],
+                                       '<div class="mw-editintro">' . "Some page\n</div>"
                                ],
                        ],
                ];
@@ -1438,6 +1475,16 @@ class OutputPageTest extends MediaWikiTestCase {
                        $tests['addWikiTextTitle']["$key (addWikiTextTitle)"] =
                                array_merge( [ $args ], array_slice( $val, 1 ) );
                }
+               foreach ( $tests['addWikiTextTidy'] as $key => $val ) {
+                       $args = [ $val[0][0], null, $val[0][1] ?? true, true, false ];
+                       $tests['addWikiTextTitle']["$key (addWikiTextTitle)"] =
+                               array_merge( [ $args ], array_slice( $val, 1 ) );
+               }
+               foreach ( $tests['addWikiTextTitleTidy'] as $key => $val ) {
+                       $args = [ $val[0][0], $val[0][1], $val[0][2] ?? true, true, false ];
+                       $tests['addWikiTextTitle']["$key (addWikiTextTitle)"] =
+                               array_merge( [ $args ], array_slice( $val, 1 ) );
+               }
 
                // We have to reformat our array to match what PHPUnit wants
                $ret = [];
@@ -1461,7 +1508,35 @@ class OutputPageTest extends MediaWikiTestCase {
                $op->addWikiText( 'a' );
        }
 
-       // @todo How should we cover the Tidy variants?
+       /**
+        * @covers OutputPage::addWikiMsg
+        */
+       public function testAddWikiMsg() {
+               $msg = wfMessage( 'parentheses' );
+               $this->assertSame( '(a)', $msg->rawParams( 'a' )->plain() );
+
+               $op = $this->newInstance();
+               $this->assertSame( '', $op->getHTML() );
+               $op->addWikiMsg( 'parentheses', "<b>a" );
+               // This is known to be bad unbalanced HTML; this will be fixed
+               // by I743f4185a03403f8d9b9db010ff1ee4e9342e062 (T198214)
+               $this->assertSame( "<p>(<b>a)\n</p>", $op->getHTML() );
+       }
+
+       /**
+        * @covers OutputPage::wrapWikiMsg
+        */
+       public function testWrapWikiMsg() {
+               $msg = wfMessage( 'parentheses' );
+               $this->assertSame( '(a)', $msg->rawParams( 'a' )->plain() );
+
+               $op = $this->newInstance();
+               $this->assertSame( '', $op->getHTML() );
+               $op->wrapWikiMsg( '[$1]', [ 'parentheses', "<b>a" ] );
+               // This is known to be bad unbalanced HTML; this will be fixed
+               // by I743f4185a03403f8d9b9db010ff1ee4e9342e062 (T198214)
+               $this->assertSame( "<p>[(<b>a)]\n</p>", $op->getHTML() );
+       }
 
        /**
         * @covers OutputPage::addParserOutputMetadata
@@ -1800,7 +1875,7 @@ class OutputPageTest extends MediaWikiTestCase {
                                'exemptStyleModules' => [ 'site' => [ 'site.styles' ], 'user' => [ 'user.styles' ] ],
                                '<meta name="ResourceLoaderDynamicStyles" content=""/>' . "\n" .
                                '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=fallback"/>' . "\n" .
-                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=user.styles&amp;only=styles&amp;skin=fallback&amp;version=1e9z0ox"/>',
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=user.styles&amp;only=styles&amp;skin=fallback&amp;version=1ai9g6t"/>',
                        ],
                        'custom modules' => [
                                'exemptStyleModules' => [
@@ -1811,7 +1886,7 @@ class OutputPageTest extends MediaWikiTestCase {
                                '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=example.site.a%2Cb&amp;only=styles&amp;skin=fallback"/>' . "\n" .
                                '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=site.styles&amp;only=styles&amp;skin=fallback"/>' . "\n" .
                                '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=example.user&amp;only=styles&amp;skin=fallback&amp;version=0a56zyi"/>' . "\n" .
-                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=user.styles&amp;only=styles&amp;skin=fallback&amp;version=1e9z0ox"/>',
+                               '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=en&amp;modules=user.styles&amp;only=styles&amp;skin=fallback&amp;version=1ai9g6t"/>',
                        ],
                ];
                // phpcs:enable
index bea0b49..2ee1ab4 100644 (file)
@@ -11,6 +11,7 @@ use MediaWiki\Storage\RevisionArchiveRecord;
 use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionStore;
 use MediaWiki\Storage\RevisionStoreRecord;
+use MediaWiki\Storage\SlotRecord;
 use MediaWiki\Storage\SuppressedDataException;
 use MediaWiki\User\UserIdentityValue;
 use MediaWikiTestCase;
@@ -241,7 +242,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank!', $html );
                $this->assertContains( 'time:20180101000003!', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRevisionParserOutput_old() {
@@ -263,7 +264,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank!', $html );
                $this->assertContains( 'time:20180101000003!', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRevisionParserOutput_archive() {
@@ -285,7 +286,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank!', $html );
                $this->assertContains( 'time:20180101000003!', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRevisionParserOutput_suppressed() {
@@ -337,7 +338,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank!', $html );
                $this->assertContains( 'time:20180101000003!', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRevisionParserOutput_raw() {
@@ -371,7 +372,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank!', $html );
                $this->assertContains( 'time:20180101000003!', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRevisionParserOutput_multi() {
@@ -387,7 +388,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $rr = new RenderedRevision( $title, $rev, $options, $this->combinerCallback );
 
                $combinedOutput = $rr->getRevisionParserOutput();
-               $mainOutput = $rr->getSlotParserOutput( 'main' );
+               $mainOutput = $rr->getSlotParserOutput( SlotRecord::MAIN );
                $auxOutput = $rr->getSlotParserOutput( 'aux' );
 
                $combinedHtml = $combinedOutput->getText();
@@ -422,7 +423,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}!\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}!\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = new RenderedRevision( $title, $rev, $options, $this->combinerCallback );
@@ -449,7 +450,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}!\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}!\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $actualRevision = $this->getMockRevision(
                        RevisionStoreRecord::class,
@@ -503,13 +504,13 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $title = $this->getMockTitle( 7, 21 );
 
                $rev = new MutableRevisionRecord( $title );
-               $rev->setContent( 'main', $mockContent );
+               $rev->setContent( SlotRecord::MAIN, $mockContent );
                $rev->setContent( 'aux', $mockContent );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = new RenderedRevision( $title, $rev, $options, $this->combinerCallback );
 
-               $output = $rr->getSlotParserOutput( 'main', [ 'generate-html' => false ] );
+               $output = $rr->getSlotParserOutput( SlotRecord::MAIN, [ 'generate-html' => false ] );
                $this->assertFalse( $output->hasText(), 'hasText' );
 
                $output = $rr->getRevisionParserOutput( [ 'generate-html' => false ] );
@@ -527,19 +528,19 @@ class RenderedRevisionTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}!\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}!\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
                $rev->setContent( 'aux', new WikitextContent( '[[Goats]]' ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = new RenderedRevision( $title, $rev, $options, $this->combinerCallback );
 
                $firstOutput = $rr->getRevisionParserOutput();
-               $mainOutput = $rr->getSlotParserOutput( 'main' );
+               $mainOutput = $rr->getSlotParserOutput( SlotRecord::MAIN );
                $auxOutput = $rr->getSlotParserOutput( 'aux' );
 
                // emulate a saved revision
                $savedRev = new MutableRevisionRecord( $title );
-               $savedRev->setContent( 'main', new WikitextContent( $text ) );
+               $savedRev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
                $savedRev->setContent( 'aux', new WikitextContent( '[[Goats]]' ) );
                $savedRev->setId( 23 ); // saved, new
                $savedRev->setUser( new UserIdentityValue( 9, 'Frank', 0 ) );
@@ -547,7 +548,7 @@ class RenderedRevisionTest extends MediaWikiTestCase {
 
                $rr->updateRevision( $savedRev );
 
-               $this->assertNotSame( $mainOutput, $rr->getSlotParserOutput( 'main' ), 'Reset main' );
+               $this->assertNotSame( $mainOutput, $rr->getSlotParserOutput( SlotRecord::MAIN ), 'Reset main' );
                $this->assertSame( $auxOutput, $rr->getSlotParserOutput( 'aux' ), 'Keep aux' );
 
                $updatedOutput = $rr->getRevisionParserOutput();
index 28052ff..ca13899 100644 (file)
@@ -9,6 +9,7 @@ use LogicException;
 use MediaWiki\Revision\RevisionRenderer;
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 use MediaWiki\User\UserIdentityValue;
 use MediaWikiTestCase;
 use ParserOptions;
@@ -153,7 +154,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
                $text .= "* [[Link It]]\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options );
@@ -170,7 +171,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank', $html );
                $this->assertContains( 'time:20180101000003', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRenderedRevision_current() {
@@ -189,7 +190,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options );
@@ -206,7 +207,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $this->assertContains( 'user:Frank', $html );
                $this->assertContains( 'time:20180101000003', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRenderedRevision_master() {
@@ -225,7 +226,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options, null, [ 'use-master' => true ] );
@@ -236,7 +237,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
 
                $this->assertContains( 'rev:21', $html );
 
-               $this->assertSame( $html, $rr->getSlotParserOutput( 'main' )->getText() );
+               $this->assertSame( $html, $rr->getSlotParserOutput( SlotRecord::MAIN )->getText() );
        }
 
        public function testGetRenderedRevision_old() {
@@ -255,7 +256,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options );
@@ -292,7 +293,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision( $rev, $options );
@@ -317,7 +318,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $sysop = $this->getTestUser( [ 'sysop' ] )->getUser(); // privileged!
@@ -356,7 +357,7 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $text .= "* user:{{REVISIONUSER}}\n";
                $text .= "* time:{{REVISIONTIMESTAMP}}\n";
 
-               $rev->setContent( 'main', new WikitextContent( $text ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $options = ParserOptions::newCanonical( 'canonical' );
                $rr = $renderer->getRenderedRevision(
@@ -391,13 +392,13 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $rev->setTimestamp( '20180101000003' );
                $rev->setComment( CommentStoreComment::newUnsavedComment( '' ) );
 
-               $rev->setContent( 'main', new WikitextContent( '[[Kittens]]' ) );
+               $rev->setContent( SlotRecord::MAIN, new WikitextContent( '[[Kittens]]' ) );
                $rev->setContent( 'aux', new WikitextContent( '[[Goats]]' ) );
 
                $rr = $renderer->getRenderedRevision( $rev );
 
                $combinedOutput = $rr->getRevisionParserOutput();
-               $mainOutput = $rr->getSlotParserOutput( 'main' );
+               $mainOutput = $rr->getSlotParserOutput( SlotRecord::MAIN );
                $auxOutput = $rr->getSlotParserOutput( 'aux' );
 
                $combinedHtml = $combinedOutput->getText();
@@ -453,13 +454,13 @@ class RevisionRendererTest extends MediaWikiTestCase {
                $title = $this->getMockTitle( 7, 21 );
 
                $rev = new MutableRevisionRecord( $title );
-               $rev->setContent( 'main', $mockContent );
+               $rev->setContent( SlotRecord::MAIN, $mockContent );
                $rev->setContent( 'aux', $mockContent );
 
                // NOTE: we are testing the private combineSlotOutput() callback here.
                $rr = $renderer->getRenderedRevision( $rev );
 
-               $output = $rr->getSlotParserOutput( 'main', [ 'generate-html' => false ] );
+               $output = $rr->getSlotParserOutput( SlotRecord::MAIN, [ 'generate-html' => false ] );
                $this->assertFalse( $output->hasText(), 'hasText' );
 
                $output = $rr->getRevisionParserOutput( [ 'generate-html' => false ] );
index 8bf87a2..28e6e12 100644 (file)
@@ -259,7 +259,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                // getTextId() must be an int!
                $this->assertInternalType( 'integer', $rev->getTextId() );
 
-               $mainSlot = $rev->getRevisionRecord()->getSlot( 'main', RevisionRecord::RAW );
+               $mainSlot = $rev->getRevisionRecord()->getSlot( SlotRecord::MAIN, RevisionRecord::RAW );
 
                // we currently only support storage in the text table
                $textId = MediaWikiServices::getInstance()
@@ -1581,7 +1581,7 @@ abstract class RevisionDbTestBase extends MediaWikiTestCase {
                        'slot_content_id' => 1,
                        'content_address' => 'tt:789',
                        'model_name' => CONTENT_MODEL_WIKITEXT,
-                       'role_name' => 'main',
+                       'role_name' => SlotRecord::MAIN,
                        'slot_origin' => 1,
                ], new WikitextContent( 'Test' ) );
 
index 3e4746a..f5bc4fa 100644 (file)
@@ -35,7 +35,7 @@ class RevisionMcrDbTest extends RevisionDbTestBase {
                        'slot_content_id' => 1,
                        'content_address' => 'tt:789',
                        'model_name' => CONTENT_MODEL_WIKITEXT,
-                       'role_name' => 'main',
+                       'role_name' => SlotRecord::MAIN,
                        'slot_origin' => 1,
                ], new WikitextContent( 'Test' ) );
 
index b446a8c..7218466 100644 (file)
@@ -31,7 +31,7 @@ class RevisionMcrReadNewDbTest extends RevisionDbTestBase {
                        'slot_content_id' => 1,
                        'content_address' => 'tt:789',
                        'model_name' => CONTENT_MODEL_WIKITEXT,
-                       'role_name' => 'main',
+                       'role_name' => SlotRecord::MAIN,
                        'slot_origin' => 1,
                ], new WikitextContent( 'Test' ) );
 
index 6359995..c470787 100644 (file)
@@ -931,7 +931,7 @@ class RevisionTest extends MediaWikiTestCase {
                $this->assertNull( $rev->getContent(), 'Content of no slots is null' );
 
                $content = new TextContent( 'Hello Kittens!' );
-               $rec->setContent( 'main', $content );
+               $rec->setContent( SlotRecord::MAIN, $content );
                $this->assertSame( $content, $rev->getContent() );
        }
 
index 7c4be97..7931236 100644 (file)
@@ -4,6 +4,7 @@ namespace MediaWiki\Tests\Storage;
 
 use CommentStoreComment;
 use Content;
+use ContentHandler;
 use LinksUpdate;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\DerivedPageDataUpdater;
@@ -13,6 +14,10 @@ use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionSlotsUpdate;
 use MediaWiki\Storage\SlotRecord;
 use MediaWikiTestCase;
+use MWCallableUpdate;
+use PHPUnit\Framework\MockObject\MockObject;
+use TextContent;
+use TextContentHandler;
 use Title;
 use User;
 use Wikimedia\TestingAccessWrapper;
@@ -110,7 +115,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $mainContent = new WikitextContent( 'Lorem ipsum' );
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent );
                $updater = $this->getDerivedPageDataUpdater( $page );
                $updater->prepareContent( $user, $update, false );
 
@@ -189,7 +194,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                );
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent );
                $update->modifySlot( SlotRecord::newInherited( $auxSlot ) );
                // TODO: MCR: test removing slots!
 
@@ -215,7 +220,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $this->assertEquals( [ 'main', 'aux' ], $updater->getModifiedSlotRoles() );
                $this->assertEquals( [ 'main', 'aux' ], $updater->getTouchedSlotRoles() );
 
-               $mainSlot = $updater->getRawSlot( 'main' );
+               $mainSlot = $updater->getRawSlot( SlotRecord::MAIN );
                $this->assertInstanceOf( SlotRecord::class, $mainSlot );
                $this->assertNotContains( '~~~', $mainSlot->getContent()->serialize(), 'PST should apply.' );
                $this->assertContains( $sysop->getName(), $mainSlot->getContent()->serialize() );
@@ -250,12 +255,12 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $mainContent2 = new WikitextContent( 'second ({{subst:REVISIONUSER}}) #~~~#' );
 
                $rev = $this->createRevision( $page, 'first', $mainContent1 );
-               $mainContent1 = $rev->getContent( 'main' ); // get post-pst content
+               $mainContent1 = $rev->getContent( SlotRecord::MAIN ); // get post-pst content
                $userName = $rev->getUser()->getName();
                $sysopName = $sysop->getName();
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent1 );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent1 );
                $updater1 = $this->getDerivedPageDataUpdater( $page );
                $updater1->prepareContent( $sysop, $update, false );
 
@@ -278,12 +283,12 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                // TODO: MCR: test inheritance from parent
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent2 );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent2 );
                $updater2 = $this->getDerivedPageDataUpdater( $page );
                $updater2->prepareContent( $sysop, $update, false );
 
                // non-null edit use the new user name in PST
-               $pstText = $updater2->getSlots()->getContent( 'main' )->serialize();
+               $pstText = $updater2->getSlots()->getContent( SlotRecord::MAIN )->serialize();
                $this->assertNotContains( '{{subst:REVISIONUSER}}', $pstText, '{{subst:REVISIONUSER}}' );
                $this->assertNotContains( '~~~', $pstText, 'signature ~~~' );
                $this->assertContains( '(' . $sysopName . ')', $pstText, '{{subst:REVISIONUSER}}' );
@@ -337,8 +342,8 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                // TODO: MCR: test multiple slots, test slot removal!
 
-               $this->assertInstanceOf( SlotRecord::class, $updater1->getRawSlot( 'main' ) );
-               $this->assertNotContains( '~~~~', $updater1->getRawContent( 'main' )->serialize() );
+               $this->assertInstanceOf( SlotRecord::class, $updater1->getRawSlot( SlotRecord::MAIN ) );
+               $this->assertNotContains( '~~~~', $updater1->getRawContent( SlotRecord::MAIN )->serialize() );
 
                $mainOutput = $updater1->getCanonicalParserOutput();
                $this->assertContains( 'first', $mainOutput->getText() );
@@ -374,11 +379,11 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $mainContent1 = new WikitextContent( 'first [[main]] ~~~' );
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent1 );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent1 );
                $updater = $this->getDerivedPageDataUpdater( $page );
                $updater->prepareContent( $user, $update, false );
 
-               $mainOutput = $updater->getSlotParserOutput( 'main' );
+               $mainOutput = $updater->getSlotParserOutput( SlotRecord::MAIN );
                $canonicalOutput = $updater->getCanonicalParserOutput();
 
                $rev = $this->createRevision( $page, 'first', $mainContent1 );
@@ -389,7 +394,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $this->assertTrue( $updater->isUpdatePrepared() );
                $this->assertTrue( $updater->isContentPrepared() );
 
-               $this->assertSame( $mainOutput, $updater->getSlotParserOutput( 'main' ) );
+               $this->assertSame( $mainOutput, $updater->getSlotParserOutput( SlotRecord::MAIN ) );
                $this->assertSame( $canonicalOutput, $updater->getCanonicalParserOutput() );
        }
 
@@ -404,11 +409,11 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $mainContent1 = new WikitextContent( 'first --{{REVISIONID}}--' );
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent1 );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent1 );
                $updater = $this->getDerivedPageDataUpdater( $page );
                $updater->prepareContent( $user, $update, false );
 
-               $mainOutput = $updater->getSlotParserOutput( 'main' );
+               $mainOutput = $updater->getSlotParserOutput( SlotRecord::MAIN );
                $canonicalOutput = $updater->getCanonicalParserOutput();
 
                // prevent optimization on matching speculative ID
@@ -424,7 +429,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $this->assertTrue( $updater->isContentPrepared() );
 
                // ParserOutput objects should have been flushed.
-               $this->assertNotSame( $mainOutput, $updater->getSlotParserOutput( 'main' ) );
+               $this->assertNotSame( $mainOutput, $updater->getSlotParserOutput( SlotRecord::MAIN ) );
                $this->assertNotSame( $canonicalOutput, $updater->getCanonicalParserOutput() );
 
                $html = $updater->getCanonicalParserOutput()->getText();
@@ -445,7 +450,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                $mainContent = new WikitextContent( 'first [[main]] ~~~' );
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent );
 
                $updater = $this->getDerivedPageDataUpdater( __METHOD__ );
                $updater->prepareContent( $user, $update, false );
@@ -456,7 +461,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $this->assertSame( $canonicalOutput->getCacheTime(), $preparedEdit->timestamp );
                $this->assertSame( $canonicalOutput, $preparedEdit->output );
                $this->assertSame( $mainContent, $preparedEdit->newContent );
-               $this->assertSame( $updater->getRawContent( 'main' ), $preparedEdit->pstContent );
+               $this->assertSame( $updater->getRawContent( SlotRecord::MAIN ), $preparedEdit->pstContent );
                $this->assertSame( $updater->getCanonicalParserOptions(), $preparedEdit->popts );
                $this->assertSame( null, $preparedEdit->revid );
        }
@@ -469,7 +474,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                $mainContent = new WikitextContent( 'first [[main]] ~~~' );
                $update = new MutableRevisionSlots();
-               $update->setContent( 'main', $mainContent );
+               $update->setContent( SlotRecord::MAIN, $mainContent );
 
                $rev = $this->createRevision( $page, __METHOD__ );
 
@@ -481,7 +486,7 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $preparedEdit = $updater->getPreparedEdit();
                $this->assertSame( $canonicalOutput->getCacheTime(), $preparedEdit->timestamp );
                $this->assertSame( $canonicalOutput, $preparedEdit->output );
-               $this->assertSame( $updater->getRawContent( 'main' ), $preparedEdit->pstContent );
+               $this->assertSame( $updater->getRawContent( SlotRecord::MAIN ), $preparedEdit->pstContent );
                $this->assertSame( $updater->getCanonicalParserOptions(), $preparedEdit->popts );
                $this->assertSame( $rev->getId(), $preparedEdit->revid );
        }
@@ -494,13 +499,12 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $mainContent1 = new WikitextContent( 'first' );
 
                $update = new RevisionSlotsUpdate();
-               $update->modifyContent( 'main', $mainContent1 );
+               $update->modifyContent( SlotRecord::MAIN, $mainContent1 );
                $updater = $this->getDerivedPageDataUpdater( $page );
                $updater->prepareContent( $user, $update, false );
 
                $dataUpdates = $updater->getSecondaryDataUpdates();
 
-               // TODO: MCR: assert updates from all slots!
                $this->assertNotEmpty( $dataUpdates );
 
                $linksUpdates = array_filter( $dataUpdates, function ( $du ) {
@@ -509,6 +513,109 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $this->assertCount( 1, $linksUpdates );
        }
 
+       /**
+        * @param string $name
+        *
+        * @return ContentHandler
+        */
+       private function defineMockContentModelForUpdateTesting( $name ) {
+               /** @var ContentHandler|MockObject $handler */
+               $handler = $this->getMockBuilder( TextContentHandler::class )
+                       ->setConstructorArgs( [ $name ] )
+                       ->setMethods(
+                               [ 'getSecondaryDataUpdates', 'getDeletionUpdates', 'unserializeContent' ]
+                       )
+                       ->getMock();
+
+               $dataUpdate = new MWCallableUpdate( 'time' );
+               $dataUpdate->_name = "$name data update";
+
+               $deletionUpdate = new MWCallableUpdate( 'time' );
+               $deletionUpdate->_name = "$name deletion update";
+
+               $handler->method( 'getSecondaryDataUpdates' )->willReturn( [ $dataUpdate ] );
+               $handler->method( 'getDeletionUpdates' )->willReturn( [ $deletionUpdate ] );
+               $handler->method( 'unserializeContent' )->willReturnCallback(
+                       function ( $text ) use ( $handler ) {
+                               return $this->createMockContent( $handler, $text );
+                       }
+               );
+
+               $this->mergeMwGlobalArrayValue(
+                       'wgContentHandlers', [
+                               $name => function () use ( $handler ){
+                                       return $handler;
+                               }
+                       ]
+               );
+
+               return $handler;
+       }
+
+       /**
+        * @param ContentHandler $handler
+        * @param string $text
+        *
+        * @return Content
+        */
+       private function createMockContent( ContentHandler $handler, $text ) {
+               /** @var Content|MockObject $content */
+               $content = $this->getMockBuilder( TextContent::class )
+                       ->setConstructorArgs( [ $text ] )
+                       ->setMethods( [ 'getModel', 'getContentHandler' ] )
+                       ->getMock();
+
+               $content->method( 'getModel' )->willReturn( $handler->getModelID() );
+               $content->method( 'getContentHandler' )->willReturn( $handler );
+
+               return $content;
+       }
+
+       public function testGetSecondaryDataUpdatesWithSlotRemoval() {
+               global $wgMultiContentRevisionSchemaMigrationStage;
+
+               if ( ! ( $wgMultiContentRevisionSchemaMigrationStage & SCHEMA_COMPAT_READ_NEW ) ) {
+                       $this->markTestSkipped( 'Slot removal cannot happen with MCR being enabled' );
+               }
+
+               $m1 = $this->defineMockContentModelForUpdateTesting( 'M1' );
+               $a1 = $this->defineMockContentModelForUpdateTesting( 'A1' );
+               $m2 = $this->defineMockContentModelForUpdateTesting( 'M2' );
+
+               $mainContent1 = $this->createMockContent( $m1, 'main 1' );
+               $auxContent1 = $this->createMockContent( $a1, 'aux 1' );
+               $mainContent2 = $this->createMockContent( $m2, 'main 2' );
+
+               $user = $this->getTestUser()->getUser();
+               $page = $this->getPage( __METHOD__ );
+               $this->createRevision(
+                       $page,
+                       __METHOD__,
+                       [ 'main' => $mainContent1, 'aux' => $auxContent1 ]
+               );
+
+               $update = new RevisionSlotsUpdate();
+               $update->modifyContent( SlotRecord::MAIN, $mainContent2 );
+               $update->removeSlot( 'aux' );
+
+               $page = $this->getPage( __METHOD__ );
+               $updater = $this->getDerivedPageDataUpdater( $page );
+               $updater->prepareContent( $user, $update, false );
+
+               $dataUpdates = $updater->getSecondaryDataUpdates();
+
+               $this->assertNotEmpty( $dataUpdates );
+
+               $updateNames = array_map( function ( $du ) {
+                       return isset( $du->_name ) ? $du->_name : get_class( $du );
+               }, $dataUpdates );
+
+               $this->assertContains( LinksUpdate::class, $updateNames );
+               $this->assertContains( 'A1 deletion update', $updateNames );
+               $this->assertContains( 'M2 data update', $updateNames );
+               $this->assertNotContains( 'M1 data update', $updateNames );
+       }
+
        /**
         * Creates a dummy revision object without touching the database.
         *
@@ -569,13 +676,13 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
                $content2 = new WikitextContent( 'two' );
 
                $update1 = new RevisionSlotsUpdate();
-               $update1->modifyContent( 'main', $content1 );
+               $update1->modifyContent( SlotRecord::MAIN, $content1 );
 
                $update1b = new RevisionSlotsUpdate();
                $update1b->modifyContent( 'xyz', $content1 );
 
                $update2 = new RevisionSlotsUpdate();
-               $update2->modifyContent( 'main', $content2 );
+               $update2->modifyContent( SlotRecord::MAIN, $content2 );
 
                $rev1 = $this->makeRevision( $title, $update1, $user1, 'rev1', 11 );
                $rev1b = $this->makeRevision( $title, $update1b, $user1, 'rev1', 11 );
index 48bf4aa..3e91df4 100644 (file)
@@ -51,7 +51,7 @@ class MutableRevisionRecordTest extends MediaWikiTestCase {
                        $record->setPageId( $rowOverrides['rev_page'] );
                }
 
-               $record->setContent( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $record->setContent( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $record->setComment( $comment );
                $record->setUser( $user );
                $record->setTimestamp( '20101010000000' );
@@ -141,33 +141,33 @@ class MutableRevisionRecordTest extends MediaWikiTestCase {
        public function testGetMainContentWhenEmpty() {
                $record = new MutableRevisionRecord( Title::newFromText( 'Foo' ) );
                $this->setExpectedException( RevisionAccessException::class );
-               $this->assertNull( $record->getContent( 'main' ) );
+               $this->assertNull( $record->getContent( SlotRecord::MAIN ) );
        }
 
        public function testSetGetMainContent() {
                $record = new MutableRevisionRecord( Title::newFromText( 'Foo' ) );
                $content = new WikitextContent( 'Badger' );
-               $record->setContent( 'main', $content );
-               $this->assertSame( $content, $record->getContent( 'main' ) );
+               $record->setContent( SlotRecord::MAIN, $content );
+               $this->assertSame( $content, $record->getContent( SlotRecord::MAIN ) );
        }
 
        public function testGetSlotWhenEmpty() {
                $record = new MutableRevisionRecord( Title::newFromText( 'Foo' ) );
-               $this->assertFalse( $record->hasSlot( 'main' ) );
+               $this->assertFalse( $record->hasSlot( SlotRecord::MAIN ) );
 
                $this->setExpectedException( RevisionAccessException::class );
-               $record->getSlot( 'main' );
+               $record->getSlot( SlotRecord::MAIN );
        }
 
        public function testSetGetSlot() {
                $record = new MutableRevisionRecord( Title::newFromText( 'Foo' ) );
                $slot = SlotRecord::newUnsaved(
-                       'main',
+                       SlotRecord::MAIN,
                        new WikitextContent( 'x' )
                );
                $record->setSlot( $slot );
-               $this->assertTrue( $record->hasSlot( 'main' ) );
-               $this->assertSame( $slot, $record->getSlot( 'main' ) );
+               $this->assertTrue( $record->hasSlot( SlotRecord::MAIN ) );
+               $this->assertSame( $slot, $record->getSlot( SlotRecord::MAIN ) );
        }
 
        public function testSetGetMinor() {
@@ -249,7 +249,7 @@ class MutableRevisionRecordTest extends MediaWikiTestCase {
                $record->setSlot( $auxSlot );
 
                $this->assertSame( [ 'main' ], $record->getOriginalSlots()->getSlotRoles() );
-               $this->assertSame( $mainSlot, $record->getOriginalSlots()->getSlot( 'main' ) );
+               $this->assertSame( $mainSlot, $record->getOriginalSlots()->getSlot( SlotRecord::MAIN ) );
 
                $this->assertSame( [ 'aux' ], $record->getInheritedSlots()->getSlotRoles() );
                $this->assertSame( $auxSlot, $record->getInheritedSlots()->getSlot( 'aux' ) );
@@ -314,7 +314,7 @@ class MutableRevisionRecordTest extends MediaWikiTestCase {
                yield 'empty' => [ $rev ];
 
                $rev = new MutableRevisionRecord( $title );
-               $rev->setContent( 'main', $content );
+               $rev->setContent( SlotRecord::MAIN, $content );
                $rev->setUser( $user );
                $rev->setComment( $comment );
                yield 'no timestamp' => [ $rev ];
@@ -326,14 +326,14 @@ class MutableRevisionRecordTest extends MediaWikiTestCase {
                yield 'no content' => [ $rev ];
 
                $rev = new MutableRevisionRecord( $title );
-               $rev->setContent( 'main', $content );
+               $rev->setContent( SlotRecord::MAIN, $content );
                $rev->setComment( $comment );
                $rev->setTimestamp( '20101010000000' );
                yield 'no user' => [ $rev ];
 
                $rev = new MutableRevisionRecord( $title );
                $rev->setUser( $user );
-               $rev->setContent( 'main', $content );
+               $rev->setContent( SlotRecord::MAIN, $content );
                $rev->setTimestamp( '20101010000000' );
                yield 'no comment' => [ $rev ];
        }
index 5a83143..1ef0121 100644 (file)
@@ -65,14 +65,14 @@ class MutableRevisionSlotsTest extends RevisionSlotsTest {
 
                $this->assertSame( [], $slots->getSlots() );
 
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->setSlot( $slotA );
-               $this->assertSame( $slotA, $slots->getSlot( 'main' ) );
+               $this->assertSame( $slotA, $slots->getSlot( SlotRecord::MAIN ) );
                $this->assertSame( [ 'main' => $slotA ], $slots->getSlots() );
 
-               $slotB = SlotRecord::newUnsaved( 'main', new WikitextContent( 'B' ) );
+               $slotB = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'B' ) );
                $slots->setSlot( $slotB );
-               $this->assertSame( $slotB, $slots->getSlot( 'main' ) );
+               $this->assertSame( $slotB, $slots->getSlot( SlotRecord::MAIN ) );
                $this->assertSame( [ 'main' => $slotB ], $slots->getSlots() );
        }
 
@@ -87,18 +87,18 @@ class MutableRevisionSlotsTest extends RevisionSlotsTest {
 
        public function testInheritSlotOverwritesSlot() {
                $slots = new MutableRevisionSlots();
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->setSlot( $slotA );
-               $slotB = $this->newSavedSlot( 'main', new WikitextContent( 'B' ) );
+               $slotB = $this->newSavedSlot( SlotRecord::MAIN, new WikitextContent( 'B' ) );
                $slotC = $this->newSavedSlot( 'foo', new WikitextContent( 'C' ) );
                $slots->inheritSlot( $slotB );
                $slots->inheritSlot( $slotC );
                $this->assertSame( [ 'main', 'foo' ], $slots->getSlotRoles() );
-               $this->assertNotSame( $slotB, $slots->getSlot( 'main' ) );
+               $this->assertNotSame( $slotB, $slots->getSlot( SlotRecord::MAIN ) );
                $this->assertNotSame( $slotC, $slots->getSlot( 'foo' ) );
-               $this->assertTrue( $slots->getSlot( 'main' )->isInherited() );
+               $this->assertTrue( $slots->getSlot( SlotRecord::MAIN )->isInherited() );
                $this->assertTrue( $slots->getSlot( 'foo' )->isInherited() );
-               $this->assertSame( $slotB->getContent(), $slots->getSlot( 'main' )->getContent() );
+               $this->assertSame( $slotB->getContent(), $slots->getSlot( SlotRecord::MAIN )->getContent() );
                $this->assertSame( $slotC->getContent(), $slots->getSlot( 'foo' )->getContent() );
        }
 
@@ -107,26 +107,26 @@ class MutableRevisionSlotsTest extends RevisionSlotsTest {
 
                $this->assertSame( [], $slots->getSlots() );
 
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->setSlot( $slotA );
-               $this->assertSame( $slotA, $slots->getSlot( 'main' ) );
+               $this->assertSame( $slotA, $slots->getSlot( SlotRecord::MAIN ) );
                $this->assertSame( [ 'main' => $slotA ], $slots->getSlots() );
 
                $newContent = new WikitextContent( 'B' );
-               $slots->setContent( 'main', $newContent );
-               $this->assertSame( $newContent, $slots->getContent( 'main' ) );
+               $slots->setContent( SlotRecord::MAIN, $newContent );
+               $this->assertSame( $newContent, $slots->getContent( SlotRecord::MAIN ) );
        }
 
        public function testRemoveExistingSlot() {
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots = new MutableRevisionSlots( [ $slotA ] );
 
                $this->assertSame( [ 'main' => $slotA ], $slots->getSlots() );
 
-               $slots->removeSlot( 'main' );
+               $slots->removeSlot( SlotRecord::MAIN );
                $this->assertSame( [], $slots->getSlots() );
                $this->setExpectedException( RevisionAccessException::class );
-               $slots->getSlot( 'main' );
+               $slots->getSlot( SlotRecord::MAIN );
        }
 
        public function testNewFromParentRevisionSlots() {
index 1d504de..7e1e1ee 100644 (file)
@@ -135,7 +135,7 @@ class NoContentModelRevisionStoreDbTest extends RevisionStoreDbTestBase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                        ]
                                ),
                                'joins' => [],
@@ -152,7 +152,7 @@ class NoContentModelRevisionStoreDbTest extends RevisionStoreDbTestBase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                                'content_size' => 'slots.rev_len',
                                                'content_sha1' => 'slots.rev_sha1',
                                                'content_address' =>
index 81f726c..3933986 100644 (file)
@@ -6,6 +6,7 @@ use CommentStoreComment;
 use Content;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 use MediaWikiTestCase;
 use ParserOptions;
 use RecentChange;
@@ -72,7 +73,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                // TODO: MCR: test additional slots
                $content = new TextContent( 'Lorem Ipsum' );
-               $updater->setContent( 'main', $content );
+               $updater->setContent( SlotRecord::MAIN, $content );
 
                $parent = $updater->grabParentRevision();
 
@@ -102,7 +103,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                $this->assertInstanceOf( Revision::class, $updater->getStatus()->value['revision'] );
 
                $rev = $updater->getNewRevision();
-               $revContent = $rev->getContent( 'main' );
+               $revContent = $rev->getContent( SlotRecord::MAIN );
                $this->assertSame( 'Lorem Ipsum', $revContent->serialize(), 'revision content' );
 
                // were the WikiPage and Title objects updated?
@@ -128,7 +129,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                // re-edit with same content - should be a "null-edit"
                $updater = $page->newPageUpdater( $user );
-               $updater->setContent( 'main', $content );
+               $updater->setContent( SlotRecord::MAIN, $content );
 
                $summary = CommentStoreComment::newUnsavedComment( 'to to re-edit' );
                $rev = $updater->saveRevision( $summary );
@@ -167,7 +168,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                $this->assertTrue( $updater->hasEditConflict( 0 ), 'hasEditConflict' );
 
                // TODO: MCR: test additional slots
-               $updater->setContent( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
 
                // TODO: test all flags for saveRevision()!
                $summary = CommentStoreComment::newUnsavedComment( 'Just a test' );
@@ -189,7 +190,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                // TODO: Test null revision (with different user): new revision!
 
                $rev = $updater->getNewRevision();
-               $revContent = $rev->getContent( 'main' );
+               $revContent = $rev->getContent( SlotRecord::MAIN );
                $this->assertSame( 'Lorem Ipsum', $revContent->serialize(), 'revision content' );
 
                // were the WikiPage and Title objects updated?
@@ -210,7 +211,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                // re-edit
                $updater = $page->newPageUpdater( $user );
-               $updater->setContent( 'main', new TextContent( 'dolor sit amet' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'dolor sit amet' ) );
 
                $summary = CommentStoreComment::newUnsavedComment( 're-edit' );
                $updater->saveRevision( $summary );
@@ -242,7 +243,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                }
 
                $updater = $page->newPageUpdater( $user );
-               $updater->setContent( 'main', $content );
+               $updater->setContent( SlotRecord::MAIN, $content );
                $rev = $updater->saveRevision( $comment );
                return $rev;
        }
@@ -267,7 +268,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                // try creating the page - should trigger CAS failure.
                $summary = CommentStoreComment::newUnsavedComment( 'create?!' );
-               $updater->setContent( 'main', new TextContent( 'Lorem ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem ipsum' ) );
                $updater->saveRevision( $summary );
                $status = $updater->getStatus();
 
@@ -287,7 +288,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                // try creating the page - should trigger CAS failure.
                $summary = CommentStoreComment::newUnsavedComment( 'edit?!' );
-               $updater->setContent( 'main', new TextContent( 'dolor sit amet' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'dolor sit amet' ) );
                $updater->saveRevision( $summary );
                $status = $updater->getStatus();
 
@@ -311,7 +312,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                // update with EDIT_UPDATE flag should fail
                $summary = CommentStoreComment::newUnsavedComment( 'udpate?!' );
-               $updater->setContent( 'main', new TextContent( 'Lorem ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem ipsum' ) );
                $updater->saveRevision( $summary, EDIT_UPDATE );
                $status = $updater->getStatus();
 
@@ -326,7 +327,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                // update with EDIT_NEW flag should fail
                $summary = CommentStoreComment::newUnsavedComment( 'create?!' );
                $updater = $page->newPageUpdater( $user );
-               $updater->setContent( 'main', new TextContent( 'dolor sit amet' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'dolor sit amet' ) );
                $updater->saveRevision( $summary, EDIT_NEW );
                $status = $updater->getStatus();
 
@@ -356,7 +357,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                $updater = $page->newPageUpdater( $user );
 
                $summary = CommentStoreComment::newUnsavedComment( 'Lorem ipsum ' . $patrolled );
-               $updater->setContent( 'main', new TextContent( 'Lorem ipsum ' . $patrolled ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem ipsum ' . $patrolled ) );
                $updater->setRcPatrolStatus( $patrolled );
                $rev = $updater->saveRevision( $summary );
 
@@ -375,24 +376,24 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                $updater = $page->newPageUpdater( $user );
                $summary = CommentStoreComment::newUnsavedComment( 'one' );
-               $updater->setContent( 'main', new TextContent( 'Lorem ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem ipsum' ) );
                $rev1 = $updater->saveRevision( $summary, EDIT_NEW );
 
                $updater = $page->newPageUpdater( $user );
                $summary = CommentStoreComment::newUnsavedComment( 'two' );
-               $updater->setContent( 'main', new TextContent( 'Foo Bar' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Foo Bar' ) );
                $rev2 = $updater->saveRevision( $summary, EDIT_UPDATE );
 
                $updater = $page->newPageUpdater( $user );
                $summary = CommentStoreComment::newUnsavedComment( 'three' );
-               $updater->inheritSlot( $rev1->getSlot( 'main' ) );
+               $updater->inheritSlot( $rev1->getSlot( SlotRecord::MAIN ) );
                $rev3 = $updater->saveRevision( $summary, EDIT_UPDATE );
 
                $this->assertNotSame( $rev1->getId(), $rev3->getId() );
                $this->assertNotSame( $rev2->getId(), $rev3->getId() );
 
-               $main1 = $rev1->getSlot( 'main' );
-               $main3 = $rev3->getSlot( 'main' );
+               $main1 = $rev1->getSlot( SlotRecord::MAIN );
+               $main3 = $rev3->getSlot( SlotRecord::MAIN );
 
                $this->assertNotSame( $main1->getRevision(), $main3->getRevision() );
                $this->assertSame( $main1->getAddress(), $main3->getAddress() );
@@ -410,7 +411,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                $updater = $page->newPageUpdater( $user );
                $updater->setUseAutomaticEditSummaries( true );
-               $updater->setContent( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
 
                // empty comment triggers auto-summary
                $summary = CommentStoreComment::newUnsavedComment( '' );
@@ -423,7 +424,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                // check that this also works when blanking the page
                $updater = $page->newPageUpdater( $user );
                $updater->setUseAutomaticEditSummaries( true );
-               $updater->setContent( 'main', new TextContent( '' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( '' ) );
 
                $summary = CommentStoreComment::newUnsavedComment( '' );
                $updater->saveRevision( $summary, EDIT_AUTOSUMMARY );
@@ -438,7 +439,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                $updater = $page2->newPageUpdater( $user );
                $updater->setUseAutomaticEditSummaries( false );
-               $updater->setContent( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
 
                $summary = CommentStoreComment::newUnsavedComment( '' );
                $updater->saveRevision( $summary, EDIT_AUTOSUMMARY );
@@ -450,7 +451,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                // check that we don't do auto.summaries without the EDIT_AUTOSUMMARY flag
                $updater = $page2->newPageUpdater( $user );
                $updater->setUseAutomaticEditSummaries( true );
-               $updater->setContent( 'main', new TextContent( '' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( '' ) );
 
                $summary = CommentStoreComment::newUnsavedComment( '' );
                $updater->saveRevision( $summary, 0 );
@@ -477,7 +478,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                $updater = $page->newPageUpdater( $user );
                $updater->setUsePageCreationLog( $use );
                $summary = CommentStoreComment::newUnsavedComment( 'cmt' );
-               $updater->setContent( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $updater->setContent( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $updater->saveRevision( $summary, EDIT_NEW );
 
                $rev = $updater->getNewRevision();
@@ -555,7 +556,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
                $page = WikiPage::factory( $title );
                $updater = $page->newPageUpdater( $user );
 
-               $updater->setContent( 'main', new \WikitextContent( $wikitext ) );
+               $updater->setContent( SlotRecord::MAIN, new \WikitextContent( $wikitext ) );
 
                $summary = CommentStoreComment::newUnsavedComment( 'Just a test' );
                $rev = $updater->saveRevision( $summary, EDIT_UPDATE );
@@ -568,7 +569,7 @@ class PageUpdaterTest extends MediaWikiTestCase {
 
                $output = $page->getParserOutput( ParserOptions::newCanonical( 'canonical' ) );
                $html = $output->getText();
-               $text = $rev->getContent( 'main' )->serialize();
+               $text = $rev->getContent( SlotRecord::MAIN )->serialize();
 
                if ( $subst ) {
                        $this->assertContains( $expected, $text, 'In Wikitext' );
index f959d68..fad6228 100644 (file)
@@ -34,7 +34,7 @@ class RevisionArchiveRecordTest extends MediaWikiTestCase {
                $user = new UserIdentityValue( 11, 'Tester', 0 );
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
-               $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
                $slots = new RevisionSlots( [ $main, $aux ] );
 
@@ -65,7 +65,7 @@ class RevisionArchiveRecordTest extends MediaWikiTestCase {
                $user = new UserIdentityValue( 11, 'Tester', 0 );
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
-               $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
                $slots = new RevisionSlots( [ $main, $aux ] );
 
@@ -197,7 +197,7 @@ class RevisionArchiveRecordTest extends MediaWikiTestCase {
 
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
-               $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
                $slots = new RevisionSlots( [ $main, $aux ] );
 
index 7f56c3a..165c27b 100644 (file)
@@ -2,6 +2,7 @@
 namespace MediaWiki\Tests\Storage;
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\SlotRecord;
 use MediaWikiTestCase;
 use Revision;
 
@@ -737,7 +738,7 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                        ]
                                ),
                                'joins' => [],
@@ -758,7 +759,7 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                                'content_size' => 'slots.rev_len',
                                                'content_sha1' => 'slots.rev_sha1',
                                                'content_address' => $db->buildConcat( [
@@ -784,7 +785,7 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                                'content_size' => 'slots.rev_len',
                                                'content_sha1' => 'slots.rev_sha1',
                                                'content_address' => $db->buildConcat( [
@@ -810,7 +811,7 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                        ]
                                ),
                                'joins' => [],
@@ -831,7 +832,7 @@ class RevisionQueryInfoTest extends MediaWikiTestCase {
                                                'slot_revision_id' => 'slots.rev_id',
                                                'slot_content_id' => 'NULL',
                                                'slot_origin' => 'slots.rev_id',
-                                               'role_name' => $db->addQuotes( 'main' ),
+                                               'role_name' => $db->addQuotes( SlotRecord::MAIN ),
                                                'content_size' => 'slots.rev_len',
                                                'content_sha1' => 'slots.rev_sha1',
                                                'content_address' =>
index df7ee72..901b800 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+// phpcs:disable MediaWiki.Commenting.PhpunitAnnotations.NotClassTrait
+
 namespace MediaWiki\Tests\Storage;
 
 use CommentStoreComment;
@@ -187,17 +189,18 @@ trait RevisionRecordTests {
                $rev = $this->newRevision( [ 'rev_deleted' => $visibility ] );
 
                // NOTE: slot meta-data is never suppressed, just the content is!
-               $this->assertTrue( $rev->hasSlot( 'main' ), 'hasSlot is never suppressed' );
-               $this->assertNotNull( $rev->getSlot( 'main', RevisionRecord::RAW ), 'raw meta' );
-               $this->assertNotNull( $rev->getSlot( 'main', RevisionRecord::FOR_PUBLIC ), 'public meta' );
+               $this->assertTrue( $rev->hasSlot( SlotRecord::MAIN ), 'hasSlot is never suppressed' );
+               $this->assertNotNull( $rev->getSlot( SlotRecord::MAIN, RevisionRecord::RAW ), 'raw meta' );
+               $this->assertNotNull( $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_PUBLIC ),
+                       'public meta' );
 
                $this->assertNotNull(
-                       $rev->getSlot( 'main', RevisionRecord::FOR_THIS_USER, $user ),
+                       $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER, $user ),
                        'user can'
                );
 
                try {
-                       $rev->getSlot( 'main', RevisionRecord::FOR_PUBLIC )->getContent();
+                       $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_PUBLIC )->getContent();
                        $exception = null;
                } catch ( SuppressedDataException $ex ) {
                        $exception = $ex;
@@ -210,7 +213,7 @@ trait RevisionRecordTests {
                );
 
                try {
-                       $rev->getSlot( 'main', RevisionRecord::FOR_THIS_USER, $user )->getContent();
+                       $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER, $user )->getContent();
                        $exception = null;
                } catch ( SuppressedDataException $ex ) {
                        $exception = $ex;
@@ -232,16 +235,16 @@ trait RevisionRecordTests {
                $user = $this->getTestUser( $groups )->getUser();
                $rev = $this->newRevision( [ 'rev_deleted' => $visibility ] );
 
-               $this->assertNotNull( $rev->getContent( 'main', RevisionRecord::RAW ), 'raw can' );
+               $this->assertNotNull( $rev->getContent( SlotRecord::MAIN, RevisionRecord::RAW ), 'raw can' );
 
                $this->assertSame(
                        $publicCan,
-                       $rev->getContent( 'main', RevisionRecord::FOR_PUBLIC ) !== null,
+                       $rev->getContent( SlotRecord::MAIN, RevisionRecord::FOR_PUBLIC ) !== null,
                        'public can'
                );
                $this->assertSame(
                        $userCan,
-                       $rev->getContent( 'main', RevisionRecord::FOR_THIS_USER, $user ) !== null,
+                       $rev->getContent( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER, $user ) !== null,
                        'user can'
                );
        }
@@ -249,7 +252,7 @@ trait RevisionRecordTests {
        public function testGetSlot() {
                $rev = $this->newRevision();
 
-               $slot = $rev->getSlot( 'main' );
+               $slot = $rev->getSlot( SlotRecord::MAIN );
                $this->assertNotNull( $slot, 'getSlot()' );
                $this->assertSame( 'main', $slot->getRole(), 'getRole()' );
        }
@@ -257,14 +260,14 @@ trait RevisionRecordTests {
        public function testHasSlot() {
                $rev = $this->newRevision();
 
-               $this->assertTrue( $rev->hasSlot( 'main' ) );
+               $this->assertTrue( $rev->hasSlot( SlotRecord::MAIN ) );
                $this->assertFalse( $rev->hasSlot( 'xyz' ) );
        }
 
        public function testGetContent() {
                $rev = $this->newRevision();
 
-               $content = $rev->getSlot( 'main' );
+               $content = $rev->getSlot( SlotRecord::MAIN );
                $this->assertNotNull( $content, 'getContent()' );
                $this->assertSame( CONTENT_MODEL_TEXT, $content->getModel(), 'getModel()' );
        }
@@ -377,8 +380,8 @@ trait RevisionRecordTests {
 
        public function provideHasSameContent() {
                // Create some slots with content
-               $mainA = SlotRecord::newUnsaved( 'main', new TextContent( 'A' ) );
-               $mainB = SlotRecord::newUnsaved( 'main', new TextContent( 'B' ) );
+               $mainA = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'A' ) );
+               $mainB = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'B' ) );
                $auxA = SlotRecord::newUnsaved( 'aux', new TextContent( 'A' ) );
                $auxB = SlotRecord::newUnsaved( 'aux', new TextContent( 'A' ) );
 
index 52647c2..409e002 100644 (file)
@@ -46,11 +46,11 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::getSlot
         */
        public function testGetSlot() {
-               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) );
                $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
 
-               $this->assertSame( $mainSlot, $slots->getSlot( 'main' ) );
+               $this->assertSame( $mainSlot, $slots->getSlot( SlotRecord::MAIN ) );
                $this->assertSame( $auxSlot, $slots->getSlot( 'aux' ) );
                $this->setExpectedException( RevisionAccessException::class );
                $slots->getSlot( 'nothere' );
@@ -60,11 +60,11 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::hasSlot
         */
        public function testHasSlot() {
-               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) );
                $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
 
-               $this->assertTrue( $slots->hasSlot( 'main' ) );
+               $this->assertTrue( $slots->hasSlot( SlotRecord::MAIN ) );
                $this->assertTrue( $slots->hasSlot( 'aux' ) );
                $this->assertFalse( $slots->hasSlot( 'AUX' ) );
                $this->assertFalse( $slots->hasSlot( 'xyz' ) );
@@ -76,11 +76,11 @@ class RevisionSlotsTest extends MediaWikiTestCase {
        public function testGetContent() {
                $mainContent = new WikitextContent( 'A' );
                $auxContent = new WikitextContent( 'B' );
-               $mainSlot = SlotRecord::newUnsaved( 'main', $mainContent );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, $mainContent );
                $auxSlot = SlotRecord::newUnsaved( 'aux', $auxContent );
                $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
 
-               $this->assertSame( $mainContent, $slots->getContent( 'main' ) );
+               $this->assertSame( $mainContent, $slots->getContent( SlotRecord::MAIN ) );
                $this->assertSame( $auxContent, $slots->getContent( 'aux' ) );
                $this->setExpectedException( RevisionAccessException::class );
                $slots->getContent( 'nothere' );
@@ -90,7 +90,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::getSlotRoles
         */
        public function testGetSlotRoles_someSlots() {
-               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) );
                $slots = $this->newRevisionSlots( [ $mainSlot, $auxSlot ] );
 
@@ -110,7 +110,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::getSlots
         */
        public function testGetSlots() {
-               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newUnsaved( 'aux', new WikitextContent( 'B' ) );
                $slotsArray = [ $mainSlot, $auxSlot ];
                $slots = $this->newRevisionSlots( $slotsArray );
@@ -122,7 +122,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::getInheritedSlots
         */
        public function testGetInheritedSlots() {
-               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newInherited(
                        SlotRecord::newSaved(
                                7, 7, 'foo',
@@ -139,7 +139,7 @@ class RevisionSlotsTest extends MediaWikiTestCase {
         * @covers \MediaWiki\Storage\RevisionSlots::getOriginalSlots
         */
        public function testGetOriginalSlots() {
-               $mainSlot = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $mainSlot = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $auxSlot = SlotRecord::newInherited(
                        SlotRecord::newSaved(
                                7, 7, 'foo',
index 07a6971..75a4718 100644 (file)
@@ -158,25 +158,25 @@ class RevisionSlotsUpdateTest extends MediaWikiTestCase {
        public function testRemoveSlot() {
                $slots = new RevisionSlotsUpdate();
 
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->modifySlot( $slotA );
 
                $this->assertSame( [ 'main' ], $slots->getModifiedRoles() );
 
-               $slots->removeSlot( 'main' );
+               $slots->removeSlot( SlotRecord::MAIN );
                $slots->removeSlot( 'other' );
                $this->assertSame( [], $slots->getModifiedRoles() );
                $this->assertSame( [ 'main', 'other' ], $slots->getRemovedRoles() );
-               $this->assertTrue( $slots->isRemovedSlot( 'main' ) );
+               $this->assertTrue( $slots->isRemovedSlot( SlotRecord::MAIN ) );
                $this->assertTrue( $slots->isRemovedSlot( 'other' ) );
-               $this->assertFalse( $slots->isModifiedSlot( 'main' ) );
+               $this->assertFalse( $slots->isModifiedSlot( SlotRecord::MAIN ) );
 
                // removing the same slot again should not trigger an error
-               $slots->removeSlot( 'main' );
+               $slots->removeSlot( SlotRecord::MAIN );
 
                // getting a slot after removing it should fail
                $this->setExpectedException( RevisionAccessException::class );
-               $slots->getModifiedSlot( 'main' );
+               $slots->getModifiedSlot( SlotRecord::MAIN );
        }
 
        public function testGetModifiedRoles() {
@@ -184,26 +184,26 @@ class RevisionSlotsUpdateTest extends MediaWikiTestCase {
 
                $this->assertSame( [], $slots->getModifiedRoles() );
 
-               $slots->modifyContent( 'main', new WikitextContent( 'A' ) );
+               $slots->modifyContent( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->modifyContent( 'foo', new WikitextContent( 'Foo' ) );
                $this->assertSame( [ 'main', 'foo' ], $slots->getModifiedRoles() );
 
-               $slots->removeSlot( 'main' );
+               $slots->removeSlot( SlotRecord::MAIN );
                $this->assertSame( [ 'foo' ], $slots->getModifiedRoles() );
        }
 
        public function testGetRemovedRoles() {
-               $slotA = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $slotA = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots = new RevisionSlotsUpdate( [ $slotA ] );
 
                $this->assertSame( [], $slots->getRemovedRoles() );
 
-               $slots->removeSlot( 'main', new WikitextContent( 'A' ) );
+               $slots->removeSlot( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $slots->removeSlot( 'foo', new WikitextContent( 'Foo' ) );
 
                $this->assertSame( [ 'main', 'foo' ], $slots->getRemovedRoles() );
 
-               $slots->modifyContent( 'main', new WikitextContent( 'A' ) );
+               $slots->modifyContent( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $this->assertSame( [ 'foo' ], $slots->getRemovedRoles() );
        }
 
index 58fd4e9..04b6aa8 100644 (file)
@@ -17,6 +17,7 @@ use MediaWiki\Storage\RevisionRecord;
 use MediaWiki\Storage\RevisionStore;
 use MediaWiki\Storage\SlotRecord;
 use MediaWiki\Storage\SqlBlobStore;
+use MediaWiki\User\UserIdentityValue;
 use MediaWikiTestCase;
 use PHPUnit_Framework_MockObject_MockObject;
 use Revision;
@@ -64,10 +65,6 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
         */
        abstract protected function getMcrTablesToReset();
 
-       public function needsDB() {
-               return true;
-       }
-
        public function setUp() {
                parent::setUp();
                $this->tablesUsed[] = 'archive';
@@ -301,9 +298,9 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
        }
 
        protected function assertRevisionCompleteness( RevisionRecord $r ) {
-               $this->assertTrue( $r->hasSlot( 'main' ) );
-               $this->assertInstanceOf( SlotRecord::class, $r->getSlot( 'main' ) );
-               $this->assertInstanceOf( Content::class, $r->getContent( 'main' ) );
+               $this->assertTrue( $r->hasSlot( SlotRecord::MAIN ) );
+               $this->assertInstanceOf( SlotRecord::class, $r->getSlot( SlotRecord::MAIN ) );
+               $this->assertInstanceOf( Content::class, $r->getContent( SlotRecord::MAIN ) );
 
                foreach ( $r->getSlotRoles() as $role ) {
                        $this->assertSlotCompleteness( $r, $r->getSlot( $role ) );
@@ -360,7 +357,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
        public function provideInsertRevisionOn_successes() {
                yield 'Bare minimum revision insertion' => [
                        [
-                               'slot' => SlotRecord::newUnsaved( 'main', new WikitextContent( 'Chicken' ) ),
+                               'slot' => SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'Chicken' ) ),
                                'page' => true,
                                'comment' => $this->getRandomCommentStoreComment(),
                                'timestamp' => '20171117010101',
@@ -369,7 +366,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                ];
                yield 'Detailed revision insertion' => [
                        [
-                               'slot' => SlotRecord::newUnsaved( 'main', new WikitextContent( 'Chicken' ) ),
+                               'slot' => SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'Chicken' ) ),
                                'parent' => true,
                                'page' => true,
                                'comment' => $this->getRandomCommentStoreComment(),
@@ -457,7 +454,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
        public function testInsertRevisionOn_blobAddressExists() {
                $title = $this->getTestPageTitle();
                $revDetails = [
-                       'slot' => SlotRecord::newUnsaved( 'main', new WikitextContent( 'Chicken' ) ),
+                       'slot' => SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'Chicken' ) ),
                        'parent' => true,
                        'comment' => $this->getRandomCommentStoreComment(),
                        'timestamp' => '20171117010101',
@@ -474,14 +471,14 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->assertRevisionRecordsEqual( $revOne, $firstReturn );
 
                // Insert a second revision inheriting the same blob address
-               $revDetails['slot'] = SlotRecord::newInherited( $firstReturn->getSlot( 'main' ) );
+               $revDetails['slot'] = SlotRecord::newInherited( $firstReturn->getSlot( SlotRecord::MAIN ) );
                $revTwo = $this->getRevisionRecordFromDetailsArray( $revDetails );
                $secondReturn = $store->insertRevisionOn( $revTwo, wfGetDB( DB_MASTER ) );
                $this->assertLinkTargetsEqual( $title, $secondReturn->getPageAsLinkTarget() );
                $this->assertRevisionRecordsEqual( $revTwo, $secondReturn );
 
-               $firstMainSlot = $firstReturn->getSlot( 'main' );
-               $secondMainSlot = $secondReturn->getSlot( 'main' );
+               $firstMainSlot = $firstReturn->getSlot( SlotRecord::MAIN );
+               $secondMainSlot = $secondReturn->getSlot( SlotRecord::MAIN );
 
                $this->assertSameSlotContent( $firstMainSlot, $secondMainSlot );
 
@@ -513,7 +510,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                ];
                yield 'no timestamp' => [
                        [
-                               'slot' => SlotRecord::newUnsaved( 'main', new WikitextContent( 'Chicken' ) ),
+                               'slot' => SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'Chicken' ) ),
                                'comment' => $this->getRandomCommentStoreComment(),
                                'user' => true,
                        ],
@@ -521,7 +518,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                ];
                yield 'no comment' => [
                        [
-                               'slot' => SlotRecord::newUnsaved( 'main', new WikitextContent( 'Chicken' ) ),
+                               'slot' => SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'Chicken' ) ),
                                'timestamp' => '20171117010101',
                                'user' => true,
                        ],
@@ -529,7 +526,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                ];
                yield 'no user' => [
                        [
-                               'slot' => SlotRecord::newUnsaved( 'main', new WikitextContent( 'Chicken' ) ),
+                               'slot' => SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'Chicken' ) ),
                                'comment' => $this->getRandomCommentStoreComment(),
                                'timestamp' => '20171117010101',
                        ],
@@ -720,7 +717,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $revRecord = $store->getRevisionById( $rev->getId() );
 
                $this->assertSame( $rev->getId(), $revRecord->getId() );
-               $this->assertTrue( $revRecord->getSlot( 'main' )->getContent()->equals( $content ) );
+               $this->assertTrue( $revRecord->getSlot( SlotRecord::MAIN )->getContent()->equals( $content ) );
                $this->assertSame( __METHOD__, $revRecord->getComment()->text );
        }
 
@@ -738,7 +735,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $revRecord = $store->getRevisionByTitle( $page->getTitle() );
 
                $this->assertSame( $rev->getId(), $revRecord->getId() );
-               $this->assertTrue( $revRecord->getSlot( 'main' )->getContent()->equals( $content ) );
+               $this->assertTrue( $revRecord->getSlot( SlotRecord::MAIN )->getContent()->equals( $content ) );
                $this->assertSame( __METHOD__, $revRecord->getComment()->text );
        }
 
@@ -756,7 +753,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $revRecord = $store->getRevisionByPageId( $page->getId() );
 
                $this->assertSame( $rev->getId(), $revRecord->getId() );
-               $this->assertTrue( $revRecord->getSlot( 'main' )->getContent()->equals( $content ) );
+               $this->assertTrue( $revRecord->getSlot( SlotRecord::MAIN )->getContent()->equals( $content ) );
                $this->assertSame( __METHOD__, $revRecord->getComment()->text );
        }
 
@@ -781,7 +778,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                );
 
                $this->assertSame( $rev->getId(), $revRecord->getId() );
-               $this->assertTrue( $revRecord->getSlot( 'main' )->getContent()->equals( $content ) );
+               $this->assertTrue( $revRecord->getSlot( SlotRecord::MAIN )->getContent()->equals( $content ) );
                $this->assertSame( __METHOD__, $revRecord->getComment()->text );
        }
 
@@ -859,13 +856,14 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->assertSame( $expectedParent, $record->getParentId() );
                $this->assertSame( $rev->getSha1(), $record->getSha1() );
                $this->assertSame( $rev->getComment(), $record->getComment()->text );
-               $this->assertSame( $rev->getContentFormat(), $record->getContent( 'main' )->getDefaultFormat() );
-               $this->assertSame( $rev->getContentModel(), $record->getContent( 'main' )->getModel() );
+               $this->assertSame( $rev->getContentFormat(),
+                       $record->getContent( SlotRecord::MAIN )->getDefaultFormat() );
+               $this->assertSame( $rev->getContentModel(), $record->getContent( SlotRecord::MAIN )->getModel() );
                $this->assertLinkTargetsEqual( $rev->getTitle(), $record->getPageAsLinkTarget() );
 
                $revRec = $rev->getRevisionRecord();
-               $revMain = $revRec->getSlot( 'main' );
-               $recMain = $record->getSlot( 'main' );
+               $revMain = $revRec->getSlot( SlotRecord::MAIN );
+               $recMain = $record->getSlot( SlotRecord::MAIN );
 
                $this->assertSame( $revMain->hasOrigin(), $recMain->hasOrigin(), 'hasOrigin' );
                $this->assertSame( $revMain->hasAddress(), $recMain->hasAddress(), 'hasAddress' );
@@ -949,7 +947,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                /** @var Revision $rev */
                $rev = $page->doEditContent(
                        new WikitextContent( $text ),
-                       __METHOD__. 'a'
+                       __METHOD__ . 'a'
                )->value['revision'];
 
                $store = MediaWikiServices::getInstance()->getRevisionStore();
@@ -1014,7 +1012,7 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $record = $store->newRevisionFromArchiveRow( $row );
 
                $this->assertRevisionRecordMatchesRevision( $orig, $record );
-               $this->assertSame( $text, $record->getContent( 'main' )->serialize() );
+               $this->assertSame( $text, $record->getContent( SlotRecord::MAIN )->serialize() );
        }
 
        /**
@@ -1045,11 +1043,86 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $record = $store->newRevisionFromArchiveRow( $row );
 
                $this->assertRevisionRecordMatchesRevision( $orig, $record );
-               $this->assertSame( $text, $record->getContent( 'main' )->serialize() );
+               $this->assertSame( $text, $record->getContent( SlotRecord::MAIN )->serialize() );
        }
 
        /**
         * @covers \MediaWiki\Storage\RevisionStore::newRevisionFromArchiveRow
+        */
+       public function testNewRevisionFromArchiveRow_no_user() {
+               $store = MediaWikiServices::getInstance()->getRevisionStore();
+
+               $row = (object)[
+                       'ar_id' => '1',
+                       'ar_page_id' => '2',
+                       'ar_namespace' => '0',
+                       'ar_title' => 'Something',
+                       'ar_rev_id' => '2',
+                       'ar_text_id' => '47',
+                       'ar_timestamp' => '20180528192356',
+                       'ar_minor_edit' => '0',
+                       'ar_deleted' => '0',
+                       'ar_len' => '78',
+                       'ar_parent_id' => '0',
+                       'ar_sha1' => 'deadbeef',
+                       'ar_comment_text' => 'whatever',
+                       'ar_comment_data' => null,
+                       'ar_comment_cid' => null,
+                       'ar_user' => '0',
+                       'ar_user_text' => '', // this is the important bit
+                       'ar_actor' => null,
+                       'ar_content_format' => null,
+                       'ar_content_model' => null,
+               ];
+
+               \Wikimedia\suppressWarnings();
+               $record = $store->newRevisionFromArchiveRow( $row );
+               \Wikimedia\suppressWarnings( true );
+
+               $this->assertInstanceOf( RevisionRecord::class, $record );
+               $this->assertInstanceOf( UserIdentityValue::class, $record->getUser() );
+               $this->assertSame( 'Unknown user', $record->getUser()->getName() );
+       }
+
+       /**
+        * @covers \MediaWiki\Storage\RevisionStore::newRevisionFromRow
+        */
+       public function testNewRevisionFromRow_no_user() {
+               $store = MediaWikiServices::getInstance()->getRevisionStore();
+               $title = Title::newFromText( __METHOD__ );
+
+               $row = (object)[
+                       'rev_id' => '2',
+                       'rev_page' => '2',
+                       'page_namespace' => '0',
+                       'page_title' => $title->getText(),
+                       'rev_text_id' => '47',
+                       'rev_timestamp' => '20180528192356',
+                       'rev_minor_edit' => '0',
+                       'rev_deleted' => '0',
+                       'rev_len' => '78',
+                       'rev_parent_id' => '0',
+                       'rev_sha1' => 'deadbeef',
+                       'rev_comment_text' => 'whatever',
+                       'rev_comment_data' => null,
+                       'rev_comment_cid' => null,
+                       'rev_user' => '0',
+                       'rev_user_text' => '', // this is the important bit
+                       'rev_actor' => null,
+                       'rev_content_format' => null,
+                       'rev_content_model' => null,
+               ];
+
+               \Wikimedia\suppressWarnings();
+               $record = $store->newRevisionFromRow( $row, 0, $title );
+               \Wikimedia\suppressWarnings( true );
+
+               $this->assertNotNull( $record );
+               $this->assertNotNull( $record->getUser() );
+               $this->assertNotEmpty( $record->getUser()->getName() );
+       }
+
+       /**
         * @covers \MediaWiki\Storage\RevisionStore::insertRevisionOn
         */
        public function testInsertRevisionOn_archive() {
@@ -1093,8 +1166,8 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                $this->assertRevisionRecordsEqual( $record, $restored );
 
                // does the new revision use the original slot?
-               $recMain = $record->getSlot( 'main' );
-               $restMain = $restored->getSlot( 'main' );
+               $recMain = $record->getSlot( SlotRecord::MAIN );
+               $restMain = $restored->getSlot( SlotRecord::MAIN );
                $this->assertSame( $recMain->getAddress(), $restMain->getAddress() );
                $this->assertSame( $recMain->getContentId(), $restMain->getContentId() );
                $this->assertSame( $recMain->getOrigin(), $restMain->getOrigin() );
@@ -1549,13 +1622,14 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
                                );
                        }
                } elseif ( isset( $array['text'] ) ) {
-                       $this->assertSame( $array['text'], $result->getSlot( 'main' )->getContent()->serialize() );
+                       $this->assertSame( $array['text'],
+                               $result->getSlot( SlotRecord::MAIN )->getContent()->serialize() );
                } elseif ( isset( $array['content_format'] ) ) {
                        $this->assertSame(
                                $array['content_format'],
-                               $result->getSlot( 'main' )->getContent()->getDefaultFormat()
+                               $result->getSlot( SlotRecord::MAIN )->getContent()->getDefaultFormat()
                        );
-                       $this->assertSame( $array['content_model'], $result->getSlot( 'main' )->getModel() );
+                       $this->assertSame( $array['content_model'], $result->getSlot( SlotRecord::MAIN )->getModel() );
                }
        }
 
index 1d6a9a0..12d950c 100644 (file)
@@ -34,7 +34,7 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
                $user = new UserIdentityValue( 11, 'Tester', 0 );
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
-               $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
                $slots = new RevisionSlots( [ $main, $aux ] );
 
@@ -62,7 +62,7 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
                $user = new UserIdentityValue( 11, 'Tester', 0 );
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
-               $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
                $slots = new RevisionSlots( [ $main, $aux ] );
 
@@ -220,7 +220,7 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
 
                $comment = CommentStoreComment::newUnsavedComment( 'Hello World' );
 
-               $main = SlotRecord::newUnsaved( 'main', new TextContent( 'Lorem Ipsum' ) );
+               $main = SlotRecord::newUnsaved( SlotRecord::MAIN, new TextContent( 'Lorem Ipsum' ) );
                $aux = SlotRecord::newUnsaved( 'aux', new TextContent( 'Frumious Bandersnatch' ) );
                $slots = new RevisionSlots( [ $main, $aux ] );
 
@@ -347,19 +347,20 @@ class RevisionStoreRecordTest extends MediaWikiTestCase {
                );
 
                // NOTE: slot meta-data is never suppressed, just the content is!
-               $this->assertNotNull( $rev->getSlot( 'main', RevisionRecord::RAW ), 'raw can' );
-               $this->assertNotNull( $rev->getSlot( 'main', RevisionRecord::FOR_PUBLIC ), 'public can' );
+               $this->assertNotNull( $rev->getSlot( SlotRecord::MAIN, RevisionRecord::RAW ), 'raw can' );
+               $this->assertNotNull( $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_PUBLIC ),
+                       'public can' );
 
                $this->assertNotNull(
-                       $rev->getSlot( 'main', RevisionRecord::FOR_THIS_USER, $user ),
+                       $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER, $user ),
                        'user can'
                );
 
-               $rev->getSlot( 'main', RevisionRecord::RAW )->getContent();
+               $rev->getSlot( SlotRecord::MAIN, RevisionRecord::RAW )->getContent();
                // NOTE: the content of the current revision is never suppressed!
                // Check that getContent() doesn't throw SuppressedDataException
-               $rev->getSlot( 'main', RevisionRecord::FOR_PUBLIC )->getContent();
-               $rev->getSlot( 'main', RevisionRecord::FOR_THIS_USER, $user )->getContent();
+               $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_PUBLIC )->getContent();
+               $rev->getSlot( SlotRecord::MAIN, RevisionRecord::FOR_THIS_USER, $user )->getContent();
        }
 
 }
index aac94b8..2ed6f28 100644 (file)
@@ -9,6 +9,7 @@ use Language;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\RevisionAccessException;
 use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SlotRecord;
 use MediaWiki\Storage\SqlBlobStore;
 use MediaWikiTestCase;
 use MWException;
@@ -436,7 +437,7 @@ class RevisionStoreTest extends MediaWikiTestCase {
                        Title::newFromText( __METHOD__ . '-UTPage' )
                );
 
-               $this->assertSame( $text, $record->getContent( 'main' )->serialize() );
+               $this->assertSame( $text, $record->getContent( SlotRecord::MAIN )->serialize() );
        }
 
        /**
@@ -465,7 +466,7 @@ class RevisionStoreTest extends MediaWikiTestCase {
                        0,
                        Title::newFromText( __METHOD__ . '-UTPage' )
                );
-               $this->assertSame( 'Söme Content', $record->getContent( 'main' )->serialize() );
+               $this->assertSame( 'Söme Content', $record->getContent( SlotRecord::MAIN )->serialize() );
        }
 
        private function makeRow( array $array ) {
index 1aae16d..0db294e 100644 (file)
@@ -118,21 +118,21 @@ class SlotRecordTest extends MediaWikiTestCase {
        }
 
        public function testGetContentId_fails() {
-               $record = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $record = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $this->setExpectedException( IncompleteRevisionException::class );
 
                $record->getContentId();
        }
 
        public function testGetAddress_fails() {
-               $record = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $record = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $this->setExpectedException( IncompleteRevisionException::class );
 
                $record->getAddress();
        }
 
        public function provideIncomplete() {
-               $unsaved = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $unsaved = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                yield 'unsaved' => [ $unsaved ];
 
                $parent = new SlotRecord( $this->makeRow(), new WikitextContent( 'A' ) );
@@ -144,7 +144,7 @@ class SlotRecordTest extends MediaWikiTestCase {
         * @dataProvider provideIncomplete
         */
        public function testGetRevision_fails( SlotRecord $record ) {
-               $record = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $record = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $this->setExpectedException( IncompleteRevisionException::class );
 
                $record->getRevision();
@@ -154,7 +154,7 @@ class SlotRecordTest extends MediaWikiTestCase {
         * @dataProvider provideIncomplete
         */
        public function testGetOrigin_fails( SlotRecord $record ) {
-               $record = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $record = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
                $this->setExpectedException( IncompleteRevisionException::class );
 
                $record->getOrigin();
@@ -173,7 +173,7 @@ class SlotRecordTest extends MediaWikiTestCase {
 
                $this->assertSame( $hash, SlotRecord::base36Sha1( $text ) );
 
-               $record = SlotRecord::newUnsaved( 'main', new WikitextContent( $text ) );
+               $record = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( $text ) );
                $this->assertSame( $hash, $record->getSha1() );
        }
 
@@ -225,7 +225,7 @@ class SlotRecordTest extends MediaWikiTestCase {
 
        public function testNewSaved() {
                // This would happen while doing an edit, before saving revision meta-data.
-               $unsaved = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $unsaved = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
 
                // This would happen while doing an edit, after saving the revision meta-data
                // and content meta-data.
@@ -285,7 +285,7 @@ class SlotRecordTest extends MediaWikiTestCase {
        }
 
        public function provideNewSaved_InvalidArgumentException() {
-               $unsaved = SlotRecord::newUnsaved( 'main', new WikitextContent( 'A' ) );
+               $unsaved = SlotRecord::newUnsaved( SlotRecord::MAIN, new WikitextContent( 'A' ) );
 
                yield 'bad revision id' => [ 'xyzzy', 5, 'address', $unsaved ];
                yield 'bad content id' => [ 7, 'xyzzy', 'address', $unsaved ];
index aa579ab..f36faf7 100644 (file)
@@ -555,6 +555,10 @@ class ApiErrorFormatterTest extends MediaWikiLangTestCase {
         * @param array $expect
         */
        public function testGetMessageFromException_BC( $exception, $options, $expect ) {
+               if ( $exception instanceof UsageException ) {
+                       $this->hideDeprecated( 'UsageException::getMessageArray' );
+               }
+
                $result = new ApiResult( 8388608 );
                $formatter = new ApiErrorFormatter_BackCompat( $result );
 
index 29c7dae..30ba1c1 100644 (file)
@@ -61,6 +61,11 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                                [ $this, 'hookGetPreferences' ]
                        ]
                ] );
+               $this->mergeMwGlobalArrayValue( 'wgDefaultUserOptions', [
+                       'testradio' => 'option1',
+               ] );
+               // Workaround for static caching in User::getDefaultOptions()
+               $this->setContentLang( Language::factory( 'qqq' ) );
        }
 
        public function hookGetPreferences( $user, &$preferences ) {
@@ -90,7 +95,11 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        'default' => [],
                ];
 
-               return true;
+               $preferences['testradio'] = [
+                       'type' => 'radio',
+                       'options' => [ 'Option 1' => 'option1', 'Option 2' => 'option2' ],
+                       'section' => 'test',
+               ];
        }
 
        /**
@@ -106,6 +115,7 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                        'willBeNull' => 'registered',
                        'willBeEmpty' => 'registered',
                        'willBeHappy' => 'registered',
+                       'testradio' => 'registered',
                        'testmultiselect-opt1' => 'registered-multiselect',
                        'testmultiselect-opt2' => 'registered-multiselect',
                        'testmultiselect-opt3' => 'registered-multiselect',
@@ -243,65 +253,6 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->assertEquals( self::$Success, $response );
        }
 
-       public function testOptionWithValue() {
-               $this->mUserMock->expects( $this->never() )
-                       ->method( 'resetOptions' );
-
-               $this->mUserMock->expects( $this->once() )
-                       ->method( 'setOption' )
-                       ->with( $this->equalTo( 'name' ), $this->equalTo( 'value' ) );
-
-               $this->mUserMock->expects( $this->once() )
-                       ->method( 'saveSettings' );
-
-               $request = $this->getSampleRequest( [ 'optionname' => 'name', 'optionvalue' => 'value' ] );
-
-               $response = $this->executeQuery( $request );
-
-               $this->assertEquals( self::$Success, $response );
-       }
-
-       public function testOptionResetValue() {
-               $this->mUserMock->expects( $this->never() )
-                       ->method( 'resetOptions' );
-
-               $this->mUserMock->expects( $this->once() )
-                       ->method( 'setOption' )
-                       ->with( $this->equalTo( 'name' ), $this->identicalTo( null ) );
-
-               $this->mUserMock->expects( $this->once() )
-                       ->method( 'saveSettings' );
-
-               $request = $this->getSampleRequest( [ 'optionname' => 'name' ] );
-               $response = $this->executeQuery( $request );
-
-               $this->assertEquals( self::$Success, $response );
-       }
-
-       public function testChange() {
-               $this->mUserMock->expects( $this->never() )
-                       ->method( 'resetOptions' );
-
-               $this->mUserMock->expects( $this->exactly( 3 ) )
-                       ->method( 'setOption' )
-                       ->withConsecutive(
-                               [ $this->equalTo( 'willBeNull' ), $this->identicalTo( null ) ],
-                               [ $this->equalTo( 'willBeEmpty' ), $this->equalTo( '' ) ],
-                               [ $this->equalTo( 'willBeHappy' ), $this->equalTo( 'Happy' ) ]
-                       );
-
-               $this->mUserMock->expects( $this->once() )
-                       ->method( 'saveSettings' );
-
-               $request = $this->getSampleRequest( [
-                       'change' => 'willBeNull|willBeEmpty=|willBeHappy=Happy'
-               ] );
-
-               $response = $this->executeQuery( $request );
-
-               $this->assertEquals( self::$Success, $response );
-       }
-
        public function testResetChangeOption() {
                $this->mUserMock->expects( $this->once() )
                        ->method( 'resetOptions' );
@@ -328,95 +279,121 @@ class ApiOptionsTest extends MediaWikiLangTestCase {
                $this->assertEquals( self::$Success, $response );
        }
 
-       public function testMultiSelect() {
+       /**
+        * @dataProvider provideOptionManupulation
+        * @param array $params
+        * @param array $setOptions
+        * @param array|null $result
+        */
+       public function testOptionManupulation( array $params, array $setOptions, array $result = null,
+               $message = ''
+       ) {
                $this->mUserMock->expects( $this->never() )
                        ->method( 'resetOptions' );
 
-               $this->mUserMock->expects( $this->exactly( 4 ) )
+               $this->mUserMock->expects( $this->exactly( count( $setOptions ) ) )
                        ->method( 'setOption' )
-                       ->withConsecutive(
-                               [ $this->equalTo( 'testmultiselect-opt1' ), $this->identicalTo( true ) ],
-                               [ $this->equalTo( 'testmultiselect-opt2' ), $this->identicalTo( null ) ],
-                               [ $this->equalTo( 'testmultiselect-opt3' ), $this->identicalTo( false ) ],
-                               [ $this->equalTo( 'testmultiselect-opt4' ), $this->identicalTo( false ) ]
-                       );
-
-               $this->mUserMock->expects( $this->once() )
-                       ->method( 'saveSettings' );
-
-               $request = $this->getSampleRequest( [
-                       'change' => 'testmultiselect-opt1=1|testmultiselect-opt2|'
-                               . 'testmultiselect-opt3=|testmultiselect-opt4=0'
-               ] );
-
-               $response = $this->executeQuery( $request );
-
-               $this->assertEquals( self::$Success, $response );
-       }
-
-       public function testSpecialOption() {
-               $this->mUserMock->expects( $this->never() )
-                       ->method( 'resetOptions' );
-
-               $this->mUserMock->expects( $this->never() )
-                       ->method( 'saveSettings' );
-
-               $request = $this->getSampleRequest( [
-                       'change' => 'special=1'
-               ] );
-
-               $response = $this->executeQuery( $request );
-
-               $this->assertEquals( [
-                       'options' => 'success',
-                       'warnings' => [
-                               'options' => [
-                                       'warnings' => "Validation error for \"special\": cannot be set by this module."
-                               ]
-                       ]
-               ], $response );
-       }
-
-       public function testUnknownOption() {
-               $this->mUserMock->expects( $this->never() )
-                       ->method( 'resetOptions' );
-
-               $this->mUserMock->expects( $this->never() )
-                       ->method( 'saveSettings' );
-
-               $request = $this->getSampleRequest( [
-                       'change' => 'unknownOption=1'
-               ] );
+                       ->withConsecutive( ...$setOptions );
+
+               if ( $setOptions ) {
+                       $this->mUserMock->expects( $this->once() )
+                               ->method( 'saveSettings' );
+               } else {
+                       $this->mUserMock->expects( $this->never() )
+                               ->method( 'saveSettings' );
+               }
 
+               $request = $this->getSampleRequest( $params );
                $response = $this->executeQuery( $request );
 
-               $this->assertEquals( [
-                       'options' => 'success',
-                       'warnings' => [
-                               'options' => [
-                                       'warnings' => "Validation error for \"unknownOption\": not a valid preference."
-                               ]
-                       ]
-               ], $response );
+               if ( !$result ) {
+                       $result = self::$Success;
+               }
+               $this->assertEquals( $result, $response, $message );
        }
 
-       public function testUserjsOption() {
-               $this->mUserMock->expects( $this->never() )
-                       ->method( 'resetOptions' );
-
-               $this->mUserMock->expects( $this->once() )
-                       ->method( 'setOption' )
-                       ->with( $this->equalTo( 'userjs-option' ), $this->equalTo( '1' ) );
-
-               $this->mUserMock->expects( $this->once() )
-                       ->method( 'saveSettings' );
-
-               $request = $this->getSampleRequest( [
-                       'change' => 'userjs-option=1'
-               ] );
-
-               $response = $this->executeQuery( $request );
-
-               $this->assertEquals( self::$Success, $response );
+       public function provideOptionManupulation() {
+               return [
+                       [
+                               [ 'change' => 'userjs-option=1' ],
+                               [ [ 'userjs-option', '1' ] ],
+                               null,
+                               'Setting userjs options',
+                       ],
+                       [
+                               [ 'change' => 'willBeNull|willBeEmpty=|willBeHappy=Happy' ],
+                               [
+                                       [ 'willBeNull', null ],
+                                       [ 'willBeEmpty', '' ],
+                                       [ 'willBeHappy', 'Happy' ],
+                               ],
+                               null,
+                               'Basic option setting',
+                       ],
+                       [
+                               [ 'change' => 'testradio=option2' ],
+                               [ [ 'testradio', 'option2' ] ],
+                               null,
+                               'Changing radio options',
+                       ],
+                       [
+                               [ 'change' => 'testradio' ],
+                               [ [ 'testradio', null ] ],
+                               null,
+                               'Resetting radio options',
+                       ],
+                       [
+                               [ 'change' => 'unknownOption=1' ],
+                               [],
+                               [
+                                       'options' => 'success',
+                                       'warnings' => [
+                                               'options' => [
+                                                       'warnings' => "Validation error for \"unknownOption\": not a valid preference."
+                                               ],
+                                       ],
+                               ],
+                               'Unrecognized options should be rejected',
+                       ],
+                       [
+                               [ 'change' => 'special=1' ],
+                               [],
+                               [
+                                       'options' => 'success',
+                                       'warnings' => [
+                                               'options' => [
+                                                       'warnings' => "Validation error for \"special\": cannot be set by this module."
+                                               ]
+                                       ]
+                               ],
+                               'Refuse setting special options',
+                       ],
+                       [
+                               [
+                                       'change' => 'testmultiselect-opt1=1|testmultiselect-opt2|'
+                                               . 'testmultiselect-opt3=|testmultiselect-opt4=0'
+                               ],
+                               [
+                                       [ 'testmultiselect-opt1', true ],
+                                       [ 'testmultiselect-opt2', null ],
+                                       [ 'testmultiselect-opt3', false ],
+                                       [ 'testmultiselect-opt4', false ],
+                               ],
+                               null,
+                               'Setting multiselect options',
+                       ],
+                       [
+                               [ 'optionname' => 'name', 'optionvalue' => 'value' ],
+                               [ [ 'name', 'value' ] ],
+                               null,
+                               'Setting options via optionname/optionvalue'
+                       ],
+                       [
+                               [ 'optionname' => 'name' ],
+                               [ [ 'name', null ] ],
+                               null,
+                               'Resetting options via optionname without optionvalue',
+                       ],
+               ];
        }
 }
index 7f2c1a6..b20d43e 100644 (file)
@@ -97,8 +97,7 @@ class ApiParseTest extends ApiTestCase {
                        $this->assertCount( 1, $res[0] );
                } else {
                        $this->assertCount( 2, $res[0] );
-                       // This deliberately fails if there are extra warnings
-                       $this->assertSame( [ 'parse' => [ 'warnings' => $warnings ] ], $res[0]['warnings'] );
+                       $this->assertSame( [ 'warnings' => $warnings ], $res[0]['warnings']['parse'] );
                }
        }
 
@@ -827,7 +826,8 @@ class ApiParseTest extends ApiTestCase {
                        'disabletidy' => '',
                ] );
 
-               $this->assertParsedTo( "<p><b>Mixed <i>up</b></i>\n</p>", $res2 );
+               $this->assertParsedTo( "<p><b>Mixed <i>up</b></i>\n</p>", $res2,
+                       'The parameter "disabletidy" has been deprecated.' );
        }
 
        public function testFormatCategories() {
index 749f154..cb5e76d 100644 (file)
@@ -3,6 +3,7 @@
 /**
  * @group API
  * @group medium
+ * @group Database
  *
  * @covers ApiQueryPrefixSearch
  */
index 129b7f9..2d7f8a4 100644 (file)
@@ -5,6 +5,7 @@ use MediaWiki\MediaWikiServices;
 /**
  * @group API
  * @group medium
+ * @group Database
  *
  * @covers ApiQuerySiteinfo
  */
index 6532635..8e2c6d9 100644 (file)
@@ -2,6 +2,7 @@
 
 use MediaWiki\Linker\LinkTarget;
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\SlotRecord;
 
 /**
  * @group medium
@@ -93,7 +94,7 @@ class ApiQueryWatchlistIntegrationTest extends ApiTestCase {
                $page = WikiPage::factory( $title );
 
                $updater = $page->newPageUpdater( $user );
-               $updater->setContent( 'main', ContentHandler::makeContent( $content, $title ) );
+               $updater->setContent( SlotRecord::MAIN, ContentHandler::makeContent( $content, $title ) );
                $rev = $updater->saveRevision( $summary );
 
                $rc = MediaWikiServices::getInstance()->getRevisionStore()->getRecentChange( $rev );
index c770029..64c3224 100644 (file)
@@ -14,6 +14,7 @@ class ChangeTagsTest extends MediaWikiTestCase {
                $this->tablesUsed[] = 'change_tag';
                $this->tablesUsed[] = 'change_tag_def';
                $this->tablesUsed[] = 'tag_summary';
+               $this->tablesUsed[] = 'valid_tag';
        }
 
        // TODO only modifyDisplayQuery and getSoftwareTags are tested, nothing else is
@@ -592,4 +593,83 @@ class ChangeTagsTest extends MediaWikiTestCase {
 
                $this->assertEquals( [ 'tag1' => 2, 'tag2' => 1 ], ChangeTags::tagUsageStatistics() );
        }
+
+       public function testListExplicitlyDefinedTagsOld() {
+               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_OLD );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'change_tag', '*' );
+               $dbw->delete( 'change_tag_def', '*' );
+               $dbw->delete( 'valid_tag', '*' );
+
+               $rcId = 123;
+               ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
+               ChangeTags::defineTag( 'tag2' );
+
+               $this->assertEquals( [ 'tag2' ], ChangeTags::listExplicitlyDefinedTags() );
+               $dbr = wfGetDB( DB_REPLICA );
+               $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_user_defined' ], '' );
+               $this->assertEquals( [], iterator_to_array( $res, false ) );
+
+               $this->assertEquals( [ 'tag2' ], $dbr->selectFieldValues( 'valid_tag', 'vt_tag', '' ) );
+       }
+
+       public function testListExplicitlyDefinedTagsWriteBoth() {
+               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_WRITE_BOTH );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'change_tag', '*' );
+               $dbw->delete( 'change_tag_def', '*' );
+               $dbw->delete( 'valid_tag', '*' );
+
+               $rcId = 123;
+               ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
+               ChangeTags::defineTag( 'tag2' );
+
+               $this->assertEquals( [ 'tag2' ], ChangeTags::listExplicitlyDefinedTags() );
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $expected = [
+                       (object)[
+                               'ctd_name' => 'tag1',
+                               'ctd_user_defined' => 0
+                       ],
+                       (object)[
+                               'ctd_name' => 'tag2',
+                               'ctd_user_defined' => 1
+                       ],
+               ];
+               $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_user_defined' ], '' );
+               $this->assertEquals( $expected, iterator_to_array( $res, false ) );
+
+               $this->assertEquals( [ 'tag2' ], $dbr->selectFieldValues( 'valid_tag', 'vt_tag', '' ) );
+       }
+
+       public function testListExplicitlyDefinedTagsNew() {
+               $this->setMwGlobals( 'wgChangeTagsSchemaMigrationStage', MIGRATION_NEW );
+               $dbw = wfGetDB( DB_MASTER );
+               $dbw->delete( 'change_tag', '*' );
+               $dbw->delete( 'change_tag_def', '*' );
+               $dbw->delete( 'valid_tag', '*' );
+
+               $rcId = 123;
+               ChangeTags::updateTags( [ 'tag1', 'tag2' ], [], $rcId );
+               ChangeTags::defineTag( 'tag2' );
+
+               $this->assertEquals( [ 'tag2' ], ChangeTags::listExplicitlyDefinedTags() );
+               $dbr = wfGetDB( DB_REPLICA );
+
+               $expected = [
+                       (object)[
+                               'ctd_name' => 'tag1',
+                               'ctd_user_defined' => 0
+                       ],
+                       (object)[
+                               'ctd_name' => 'tag2',
+                               'ctd_user_defined' => 1
+                       ],
+               ];
+               $res = $dbr->select( 'change_tag_def', [ 'ctd_name', 'ctd_user_defined' ], '' );
+               $this->assertEquals( $expected, iterator_to_array( $res, false ) );
+
+               $this->assertEquals( [], $dbr->selectFieldValues( 'valid_tag', 'vt_tag', '' ) );
+       }
 }
index d69cfd1..a890494 100644 (file)
@@ -32,7 +32,7 @@ class TextContentTest extends MediaWikiLangTestCase {
                                CONTENT_MODEL_CSS,
                                CONTENT_MODEL_JAVASCRIPT,
                        ],
-                       'wgUseTidy' => false,
+                       'wgTidyConfig' => [ 'driver' => 'disabled' ],
                        'wgCapitalLinks' => true,
                        'wgHooks' => [], // bypass hook ContentGetParserOutput that force custom rendering
                ] );
index b4b2948..e469f12 100644 (file)
@@ -1,6 +1,8 @@
 <?php
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\SlotRenderingProvider;
+use MediaWiki\Storage\SlotRecord;
 
 /**
  * @group ContentHandler
@@ -363,4 +365,30 @@ class WikitextContentHandlerTest extends MediaWikiLangTestCase {
                $this->assertArrayHasKey( 'file_text', $data );
                $this->assertEquals( 'This is file content', $data['file_text'] );
        }
+
+       public function testGetSecondaryDataUpdates() {
+               $title = Title::newFromText( 'Somefile.jpg', NS_FILE );
+               $content = new WikitextContent( '' );
+
+               /** @var SlotRenderingProvider $srp */
+               $srp = $this->getMock( SlotRenderingProvider::class );
+
+               $handler = new WikitextContentHandler();
+               $updates = $handler->getSecondaryDataUpdates( $title, $content, SlotRecord::MAIN, $srp );
+
+               $this->assertEquals( [], $updates );
+       }
+
+       public function testGetDeletionUpdates() {
+               $title = Title::newFromText( 'Somefile.jpg', NS_FILE );
+               $content = new WikitextContent( '' );
+
+               $srp = $this->getMock( SlotRenderingProvider::class );
+
+               $handler = new WikitextContentHandler();
+               $updates = $handler->getDeletionUpdates( $title, SlotRecord::MAIN );
+
+               $this->assertEquals( [], $updates );
+       }
+
 }
index 88f4d8f..607549f 100644 (file)
@@ -102,9 +102,15 @@ Then we got more<br>text
 END;
                $struct = $this->getStructure( $text );
                $this->assertEquals( "Opening text is opening.", $struct->getOpeningText() );
-               $this->assertEquals( "Opening text is opening.   Then we got more text",
+               $this->assertEquals( "Opening text is opening. Then we got more text",
                        $struct->getMainText() );
                $this->assertEquals( [ "Header table row in table another row in table" ],
                        $struct->getAuxiliaryText() );
        }
+
+       public function testPreservesWordSpacing() {
+               $text = "<dd><dl>foo</dl><dl>bar</dl></dd><p>baz</p>";
+               $struct = $this->getStructure( $text );
+               $this->assertEquals( "foo bar baz", $struct->getMainText() );
+       }
 }
index 5c2aa2b..6b1ed7f 100644 (file)
@@ -11,15 +11,17 @@ use Wikimedia\TestingAccessWrapper;
 class DatabasePostgresTest extends MediaWikiTestCase {
 
        private function doTestInsertIgnore() {
-               $reset = new ScopedCallback( function () {
+               $fname = __METHOD__;
+               $reset = new ScopedCallback( function () use ( $fname ) {
                        if ( $this->db->explicitTrxActive() ) {
-                               $this->db->rollback( __METHOD__ );
+                               $this->db->rollback( $fname );
                        }
-                       $this->db->query( 'DROP TABLE IF EXISTS ' . $this->db->tableName( 'foo' ) );
+                       $this->db->query( 'DROP TABLE IF EXISTS ' . $this->db->tableName( 'foo' ), $fname );
                } );
 
                $this->db->query(
-                       "CREATE TEMPORARY TABLE {$this->db->tableName( 'foo' )} (i INTEGER NOT NULL PRIMARY KEY)"
+                       "CREATE TEMPORARY TABLE {$this->db->tableName( 'foo' )} (i INTEGER NOT NULL PRIMARY KEY)",
+                       __METHOD__
                );
                $this->db->insert( 'foo', [ [ 'i' => 1 ], [ 'i' => 2 ] ], __METHOD__ );
 
@@ -92,19 +94,22 @@ class DatabasePostgresTest extends MediaWikiTestCase {
        }
 
        private function doTestInsertSelectIgnore() {
-               $reset = new ScopedCallback( function () {
+               $fname = __METHOD__;
+               $reset = new ScopedCallback( function () use ( $fname ) {
                        if ( $this->db->explicitTrxActive() ) {
-                               $this->db->rollback( __METHOD__ );
+                               $this->db->rollback( $fname );
                        }
-                       $this->db->query( 'DROP TABLE IF EXISTS ' . $this->db->tableName( 'foo' ) );
-                       $this->db->query( 'DROP TABLE IF EXISTS ' . $this->db->tableName( 'bar' ) );
+                       $this->db->query( 'DROP TABLE IF EXISTS ' . $this->db->tableName( 'foo' ), $fname );
+                       $this->db->query( 'DROP TABLE IF EXISTS ' . $this->db->tableName( 'bar' ), $fname );
                } );
 
                $this->db->query(
-                       "CREATE TEMPORARY TABLE {$this->db->tableName( 'foo' )} (i INTEGER)"
+                       "CREATE TEMPORARY TABLE {$this->db->tableName( 'foo' )} (i INTEGER)",
+                       __METHOD__
                );
                $this->db->query(
-                       "CREATE TEMPORARY TABLE {$this->db->tableName( 'bar' )} (i INTEGER NOT NULL PRIMARY KEY)"
+                       "CREATE TEMPORARY TABLE {$this->db->tableName( 'bar' )} (i INTEGER NOT NULL PRIMARY KEY)",
+                       __METHOD__
                );
                $this->db->insert( 'bar', [ [ 'i' => 1 ], [ 'i' => 2 ] ], __METHOD__ );
 
index de861b6..1616139 100644 (file)
@@ -23,6 +23,7 @@
  * @copyright © 2013 Wikimedia Foundation Inc.
  */
 
+use Wikimedia\Rdbms\LBFactory;
 use Wikimedia\Rdbms\LBFactorySimple;
 use Wikimedia\Rdbms\LBFactoryMulti;
 use Wikimedia\Rdbms\LoadBalancer;
@@ -33,13 +34,14 @@ use Wikimedia\Rdbms\DatabaseDomain;
 
 /**
  * @group Database
+ * @covers \Wikimedia\Rdbms\LBFactory
  * @covers \Wikimedia\Rdbms\LBFactorySimple
  * @covers \Wikimedia\Rdbms\LBFactoryMulti
  */
 class LBFactoryTest extends MediaWikiTestCase {
 
        /**
-        * @covers MWLBFactory::getLBFactoryClass
+        * @covers MWLBFactory::getLBFactoryClass()
         * @dataProvider getLBFactoryClassProvider
         */
        public function testGetLBFactoryClass( $expected, $deprecated ) {
@@ -75,8 +77,8 @@ class LBFactoryTest extends MediaWikiTestCase {
        }
 
        /**
-        * @covers LBFactory::getLocalDomainID()
-        * @covers LBFactory::resolveDomainID()
+        * @covers \Wikimedia\Rdbms\LBFactory::getLocalDomainID()
+        * @covers \Wikimedia\Rdbms\LBFactory::resolveDomainID()
         */
        public function testLBFactorySimpleServer() {
                global $wgDBserver, $wgDBname, $wgDBuser, $wgDBpassword, $wgDBtype, $wgSQLiteDataDir;
@@ -627,7 +629,6 @@ class LBFactoryTest extends MediaWikiTestCase {
                $time = 1526522031;
                $agentId = md5( 'Ramsey\'s Loyal Presa Canario' );
 
-               $lbFactory = $this->newLBFactoryMulti();
                $this->assertEquals(
                        '3@542#c47dcfb0566e7d7bc110a6128a45c93a',
                        LBFactory::makeCookieValueFromCPIndex( 3, 542, $agentId )
index 55e5bbf..6b977a3 100644 (file)
@@ -20,11 +20,6 @@ class DeprecationHelperTest extends MediaWikiTestCase {
                $this->setMwGlobals( 'wgDevelopmentWarnings', false );
        }
 
-       public function tearDown() {
-               parent::tearDown();
-               MWDebug::clearLog();
-       }
-
        /**
         * @dataProvider provideGet
         */
index 07d02dd..e21ac3b 100644 (file)
@@ -216,9 +216,9 @@ class DifferenceEngineTest extends MediaWikiTestCase {
        }
 
        public function testSetRevisions() {
-               $main1 = SlotRecord::newUnsaved( 'main',
+               $main1 = SlotRecord::newUnsaved( SlotRecord::MAIN,
                        ContentHandler::makeContent( 'xxx', null, CONTENT_MODEL_TEXT ) );
-               $main2 = SlotRecord::newUnsaved( 'main',
+               $main2 = SlotRecord::newUnsaved( SlotRecord::MAIN,
                        ContentHandler::makeContent( 'yyy', null, CONTENT_MODEL_TEXT ) );
                $rev1 = $this->getRevisionRecord( $main1 );
                $rev2 = $this->getRevisionRecord( $main2 );
@@ -260,9 +260,9 @@ class DifferenceEngineTest extends MediaWikiTestCase {
        }
 
        public function provideGetDiffBody() {
-               $main1 = SlotRecord::newUnsaved( 'main',
+               $main1 = SlotRecord::newUnsaved( SlotRecord::MAIN,
                        ContentHandler::makeContent( 'xxx', null, CONTENT_MODEL_TEXT ) );
-               $main2 = SlotRecord::newUnsaved( 'main',
+               $main2 = SlotRecord::newUnsaved( SlotRecord::MAIN,
                        ContentHandler::makeContent( 'yyy', null, CONTENT_MODEL_TEXT ) );
                $slot1 = SlotRecord::newUnsaved( 'slot',
                        ContentHandler::makeContent( 'aaa', null, CONTENT_MODEL_TEXT ) );
index dc81e1d..c765438 100644 (file)
@@ -31,7 +31,7 @@ class ComposerLockTest extends MediaWikiTestCase {
                                                'email' => 'chad@wikimedia.org',
                                        ],
                                ],
-                               'description' => 'Constant Database (CDB) wrapper library for PHP. '.
+                               'description' => 'Constant Database (CDB) wrapper library for PHP. ' .
                                        'Provides pure-PHP fallback when dba_* functions are absent.',
                        ],
                        'cssjanus/cssjanus' => [
index c758ba6..8a05641 100644 (file)
@@ -51,7 +51,7 @@ class LinkRendererTest extends MediaWikiLangTestCase {
 
                // Query added
                $this->assertEquals(
-                       '<a href="/w/index.php?title=Foobar&amp;foo=bar" '. 'title="Foobar">Foobar</a>',
+                       '<a href="/w/index.php?title=Foobar&amp;foo=bar" ' . 'title="Foobar">Foobar</a>',
                        $linkRenderer->makeKnownLink( $target, null, [], [ 'foo' => 'bar' ] )
                );
 
index a70c005..83554d2 100644 (file)
@@ -127,9 +127,8 @@ class BitmapMetadataHandlerTest extends MediaWikiTestCase {
         * @covers BitmapMetadataHandler::png
         */
        public function testPNGXMP() {
-               if ( !extension_loaded( 'xml' ) ) {
-                       $this->markTestSkipped( "This test needs the xml extension." );
-               }
+               $this->checkPHPExtension( 'xml' );
+
                $handler = new BitmapMetadataHandler();
                $result = $handler->PNG( $this->filePath . 'xmp.png' );
                $expected = [
index 0987bd0..e6d2b27 100644 (file)
@@ -126,10 +126,10 @@ class FormatMetadataTest extends MediaWikiMediaTestCase {
                        ],
                        [
                                [ 'Software' => [ 'x-default' => 'paint.net 4.0.12', '_type' => 'lang' ] ],
-                               [ 'Software' => '<ul class="metadata-langlist">'.
-                                               '<li class="mw-metadata-lang-default">'.
-                                                       '<span class="mw-metadata-lang-value">paint.net 4.0.12</span>'.
-                                               "</li>\n".
+                               [ 'Software' => '<ul class="metadata-langlist">' .
+                                               '<li class="mw-metadata-lang-default">' .
+                                                       '<span class="mw-metadata-lang-value">paint.net 4.0.12</span>' .
+                                               "</li>\n" .
                                        '</ul>'
                                ],
                        ],
index 68cddd6..d07a9e1 100644 (file)
@@ -2,6 +2,7 @@
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 use PHPUnit\Framework\MockObject\MockObject;
 
 /**
@@ -43,7 +44,7 @@ class ArticleViewTest extends MediaWikiTestCase {
                        }
 
                        $u = $page->newPageUpdater( $user );
-                       $u->setContent( 'main', $cont );
+                       $u->setContent( SlotRecord::MAIN, $cont );
                        $rev = $u->saveRevision( CommentStoreComment::newUnsavedComment( 'Rev ' . $key ) );
 
                        $revisions[ $key ] = $rev;
@@ -201,7 +202,7 @@ class ArticleViewTest extends MediaWikiTestCase {
                $rev->setComment( $dummyRev->getComment() );
                $rev->setTimestamp( $dummyRev->getTimestamp() );
 
-               $rev->setContent( 'main', $content );
+               $rev->setContent( SlotRecord::MAIN, $content );
 
                $rev = new Revision( $rev );
 
@@ -453,7 +454,7 @@ class ArticleViewTest extends MediaWikiTestCase {
                $this->setTemporaryHook(
                        'ArticleRevisionViewCustom',
                        function ( RevisionRecord $rev, Title $title, $oldid, OutputPage $output ) use ( $page ) {
-                               $content = $rev->getContent( 'main' );
+                               $content = $rev->getContent( SlotRecord::MAIN );
 
                                $this->assertSame( $page->getTitle(), $title, '$title' );
                                $this->assertSame( 'Test A', $content->getNativeData(), '$content' );
index 6757e78..476d5c2 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Storage\SlotRecord;
 use MediaWiki\Storage\SqlBlobStore;
 use MediaWiki\Tests\Storage\PreMcrSchemaOverride;
 
@@ -27,7 +28,7 @@ class PageArchivePreMcrTest extends PageArchiveTestBase {
                $blobStore = MediaWikiServices::getInstance()->getBlobStore();
 
                $textId = $blobStore->getTextIdFromAddress(
-                       $this->firstRev->getSlot( 'main' )->getAddress()
+                       $this->firstRev->getSlot( SlotRecord::MAIN )->getAddress()
                );
 
                $row = (object)[ 'ar_text_id' => $textId ];
@@ -61,7 +62,7 @@ class PageArchivePreMcrTest extends PageArchiveTestBase {
                                'ar_namespace' => '0',
                                'ar_title' => 'PageArchiveTest_thePage',
                                'ar_text_id' => (string)$blobStore->getTextIdFromAddress(
-                                       $this->ipRev->getSlot( 'main' )->getAddress()
+                                       $this->ipRev->getSlot( SlotRecord::MAIN )->getAddress()
                                ),
                                'ar_parent_id' => strval( $this->ipRev->getParentId() ),
                        ],
@@ -86,7 +87,7 @@ class PageArchivePreMcrTest extends PageArchiveTestBase {
                                'ar_namespace' => '0',
                                'ar_title' => 'PageArchiveTest_thePage',
                                'ar_text_id' => (string)$blobStore->getTextIdFromAddress(
-                                       $this->firstRev->getSlot( 'main' )->getAddress()
+                                       $this->firstRev->getSlot( SlotRecord::MAIN )->getAddress()
                                ),
                                'ar_parent_id' => '0',
                        ],
index dc805df..67cbf58 100644 (file)
@@ -3,6 +3,8 @@
 use MediaWiki\Edit\PreparedEdit;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\RevisionSlotsUpdate;
+use MediaWiki\Storage\SlotRecord;
+use PHPUnit\Framework\MockObject\MockObject;
 use Wikimedia\TestingAccessWrapper;
 
 /**
@@ -104,18 +106,35 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
 
        /**
         * @param string|Title|WikiPage $page
-        * @param string $text
+        * @param string|Content|Content[] $content
         * @param int|null $model
         *
         * @return WikiPage
         */
-       protected function createPage( $page, $text, $model = null, $user = null ) {
+       protected function createPage( $page, $content, $model = null, $user = null ) {
                if ( is_string( $page ) || $page instanceof Title ) {
                        $page = $this->newPage( $page, $model );
                }
 
-               $content = ContentHandler::makeContent( $text, $page->getTitle(), $model );
-               $page->doEditContent( $content, "testing", EDIT_NEW, false, $user );
+               if ( !$user ) {
+                       $user = $this->getTestUser()->getUser();
+               }
+
+               if ( is_string( $content ) ) {
+                       $content = ContentHandler::makeContent( $content, $page->getTitle(), $model );
+               }
+
+               if ( !is_array( $content ) ) {
+                       $content = [ 'main' => $content ];
+               }
+
+               $updater = $page->newPageUpdater( $user );
+
+               foreach ( $content as $role => $cnt ) {
+                       $updater->setContent( $role, $cnt );
+               }
+
+               $updater->saveRevision( CommentStoreComment::newUnsavedComment( "testing" ) );
 
                return $page;
        }
@@ -589,16 +608,18 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
         * @covers WikiPage::doDeleteUpdates
         */
        public function testDoDeleteUpdates() {
+               $user = $this->getTestUser()->getUser();
                $page = $this->createPage(
                        __METHOD__,
                        "[[original text]] foo",
                        CONTENT_MODEL_WIKITEXT
                );
                $id = $page->getId();
+               $page->loadPageData(); // make sure the current revision is cached.
 
                // Similar to MovePage logic
                wfGetDB( DB_MASTER )->delete( 'page', [ 'page_id' => $id ], __METHOD__ );
-               $page->doDeleteUpdates( $id );
+               $page->doDeleteUpdates( $page->getId(), $page->getContent(), $page->getRevision(), $user );
 
                // Run the job queue
                JobQueueGroup::destroySingletons();
@@ -615,6 +636,86 @@ abstract class WikiPageDbTestBase extends MediaWikiLangTestCase {
                $this->assertEquals( 0, $n, 'pagelinks should contain no more links from the page' );
        }
 
+       /**
+        * @param string $name
+        *
+        * @return ContentHandler
+        */
+       protected function defineMockContentModelForUpdateTesting( $name ) {
+               /** @var ContentHandler|MockObject $handler */
+               $handler = $this->getMockBuilder( TextContentHandler::class )
+                       ->setConstructorArgs( [ $name ] )
+                       ->setMethods(
+                               [ 'getSecondaryDataUpdates', 'getDeletionUpdates', 'unserializeContent' ]
+                       )
+                       ->getMock();
+
+               $dataUpdate = new MWCallableUpdate( 'time' );
+               $dataUpdate->_name = "$name data update";
+
+               $deletionUpdate = new MWCallableUpdate( 'time' );
+               $deletionUpdate->_name = "$name deletion update";
+
+               $handler->method( 'getSecondaryDataUpdates' )->willReturn( [ $dataUpdate ] );
+               $handler->method( 'getDeletionUpdates' )->willReturn( [ $deletionUpdate ] );
+               $handler->method( 'unserializeContent' )->willReturnCallback(
+                       function ( $text ) use ( $handler ) {
+                               return $this->createMockContent( $handler, $text );
+                       }
+               );
+
+               $this->mergeMwGlobalArrayValue(
+                       'wgContentHandlers', [
+                               $name => function () use ( $handler ){
+                                       return $handler;
+                               }
+                       ]
+               );
+
+               return $handler;
+       }
+
+       /**
+        * @param ContentHandler $handler
+        * @param string $text
+        *
+        * @return Content
+        */
+       protected function createMockContent( ContentHandler $handler, $text ) {
+               /** @var Content|MockObject $content */
+               $content = $this->getMockBuilder( TextContent::class )
+                       ->setConstructorArgs( [ $text ] )
+                       ->setMethods( [ 'getModel', 'getContentHandler' ] )
+                       ->getMock();
+
+               $content->method( 'getModel' )->willReturn( $handler->getModelID() );
+               $content->method( 'getContentHandler' )->willReturn( $handler );
+
+               return $content;
+       }
+
+       public function testGetDeletionUpdates() {
+               $m1 = $this->defineMockContentModelForUpdateTesting( 'M1' );
+
+               $mainContent1 = $this->createMockContent( $m1, 'main 1' );
+
+               $page = new WikiPage( Title::newFromText( __METHOD__ ) );
+               $page = $this->createPage(
+                       $page,
+                       [ 'main' => $mainContent1 ]
+               );
+
+               $dataUpdates = $page->getDeletionUpdates( $page->getRevisionRecord() );
+               $this->assertNotEmpty( $dataUpdates );
+
+               $updateNames = array_map( function ( $du ) {
+                       return isset( $du->_name ) ? $du->_name : get_class( $du );
+               }, $dataUpdates );
+
+               $this->assertContains( LinksDeletionUpdate::class, $updateNames );
+               $this->assertContains( 'M1 deletion update', $updateNames );
+       }
+
        /**
         * @covers WikiPage::getRevision
         */
@@ -1132,7 +1233,7 @@ more stuff
                );
 
                // TODO: MCR: assert origin once we write slot data
-               // $mainSlot = $page->getRevision()->getRevisionRecord()->getSlot( 'main' );
+               // $mainSlot = $page->getRevision()->getRevisionRecord()->getSlot( SlotRecord::MAIN );
                // $this->assertTrue( $mainSlot->isInherited(), 'isInherited' );
                // $this->assertSame( $rev2->getId(), $mainSlot->getOrigin(), 'getOrigin' );
        }
@@ -2316,10 +2417,10 @@ more stuff
 
                // provide context, so the cache can be kept in place
                $slotsUpdate = new revisionSlotsUpdate();
-               $slotsUpdate->modifyContent( 'main', $content );
+               $slotsUpdate->modifyContent( SlotRecord::MAIN, $content );
 
                $updater = $page->newPageUpdater( $user, $slotsUpdate );
-               $updater->setContent( 'main', $content );
+               $updater->setContent( SlotRecord::MAIN, $content );
                $revision = $updater->saveRevision(
                        CommentStoreComment::newUnsavedComment( 'test' ),
                        EDIT_NEW
@@ -2348,7 +2449,7 @@ more stuff
                $user = $revision->getUser();
 
                $slotsUpdate = new RevisionSlotsUpdate();
-               $slotsUpdate->modifyContent( 'main', new WikitextContent( 'Hello World' ) );
+               $slotsUpdate->modifyContent( SlotRecord::MAIN, new WikitextContent( 'Hello World' ) );
 
                // get a virgin updater
                $updater1 = $page->getDerivedDataUpdater( $user );
@@ -2360,7 +2461,7 @@ more stuff
                $this->assertSame( $updater1, $page->getDerivedDataUpdater( $user, $revision ) );
 
                $slotsUpdate = RevisionSlotsUpdate::newFromContent(
-                       [ 'main' => $revision->getContent( 'main' ) ]
+                       [ SlotRecord::MAIN => $revision->getContent( SlotRecord::MAIN ) ]
                );
                $this->assertSame( $updater1, $page->getDerivedDataUpdater( $user, null, $slotsUpdate ) );
 
index 9e2ff09..458e415 100644 (file)
@@ -20,4 +20,29 @@ class WikiPageMcrReadNewDbTest extends WikiPageDbTestBase {
                return true;
        }
 
+       public function testGetDeletionUpdates() {
+               $m1 = $this->defineMockContentModelForUpdateTesting( 'M1' );
+               $a1 = $this->defineMockContentModelForUpdateTesting( 'A1' );
+
+               $mainContent1 = $this->createMockContent( $m1, 'main 1' );
+               $auxContent1 = $this->createMockContent( $a1, 'aux 1' );
+
+               $page = new WikiPage( Title::newFromText( __METHOD__ ) );
+               $page = $this->createPage(
+                       $page,
+                       [ 'main' => $mainContent1, 'aux' => $auxContent1 ]
+               );
+
+               $dataUpdates = $page->getDeletionUpdates( $page->getRevisionRecord() );
+               $this->assertNotEmpty( $dataUpdates );
+
+               $updateNames = array_map( function ( $du ) {
+                       return isset( $du->_name ) ? $du->_name : get_class( $du );
+               }, $dataUpdates );
+
+               $this->assertContains( LinksDeletionUpdate::class, $updateNames );
+               $this->assertContains( 'M1 deletion update', $updateNames );
+               $this->assertContains( 'A1 deletion update', $updateNames );
+       }
+
 }
index 7c9c657..d849124 100644 (file)
@@ -20,4 +20,24 @@ class WikiPageNoContentModelDbTest extends WikiPageDbTestBase {
                return false;
        }
 
+       public function testGetDeletionUpdates() {
+               $mainContent1 = new WikitextContent( '' );
+
+               $title = Title::makeTitle( $this->getDefaultWikitextNS(), __METHOD__ );
+               $page = new WikiPage( $title );
+               $page = $this->createPage(
+                       $page,
+                       [ 'main' => $mainContent1 ]
+               );
+
+               $dataUpdates = $page->getDeletionUpdates( $page->getRevisionRecord() );
+               $this->assertNotEmpty( $dataUpdates );
+
+               $updateNames = array_map( function ( $du ) {
+                       return isset( $du->_name ) ? $du->_name : get_class( $du );
+               }, $dataUpdates );
+
+               $this->assertContains( LinksDeletionUpdate::class, $updateNames );
+       }
+
 }
index 1427f01..3e857f0 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionStore;
+use MediaWiki\Storage\SlotRecord;
 use MediaWiki\User\UserIdentityValue;
 
 /**
@@ -235,7 +236,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $oldRevision->setId( 100 );
                $oldRevision->setUser( new UserIdentityValue( 7, 'FauxAuthor', 0 ) );
                $oldRevision->setTimestamp( '20141111111111' );
-               $oldRevision->setContent( 'main', new WikitextContent( 'FAUX' ) );
+               $oldRevision->setContent( SlotRecord::MAIN, new WikitextContent( 'FAUX' ) );
 
                $po = new ParserOptions( $frank );
                $po->setCurrentRevisionCallback( function () use ( $oldRevision ) {
@@ -263,7 +264,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $newRevision = new MutableRevisionRecord( $title );
                $newRevision->setUser( new UserIdentityValue( 9, 'NewAuthor', 0 ) );
                $newRevision->setTimestamp( '20180808000000' );
-               $newRevision->setContent( 'main', new WikitextContent( 'NEW' ) );
+               $newRevision->setContent( SlotRecord::MAIN, new WikitextContent( 'NEW' ) );
 
                $po = new ParserOptions( $frank );
                $po->setIsPreview( true );
@@ -298,7 +299,7 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $newRevision = new MutableRevisionRecord( $title );
                $newRevision->setUser( new UserIdentityValue( 9, 'NewAuthor', 0 ) );
                $newRevision->setTimestamp( '20180808000000' );
-               $newRevision->setContent( 'main', new WikitextContent( $text ) );
+               $newRevision->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
 
                $po = new ParserOptions( $frank );
                $po->setIsPreview( true );
@@ -329,13 +330,13 @@ class ParserMethodsTest extends MediaWikiLangTestCase {
                $oldRevision->setId( 100 );
                $oldRevision->setUser( new UserIdentityValue( 7, 'OldAuthor', 0 ) );
                $oldRevision->setTimestamp( '20140404000000' );
-               $oldRevision->setContent( 'main', new WikitextContent( 'OLD' ) );
+               $oldRevision->setContent( SlotRecord::MAIN, new WikitextContent( 'OLD' ) );
 
                $currentRevision = new MutableRevisionRecord( $title );
                $currentRevision->setId( 200 );
                $currentRevision->setUser( new UserIdentityValue( 9, 'CurrentAuthor', 0 ) );
                $currentRevision->setTimestamp( '20160606000000' );
-               $currentRevision->setContent( 'main', new WikitextContent( 'CURRENT' ) );
+               $currentRevision->setContent( SlotRecord::MAIN, new WikitextContent( 'CURRENT' ) );
 
                $revisionStore = $this->getMockBuilder( RevisionStore::class )
                        ->disableOriginalConstructor()
index b5965c4..a8b0f90 100644 (file)
@@ -514,7 +514,7 @@ class SanitizerTest extends MediaWikiTestCase {
        public function provideStripAllTags() {
                return [
                        [ '<p>Foo</p>', 'Foo' ],
-                       [ '<p id="one">Foo</p><p id="two">Bar</p>', 'FooBar' ],
+                       [ '<p id="one">Foo</p><p id="two">Bar</p>', 'Foo Bar' ],
                        [ "<p>Foo</p>\n<p>Bar</p>", 'Foo Bar' ],
                        [ '<p>Hello &lt;strong&gt; wor&#x6c;&#100; caf&eacute;</p>', 'Hello <strong> world café' ],
                        [
index 61eb316..a0beb45 100644 (file)
@@ -2,9 +2,11 @@
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\MutableRevisionRecord;
 use MediaWiki\Storage\RevisionRecord;
+use MediaWiki\Storage\SlotRecord;
 
 /**
  * @covers PoolWorkArticleView
+ * @group Database
  */
 class PoolWorkArticleViewTest extends MediaWikiTestCase {
 
@@ -12,7 +14,7 @@ class PoolWorkArticleViewTest extends MediaWikiTestCase {
                $user = $this->getTestUser()->getUser();
                $updater = $page->newPageUpdater( $user );
 
-               $updater->setContent( 'main', new WikitextContent( $text ) );
+               $updater->setContent( SlotRecord::MAIN, new WikitextContent( $text ) );
                return $updater->saveRevision( CommentStoreComment::newUnsavedComment( 'testing' ) );
        }
 
@@ -56,7 +58,7 @@ class PoolWorkArticleViewTest extends MediaWikiTestCase {
                $fakeRev = new MutableRevisionRecord( $page->getTitle() );
                $fakeRev->setId( $rev->getId() );
                $fakeRev->setPageId( $page->getId() );
-               $fakeRev->setContent( 'main', new WikitextContent( 'YES!' ) );
+               $fakeRev->setContent( SlotRecord::MAIN, new WikitextContent( 'YES!' ) );
 
                $work = new PoolWorkArticleView( $page, $options, $rev->getId(), false, $fakeRev );
                $work->execute();
@@ -156,7 +158,7 @@ class PoolWorkArticleViewTest extends MediaWikiTestCase {
                $fakeRev = new MutableRevisionRecord( $page->getTitle() );
                $fakeRev->setId( $rev1->getId() );
                $fakeRev->setPageId( $page->getId() );
-               $fakeRev->setContent( 'main', new WikitextContent( 'SECRET' ) );
+               $fakeRev->setContent( SlotRecord::MAIN, new WikitextContent( 'SECRET' ) );
                $fakeRev->setVisibility( RevisionRecord::DELETED_TEXT );
 
                $work = new PoolWorkArticleView( $page, $options, $rev1->getId(), false, $fakeRev );
index d9e091d..71a3a4f 100644 (file)
@@ -678,6 +678,9 @@ class ExtensionProcessorTest extends MediaWikiTestCase {
                $info = self::$default + [
                        'requires' => [
                                'MediaWiki' => '>= 1.25.0',
+                               'platform' => [
+                                       'php' => '>= 5.5.9'
+                               ],
                                'extensions' => [
                                        'Bar' => '*'
                                ]
index b668a9a..20f97bf 100644 (file)
@@ -9,10 +9,10 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
        use PHPUnit4And6Compat;
 
        /**
-        * @dataProvider provideCheck
+        * @dataProvider provideMediaWikiCheck
         */
-       public function testCheck( $coreVersion, $constraint, $expected ) {
-               $checker = new VersionChecker( $coreVersion );
+       public function testMediaWikiCheck( $coreVersion, $constraint, $expected ) {
+               $checker = new VersionChecker( $coreVersion, '7.0.0' );
                $this->assertEquals( $expected, !(bool)$checker->checkArray( [
                        'FakeExtension' => [
                                'MediaWiki' => $constraint,
@@ -20,7 +20,7 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                ] ) );
        }
 
-       public static function provideCheck() {
+       public static function provideMediaWikiCheck() {
                return [
                        // [ $wgVersion, constraint, expected ]
                        [ '1.25alpha', '>= 1.26', false ],
@@ -44,11 +44,64 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                ];
        }
 
+       /**
+        * @dataProvider providePhpValidCheck
+        */
+       public function testPhpValidCheck( $phpVersion, $constraint, $expected ) {
+               $checker = new VersionChecker( '1.0.0', $phpVersion );
+               $this->assertEquals( $expected, !(bool)$checker->checkArray( [
+                       'FakeExtension' => [
+                               'platform' => [
+                                       'php' => $constraint,
+                               ],
+                       ],
+               ] ) );
+       }
+
+       public static function providePhpValidCheck() {
+               return [
+                       // [ phpVersion, constraint, expected ]
+                       [ '7.0.23', '>= 7.0.0', true ],
+                       [ '7.0.23', '^7.1.0', false ],
+                       [ '7.0.23', '7.0.23', true ],
+               ];
+       }
+
+       /**
+        * @expectedException UnexpectedValueException
+        */
+       public function testPhpInvalidConstraint() {
+               $checker = new VersionChecker( '1.0.0', '7.0.0' );
+               $checker->checkArray( [
+                       'FakeExtension' => [
+                               'platform' => [
+                                       'php' => 'totallyinvalid',
+                               ],
+                       ],
+               ] );
+       }
+
+       /**
+        * @dataProvider providePhpInvalidVersion
+        * @expectedException UnexpectedValueException
+        */
+       public function testPhpInvalidVersion( $phpVersion ) {
+                $checker = new VersionChecker( '1.0.0', $phpVersion );
+       }
+
+       public static function providePhpInvalidVersion() {
+               return [
+                       // [ phpVersion ]
+                       [ '7.abc' ],
+                       [ '5.a.x' ],
+               ];
+       }
+
        /**
         * @dataProvider provideType
         */
        public function testType( $given, $expected ) {
-               $checker = new VersionChecker( '1.0.0' );
+               $checker = new VersionChecker( '1.0.0', '7.0.0' );
                $checker->setLoadedExtensionsAndSkins( [
                                'FakeDependency' => [
                                        'version' => '1.0.0',
@@ -150,7 +203,7 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
         * returns any error message.
         */
        public function testInvalidConstraint() {
-               $checker = new VersionChecker( '1.0.0' );
+               $checker = new VersionChecker( '1.0.0', '7.0.0' );
                $checker->setLoadedExtensionsAndSkins( [
                                'FakeDependency' => [
                                        'version' => 'not really valid',
@@ -169,7 +222,7 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                        ],
                ] ) );
 
-               $checker = new VersionChecker( '1.0.0' );
+               $checker = new VersionChecker( '1.0.0', '7.0.0' );
                $checker->setLoadedExtensionsAndSkins( [
                                'FakeDependency' => [
                                        'version' => '1.24.3',
@@ -184,24 +237,49 @@ class VersionCheckerTest extends PHPUnit\Framework\TestCase {
                ] );
        }
 
-       /**
-        * T197478
-        */
-       public function testInvalidDependency() {
-               $checker = new VersionChecker( '1.0.0' );
-               $this->setExpectedException( UnexpectedValueException::class,
-                       'Dependency type skin unknown in FakeExtension' );
-               $this->assertEquals( [
+       public function provideInvalidDependency() {
+               return [
                        [
-                               'type' => 'invalid-version',
-                               'msg' => 'FakeDependency does not have a valid version string.',
+                               [
+                                       'FakeExtension' => [
+                                               'platform' => [
+                                                       'undefinedPlatformDependency' => '*',
+                                               ],
+                                       ],
+                               ],
+                               'undefinedPlatformDependency',
                        ],
-               ], $checker->checkArray( [
-                       'FakeExtension' => [
-                               'skin' => [
-                                       'FakeSkin' => '*',
+                       [
+                               [
+                                       'FakeExtension' => [
+                                               'undefinedDependencyType' => '*',
+                                       ],
                                ],
+                               'undefinedDependencyType',
                        ],
-               ] ) );
+                       // T197478
+                       [
+                               [
+                                       'FakeExtension' => [
+                                               'skin' => [
+                                                       'FakeSkin' => '*',
+                                               ],
+                                       ],
+                               ],
+                               'skin',
+                       ],
+               ];
+       }
+
+       /**
+        * @dataProvider provideInvalidDependency
+        */
+       public function testInvalidDependency( $depencency, $type ) {
+               $checker = new VersionChecker( '1.0.0', '7.0.0' );
+               $this->setExpectedException(
+                       UnexpectedValueException::class,
+                       "Dependency type $type unknown in FakeExtension"
+               );
+               $checker->checkArray( $depencency );
        }
 }
index 7cd6983..dbc757f 100644 (file)
@@ -226,7 +226,7 @@ Deprecation message.' ]
                        . 'mw.config.set({"key":"value"});'
                        . 'mw.loader.state({"test.exempt":"ready","test.private":"loading","test.styles.pure":"ready","test.styles.private":"ready","test.styles.deprecated":"ready","test.scripts":"loading"});'
                        . 'mw.loader.implement("test.private@{blankVer}",function($,jQuery,require,module){},{"css":[]});'
-                       . 'mw.loader.load(["test"]);'
+                       . 'RLPAGEMODULES=["test"];mw.loader.load(RLPAGEMODULES);'
                        . 'mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test.scripts\u0026only=scripts\u0026skin=fallback");'
                        . '});</script>' . "\n"
                        . '<link rel="stylesheet" href="/w/load.php?debug=false&amp;lang=nl&amp;modules=test.styles.deprecated%2Cpure&amp;only=styles&amp;skin=fallback"/>' . "\n"
index 9040f39..171f2a6 100644 (file)
@@ -499,12 +499,42 @@ mw.example();
                );
 
                $this->assertEquals(
-                       'mw.loader.register( "test.name", "1234567" );',
-                       ResourceLoader::makeLoaderRegisterScript(
-                               'test.name',
-                               '1234567'
-                       ),
-                       'Variadic parameters'
+                       'mw.loader.register( [
+    [
+        "test.foo",
+        "100"
+    ],
+    [
+        "test.bar",
+        "200",
+        [
+            "test.unknown"
+        ]
+    ],
+    [
+        "test.baz",
+        "300",
+        [
+            3,
+            0
+        ]
+    ],
+    [
+        "test.quux",
+        "400",
+        [],
+        null,
+        null,
+        "return true;"
+    ]
+] );',
+                       ResourceLoader::makeLoaderRegisterScript( [
+                               [ 'test.foo', '100' , [], null, null ],
+                               [ 'test.bar', '200', [ 'test.unknown' ], null ],
+                               [ 'test.baz', '300', [ 'test.quux', 'test.foo' ], null ],
+                               [ 'test.quux', '400', [], null, null, 'return true;' ],
+                       ] ),
+                       'Compact dependency indexes'
                );
        }
 
index 7a47a63..a1ad8f9 100644 (file)
@@ -262,7 +262,7 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
 
                // Set up objects
                $module = $this->getMockBuilder( TestResourceLoaderWikiModule::class )
-                       ->setMethods( [ 'getPages' ] ) ->getMock();
+                       ->setMethods( [ 'getPages' ] )->getMock();
                $module->method( 'getPages' )->willReturn( $pages );
                $module::$returnFetchTitleInfo = $titleInfo;
                $rl = new EmptyResourceLoader();
@@ -330,7 +330,7 @@ class ResourceLoaderWikiModuleTest extends ResourceLoaderTestCase {
        public function testGetContent( $expected, $title ) {
                $context = $this->getResourceLoaderContext( [], new EmptyResourceLoader );
                $module = $this->getMockBuilder( ResourceLoaderWikiModule::class )
-                       ->setMethods( [ 'getContentObj' ] ) ->getMock();
+                       ->setMethods( [ 'getContentObj' ] )->getMock();
                $module->expects( $this->any() )
                        ->method( 'getContentObj' )->willReturn( null );
 
index b217af1..8eb233b 100644 (file)
@@ -105,7 +105,7 @@ JSON;
                                ],
                                [
                                        'method' => 'GET',
-                                       'userAgent' => Http::userAgent() ." SparqlClient",
+                                       'userAgent' => Http::userAgent() . " SparqlClient",
                                        'timeout' => 30
                                ]
                        ],
index d84fcd7..d57d489 100644 (file)
@@ -91,7 +91,12 @@ abstract class AbstractChangesListSpecialPageTestCase extends MediaWikiTestCase
        /**
         * @dataProvider validateOptionsProvider
         */
-       public function testValidateOptions( $optionsToSet, $expectedRedirect, $expectedRedirectOptions ) {
+       public function testValidateOptions(
+               $optionsToSet,
+               $expectedRedirect,
+               $expectedRedirectOptions,
+               $rcfilters
+       ) {
                $redirectQuery = [];
                $redirected = false;
                $output = $this->getMockBuilder( OutputPage::class )
@@ -110,6 +115,7 @@ abstract class AbstractChangesListSpecialPageTestCase extends MediaWikiTestCase
 
                // Give users patrol permissions so we can test that.
                $user = $this->getTestSysop()->getUser();
+               $user->setOption( 'rcenhancedfilters-disable', $rcfilters ? 0 : 1 );
                $ctx->setUser( $user );
 
                // Disable this hook or it could break changeType
index aeaa1ae..b874215 100644 (file)
@@ -15,13 +15,6 @@ use Wikimedia\TestingAccessWrapper;
  * @covers ChangesListSpecialPage
  */
 class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase {
-       public function setUp() {
-               parent::setUp();
-               $this->setMwGlobals( [
-                       'wgStructuredChangeFiltersShowPreference' => true,
-               ] );
-       }
-
        protected function getPage() {
                $mock = $this->getMockBuilder( ChangesListSpecialPage::class )
                        ->setConstructorArgs(
@@ -673,43 +666,6 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                return $now - $days * $secondsPerDay;
        }
 
-       public function testGetFilterGroupDefinitionFromLegacyCustomFilters() {
-               $customFilters = [
-                       'hidefoo' => [
-                               'msg' => 'showhidefoo',
-                               'default' => true,
-                       ],
-
-                       'hidebar' => [
-                               'msg' => 'showhidebar',
-                               'default' => false,
-                       ],
-               ];
-
-               $this->assertEquals(
-                       [
-                               'name' => 'unstructured',
-                               'class' => ChangesListBooleanFilterGroup::class,
-                               'priority' => -1,
-                               'filters' => [
-                                       [
-                                               'name' => 'hidefoo',
-                                               'showHide' => 'showhidefoo',
-                                               'default' => true,
-                                       ],
-                                       [
-                                               'name' => 'hidebar',
-                                               'showHide' => 'showhidebar',
-                                               'default' => false,
-                                       ]
-                               ],
-                       ],
-                       $this->changesListSpecialPage->getFilterGroupDefinitionFromLegacyCustomFilters(
-                               $customFilters
-                       )
-               );
-       }
-
        public function testGetStructuredFilterJsData() {
                $this->changesListSpecialPage->filterGroups = [];
 
@@ -1041,57 +997,68 @@ class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase
                                [ 'hideanons' => 1, 'hideliu' => 1, 'hidebots' => 1 ],
                                true,
                                [ 'userExpLevel' => 'unregistered', 'hidebots' => 1, ],
+                               true,
                        ],
                        [
                                [ 'hideanons' => 1, 'hideliu' => 1, 'hidebots' => 0 ],
                                true,
                                [ 'hidebots' => 0, 'hidehumans' => 1 ],
+                               true,
                        ],
                        [
                                [ 'hideanons' => 1 ],
                                true,
-                               [ 'userExpLevel' => 'registered' ]
+                               [ 'userExpLevel' => 'registered' ],
+                               true,
                        ],
                        [
                                [ 'hideliu' => 1 ],
                                true,
-                               [ 'userExpLevel' => 'unregistered' ]
+                               [ 'userExpLevel' => 'unregistered' ],
+                               true,
                        ],
                        [
                                [ 'hideanons' => 1, 'hidebots' => 1 ],
                                true,
-                               [ 'userExpLevel' => 'registered', 'hidebots' => 1 ]
+                               [ 'userExpLevel' => 'registered', 'hidebots' => 1 ],
+                               true,
                        ],
                        [
                                [ 'hideliu' => 1, 'hidebots' => 0 ],
                                true,
-                               [ 'userExpLevel' => 'unregistered', 'hidebots' => 0 ]
+                               [ 'userExpLevel' => 'unregistered', 'hidebots' => 0 ],
+                               true,
                        ],
                        [
                                [ 'hidemyself' => 1, 'hidebyothers' => 1 ],
                                true,
                                [],
+                               true,
                        ],
                        [
                                [ 'hidebots' => 1, 'hidehumans' => 1 ],
                                true,
                                [],
+                               true,
                        ],
                        [
                                [ 'hidepatrolled' => 1, 'hideunpatrolled' => 1 ],
                                true,
                                [],
+                               true,
                        ],
                        [
                                [ 'hideminor' => 1, 'hidemajor' => 1 ],
                                true,
                                [],
+                               true,
                        ],
                        [
                                // changeType
                                [ 'hidepageedits' => 1, 'hidenewpages' => 1, 'hidecategorization' => 1, 'hidelog' => 1, ],
                                true,
                                [],
+                               true,
                        ],
                ];
        }
diff --git a/tests/phpunit/includes/specials/SpecialLogTest.php b/tests/phpunit/includes/specials/SpecialLogTest.php
new file mode 100644 (file)
index 0000000..d66280e
--- /dev/null
@@ -0,0 +1,35 @@
+<?php
+/**
+ * @license GPL-2.0-or-later
+ * @author Legoktm
+ */
+
+/**
+ * @covers SpecialLog
+ */
+class SpecialLogTest extends SpecialPageTestBase {
+
+       /**
+        * Returns a new instance of the special page under test.
+        *
+        * @return SpecialPage
+        */
+       protected function newSpecialPage() {
+               return new SpecialLog();
+       }
+
+       /**
+        * Verify that no exception was thrown for an invalid date
+        * @see T201411
+        */
+       public function testInvalidDate() {
+               list( $html, ) = $this->executeSpecialPage(
+                       '',
+                       // There is no 13th month
+                       new FauxRequest( [ 'wpdate' => '2018-13-01' ] ),
+                       'qqx'
+               );
+               $this->assertContains( '(log-summary)', $html );
+       }
+
+}
index 0b6962d..11988da 100644 (file)
@@ -46,6 +46,7 @@ class SpecialRecentchangesTest extends AbstractChangesListSpecialPageTestCase {
                                [ 'hideanons' => 1, 'hideliu' => 1 ],
                                true,
                                [ 'hideliu' => 1 ],
+                               false,
                        ],
                ];
        }
diff --git a/tests/phpunit/includes/specials/SpecialRedirectTest.php b/tests/phpunit/includes/specials/SpecialRedirectTest.php
new file mode 100644 (file)
index 0000000..bee35df
--- /dev/null
@@ -0,0 +1,70 @@
+<?php
+
+/**
+ * Test class for SpecialRedirect class
+ *
+ * @since 1.32
+ *
+ * @license GPL-2.0-or-later
+ * @group Database
+ */
+class SpecialRedirectTest extends MediaWikiTestCase {
+
+       protected $tablesUsed = [ 'user' ];
+
+       const CREATE_USER = 'create_user';
+
+       /**
+        * @dataProvider provideDispatch
+        * @covers SpecialRedirect::dispatchUser()
+        * @covers SpecialRedirect::dispatchFile()
+        * @covers SpecialRedirect::dispatchRevision()
+        * @covers SpecialRedirect::dispatchPage()
+        * @covers SpecialRedirect::dispatchLog()
+        */
+       public function testDispatch( $method, $type, $value, $expectedStatus ) {
+               $page = new SpecialRedirect();
+
+               // setup the user object
+               if ( $value === self::CREATE_USER ) {
+                       $user = User::newFromName( __CLASS__ );
+                       $user->addToDatabase();
+                       $value = $user->getId();
+               }
+
+               $page->setParameter( $type . '/' . $value );
+
+               $status = $page->$method();
+               $this->assertSame(
+                       $status->isGood(), $expectedStatus === 'good',
+                       $method . ' does not return expected status "' . $expectedStatus . '"'
+               );
+       }
+
+       public static function provideDispatch() {
+               foreach ( [
+                       [ 'nonumeric', 'fatal' ],
+                       [ '3', 'fatal' ],
+                       [ self::CREATE_USER, 'good' ],
+               ] as $dispatchUser ) {
+                       yield [ 'dispatchUser', 'user', $dispatchUser[0], $dispatchUser[1] ];
+               }
+               foreach ( [
+                       [ 'bad<name', 'fatal' ],
+                       [ 'File:Non-exists.jpg', 'fatal' ],
+                       // TODO Cannot test the good path here, because a file must exists
+               ] as $dispatchFile ) {
+                       yield [ 'dispatchFile', 'file', $dispatchFile[0], $dispatchFile[1] ];
+               }
+               foreach ( [
+                       [ 'nonumeric', 'fatal' ],
+                       [ '0', 'fatal' ],
+                       [ '1', 'good' ],
+               ] as $dispatch ) {
+                       yield [ 'dispatchRevision', 'revision', $dispatch[0], $dispatch[1] ];
+                       yield [ 'dispatchPage', 'revision', $dispatch[0], $dispatch[1] ];
+                       yield [ 'dispatchLog', 'log', $dispatch[0], $dispatch[1] ];
+               }
+       }
+
+}
index 26f6908..8ef8cb0 100644 (file)
@@ -461,7 +461,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        "(wl_notificationtimestamp >= 'TS111TS') OR (wl_notificationtimestamp IS NULL)" .
                        '))))' .
                        ') OR ((wl_namespace = 1) AND (' .
-                       "(((wl_title = 'AnotherDbKey') AND (".
+                       "(((wl_title = 'AnotherDbKey') AND (" .
                        "(wl_notificationtimestamp >= 'TS123TS') OR (wl_notificationtimestamp IS NULL)" .
                        ')))))';
                $mockDb->expects( $this->once() )
@@ -564,7 +564,7 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
                        "(wl_notificationtimestamp >= 'TS111TS') OR (wl_notificationtimestamp IS NULL)" .
                        '))))' .
                        ') OR ((wl_namespace = 1) AND (' .
-                       "(((wl_title = 'AnotherDbKey') AND (".
+                       "(((wl_title = 'AnotherDbKey') AND (" .
                        "(wl_notificationtimestamp >= 'TS123TS') OR (wl_notificationtimestamp IS NULL)" .
                        '))))' .
                        ') OR ' .
index 82302b1..97bed4c 100644 (file)
@@ -12,10 +12,9 @@ class StructureTest extends MediaWikiTestCase {
         * @coversNothing
         */
        public function testUnitTestFileNamesEndWithTest() {
-               if ( wfIsWindows() ) {
-                       $this->markTestSkipped( 'This test does not work on Windows' );
-               }
-               $rootPath = escapeshellarg( __DIR__ . '/..' );
+               // realpath() also normalizes directory separator on windows for prefix compares
+               $rootPath = realpath( __DIR__ . '/..' );
+               $suitesPath = realpath( __DIR__ . '/../suites/' );
                $testClassRegex = implode( '|', [
                        'ApiFormatTestBase',
                        'ApiTestCase',
@@ -29,26 +28,26 @@ class StructureTest extends MediaWikiTestCase {
                        '\\?PHPUnit\\Framework\\TestCase',
                        'TestCase', // \PHPUnit\Framework\TestCase with appropriate use statement
                        'DumpTestCase',
+                       'SpecialPageTestBase',
                ] );
-               $testClassRegex = "^class .* extends ($testClassRegex)";
-               $finder = "find $rootPath -name '*.php' '!' -name '*Test.php'" .
-                       " | xargs grep -El '$testClassRegex|function suite\('";
-
-               $results = null;
-               $exitCode = null;
-               exec( $finder, $results, $exitCode );
+               $testClassRegex = "/^class .* extends ($testClassRegex)/m";
 
-               $this->assertEquals(
-                       0,
-                       $exitCode,
-                       'Verify find/grep command succeeds.'
-               );
+               $results = $this->recurseFiles( $rootPath );
 
                $results = array_filter(
                        $results,
-                       [ $this, 'filterSuites' ]
+                       function ( $filename ) use ( $testClassRegex, $suitesPath ) {
+                               // Remove testUnitTestFileNamesEndWithTest false positives
+                               if ( strpos( $filename, $suitesPath ) === 0
+                                       || substr( $filename, -8 ) === 'Test.php'
+                               ) {
+                                       return false;
+                               }
+                               $contents = file_get_contents( $filename );
+                               return preg_match( $testClassRegex, $contents );
+                       }
                );
-               $strip = strlen( $rootPath ) - 1;
+               $strip = strlen( $rootPath ) + 1;
                foreach ( $results as $k => $v ) {
                        $results[$k] = substr( $v, $strip );
                }
@@ -59,12 +58,7 @@ class StructureTest extends MediaWikiTestCase {
                );
        }
 
-       /**
-        * Filter to remove testUnitTestFileNamesEndWithTest false positives.
-        * @param string $filename
-        * @return bool
-        */
-       public function filterSuites( $filename ) {
-               return strpos( $filename, __DIR__ . '/../suites/' ) !== 0;
+       private function recurseFiles( $dir ) {
+               return ( new File_Iterator_Facade() )->getFilesAsArray( $dir, [ '.php' ] );
        }
 }
index a1bd20a..47f04b2 100644 (file)
@@ -3,9 +3,6 @@
                "wikimedia/qunit",
                "../../.eslintrc.json"
        ],
-       "env": {
-               "qunit": true
-       },
        "globals": {
                "sinon": false
        },
index 981043b..be8b3a9 100644 (file)
@@ -1,5 +1,5 @@
 /* global sinon */
-( function ( $, mw, QUnit ) {
+( function () {
        'use strict';
 
        var addons, nested;
                } );
        } );
 
-}( jQuery, mediaWiki, QUnit ) );
+}() );
index c064275..a12cfc7 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function () {
        var getAccessKeyPrefixTestData, updateTooltipAccessKeysTestData;
 
        QUnit.module( 'jquery.accessKeyLabel', QUnit.newMwEnvironment( {
                $.fn.updateTooltipAccessKeys.setTestMode( false );
        } );
 
-}( jQuery ) );
+}() );
index ca6a512..d207260 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function () {
        QUnit.module( 'jquery.color', QUnit.newMwEnvironment() );
 
        QUnit.test( 'animate', function ( assert ) {
@@ -12,4 +12,4 @@
                        } )
                        .always( done );
        } );
-}( jQuery ) );
+}() );
index bd6e7b2..1051a83 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function () {
        QUnit.module( 'jquery.colorUtil', QUnit.newMwEnvironment() );
 
        QUnit.test( 'getRGB', function ( assert ) {
@@ -60,4 +60,4 @@
                b = $.colorUtil.getColorBrightness( 'rgb(200,50,50)', -0.2 );
                assert.strictEqual( b, 'rgb(118,29,29)', 'Start with rgb string "rgb(200,50,50)", darken 20%' );
        } );
-}( jQuery ) );
+}() );
index 74d8509..ae464f0 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function () {
        QUnit.module( 'jquery.getAttrs', QUnit.newMwEnvironment() );
 
        QUnit.test( 'getAttrs()', function ( assert ) {
@@ -11,4 +11,4 @@
 
                assert.propEqual( $el.getAttrs(), attrs, 'keys and values match' );
        } );
-}( jQuery ) );
+}() );
index 3f17ca5..cb09180 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function () {
        QUnit.module( 'jquery.hidpi', QUnit.newMwEnvironment() );
 
        QUnit.test( 'devicePixelRatio', function ( assert ) {
@@ -35,4 +35,4 @@
                assert.strictEqual( $.matchSrcSet( 1.75, srcset ), 'onefive.png', '1.75 gives match to 1.5' );
                assert.strictEqual( $.matchSrcSet( 2.25, srcset ), 'two.png', '2.25 gives match to 2' );
        } );
-}( jQuery ) );
+}() );
index 0e34e34..b73b266 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function () {
        QUnit.module( 'jquery.highlightText', QUnit.newMwEnvironment() );
 
        QUnit.test( 'Check', function ( assert ) {
                        );
                } );
        } );
-}( jQuery ) );
+}() );
index 9d4f8dd..75a8d10 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $, mw ) {
+( function () {
        var simpleSample, U_20AC, poop, mbSample;
 
        QUnit.module( 'jquery.lengthLimit', QUnit.newMwEnvironment() );
                expected: '\uD800'
        } );
 
-}( jQuery, mediaWiki ) );
+}() );
index a3e46ab..c88768d 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $, mw ) {
+( function () {
        QUnit.module( 'jquery.localize', QUnit.newMwEnvironment() );
 
        QUnit.test( 'Handle basic replacements', function ( assert ) {
                assert.strictEqual( $lc.length, 1, 'link is created' );
                assert.strictEqual( $lc.text(), 'link', 'the link text got added' );
        } );
-}( jQuery, mediaWiki ) );
+}() );
index df29ee6..0b3e809 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function () {
        var loremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.';
 
        QUnit.module( 'jquery.makeCollapsible', QUnit.newMwEnvironment() );
                        assert.assertFalse( $collapsible2.find( '> .mw-collapsible-toggle' ).hasClass( 'mw-collapsible-toggle-collapsed' ) );
                } ).find( '> .mw-collapsible-toggle a' ).trigger( 'click' );
        } );
-}( jQuery ) );
+}() );
index ec3539b..220771b 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function () {
        QUnit.module( 'jquery.tabIndex', QUnit.newMwEnvironment() );
 
        QUnit.test( 'firstTabIndex', function ( assert ) {
@@ -32,4 +32,4 @@
                $testB = $( '<div>' );
                assert.strictEqual( $testB.lastTabIndex(), null, 'Return null if none available.' );
        } );
-}( jQuery ) );
+}() );
index e49110f..1481977 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $, mw ) {
+( function () {
        /**
         * This module tests the input/output capabilities of the parsers of tablesorter.
         * It does not test actual sorting.
 
        // TODO add numbers sorting tests for T10115 with a different language
 
-}( jQuery, mediaWiki ) );
+}() );
index 69a5cec..360ef01 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $, mw ) {
+( function () {
        var header = [ 'Planet', 'Radius (km)' ],
 
                // Data set "planets"
                );
        } );
 
-}( jQuery, mediaWiki ) );
+}() );
index d598586..4966747 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function () {
        var caretSample,
                sig = {
                        pre: '--~~~~'
                end: 11,
                mode: 'set'
        } );
-}( jQuery ) );
+}() );
index 69ab797..541c610 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.ForeignApi', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
@@ -29,4 +29,4 @@
                return api.post( {} );
        } );
 
-}( mediaWiki ) );
+}() );
index fdf90dd..51ee7ad 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.api.category', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
                } );
        } );
 
-}( mediaWiki ) );
+}() );
index ff5cb2c..e9132f4 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        QUnit.module( 'mediawiki.api.edit', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
                        } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 7282b3f..72f57e9 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.api.messages', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
@@ -26,4 +26,4 @@
                        );
                } );
        } );
-}( mediaWiki ) );
+}() );
index 997a42c..549deb0 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.api.options', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
                        } )
                );
        } );
-}( mediaWiki ) );
+}() );
index 5673227..0bcce12 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.api.parse', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
@@ -42,4 +42,4 @@
                        assert.strictEqual( html, '<p><b>Earth</b> is a planet.</p>', 'Parse page by Title object' );
                } );
        } );
-}( mediaWiki ) );
+}() );
index 5ae0e94..1387be2 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        QUnit.module( 'mediawiki.api', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
                        var self = this,
                                requests = this.requests = [];
                        this.api = new mw.Api();
-                       this.sandbox.stub( jQuery, 'ajax', function () {
+                       this.sandbox.stub( $, 'ajax', function () {
                                var request = $.extend( {
                                        abort: self.sandbox.spy()
                                }, $.Deferred() );
                        assert.ok( request.abort.calledOnce, 'abort request number ' + i );
                } );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 788a427..f4d4b28 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        QUnit.module( 'mediawiki.api.upload', QUnit.newMwEnvironment( {} ) );
 
        QUnit.test( 'Basic functionality', function ( assert ) {
@@ -30,4 +30,4 @@
                assert.strictEqual( $input.val(), 'Testing API upload.jpg', 'input value' );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 649bf03..eff662e 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.api.watch', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
@@ -57,4 +57,4 @@
                } );
        } );
 
-}( mediaWiki ) );
+}() );
index 79a1b26..2de4043 100644 (file)
@@ -1,6 +1,6 @@
 /* eslint-disable camelcase */
 /* eslint no-underscore-dangle: "off" */
-( function ( mw, $ ) {
+( function () {
        var mockFilterStructure = [ {
                        name: 'group1',
                        title: 'Group 1',
                } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 03ef387..bbbe567 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable camelcase */
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.rcfilters - FilterItem' );
 
        QUnit.test( 'Initializing filter item', function ( assert ) {
 
                assert.strictEqual( item.getValue(), '1', 'Value is kept as-is' );
        } );
-}( mediaWiki ) );
+}() );
index 45d591d..2c2ce87 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable camelcase */
-( function ( mw, $ ) {
+( function () {
        var filterDefinition = [ {
                        name: 'group1',
                        type: 'send_unselected_if_any',
                } );
                assert.strictEqual( model.areVisibleFiltersEmpty(), false );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 92e5f2e..5850875 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable camelcase */
-( function ( mw ) {
+( function () {
        var filterDefinition = [ {
                        name: 'group1',
                        type: 'send_unselected_if_any',
                        'Invert parameter saved if there are namespaces.'
                );
        } );
-}( mediaWiki ) );
+}() );
index 5e35c18..5964136 100644 (file)
@@ -1,5 +1,5 @@
 /* eslint-disable camelcase */
-( function ( mw ) {
+( function () {
        var itemData = {
                params: {
                        param1: '1',
@@ -91,4 +91,4 @@
                        'Default state represented when item initialized with default:true.'
                );
        } );
-}( mediaWiki ) );
+}() );
index 14c2bb4..54fdffc 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $ ) {
+( function () {
        QUnit.module( 'mediawiki.special.recentchanges', QUnit.newMwEnvironment() );
 
        // TODO: verify checkboxes == [ 'nsassociated', 'nsinvert' ]
@@ -61,4 +61,4 @@
                // DOM cleanup
                $env.remove();
        } );
-}( jQuery ) );
+}() );
index a343aa5..b1a3650 100644 (file)
@@ -6,7 +6,7 @@
 
 QUnit.module( 'mediawiki.widgets.APIResultsQueue' );
 
-( function ( $, mw ) {
+( function () {
        var itemCounter, FullResourceProvider, EmptyResourceProvider, SingleResultResourceProvider;
 
        itemCounter = 0;
@@ -194,4 +194,4 @@ QUnit.module( 'mediawiki.widgets.APIResultsQueue' );
                        // Finish the async test
                        .then( done );
        } );
-}( jQuery, mediaWiki ) );
+}() );
index 485bac0..cde77e7 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.RegExp' );
 
        QUnit.test( 'escape', function ( assert ) {
@@ -35,4 +35,4 @@
                assert.strictEqual( mw.RegExp.escape( normal ), normal, 'Alphanumerals are left alone' );
        } );
 
-}( mediaWiki ) );
+}() );
index 0898afd..e7e7a8d 100644 (file)
@@ -1,4 +1,4 @@
-( function ( $, mw ) {
+( function () {
        var simpleSample, U_20AC, poop, mbSample,
                trimByteLength = require( 'mediawiki.String' ).trimByteLength;
 
                expected: '\uD800'
        } );
 
-}( jQuery, mediaWiki ) );
+}() );
index 8d67b4b..acdf2f1 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        /* eslint-disable camelcase */
        var repeat = function ( input, multiplier ) {
                        return new Array( multiplier + 1 ).join( input );
                assert.strictEqual( title.toString(), 'Penguins:Flightless_yet_cute.jpg' );
        } );
 
+       QUnit.test( 'isTalkPage/getTalkPage/getSubjectPage', function ( assert ) {
+               var title;
+
+               title = new mw.Title( 'User:Foo' );
+               assert.strictEqual( title.isTalkPage(), false, 'Non-talk page detected as such' );
+               assert.strictEqual( title.getSubjectPage().getPrefixedText(), 'User:Foo', 'getSubjectPage on a subject page is a no-op' );
+
+               title = title.getTalkPage();
+               assert.strictEqual( title.getPrefixedText(), 'User talk:Foo', 'getTalkPage creates correct title' );
+               assert.strictEqual( title.getTalkPage().getPrefixedText(), 'User talk:Foo', 'getTalkPage on a talk page is a no-op' );
+               assert.strictEqual( title.isTalkPage(), true, 'Talk page is detected as such' );
+
+               title = title.getSubjectPage();
+               assert.strictEqual( title.getPrefixedText(), 'User:Foo', 'getSubjectPage creates correct title' );
+
+               title = new mw.Title( 'Special:AllPages' );
+               assert.strictEqual( title.isTalkPage(), false, 'Special page is not a talk page' );
+               assert.strictEqual( title.getTalkPage(), null, 'getTalkPage not valid for this namespace' );
+               assert.strictEqual( title.getSubjectPage().getPrefixedText(), 'Special:AllPages', 'getSubjectPage is self for special pages' );
+
+               title = new mw.Title( 'Category:Project:Maintenance' );
+               assert.strictEqual( title.getTalkPage().getPrefixedText(), 'Category talk:Project:Maintenance', 'getTalkPage is not confused by colon in main text' );
+               title = new mw.Title( 'Category talk:Project:Maintenance' );
+               assert.strictEqual( title.getSubjectPage().getPrefixedText(), 'Category:Project:Maintenance', 'getSubjectPage is not confused by colon in main text' );
+
+               title = new mw.Title( 'Foo#Caption' );
+               assert.strictEqual( title.getFragment(), 'Caption', 'Subject page has a fragment' );
+               title = title.getTalkPage();
+               assert.strictEqual( title.getPrefixedText(), 'Talk:Foo', 'getTalkPage creates correct title' );
+               assert.strictEqual( title.getFragment(), null, 'getTalkPage does not copy the fragment' );
+       } );
+
        QUnit.test( 'Throw error on invalid title', function ( assert ) {
                assert.throws( function () {
                        return new mw.Title( '' );
                }
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index eece8c0..5eb5e05 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.Uri', QUnit.newMwEnvironment( {
                setup: function () {
                        this.mwUriOrg = mw.Uri;
                href = uri.toString();
                assert.strictEqual( href, testProtocol + testServer + ':' + testPort + testPath, 'Root-relative URL gets host, protocol, and port supplied' );
        } );
-}( mediaWiki ) );
+}() );
index 65765f2..33423d8 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.base' );
 
        QUnit.test( 'mw.hook - basic', function ( assert ) {
                } ] );
        } );
 
-}( mediaWiki ) );
+}() );
index b5824d3..32457fa 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        var pluralTestcases = {
                /*
                 * Sample:
@@ -80,4 +80,4 @@
                        pluralTest( langCode, tests );
                }
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 59bf737..4606cbd 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
 
        var NOW = 9012, // miliseconds
                DEFAULT_DURATION = 5678, // seconds
                assert.strictEqual( key, 'barfoo' );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 2a4d991..a65051b 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.errorLogger', QUnit.newMwEnvironment() );
 
        QUnit.test( 'installGlobalHandler', function ( assert ) {
@@ -39,4 +39,4 @@
                assert.strictEqual( w.onerror( errorMessage, errorUrl, errorLine ), true,
                        'Global handler preserves true return from previous handler' );
        } );
-}( mediaWiki ) );
+}() );
index c2abc08..ec3dd91 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
 
        var getBucket = mw.experiments.getBucket;
 
@@ -60,4 +60,4 @@
                );
        } );
 
-}( mediaWiki ) );
+}() );
index 91afec3..5bbc78d 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.html' );
 
        QUnit.test( 'escape', function ( assert ) {
                );
        } );
 
-}( mediaWiki ) );
+}() );
index 3d3eedd..a55c43d 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
 
        QUnit.module( 'mediawiki.inspect' );
 
@@ -71,4 +71,4 @@
                        );
                } );
        } );
-}( mediaWiki ) );
+}() );
index e4cf446..8c6f788 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        /* eslint-disable camelcase */
        var formatText, formatParse, formatnumTests, specialCharactersPageName, expectedListUsers,
                expectedListUsersSitename, expectedLinkPagenamee, expectedEntrypoints,
                assert.strictEqual( logSpy.callCount, 2, 'mw.log.warn calls' );
        } );
 
+       QUnit.test( 'Non-string parameters to various functions', function ( assert ) {
+               var i, cases;
+
+               // For jquery-param-int
+               mw.messages.set( 'x', 'y' );
+               // For jquery-param-grammar
+               mw.language.setData( 'en', 'grammarTransformations', {
+                       test: [
+                               [ 'x', 'y' ]
+                       ]
+               } );
+
+               cases = [
+                       {
+                               key: 'jquery-param-wikilink',
+                               msg: '[[$1]] [[$1|a]]',
+                               expected: '<a title="x" href="/wiki/x">x</a> <a title="x" href="/wiki/x">a</a>'
+                       },
+                       {
+                               key: 'jquery-param-plural',
+                               msg: '{{PLURAL:$1|a|b}}',
+                               expected: 'b'
+                       },
+                       {
+                               key: 'jquery-param-gender',
+                               msg: '{{GENDER:$1|a|b}}',
+                               expected: 'a'
+                       },
+                       {
+                               key: 'jquery-param-grammar',
+                               msg: '{{GRAMMAR:test|$1}}',
+                               expected: '<b>x</b>'
+                       },
+                       {
+                               key: 'jquery-param-int',
+                               msg: '{{int:$1}}',
+                               expected: 'y'
+                       },
+                       {
+                               key: 'jquery-param-ns',
+                               msg: '{{ns:$1}}',
+                               expected: ''
+                       },
+                       {
+                               key: 'jquery-param-formatnum',
+                               msg: '{{formatnum:$1}}',
+                               expected: '<b>x</b>'
+                       },
+                       {
+                               key: 'jquery-param-case',
+                               msg: '{{lc:$1}} {{uc:$1}} {{lcfirst:$1}} {{ucfirst:$1}}',
+                               expected: 'x X x X'
+                       }
+               ];
+
+               for ( i = 0; i < cases.length; i++ ) {
+                       mw.messages.set( cases[ i ].key, cases[ i ].msg );
+                       assert.strictEqual(
+                               mw.message( cases[ i ].key, $( '<b>' ).text( 'x' ) ).parse(),
+                               cases[ i ].expected,
+                               cases[ i ].key
+                       );
+               }
+       } );
+
        QUnit.test( 'Integration', function ( assert ) {
                var expected, msg;
 
                        'setParserDefaults is deep if requested'
                );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 54d4285..207385f 100644 (file)
@@ -2,7 +2,7 @@
  * Some misc JavaScript compatibility tests,
  * just to make sure the environments we run in are consistent.
  */
-( function ( $ ) {
+( function () {
        QUnit.module( 'mediawiki.jscompat', QUnit.newMwEnvironment() );
 
        QUnit.test( 'Variable with Unicode letter in name', function ( assert ) {
@@ -66,4 +66,4 @@
                        assert.strictEqual( $textarea.val(), expected, 'Expecting ' + n + ' newlines (from DOM set with ' + n + ')' );
                }
        } );
-}( jQuery ) );
+}() );
index d460c0b..3040b85 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        'use strict';
 
        var grammarTests, bcp47Tests;
                        assert.strictEqual( mw.language.bcp47( input ), expected );
                } );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 3a48e6e..347614c 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        QUnit.module( 'mediawiki.loader', QUnit.newMwEnvironment( {
                setup: function ( assert ) {
                        // Expose for load.mock.php
                } );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 923f97d..28dfc53 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        var TEST_MODEL = 'test-content-model';
 
        QUnit.module( 'mediawiki.messagePoster', QUnit.newMwEnvironment( {
@@ -25,4 +25,4 @@
                        'Throws exception is same model is registered a second time'
                );
        } );
-}( mediaWiki ) );
+}() );
index df02693..7b25707 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.requestIdleCallback', QUnit.newMwEnvironment( {
                setup: function () {
                        var clock = this.clock = this.sandbox.useFakeTimers();
                } );
        }
 
-}( mediaWiki ) );
+}() );
index 436cb2e..fab7e1f 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.storage' );
 
        QUnit.test( 'set/get with storage support', function ( assert ) {
@@ -53,4 +53,4 @@
                mw.storage.store = old;
        } );
 
-}( mediaWiki ) );
+}() );
index ab1d55e..de8811f 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
 
        QUnit.module( 'mediawiki.template.mustache', {
                beforeEach: function () {
@@ -29,4 +29,4 @@
                assert.strictEqual( htmlPartial, 'Hello goodbye', 'Render with partial' );
        } );
 
-}( mediaWiki ) );
+}() );
index 31f4782..534408e 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
 
        QUnit.module( 'mediawiki.template', {
                beforeEach: function () {
@@ -60,4 +60,4 @@
                );
        } );
 
-}( mediaWiki ) );
+}() );
index 37b6c88..201dc25 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        var specialCharactersPageName,
                // Can't mock SITENAME since jqueryMsg caches it at load
                siteName = mw.config.get( 'wgSiteName' );
 
                assert.strictEqual( mw.msg( 'int-msg' ), 'Some Other Message', 'int is resolved' );
        } );
-}( mediaWiki ) );
+}() );
index 6a1b83c..b9a64b5 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        QUnit.module( 'mediawiki.toc', QUnit.newMwEnvironment( {
                setup: function () {
                        // Prevent live cookies from interferring with the test
@@ -36,4 +36,4 @@
                        return $tocList.promise();
                } );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 6c27c5b..ce0ca57 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.track' );
 
        QUnit.test( 'track', function ( assert ) {
@@ -57,4 +57,4 @@
                        [ 'unsub', { key: 2 } ]
                ], 'Stop when unsubscribing' );
        } );
-}( mediaWiki ) );
+}() );
index 751155d..1e35211 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        QUnit.module( 'mediawiki.user', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
                assert.strictEqual( result.trim(), result, 'no leading or trailing whitespace' );
                assert.strictEqual( result2, result, 'retained' );
        } );
-}( mediaWiki ) );
+}() );
index 0a65788..673cb15 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
        var util = require( 'mediawiki.util' ),
                // Based on IPTest.php > testisIPv4
                IPV4_CASES = [
        } );
 
        QUnit.test( '$content', function ( assert ) {
-               assert.ok( util.$content instanceof jQuery, 'mw.util.$content instance of jQuery' );
+               assert.ok( util.$content instanceof $, 'mw.util.$content instance of jQuery' );
                assert.strictEqual( util.$content.length, 1, 'mw.util.$content must have length of 1' );
        } );
 
         * one element can have a given id.
         */
        QUnit.test( 'addPortletLink', function ( assert ) {
-               var pTestTb, pCustom, vectorTabs, tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo,
+               var tbRL, cuQuux, $cuQuux, tbMW, $tbMW, tbRLDM, caFoo,
                        addedAfter, tbRLDMnonexistentid, tbRLDMemptyjquery;
 
-               pTestTb =
+               $( '#qunit-fixture' ).append(
                        '<div class="portlet" id="p-test-tb">' +
                                '<h3>Toolbox</h3>' +
                                '<ul class="body"></ul>' +
-                       '</div>';
-               pCustom =
+                       '</div>' +
                        '<div class="portlet" id="p-test-custom">' +
                                '<h3>Views</h3>' +
                                '<ul class="body">' +
                                                '</ul>' +
                                        '</li>' +
                                '</ul>' +
-                       '</div>';
-               vectorTabs =
+                       '</div>' +
                        '<div id="p-test-views" class="vectorTabs">' +
                                '<h3>Views</h3>' +
                                '<ul></ul>' +
-                       '</div>';
-
-               $( '#qunit-fixture' ).append( pTestTb, pCustom, vectorTabs );
-
-               tbRL = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/ResourceLoader',
-                       'ResourceLoader', 't-rl', 'More info about ResourceLoader on MediaWiki.org ', 'l'
+                       '</div>'
                );
 
-               assert.ok( tbRL && tbRL.nodeType, 'addPortletLink returns a DOM Node' );
+               tbRL = util.addPortletLink( 'p-test-tb', 'https://example.org/next',
+                       'Next', 't-rl', 'More info about Example Next ', 'l'
+               );
+               assert.strictEqual( tbRL.nodeType, 1, 'returns a DOM Node' );
+               assert.strictEqual( tbRL.nodeName, 'LI', 'returns a list item element' );
 
-               tbMW = util.addPortletLink( 'p-test-tb', '//mediawiki.org/',
-                       'MediaWiki.org', 't-mworg', 'Go to MediaWiki.org', 'm', tbRL );
+               tbMW = util.addPortletLink( 'p-test-tb', '//example.org/',
+                       'Example.org', 't-xmp', 'Go to Example', 'x', tbRL );
                $tbMW = $( tbMW );
-
                assert.propEqual(
                        $tbMW.getAttrs(),
                        {
-                               id: 't-mworg'
+                               id: 't-xmp'
                        },
-                       'Validate attributes of created element'
+                       'List item attributes'
                );
-
                assert.propEqual(
                        $tbMW.find( 'a' ).getAttrs(),
                        {
-                               href: '//mediawiki.org/',
-                               title: 'Go to MediaWiki.org [test-m]',
-                               accesskey: 'm'
+                               href: '//example.org/',
+                               title: 'Go to Example [test-x]',
+                               accesskey: 'x'
                        },
-                       'Validate attributes of anchor tag in created element'
+                       'Anchor link attributes'
+               );
+               assert.strictEqual(
+                       $tbMW.closest( '.portlet' ).attr( 'id' ),
+                       'p-test-tb',
+                       'Parent portlet ID'
+               );
+               assert.strictEqual(
+                       $tbMW.next()[ 0 ],
+                       tbRL,
+                       'Next node (set as Node object)'
+               );
+               assert.strictEqual(
+                       $tbMW.find( 'span' ).length,
+                       0,
+                       'No <span> wrap for porlets without vectorTabs class'
                );
-
-               assert.strictEqual( $tbMW.closest( '.portlet' ).attr( 'id' ), 'p-test-tb', 'Link was inserted within correct portlet' );
-               assert.strictEqual( $tbMW.next()[ 0 ], tbRL, 'Link is in the correct position (nextnode as Node object)' );
 
                cuQuux = util.addPortletLink( 'p-test-custom', '#', 'Quux', null, 'Example [shift-x]', 'q' );
                $cuQuux = $( cuQuux );
-
-               assert.strictEqual( $cuQuux.find( 'a' ).attr( 'title' ), 'Example [test-q]', 'Existing accesskey is stripped and updated' );
-
+               assert.strictEqual(
+                       $cuQuux.find( 'a' ).attr( 'title' ),
+                       'Example [test-q]',
+                       'Title has new accesskey and label'
+               );
                assert.strictEqual(
                        $( '#p-test-custom #c-barmenu ul li' ).length,
                        1,
-                       'addPortletLink did not add the item to all <ul> elements in the portlet (T37082)'
+                       'No items added to unrelated <ul> elsewhere in the portlet (T37082)'
                );
 
                tbRLDM = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm', 'List of all default modules ', 'd', '#t-rl' );
-
-               assert.strictEqual( $( tbRLDM ).next()[ 0 ], tbRL, 'Link is in the correct position (CSS selector as nextnode)' );
+               assert.strictEqual( $( tbRLDM ).next()[ 0 ], tbRL, 'Next node (set as CSS selector)' );
 
                caFoo = util.addPortletLink( 'p-test-views', '#', 'Foo' );
-
-               assert.strictEqual( $tbMW.find( 'span' ).length, 0, 'No <span> element should be added for porlets without vectorTabs class.' );
-               assert.strictEqual( $( caFoo ).find( 'span' ).length, 1, 'A <span> element should be added for porlets with vectorTabs class.' );
+               assert.strictEqual( $( caFoo ).find( 'span' ).length, 1, 'Added <span> element for porlet with vectorTabs class' );
 
                addedAfter = util.addPortletLink( 'p-test-tb', '#', 'After foo', 'post-foo', 'After foo', null, $( tbRL ) );
-               assert.strictEqual( $( addedAfter ).next()[ 0 ], tbRL, 'Link is in the correct position (jQuery object as nextnode)' );
+               assert.strictEqual( $( addedAfter ).next()[ 0 ], tbRL, 'Next node (set as jQuery object)' );
 
-               // test case - nonexistent id as next node
                tbRLDMnonexistentid = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm-nonexistent', 'List of all default modules ', 'd', '#t-rl-nonexistent' );
+               assert.strictEqual(
+                       tbRLDMnonexistentid,
+                       $( '#p-test-tb li:last' )[ 0 ],
+                       'Next node as non-matching CSS selector falls back to appending'
+               );
 
-               assert.strictEqual( tbRLDMnonexistentid, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode non-matching CSS selector)' );
-
-               // test case - empty jquery object as next node
                tbRLDMemptyjquery = util.addPortletLink( 'p-test-tb', '//mediawiki.org/wiki/RL/DM',
                        'Default modules', 't-rldm-empty-jquery', 'List of all default modules ', 'd', $( '#t-rl-nonexistent' ) );
-
-               assert.strictEqual( tbRLDMemptyjquery, $( '#p-test-tb li:last' )[ 0 ], 'Fallback to adding at the end (nextnode as empty jQuery object)' );
+               assert.strictEqual(
+                       tbRLDMemptyjquery,
+                       $( '#p-test-tb li:last' )[ 0 ],
+                       'Next node as empty jQuery object falls back to appending'
+               );
        } );
 
        QUnit.test( 'validateEmail', function ( assert ) {
                        assert.strictEqual( util.isIPv6Address( ipCase[ 1 ] ), ipCase[ 0 ], ipCase[ 2 ] );
                } );
        } );
-}( mediaWiki, jQuery ) );
+}() );
index 9864166..2c639b7 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw, $ ) {
+( function () {
 
        // Simulate square element with 20px long edges placed at (20, 20) on the page
        var
                        'It should default to a threshold of 50px and the window\'s viewport' );
        } );
 
-}( mediaWiki, jQuery ) );
+}() );
index 7f8819d..2bda47b 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
 
        QUnit.module( 'mediawiki.visibleTimeout', QUnit.newMwEnvironment( {
                setup: function () {
                this.sandbox.clock.tick( 50 );
                assert.strictEqual( called, 1 );
        } );
-}( mediaWiki ) );
+}() );
index 4328d3f..a872d6e 100644 (file)
@@ -1,7 +1,8 @@
 const assert = require( 'assert' ),
-       EditPage = require( '../pageobjects/edit.page' ),
+       Api = require( 'wdio-mediawiki/Api' ),
        RecentChangesPage = require( '../pageobjects/recentchanges.page' ),
-       Util = require( 'wdio-mediawiki/Util' );
+       Util = require( 'wdio-mediawiki/Util' ),
+       RunJobs = require( 'wdio-mediawiki/RunJobs' );
 
 describe( 'Special:RecentChanges', function () {
        let content,
@@ -13,9 +14,11 @@ describe( 'Special:RecentChanges', function () {
                name = Util.getTestString();
        } );
 
-       // Skip due to failures on many repos (T199644)
-       it.skip( 'shows page creation', function () {
-               EditPage.edit( name, content );
+       it( 'shows page creation', function () {
+               browser.call( function () {
+                       return Api.edit( name, content );
+               } );
+               RunJobs.run();
 
                RecentChangesPage.open();
 
index ed99bd4..bc759e4 100644 (file)
@@ -1,4 +1,4 @@
-const Page = require( 'wdio-mediawiki/Page' );
+const Page = require( './Page' );
 
 class BlankPage extends Page {
        get heading() { return browser.element( '#firstHeading' ); }
index d07934b..8838530 100644 (file)
@@ -1,4 +1,4 @@
-const Page = require( 'wdio-mediawiki/Page' );
+const Page = require( './Page' );
 
 class LoginPage extends Page {
        get username() { return browser.element( '#wpName1' ); }
diff --git a/tests/selenium/wdio-mediawiki/RunJobs.js b/tests/selenium/wdio-mediawiki/RunJobs.js
new file mode 100644 (file)
index 0000000..50ac601
--- /dev/null
@@ -0,0 +1,73 @@
+const MWBot = require( 'mwbot' ),
+       Page = require( './Page' ),
+       FRONTPAGE_REQUESTS_MAX_RUNS = 10; // (arbitrary) safe-guard against endless execution
+
+/**
+ * Trigger the execution of jobs
+ *
+ * @see https://www.mediawiki.org/wiki/Manual:Job_queue/For_developers#Execution_of_jobs
+ *
+ * Use RunJobs.run() to ensure that jobs are executed before making assertions that depend on it.
+ *
+ * Systems that are selenium-tested are usually provisioned for that purpose, see no organic
+ * traffic, consequently typical post-send job queue processing rarely happens. Additionally,
+ * test set-up is often done through the API, requests to which do not trigger job queue
+ * processing at all.
+ *
+ * This can lead to an accumulation of unprocessed jobs, which in turn would render certain
+ * assertions impossible - e.g. checking a page is listed on Special:RecentChanges right
+ * after creating it.
+ *
+ * This class will try to trigger job execution through
+ * repeated blunt requests against the wiki's home page to trigger them at a rate
+ * of $wgJobRunRate per request.
+ */
+class RunJobs {
+
+       static run() {
+               browser.call( () => {
+                       return this.runThroughFrontPageRequests();
+               } );
+       }
+
+       static getJobCount() {
+               let bot = new MWBot( {
+                       apiUrl: `${browser.options.baseUrl}/api.php`
+               } );
+               return new Promise( ( resolve ) => {
+                       return bot.request( {
+                               action: 'query',
+                               meta: 'siteinfo',
+                               siprop: 'statistics'
+                       } ).then( ( response ) => {
+                               resolve( response.query.statistics.jobs );
+                       } );
+               } );
+       }
+
+       static runThroughFrontPageRequests( runCount = 1 ) {
+               let page = new Page();
+               this.log( `through requests to the front page (run ${runCount}).` );
+
+               page.openTitle( '' );
+
+               return this.getJobCount().then( ( jobCount ) => {
+                       if ( jobCount === 0 ) {
+                               this.log( 'found no more queued jobs.' );
+                               return;
+                       }
+                       this.log( `detected ${jobCount} more queued job(s).` );
+                       if ( runCount >= FRONTPAGE_REQUESTS_MAX_RUNS ) {
+                               this.log( 'stopping requests to the front page due to reached limit.' );
+                               return;
+                       }
+                       return this.runThroughFrontPageRequests( ++runCount );
+               } );
+       }
+
+       static log( message ) {
+               process.stdout.write( `RunJobs ${message}\n` );
+       }
+}
+
+module.exports = RunJobs;
index f9cadcd..2977479 100644 (file)
@@ -1,5 +1,5 @@
 const assert = require( 'assert' ),
-       BlankPage = require( 'wdio-mediawiki/BlankPage' );
+       BlankPage = require( './../BlankPage' );
 
 describe( 'BlankPage', function () {
        it( 'should have its title @daily', function () {