Merge "user: Allow "CAS update failed" exceptions to be normalised"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Thu, 20 Sep 2018 22:31:11 +0000 (22:31 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 20 Sep 2018 22:31:11 +0000 (22:31 +0000)
477 files changed:
.eslintrc.json
.gitattributes
.phpcs.xml
HISTORY
RELEASE-NOTES-1.32
autoload.php
composer.json
docs/design.txt [deleted file]
docs/distributors.txt
docs/hooks.txt
includes/AutoLoader.php
includes/DefaultSettings.php
includes/EditPage.php
includes/GlobalFunctions.php
includes/Revision/RenderedRevision.php
includes/Revision/SlotRenderingProvider.php [new file with mode: 0644]
includes/Storage/DerivedPageDataUpdater.php
includes/Storage/RevisionStore.php
includes/Title.php
includes/WebRequest.php
includes/actions/RollbackAction.php
includes/api/ApiLogin.php
includes/api/ApiQueryAllDeletedRevisions.php
includes/api/ApiQueryInfo.php
includes/api/i18n/ar.json
includes/api/i18n/ja.json
includes/api/i18n/nb.json
includes/api/i18n/zh-hant.json
includes/cache/localisation/LocalisationCache.php
includes/changes/ChangesListBooleanFilter.php
includes/content/Content.php
includes/content/ContentHandler.php
includes/exception/MWException.php
includes/exception/MWExceptionRenderer.php
includes/gallery/PackedImageGallery.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/htmlform/fields/HTMLTextField.php
includes/installer/i18n/bg.json
includes/installer/i18n/nap.json
includes/installer/i18n/roa-tara.json
includes/jobqueue/JobQueueDB.php
includes/libs/virtualrest/ParsoidVirtualRESTService.php
includes/media/JpegHandler.php
includes/page/Article.php
includes/page/ImageHistoryList.php
includes/page/WikiPage.php
includes/parser/MWTidy.php
includes/parser/Parser.php
includes/parser/Preprocessor_Hash.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderImage.php
includes/resourceloader/ResourceLoaderSkinModule.php
includes/resourceloader/ResourceLoaderStartUpModule.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specials/SpecialFilepath.php
includes/specials/SpecialRecentchanges.php
includes/specials/SpecialRedirect.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/watcheditem/WatchedItemStore.php
includes/widget/search/FullSearchResultWidget.php
languages/Language.php
languages/classes/LanguageKk.php
languages/data/CrhExceptions.php
languages/i18n/ar.json
languages/i18n/ast.json
languages/i18n/be-tarask.json
languages/i18n/bg.json
languages/i18n/bn.json
languages/i18n/cdo.json
languages/i18n/ckb.json
languages/i18n/cs.json
languages/i18n/da.json
languages/i18n/de-ch.json
languages/i18n/de.json
languages/i18n/en.json
languages/i18n/es.json
languages/i18n/eu.json
languages/i18n/fi.json
languages/i18n/fr.json
languages/i18n/gcr.json
languages/i18n/gl.json
languages/i18n/gsw.json
languages/i18n/he.json
languages/i18n/hr.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/io.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jv.json
languages/i18n/kjp.json
languages/i18n/ko.json
languages/i18n/lez.json
languages/i18n/lt.json
languages/i18n/lv.json
languages/i18n/mk.json
languages/i18n/mni.json
languages/i18n/mnw.json
languages/i18n/mr.json
languages/i18n/my.json
languages/i18n/nan.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/or.json
languages/i18n/pfl.json
languages/i18n/pl.json
languages/i18n/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/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/yue.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesBi.php [new file with mode: 0644]
languages/messages/MessagesEn_ca.php [new file with mode: 0644]
languages/messages/MessagesEn_gb.php
languages/messages/MessagesJam.php [new file with mode: 0644]
languages/messages/MessagesPih.php [new file with mode: 0644]
languages/messages/MessagesSco.php [new file with mode: 0644]
maintenance/Maintenance.php
maintenance/benchmarks/benchmarkTidy.php
maintenance/cleanupInvalidDbKeys.php
maintenance/compareParsers.php
maintenance/createCommonPasswordCdb.php
maintenance/dumpIterator.php
maintenance/edit.php
maintenance/includes/DeleteLocalPasswords.php
maintenance/populateChangeTagDef.php
maintenance/resources/foreign-resources.yaml
maintenance/resources/manageForeignResources.php
mw-config/config.js
package.json
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/phpunit/MediaWikiTestCase.php
tests/phpunit/includes/Storage/DerivedPageDataUpdaterTest.php
tests/phpunit/includes/Storage/RevisionRecordTests.php
tests/phpunit/includes/Storage/RevisionStoreDbTestBase.php
tests/phpunit/includes/api/ApiQueryPrefixSearchTest.php
tests/phpunit/includes/api/ApiQuerySiteinfoTest.php
tests/phpunit/includes/content/TextContentTest.php
tests/phpunit/includes/content/WikitextContentHandlerTest.php
tests/phpunit/includes/libs/composer/ComposerLockTest.php
tests/phpunit/includes/linker/LinkRendererTest.php
tests/phpunit/includes/media/FormatMetadataTest.php
tests/phpunit/includes/page/WikiPageDbTestBase.php
tests/phpunit/includes/page/WikiPageMcrReadNewDbTest.php
tests/phpunit/includes/page/WikiPageNoContentModelDbTest.php
tests/phpunit/includes/poolcounter/PoolWorkArticleViewTest.php
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/ChangesListSpecialPageTest.php
tests/phpunit/includes/specials/SpecialRedirectTest.php [new file with mode: 0644]
tests/phpunit/includes/watcheditem/WatchedItemStoreUnitTest.php
tests/phpunit/structure/StructureTest.php
tests/phpunit/suites/ParserTestTopLevelSuite.php
tests/qunit/.eslintrc.json
tests/qunit/data/mwLoaderTestCallback.js
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.accessKeyLabel.test.js
tests/qunit/suites/resources/jquery/jquery.color.test.js
tests/qunit/suites/resources/jquery/jquery.colorUtil.test.js
tests/qunit/suites/resources/jquery/jquery.getAttrs.test.js
tests/qunit/suites/resources/jquery/jquery.hidpi.test.js
tests/qunit/suites/resources/jquery/jquery.highlightText.test.js
tests/qunit/suites/resources/jquery/jquery.lengthLimit.test.js
tests/qunit/suites/resources/jquery/jquery.localize.test.js
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.test.js
tests/qunit/suites/resources/jquery/jquery.tabIndex.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.parsers.test.js
tests/qunit/suites/resources/jquery/jquery.tablesorter.test.js
tests/qunit/suites/resources/jquery/jquery.textSelection.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.ForeignApi.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.category.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.edit.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.messages.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.options.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.parse.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.upload.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/UriProcessor.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FilterItem.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.FiltersViewModel.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.SavedQueriesModel.test.js
tests/qunit/suites/resources/mediawiki.rcfilters/dm.SavedQueryItemModel.test.js
tests/qunit/suites/resources/mediawiki.special/mediawiki.special.recentchanges.test.js
tests/qunit/suites/resources/mediawiki.widgets/MediaSearch/mediawiki.widgets.APIResultsQueue.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.RegExp.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.String.trimByteLength.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Title.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.Uri.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.base.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cldr.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.cookie.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.errorLogger.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.experiments.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.html.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.inspect.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.jscompat.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.language.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.messagePoster.factory.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.requestIdleCallback.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.storage.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.template.mustache.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.template.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.toc.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.track.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.user.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.util.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.viewport.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.visibleTimeout.test.js

index 4630e07..c076751 100644 (file)
@@ -8,8 +8,6 @@
                "module": false,
                "mw": false,
                "$": false,
-               "mediaWiki": false,
-               "jQuery": false,
                "OO": false
        },
        "rules": {
index 786c09f..81b7a33 100644 (file)
@@ -5,6 +5,7 @@
 *~ export-ignore
 #*# export-ignore
 .* export-ignore
+*.htaccess -export-ignore
 package.json export-ignore
 README.mediawiki export-ignore
 Gemfile* export-ignore
index bd0ab82..2bce5b2 100644 (file)
@@ -2,14 +2,12 @@
 <ruleset name="MediaWiki">
        <rule ref="./vendor/mediawiki/mediawiki-codesniffer/MediaWiki">
                <exclude name="Generic.ControlStructures.InlineControlStructure" />
-               <exclude name="MediaWiki.Commenting.FunctionAnnotations.UnrecognizedAnnotation" />
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationProtected" />
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingDocumentationPublic" />
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingParamTag" />
                <exclude name="MediaWiki.Commenting.FunctionComment.MissingReturn" />
                <exclude name="MediaWiki.Commenting.FunctionComment.ExtraParamComment" />
                <exclude name="MediaWiki.Commenting.FunctionComment.WrongStyle" />
-               <exclude name="MediaWiki.Commenting.PhpunitAnnotations.NotClassTrait" />
                <exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentStart" />
                <exclude name="MediaWiki.Commenting.IllegalSingleLineComment.IllegalSingleLineCommentEnd" />
                <exclude name="MediaWiki.ControlStructures.AssignmentInControlStructures.AssignmentInControlStructures" />
diff --git a/HISTORY b/HISTORY
index bc74a6b..4665036 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -2,6 +2,32 @@ Change notes from older releases. For current info see RELEASE-NOTES-1.32.
 
 = MediaWiki 1.31 =
 
+== MediaWiki 1.31.1 ==
+
+This is a security and maintenance release of the MediaWiki 1.31 branch.
+
+=== Changes since MediaWiki 1.31.0 ===
+* (T169545, CVE-2018-0503) SECURITY: $wgRateLimits entry for 'user' overrides
+  'newbie'.
+* (T194605, CVE-2018-0505) SECURITY: BotPasswords can bypass CentralAuth's
+  account lock.
+* (T199029, CVE-2018-13258) SECURITY: Tarball was missing .htaccess files.
+* (T197229) Bundle Nuke extension, it was accidentally omitted.
+* (T193995) Fix undefined patchPath() method call in parser tests.
+* (T198687) Fix various selectFields methods to use the string 'NULL', not null.
+* Special:BotPasswords now requires reauthentication.
+* (T191608, T187638) Add 'logid' parameter to Special:Log.
+* (T193829) Indicate when a Bot Password needs reset.
+* (T198037) GitInfo: Don't try shelling out if it's disabled.
+* (T151415) Log email changes.
+* (T197206) Fix performance regression when multiple DB used without caching.
+* (T197030) PHPSessionHandler: Suppress headers warnings in initialize().
+* (T182377, T196793) Exif: Guard against uncountable tag values.
+* (T200861) Fix total breakage of SQLite web upgrade.
+* (T200864) Fix pingback over-reporting on non-MySQL databases
+* (T202550) Unbreak SpecialListusersHeaderForm and SpecialListusersHeader
+  hooks.
+
 == MediaWiki 1.31.0 ==
 
 === Changes since MediaWiki 1.31.0-rc.2 ===
@@ -488,6 +514,43 @@ There's usually someone online in #mediawiki on irc.freenode.net.
 
 = MediaWiki 1.30 =
 
+== MediaWiki 1.30.1 ==
+
+This is a security and maintenance release of the MediaWiki 1.30 branch.
+
+=== Changes since MediaWiki 1.30.0 ===
+* (T169545, CVE-2018-0503) SECURITY: $wgRateLimits entry for 'user' overrides
+  'newbie'.
+* (T194605, CVE-2018-0505) SECURITY: BotPasswords can bypass CentralAuth's
+  account lock.
+* (T87572) Make FormatMetadata::flattenArrayReal() work for an associative array.
+* Updated composer/spdx-licenses from 1.1.4 to 1.3.0 (development dependency).
+* (T189567) the CLI installer (maintenance/install.php) learned to detect and
+  include extensions. Pass --with-extensions to enable that feature.
+* (T190503) Let built-in web server (maintenance/dev) handle .php requests.
+* (T167507) selenium: Run Chrome headlessly.
+* selenium: Pass -no-sandbox to Chrome under Docker.
+* (T179190) selenium: Move logic for running tests from package.json to selenium.sh
+* (T192584) Stop incorrectly passing USE INDEX to RecentChange::newFromConds().
+* Add default edit rate limit of 90 edits/minute for all users.
+* (T186565) Fix PHP Notice from `ob_end_flush()` in `FileRepo::streamFile()`.
+* oojs/oojs-ui updated to remove an unnecessary dependancy.
+* (T196125) php-memcached 3.0 (provided with PHP 7.0) is now supported.
+* (T118683) Fix exception from &$user deref on HHVM in the TitleMoveComplete hook.
+* (T196672) The mtime of extension.json files is now able to be zero
+* (T180403) Validate $length in padleft/padright parser functions.
+* (T143790) Make $wgEmailConfirmToEdit only affect edit actions.
+* (T193995) Fix undefined patchPath() method call in parser tests.
+* Special:BotPasswords now requires reauthentication.
+* (T191608, T187638) Add 'logid' parameter to Special:Log.
+* (T193829) Indicate when a Bot Password needs reset.
+* (T151415) Log email changes.
+* (T200861) Fix total breakage of SQLite web upgrade.
+* (T202550) Unbreak SpecialListusersHeaderForm and SpecialListusersHeader
+  hooks.
+* (T190539) Explicitly require Postgres 9.1.
+* (T118420) Unbreak Oracle installer.
+
 == MediaWiki 1.30.0 ==
 
 === Changes since MediaWiki 1.30.0-rc.0 ===
@@ -751,6 +814,49 @@ changes to languages because of Phabricator reports.
 
 = MediaWiki 1.29 =
 
+== MediaWiki 1.29.3 ==
+
+This is a security and maintenance release of the MediaWiki 1.29 branch.
+
+=== Changes since 1.29.2 ===
+* (T169545, CVE-2018-0503) SECURITY: $wgRateLimits entry for 'user' overrides
+  'newbie'.
+* (T194605, CVE-2018-0505) SECURITY: BotPasswords can bypass CentralAuth's
+  account lock.
+* (T180551) Fix LanguageSrTest for language converter
+* (T180552) Fix langauge converter parser test with self-close tags
+* (T180537) Remove $wgAuth usage from wrapOldPasswords.php
+* (T180485) InputBox: Have inputbox langconvert certain attributes
+* (T161732, T181547) Upgraded Moment.js from v2.15.0 to v2.19.3.
+* (T172927) Drop vendor from MW release branch
+* (T87572) Make FormatMetadata::flattenArrayReal() work for an associative array
+* Updated composer/spdx-licenses from 1.1.4 to 1.3.0 (development dependency).
+* (T189567) the CLI installer (maintenance/install.php) learned to detect and
+  include extensions. Pass --with-extensions to enable that feature.
+* (T182381) Mask deprecated call in WatchedItemUnitTest
+* (T190503) Let built-in web server (maintenance/dev) handle .php requests.
+* The karma qunit tests would fail on some configuration due to headers already
+  sent. Check headers_sent() before sending cpPosTime headers
+* (T167507) selenium: Run Chrome headlessly.
+* selenium: Pass -no-sandbox to Chrome under Docker
+* (T191247) Use MediaWiki\SuppressWarnings around trigger_error('') instead @
+* (T75174, T161041) Unit test ChangesListSpecialPageTest::testFilterUserExpLevel
+  fails under SQLite.
+* (T192584) Stop incorrectly passing USE INDEX to RecentChange::newFromConds().
+* (T179190) selenium: Move test running logic from package.json to selenium.sh.
+* (T117839, T193200) PDFHandler: Fix for pdfinfo changes in poppler-utils 0.48.
+* Add default edit rate limit of 90 edits/minute for all users.
+* (T196125) php-memcached 3.0 (provided with PHP 7.0) is now supported.
+* (T196672) The mtime of extension.json files is now able to be zero
+* (T180403) Validate $length in padleft/padright parser functions.
+* (T143790) Make $wgEmailConfirmToEdit only affect edit actions.
+* (T194237) Special:BotPasswords now requires reauthentication.
+* (T191608, T187638) Add 'logid' parameter to Special:Log.
+* (T176097) resourceloader: Disable a flaky MessageBlobStoreTest case
+* (T193829) Indicate when a Bot Password needs reset.
+* (T151415) Log email changes.
+* (T118420) Unbreak Oracle installer.
+
 == MediaWiki 1.29.2 ==
 
 This is a security and maintenance release of the MediaWiki 1.29 branch.
@@ -1526,6 +1632,34 @@ There's usually someone online in #mediawiki on irc.freenode.net.
 
 = MediaWiki 1.27 =
 
+== MediaWiki 1.27.5 ==
+
+This is a security and maintenance release of the MediaWiki 1.27 branch.
+
+=== Changes since 1.27.4 ===
+* (T169545, CVE-2018-0503) SECURITY: $wgRateLimits entry for 'user' overrides
+  'newbie'.
+* (T194605, CVE-2018-0505) SECURITY: BotPasswords can bypass CentralAuth's
+  account lock.
+* Upgraded Moment.js from v2.8.4 to v2.19.3.
+* (T160298) Fixed Special:ActiveUsers due to bad backport.
+* (T87572) Make FormatMetadata::flattenArrayReal() work for an associative array.
+* Updated list of SPDX licenses for extensions.
+* (T189567) the CLI installer (maintenance/install.php) learned to detect and
+  include extensions. Pass --with-extensions to enable that feature.
+* (T192584) Stop incorrectly passing USE INDEX to RecentChange::newFromConds().
+* Add default edit rate limit of 90 edits/minute for all users.
+* (T196125) php-memcached 3.0 (provided with PHP 7.0) is now supported.
+* (T196672) The mtime of extension.json files is now able to be zero.
+* (T118683) Fix exception from &$user deref on HHVM in the TitleMoveComplete hook.
+* (T180403) Validate $length in padleft/padright parser functions.
+* (T143790) Make $wgEmailConfirmToEdit only affect edit actions.
+* Special:BotPasswords now requires reauthentication.
+* (T191608, T187638) Add 'logid' parameter to Special:Log.
+* (T193829) Indicate when a Bot Password needs reset.
+* (T151415) Log email changes.
+* (T118420) Unbreak Oracle installer.
+
 == MediaWiki 1.27.4 ==
 This is a security and maintenance release of the MediaWiki 1.27 branch.
 
index 041b3d7..9f0bc1b 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,
@@ -290,11 +294,23 @@ 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.
 
 === Deprecations in 1.32 ===
 * HTMLForm::setSubmitProgressive() is deprecated. No need to call it. Submit
@@ -417,6 +433,24 @@ because of Phabricator reports.
   'help', 'help-message', 'help-messages' instead.
 * (T197179) HTMLFormField::getNotices() is now deprecated.
 * The jquery.localize module is now deprecated. Use jquery.i18n instead.
+* The SecondaryDataUpdates hook was deprecated in favor of RevisionDataUpdates,
+  or overriding ContentHandler::getSecondaryDataUpdates (T194038).
+* The WikiPageDeletionUpdates hook was deprecated in favor of
+  PageDeletionDataUpdates, or overriding ContentHandler::getDeletionDataUpdates
+  (T194038).
+* Content::getSecondaryDataUpdates has been deprecated in favor of
+  ContentHandler::getSecondaryDataUpdates() for overriding by extensions
+  (T194038).
+  Application logic should call WikiPage::doSecondaryDataUpdates() (T194037).
+* Content::getDeletionUpdates has been deprecated in favor of
+  ContentHandler::getDeletionUpdates() for overriding by extensions (T194038).
+  Application logic should call WikiPage::doSecondaryDataUpdates() (T194037).
+* (T198214) Old Tidy-related configuration settings, which were soft-deprecated
+  in MediaWiki 1.26, have now been hard deprecated. This affects $wgUseTidy,
+  $wgTidyBin, $wgTidyConf, $wgTidyOpts, $wgTidyInternal, and $wgDebugTidy. Use
+  $wgTidyConfig instead.
+* All Tidy configurations other than Remex have been deprecated; future parsers
+  will not emit compatible output for these configurations.
 
 === Other changes in 1.32 ===
 * (T198811) The following tables have had their UNIQUE indexes turned into
@@ -427,6 +461,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..67285d0 100644 (file)
@@ -897,6 +897,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\ProcOpenError' => __DIR__ . '/includes/exception/ProcOpenError.php',
        'MediaWiki\\Revision\\RenderedRevision' => __DIR__ . '/includes/Revision/RenderedRevision.php',
        'MediaWiki\\Revision\\RevisionRenderer' => __DIR__ . '/includes/Revision/RevisionRenderer.php',
+       'MediaWiki\\Revision\\SlotRenderingProvider' => __DIR__ . '/includes/Revision/SlotRenderingProvider.php',
        'MediaWiki\\Search\\ParserOutputSearchDataExtractor' => __DIR__ . '/includes/search/ParserOutputSearchDataExtractor.php',
        'MediaWiki\\ShellDisabledError' => __DIR__ . '/includes/exception/ShellDisabledError.php',
        'MediaWiki\\Site\\MediaWikiPageNameNormalizer' => __DIR__ . '/includes/site/MediaWikiPageNameNormalizer.php',
index bd3a696..e99fe81 100644 (file)
@@ -62,7 +62,7 @@
                "jakub-onderka/php-parallel-lint": "0.9.2",
                "jetbrains/phpstorm-stubs": "dev-master#38ff1a581b297f7901e961b8c923862ea80c3b96",
                "justinrainbow/json-schema": "~5.2",
-               "mediawiki/mediawiki-codesniffer": "21.0.0",
+               "mediawiki/mediawiki-codesniffer": "22.0.0",
                "monolog/monolog": "~1.22.1",
                "nikic/php-parser": "3.1.3",
                "seld/jsonlint": "1.7.1",
diff --git a/docs/design.txt b/docs/design.txt
deleted file mode 100644 (file)
index 5c04add..0000000
+++ /dev/null
@@ -1,106 +0,0 @@
-design.txt
-
-This is a brief overview of the new design.
-
-More thorough and up-to-date information is available on the documentation
-wiki at https://www.mediawiki.org/
-
-Primary classes:
-
-  User
-    Encapsulates the state of the user viewing/using the site. Can be queried
-    for things like the user's settings, name, etc. Handles the details of
-    getting and saving to the "user" table of the database, and dealing with
-    sessions and cookies.
-
-  OutputPage
-    Encapsulates the entire HTML page that will be sent in response to any
-    server request. It is used by calling its functions to add text, headers,
-    etc., in any order, and then calling output() to send it all. It could be
-    easily changed to send incrementally if that becomes useful, but I prefer
-    the flexibility. This should also do the output encoding. The system
-    allocates a global one in $wgOut.
-
-  Title
-    Represents the title of an article, and does all the work of translating
-    among various forms such as plain text, URL, database key, etc. For
-    convenience, and for historical reasons, it also represents a few features
-    of articles that don't involve their text, such as access rights.
-    See also title.txt.
-
-  Article
-    Encapsulates access to the "page" table of the database. The object
-    represents a an article, and maintains state such as text (in Wikitext
-    format), flags, etc.
-
-  Revision
-    Encapsulates individual page revision data and access to the
-    revision/text/blobs storage system. Higher-level code should never touch
-    text storage directly; this class mediates it.
-
-  Skin
-    Encapsulates a "look and feel" for the wiki. All of the functions that
-    render HTML, and make choices about how to render it, are here, and are
-    called from various other places when needed (most notably,
-    OutputPage::addWikiText()). The StandardSkin object is a complete
-    implementation, and is meant to be subclassed with other skins that may
-    override some of its functions. The User object contains a reference to a
-    skin (according to that user's preference), and so rather than having a
-    global skin object we just rely on the global User and get the skin with
-    $wgUser->getSkin().
-    See also skin.txt.
-
-  Language
-    Represents the language used for incidental text, and also has some
-    character encoding functions and other locale stuff. The current user
-    interface language is instantiated as $wgLang, and the local content
-    language as $wgContLang; be sure to use the *correct* language object
-    depending upon the circumstances.
-    See also language.txt.
-
-  Parser
-    Class used to transform wikitext to html.
-
-  LinkCache
-    Keeps information on existence of articles. See linkcache.txt.
-
-Naming/coding conventions:
-
-  These are meant to be descriptive, not dictatorial; I won't presume to tell
-  you how to program, I'm just describing the methods I chose to use for myself.
-  If you do choose to follow these guidelines, it will probably be easier for
-  you to collaborate with others on the project, but if you want to contribute
-  without bothering, by all means do so (and don't be surprised if I reformat
-  your code).
-
-  - I have the code indented with tabs to save file size and so that users can
-    set their tab stops to any depth they like. I use 4-space tab stops, which
-    work well. I also use K&R brace matching style. I know that's a religious
-    issue for some, so if you want to use a style that puts opening braces on
-    the next line, that's OK too, but please don't use a style where closing
-    braces don't align with either the opening brace on its own line or the
-    statement that opened the block--that's confusing as hell.
-
-  - Certain functions and class members are marked with /* private */, rather
-    than being marked as such. This is a hold-over from PHP 4, which didn't
-    support proper visibilities. You should not access things marked in this
-    manner outside the class/inheritance line as this code is subjected to be
-    updated in a manner that enforces this at some time in the near future, and
-    things will break. New code should use the standard method of setting
-    visibilities as normal.
-
-  - Globals are particularly evil in PHP; it sets a lot of them automatically
-    from cookies, query strings, and such, leading to namespace conflicts; when
-    a variable name is used in a function, it is silently declared as a new
-    local masking the global, so you'll get weird error because you forgot the
-    global declaration; lack of static class member variables means you have to
-    use globals for them, etc. Evil, evil.
-
-    I think I've managed to pare down the number of globals we use to a scant
-    few dozen or so, and I've prefixed them all with "wg" so you can spot errors
-    better (odds are, if you see a "wg" variable being used in a function that
-    doesn't declare it global, that's probably an error).
-
-    Other conventions: Top-level functions are wfFuncname(), names of session
-    variables are wsName, cookies wcName, and form field values wpName ("p" for
-    "POST").
index 729dffa..f2af458 100644 (file)
@@ -174,8 +174,6 @@ perhaps configure it to use them (see Configuration section of this document):
   "$wgAntivirus = 'clamav';".
   * DjVuLibre: Allows processing of DjVu files. To enable this, set
   "$wgDjvuDump = 'djvudump'; $wgDjvuRenderer = 'ddjvu'; $wgDjvuTxt = 'djvutxt';".
-  * HTML Tidy: Fixes errors in HTML at runtime. Can be enabled with
-       "$wgUseTidy = true;".
   * ImageMagick: For resizing images. "$wgUseImageMagick = true;" will enable
   it. PHP's GD can also be used, but ImageMagick is preferable.
   * HTTP cache such as Varnish or Squid: can provide a drastic speedup and a
index cce50e0..8223814 100644 (file)
@@ -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.
@@ -4054,10 +4051,9 @@ dumps. One, and only one hook should set this, and return false.
 &$opts: Options to use for the query
 &$join: Join conditions
 
-'WikiPageDeletionUpdates': manipulate the list of DeferrableUpdates to be
-applied when a page is deleted. Called in WikiPage::getDeletionUpdates(). Note
-that updates specific to a content model should be provided by the respective
-Content's getDeletionUpdates() method.
+'WikiPageDeletionUpdates': DEPRECATED! Use PageDeletionDataUpdates or
+override ContentHandler::getDeletionDataUpdates instead.
+Manipulates the list of DeferrableUpdates to be applied when a page is deleted.
 $page: the WikiPage
 $content: the Content to generate updates for, or null in case the page revision
   could not be loaded. The delete will succeed despite this.
index c9932d6..5482f6a 100644 (file)
@@ -132,14 +132,14 @@ class AutoLoader {
                        'MediaWiki\\Auth\\' => __DIR__ . '/auth/',
                        'MediaWiki\\Edit\\' => __DIR__ . '/edit/',
                        'MediaWiki\\EditPage\\' => __DIR__ . '/editpage/',
-                       'MediaWiki\\Linker\\' => __DIR__ .'/linker/',
-                       'MediaWiki\\Preferences\\' => __DIR__ .'/preferences/',
-                       'MediaWiki\\Services\\' => __DIR__ .'/services/',
-                       'MediaWiki\\Session\\' => __DIR__ .'/session/',
-                       'MediaWiki\\Shell\\' => __DIR__ .'/shell/',
-                       'MediaWiki\\Sparql\\' => __DIR__ .'/sparql/',
-                       'MediaWiki\\Storage\\' => __DIR__ .'/Storage/',
-                       'MediaWiki\\Tidy\\' => __DIR__ .'/tidy/',
+                       'MediaWiki\\Linker\\' => __DIR__ . '/linker/',
+                       'MediaWiki\\Preferences\\' => __DIR__ . '/preferences/',
+                       'MediaWiki\\Services\\' => __DIR__ . '/services/',
+                       'MediaWiki\\Session\\' => __DIR__ . '/session/',
+                       'MediaWiki\\Shell\\' => __DIR__ . '/shell/',
+                       'MediaWiki\\Sparql\\' => __DIR__ . '/sparql/',
+                       'MediaWiki\\Storage\\' => __DIR__ . '/Storage/',
+                       'MediaWiki\\Tidy\\' => __DIR__ . '/tidy/',
                ];
        }
 }
index 702ea54..d335dcc 100644 (file)
@@ -3288,7 +3288,7 @@ $wgUseMediaWikiUIEverywhere = false;
  *
  * @since 1.32
  */
-$wgOOUIPreferences = false;
+$wgOOUIPreferences = true;
 
 /**
  * Whether to label the store-to-database-and-show-to-others button in the editor
@@ -4267,17 +4267,26 @@ $wgAllowImageTag = false;
  * library; historically, Dave Raggett's "HTML Tidy" was typically used.
  * See https://www.w3.org/People/Raggett/tidy/
  *
+ * Setting this to null is deprecated.
+ *
  * If this is null and $wgUseTidy is true, the deprecated configuration
  * parameters will be used instead.
  *
  * If this is null and $wgUseTidy is false, a pure PHP fallback will be used.
+ * (Equivalent to setting `$wgTidyConfig['driver'] = 'disabled'`.)
  *
  * Keys are:
  *  - driver: May be:
+ *    - RemexHtml: Use the RemexHtml library in PHP
  *    - RaggettInternalHHVM: Use the limited-functionality HHVM extension
+ *      Deprecated since 1.32.
  *    - RaggettInternalPHP: Use the PECL extension
+ *      Deprecated since 1.32.
  *    - RaggettExternal: Shell out to an external binary (tidyBin)
- *    - RemexHtml: Use the RemexHtml library in PHP
+ *      Deprecated since 1.32.
+ *    - disabled: Disable tidy pass and use a hacky pure PHP workaround
+ *      (this is what setting $wgUseTidy to false used to do)
+ *      Deprecated since 1.32.
  *
  *  - tidyConfigFile: Path to configuration file for any of the Raggett drivers
  *  - debugComment: True to add a comment to the output with warning messages
@@ -4288,37 +4297,38 @@ $wgTidyConfig = [ 'driver' => 'RemexHtml' ];
 
 /**
  * Set this to true to use the deprecated tidy configuration parameters.
- * @deprecated use $wgTidyConfig
+ * @deprecated since 1.26, use $wgTidyConfig['driver'] = 'disabled'
  */
 $wgUseTidy = false;
 
 /**
  * The path to the tidy binary.
- * @deprecated Use $wgTidyConfig['tidyBin']
+ * @deprecated since 1.26, use $wgTidyConfig['tidyBin']
  */
 $wgTidyBin = 'tidy';
 
 /**
  * The path to the tidy config file
- * @deprecated Use $wgTidyConfig['tidyConfigFile']
+ * @deprecated since 1.26, use $wgTidyConfig['tidyConfigFile']
  */
 $wgTidyConf = $IP . '/includes/tidy/tidy.conf';
 
 /**
  * The command line options to the tidy binary
- * @deprecated Use $wgTidyConfig['tidyCommandLine']
+ * @deprecated since 1.26, use $wgTidyConfig['tidyCommandLine']
  */
 $wgTidyOpts = '';
 
 /**
  * Set this to true to use the tidy extension
- * @deprecated Use $wgTidyConfig['driver']
+ * @deprecated since 1.26, use $wgTidyConfig['driver']
  */
 $wgTidyInternal = extension_loaded( 'tidy' );
 
 /**
  * Put tidy warnings in HTML comments
  * Only works for internal tidy.
+ * @deprecated since 1.26, use $wgTidyConfig['debugComment']
  */
 $wgDebugTidy = false;
 
@@ -4833,7 +4843,7 @@ $wgReservedUsernames = [
        'Maintenance script', // Maintenance scripts which perform editing, image import script
        'Template namespace initialisation script', // Used in 1.2->1.3 upgrade
        'ScriptImporter', // Default user name used by maintenance/importSiteScripts.php
-       'Unknown user', // Used in WikiImporter when importing revisions with no author
+       'Unknown user', // Used in WikiImporter and RevisionStore for revisions with no author
        'msg:double-redirect-fixer', // Automatic double redirect fix
        'msg:usermessage-editor', // Default user for leaving user messages
        'msg:proxyblocker', // For $wgProxyList and Special:Blockme (removed in 1.22)
@@ -8998,7 +9008,7 @@ $wgCommentTableSchemaMigrationStage = MIGRATION_OLD;
  * @since 1.32
  * @var int An appropriate combination of SCHEMA_COMPAT_XXX flags.
  */
-$wgMultiContentRevisionSchemaMigrationStage = SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_OLD;
+$wgMultiContentRevisionSchemaMigrationStage = SCHEMA_COMPAT_WRITE_BOTH | SCHEMA_COMPAT_READ_NEW;
 
 /**
  * Actor table schema migration stage.
index 64b2f01..f1f0572 100644 (file)
@@ -1689,7 +1689,7 @@ class EditPage {
                                // is if an extension hook aborted from inside ArticleSave.
                                // Render the status object into $this->hookError
                                // FIXME this sucks, we should just use the Status object throughout
-                               $this->hookError = '<div class="error">' ."\n" . $status->getWikiText() .
+                               $this->hookError = '<div class="error">' . "\n" . $status->getWikiText() .
                                        '</div>';
                                return true;
                }
index 4f12110..336cb89 100644 (file)
@@ -2503,38 +2503,6 @@ function wfUsePHP( $req_ver ) {
        }
 }
 
-/**
- * This function works like "use VERSION" in Perl except it checks the version
- * of MediaWiki, the program will die with a backtrace if the current version
- * of MediaWiki is less than the version provided.
- *
- * This is useful for extensions which due to their nature are not kept in sync
- * with releases
- *
- * Note: Due to the behavior of PHP's version_compare() which is used in this
- * function, if you want to allow the 'wmf' development versions add a 'c' (or
- * any single letter other than 'a', 'b' or 'p') as a post-fix to your
- * targeted version number. For example if you wanted to allow any variation
- * of 1.22 use `wfUseMW( '1.22c' )`. Using an 'a' or 'b' instead of 'c' will
- * not result in the same comparison due to the internal logic of
- * version_compare().
- *
- * @see perldoc -f use
- *
- * @deprecated since 1.26, use the "requires" property of extension.json
- * @param string|int|float $req_ver The version to check, can be a string, an integer, or a float
- * @throws MWException
- */
-function wfUseMW( $req_ver ) {
-       global $wgVersion;
-
-       wfDeprecated( __FUNCTION__, '1.26' );
-
-       if ( version_compare( $wgVersion, (string)$req_ver, '<' ) ) {
-               throw new MWException( "MediaWiki $req_ver required--this is only $wgVersion" );
-       }
-}
-
 /**
  * Return the final portion of a pathname.
  * Reimplemented because PHP5's "basename()" is buggy with multibyte text.
index ba40a81..fa16c61 100644 (file)
@@ -42,7 +42,7 @@ use Wikimedia\Assert\Assert;
  *
  * @since 1.32
  */
-class RenderedRevision {
+class RenderedRevision implements SlotRenderingProvider {
 
        /**
         * @var Title
diff --git a/includes/Revision/SlotRenderingProvider.php b/includes/Revision/SlotRenderingProvider.php
new file mode 100644 (file)
index 0000000..740f0f2
--- /dev/null
@@ -0,0 +1,32 @@
+<?php
+/**
+ * Created by PhpStorm.
+ * User: daki
+ * Date: 05.09.18
+ * Time: 16:08
+ */
+namespace MediaWiki\Revision;
+
+use MediaWiki\Storage\SuppressedDataException;
+use ParserOutput;
+
+/**
+ * A lazy provider of ParserOutput objects for a revision's individual slots.
+ *
+ * @since 1.32
+ */
+interface SlotRenderingProvider {
+
+       /**
+        * @param string $role
+        * @param array $hints Hints given as an associative array. Known keys:
+        *      - 'generate-html' => bool: Whether the caller is interested in output HTML (as opposed
+        *        to just meta-data). Default is to generate HTML.
+        *
+        * @throws SuppressedDataException if the content is not accessible for the audience
+        *         specified in the constructor.
+        * @return ParserOutput
+        */
+       public function getSlotParserOutput( $role, array $hints = [] );
+
+}
index 99c31b2..e34e406 100644 (file)
@@ -27,12 +27,14 @@ use CategoryMembershipChangeJob;
 use Content;
 use ContentHandler;
 use DataUpdate;
+use DeferrableUpdate;
 use DeferredUpdates;
 use Hooks;
 use IDBAccessObject;
 use InvalidArgumentException;
 use JobQueueGroup;
 use Language;
+use LinksDeletionUpdate;
 use LinksUpdate;
 use LogicException;
 use MediaWiki\Edit\PreparedEdit;
@@ -165,8 +167,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         *
         * Contains the following fields:
         * - oldRevision (RevisionRecord|null): the revision that was current before the change
-        *   associated with this update. Might not be set, use getOldRevision() instead of direct
-        *   access.
+        *   associated with this update. Might not be set, use getParentRevision().
         * - oldId (int|null): the id of the above revision. 0 if there is no such revision (the change
         *   was about creating a new page); null if not known (that should not happen).
         * - oldIsRedirect (bool|null): whether the page was a redirect before the change. Lazy-loaded,
@@ -183,6 +184,11 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         */
        private $slotsUpdate = null;
 
+       /**
+        * @var RevisionRecord|null
+        */
+       private $parentRevision = null;
+
        /**
         * @var RevisionRecord|null
         */
@@ -456,29 +462,34 @@ class DerivedPageDataUpdater implements IDBAccessObject {
        }
 
        /**
-        * Returns the revision that was current before the edit. This would be null if the edit
-        * created the page, or the revision's parent for a regular edit, or the revision itself
-        * for a null-edit.
-        * Only defined after calling grabCurrentRevision() or prepareContent() or prepareUpdate()!
+        * Returns the parent revision of the new revision wrapped by this update.
+        * If the update is a null-edit, this will return the parent of the current (and new) revision.
+        * This will return null if the revision wrapped by this update created the page.
+        * Only defined after calling prepareContent() or prepareUpdate()!
         *
-        * @return RevisionRecord|null the revision that was current before the edit, or null if
-        *         the edit created the page.
+        * @return RevisionRecord|null the parent revision of the new revision, or null if
+        *         the update created the page.
         */
-       private function getOldRevision() {
-               $this->assertHasPageState( __METHOD__ );
+       private function getParentRevision() {
+               $this->assertPrepared( __METHOD__ );
 
-               // If 'oldRevision' is not set, load it!
-               // Useful if $this->oldPageState is initialized by prepareUpdate.
-               if ( !array_key_exists( 'oldRevision', $this->pageState ) ) {
-                       /** @var int $oldId */
-                       $oldId = $this->pageState['oldId'];
-                       $flags = $this->useMaster() ? RevisionStore::READ_LATEST : 0;
-                       $this->pageState['oldRevision'] = $oldId
-                               ? $this->revisionStore->getRevisionById( $oldId, $flags )
-                               : null;
+               if ( $this->parentRevision ) {
+                       return $this->parentRevision;
                }
 
-               return $this->pageState['oldRevision'];
+               if ( !$this->pageState['oldId'] ) {
+                       // If there was no current revision, there is no parent revision,
+                       // since the page didn't exist.
+                       return null;
+               }
+
+               $oldId = $this->revision->getParentId();
+               $flags = $this->useMaster() ? RevisionStore::READ_LATEST : 0;
+               $this->parentRevision = $oldId
+                       ? $this->revisionStore->getRevisionById( $oldId, $flags )
+                       : null;
+
+               return $this->parentRevision;
        }
 
        /**
@@ -495,8 +506,8 @@ class DerivedPageDataUpdater implements IDBAccessObject {
         * @note After prepareUpdate() was called, grabCurrentRevision() will throw an exception
         * to avoid confusion, since the page's current revision is then the new revision after
         * the edit, which was presumably passed to prepareUpdate() as the $revision parameter.
-        * Use getOldRevision() instead to access the revision that used to be current before the
-        * edit.
+        * Use getParentRevision() instead to access the revision that is the parent of the
+        * new revision.
         *
         * @return RevisionRecord|null the page's current revision, or null if the page does not
         * yet exist.
@@ -834,6 +845,8 @@ class DerivedPageDataUpdater implements IDBAccessObject {
 
                        // prepareUpdate() is redundant for null-edits
                        $this->doTransition( 'has-revision' );
+               } else {
+                       $this->parentRevision = $parentRevision;
                }
        }
 
@@ -969,7 +982,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                $this->assertPrepared( __METHOD__ );
 
                if ( !$this->slotsUpdate ) {
-                       $old = $this->getOldRevision();
+                       $old = $this->getParentRevision();
                        $this->slotsUpdate = RevisionSlotsUpdate::newFromRevisionSlots(
                                $this->revision->getSlots(),
                                $old ? $old->getSlots() : null
@@ -1077,7 +1090,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                        } else {
                                throw new LogicException(
                                        'Trying to re-use DerivedPageDataUpdater with revision '
-                                       .$revision->getId()
+                                       . $revision->getId()
                                        . ', but it\'s already bound to revision '
                                        . $this->revision->getId()
                                );
@@ -1138,7 +1151,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                        if ( !$this->user->equals( $user ) ) {
                                throw new LogicException(
                                        'The Revision provided has a mismatching actor: expected '
-                                       .$this->user->getName()
+                                       . $this->user->getName()
                                        . ', got '
                                        . $user->getName()
                                );
@@ -1252,34 +1265,103 @@ class DerivedPageDataUpdater implements IDBAccessObject {
        /**
         * @param bool $recursive
         *
-        * @return DataUpdate[]
+        * @return DeferrableUpdate[]
         */
        public function getSecondaryDataUpdates( $recursive = false ) {
-               // TODO: MCR: getSecondaryDataUpdates() needs a complete overhaul to avoid DataUpdates
-               // from different slots overwriting each other in the database. Plan:
-               // * replace direct calls to Content::getSecondaryDataUpdates() with calls to this method
-               // * Construct LinksUpdate here, on the combined ParserOutput, instead of in AbstractContent
-               //   for each slot.
-               // * Pass $slot into getSecondaryDataUpdates() - probably be introducing a new duplicate
-               //   version of this function in ContentHandler.
-               // * The new method gets the PreparedEdit, but no $recursive flag (that's for LinksUpdate)
-               // * Hack: call both the old and the new getSecondaryDataUpdates method here; Pass
-               //   the per-slot ParserOutput to the old method, for B/C.
-               // * Hack: If there is more than one slot, filter LinksUpdate from the DataUpdates
-               //   returned by getSecondaryDataUpdates, and use a LinksUpdated for the combined output
-               //   instead.
-               // * Call the SecondaryDataUpdates hook here (or kill it - its signature doesn't make sense)
-
-               $content = $this->getSlots()->getContent( 'main' );
-
-               // NOTE: $output is the combined output, to be shown in the default view.
+               if ( $this->isContentDeleted() ) {
+                       // This shouldn't happen, since the current content is always public,
+                       // and DataUpates are only needed for current content.
+                       return [];
+               }
+
                $output = $this->getCanonicalParserOutput();
 
-               $updates = $content->getSecondaryDataUpdates(
-                       $this->getTitle(), null, $recursive, $output
+               // Construct a LinksUpdate for the combined canonical output.
+               $linksUpdate = new LinksUpdate(
+                       $this->getTitle(),
+                       $output,
+                       $recursive
                );
 
-               return $updates;
+               $allUpdates = [ $linksUpdate ];
+
+               // NOTE: Run updates for all slots, not just the modified slots! Otherwise,
+               // info for an inherited slot may end up being removed. This is also needed
+               // to ensure that purges are effective.
+               $renderedRevision = $this->getRenderedRevision();
+               foreach ( $this->getSlots()->getSlotRoles() as $role ) {
+                       $slot = $this->getRawSlot( $role );
+                       $content = $slot->getContent();
+                       $handler = $content->getContentHandler();
+
+                       $updates = $handler->getSecondaryDataUpdates(
+                               $this->getTitle(),
+                               $content,
+                               $role,
+                               $renderedRevision
+                       );
+                       $allUpdates = array_merge( $allUpdates, $updates );
+
+                       // TODO: remove B/C hack in 1.32!
+                       // NOTE: we assume that the combined output contains all relevant meta-data for
+                       // all slots!
+                       $legacyUpdates = $content->getSecondaryDataUpdates(
+                               $this->getTitle(),
+                               null,
+                               $recursive,
+                               $output
+                       );
+
+                       // HACK: filter out redundant and incomplete LinksUpdates
+                       $legacyUpdates = array_filter( $legacyUpdates, function ( $update ) {
+                               return !( $update instanceof LinksUpdate );
+                       } );
+
+                       $allUpdates = array_merge( $allUpdates, $legacyUpdates );
+               }
+
+               // XXX: if a slot was removed by an earlier edit, but deletion updates failed to run at
+               // that time, we don't know for which slots to run deletion updates when purging a page.
+               // We'd have to examine the entire history of the page to determine that. Perhaps there
+               // could be a "try extra hard" mode for that case that would run a DB query to find all
+               // roles/models ever used on the page. On the other hand, removing slots should be quite
+               // rare, so perhaps this isn't worth the trouble.
+
+               // TODO: consolidate with similar logic in WikiPage::getDeletionUpdates()
+               $wikiPage = $this->getWikiPage();
+               $parentRevision = $this->getParentRevision();
+               foreach ( $this->getRemovedSlotRoles() as $role ) {
+                       // HACK: we should get the content model of the removed slot from a SlotRoleHandler!
+                       // For now, find the slot in the parent revision - if the slot was removed, it should
+                       // always exist in the parent revision.
+                       $parentSlot = $parentRevision->getSlot( $role, RevisionRecord::RAW );
+                       $content = $parentSlot->getContent();
+                       $handler = $content->getContentHandler();
+
+                       $updates = $handler->getDeletionUpdates(
+                               $this->getTitle(),
+                               $role
+                       );
+                       $allUpdates = array_merge( $allUpdates, $updates );
+
+                       // TODO: remove B/C hack in 1.32!
+                       $legacyUpdates = $content->getDeletionUpdates( $wikiPage );
+
+                       // HACK: filter out redundant and incomplete LinksDeletionUpdate
+                       $legacyUpdates = array_filter( $legacyUpdates, function ( $update ) {
+                               return !( $update instanceof LinksDeletionUpdate );
+                       } );
+
+                       $allUpdates = array_merge( $allUpdates, $legacyUpdates );
+               }
+
+               // TODO: hard deprecate SecondaryDataUpdates in favor of RevisionDataUpdates in 1.33!
+               Hooks::run(
+                       'RevisionDataUpdates',
+                       [ $this->getTitle(), $renderedRevision, &$allUpdates ]
+               );
+
+               return $allUpdates;
        }
 
        /**
@@ -1425,7 +1507,7 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                        WikiPage::onArticleEdit( $title, $legacyRevision, $this->getTouchedSlotRoles() );
                }
 
-               $oldRevision = $this->getOldRevision();
+               $oldRevision = $this->getParentRevision();
                $oldLegacyRevision = $oldRevision ? new Revision( $oldRevision ) : null;
 
                // TODO: In the wiring, register a listener for this on the new PageEventEmitter
@@ -1484,7 +1566,9 @@ class DerivedPageDataUpdater implements IDBAccessObject {
                }
 
                foreach ( $updates as $update ) {
-                       $update->setCause( $causeAction, $causeAgent );
+                       if ( $update instanceof DataUpdate ) {
+                               $update->setCause( $causeAction, $causeAgent );
+                       }
                        if ( $update instanceof LinksUpdate ) {
                                $update->setRevision( $legacyRevision );
                                $update->setTriggeringUser( $triggeringUser );
index 8e66906..61b428f 100644 (file)
@@ -525,11 +525,11 @@ class RevisionStore
                        $slot = $rev->getSlot( $role, RevisionRecord::RAW );
                        Assert::postcondition(
                                $slot->getContent() !== null,
-                               $role .  ' slot must have content'
+                               $role . ' slot must have content'
                        );
                        Assert::postcondition(
                                $slot->hasRevision(),
-                               $role .  ' slot must have a revision associated'
+                               $role . ' slot must have a revision associated'
                        );
                }
 
@@ -1711,8 +1711,8 @@ class RevisionStore
                                $row->ar_actor ?? null
                        );
                } catch ( InvalidArgumentException $ex ) {
-                       wfWarn( __METHOD__ . ': ' . $ex->getMessage() );
-                       $user = new UserIdentityValue( 0, '', 0 );
+                       wfWarn( __METHOD__ . ': ' . $title->getPrefixedDBkey() . ': ' . $ex->getMessage() );
+                       $user = new UserIdentityValue( 0, 'Unknown user', 0 );
                }
 
                $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
@@ -1759,8 +1759,8 @@ class RevisionStore
                                $row->rev_actor ?? null
                        );
                } catch ( InvalidArgumentException $ex ) {
-                       wfWarn( __METHOD__ . ': ' . $ex->getMessage() );
-                       $user = new UserIdentityValue( 0, '', 0 );
+                       wfWarn( __METHOD__ . ': ' . $title->getPrefixedDBkey() . ': ' . $ex->getMessage() );
+                       $user = new UserIdentityValue( 0, 'Unknown user', 0 );
                }
 
                $db = $this->getDBConnectionRefForQueryFlags( $queryFlags );
index ca62e0e..bbc1d63 100644 (file)
@@ -1665,7 +1665,7 @@ class Title implements LinkTarget {
                        if ( $nsText === false ) {
                                // See T165149. Awkward, but better than erroneously linking to the main namespace.
                                $nsText = MediaWikiServices::getInstance()->getContentLanguage()->
-                                       getNsText( NS_SPECIAL ) .  ":Badtitle/NS{$this->mNamespace}";
+                                       getNsText( NS_SPECIAL ) . ":Badtitle/NS{$this->mNamespace}";
                        }
 
                        $p .= $nsText . ':';
index 327dd54..ed10615 100644 (file)
@@ -856,7 +856,7 @@ class WebRequest {
         * @return string
         */
        public function getFullRequestURL() {
-               return wfGetServerUrl( PROTO_CURRENT ) .  $this->getRequestURL();
+               return wfGetServerUrl( PROTO_CURRENT ) . $this->getRequestURL();
        }
 
        /**
index 9d336e4..dc7b00e 100644 (file)
@@ -151,7 +151,6 @@ class RollbackAction extends FormlessAction {
                        );
                        $de->showDiff( '', '' );
                }
-               return;
        }
 
        protected function getDescription() {
index 0248f25..14491da 100644 (file)
@@ -132,7 +132,8 @@ class ApiLogin extends ApiBase {
                                $loginType = 'BotPassword';
                        } elseif ( !$botLoginData[2] ||
                                $status->hasMessage( 'login-throttled' ) ||
-                               $status->hasMessage( 'botpasswords-needs-reset' )
+                               $status->hasMessage( 'botpasswords-needs-reset' ) ||
+                               $status->hasMessage( 'botpasswords-locked' )
                        ) {
                                $authRes = 'Failed';
                                $message = $status->getMessage();
index 830df59..bae6885 100644 (file)
@@ -76,7 +76,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                                if ( !is_null( $params[$param] ) ) {
                                        $p = $this->getModulePrefix();
                                        $this->dieWithError(
-                                               [ 'apierror-invalidparammix-cannotusewith', $p.$param, "{$p}user" ],
+                                               [ 'apierror-invalidparammix-cannotusewith', $p . $param, "{$p}user" ],
                                                'invalidparammix'
                                        );
                                }
@@ -86,7 +86,7 @@ class ApiQueryAllDeletedRevisions extends ApiQueryRevisionsBase {
                                if ( !is_null( $params[$param] ) ) {
                                        $p = $this->getModulePrefix();
                                        $this->dieWithError(
-                                               [ 'apierror-invalidparammix-mustusewith', $p.$param, "{$p}user" ],
+                                               [ 'apierror-invalidparammix-mustusewith', $p . $param, "{$p}user" ],
                                                'invalidparammix'
                                        );
                                }
index 0cf6b04..3b7b00d 100644 (file)
@@ -522,7 +522,7 @@ class ApiQueryInfo extends ApiQueryBase {
                }
 
                if ( $this->params['testactions'] ) {
-                       $limit = $this->getMain()->canApiHighLimits() ? self::LIMIT_SML1 : self::LIMIT_SML2;
+                       $limit = $this->getMain()->canApiHighLimits() ? self::LIMIT_SML2 : self::LIMIT_SML1;
                        if ( $this->countTestedActions >= $limit ) {
                                return null; // force a continuation
                        }
index 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 8edddda..5e30c1a 100644 (file)
@@ -53,7 +53,7 @@
        "apihelp-clearhasmsg-example-1": "Fjern <code>hasmsg</code>-flagget for aktuell bruker.",
        "apihelp-clientlogin-summary": "Logg inn på wikien med den interaktive flyten.",
        "apihelp-clientlogin-example-login": "Start prosessen med å logge inn til wikien som bruker <kbd>Example</kbd> med passord <kbd>ExamplePassword</kbd>.",
-       "apihelp-clientlogin-example-login2": "Fortsett å logge inn etter en <samp>UI</samp>-respons for tofaktor-autentisering, ved å oppgi en <var>OATHToken</var> på <kbd>987654</kbd>.",
+       "apihelp-clientlogin-example-login2": "Fortsett å logge inn etter en <samp>UI</samp>-respons for totrinns pålogging, ved å oppgi en <var>OATHToken</var> på <kbd>987654</kbd>.",
        "apihelp-compare-summary": "Hent forskjellen mellom to sider.",
        "apihelp-compare-extended-description": "Et revisjonsnummer, en sidetittel eller en side-ID for både «fra» og «til» må sendes.",
        "apihelp-compare-param-fromtitle": "Første tittel å sammenligne.",
index ae46595..55c0671 100644 (file)
        "apihelp-options-example-complex": "重置所有偏好設定,然後再設定 <kbd>skin</kbd> 與 <kbd>nickname</kbd>。",
        "apihelp-paraminfo-summary": "獲得有關 API 模組的資訊。",
        "apihelp-paraminfo-param-helpformat": "說明字串的格式。",
+       "apihelp-paraminfo-param-formatmodules": "格式模組名稱清單(<var>format</var> 參數的值)。請改用 <var>$1modules</var> 。",
        "apihelp-paraminfo-example-1": "顯示 <kbd>[[Special:ApiHelp/parse|action=parse]]</kbd>、<kbd>[[Special:ApiHelp/jsonfm|format=jsonfm]]</kbd>、<kbd>[[Special:ApiHelp/query+allpages|action=query&list=allpages]]</kbd>、和 <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> 的資訊。",
        "apihelp-paraminfo-example-2": "顯示 <kbd>[[Special:ApiHelp/query|action=query]]</kbd> 所有子模組的資訊。",
        "apihelp-parse-summary": "解析內容併回傳解析器輸出。",
        "apihelp-query+allimages-param-to": "要停止列舉的圖片標題。僅能與 $1sort=name 一起使用。",
        "apihelp-query+allimages-param-start": "要開始列舉的時間戳記。僅能與 $1sort=timestamp 一起使用。",
        "apihelp-query+allimages-param-end": "要停止列舉的時間戳記。僅能與 $1sort=timestamp 一起使用。",
+       "apihelp-query+allimages-param-prefix": "搜尋所有以此值為開頭的圖片。僅能與 $1sort=name 一起使用。",
        "apihelp-query+allimages-param-minsize": "限制圖片至少要有這樣多的位元組。",
        "apihelp-query+allimages-param-maxsize": "限制圖片最多只能這樣多的位元組。",
        "apihelp-query+allimages-param-sha1": "圖片的 SHA1 雜湊值。覆蓋 $1sha1base36。",
        "apihelp-query+allusers-example-Y": "列出以<kbd>Y</kbd>開頭的使用者。",
        "apihelp-query+authmanagerinfo-summary": "取得目前身分核對狀態的資訊。",
        "apihelp-query+backlinks-summary": "找出連結至指定頁面的所有頁面。",
+       "apihelp-query+backlinks-param-title": "要搜尋的標題。不能與 <var>$1pageid</var> 一起使用。",
        "apihelp-query+backlinks-param-pageid": "要搜尋的頁面 ID。不能與 <var>$1title</var> 一起使用。",
        "apihelp-query+backlinks-param-namespace": "要列舉的命名空間。",
        "apihelp-query+backlinks-param-dir": "列出時所採用的方向。",
        "apihelp-query+blocks-paramvalue-prop-userid": "添加已封鎖使用者的使用者 ID。",
        "apihelp-query+blocks-paramvalue-prop-by": "添加進行封鎖中的使用者之使用者名稱。",
        "apihelp-query+blocks-paramvalue-prop-byid": "添加進行封鎖中的使用者之使用者 ID。",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "添加當封鎖生效的時間戳記。",
+       "apihelp-query+blocks-paramvalue-prop-expiry": "添加當封鎖到期的時間戳記。",
        "apihelp-query+blocks-paramvalue-prop-reason": "添加封鎖的原因。",
        "apihelp-query+blocks-example-simple": "列出封鎖。",
        "apihelp-query+blocks-example-users": "列出使用者 <kbd>Alice</kbd> 與 <kbd>Bob</kbd> 的封鎖。",
        "apihelp-query+categorymembers-paramvalue-prop-timestamp": "添加在頁面有被包含時的時間戳記。",
        "apihelp-query+categorymembers-param-limit": "回傳的頁面數量上限。",
        "apihelp-query+categorymembers-param-sort": "作為排序順序的屬性。",
+       "apihelp-query+categorymembers-param-start": "起始列出的時間戳記。僅能與 <kbd>$1sort=timestamp</kbd> 一起使用。",
+       "apihelp-query+categorymembers-param-end": "結束列出的時間戳記。僅能與 <kbd>$1sort=timestamp</kbd> 一起使用。",
        "apihelp-query+categorymembers-param-startsortkey": "請改用 $1starthexsortkey。",
        "apihelp-query+categorymembers-param-endsortkey": "請改用 $1endhexsortkey。",
        "apihelp-query+categorymembers-example-simple": "取得在 <kbd>Category:Physics</kbd> 裡前 10 項的頁面。",
        "apihelp-query+logevents-paramvalue-prop-userid": "添加承擔日誌事件的使用者 ID。",
        "apihelp-query+logevents-paramvalue-prop-timestamp": "添加日誌事件的時間戳記。",
        "apihelp-query+logevents-paramvalue-prop-comment": "添加日誌事件的註釋。",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "添加日誌事件的解析註釋。",
        "apihelp-query+logevents-paramvalue-prop-details": "列出日誌事件的額外詳細資訊。",
        "apihelp-query+logevents-paramvalue-prop-tags": "列出日誌事件的標籤。",
        "apihelp-query+logevents-param-type": "篩選僅為此類型的日誌項目。",
        "apihelp-query+logevents-param-tag": "僅列出以此標籤所標記的事件項目。",
        "apihelp-query+logevents-param-limit": "要回傳的事件項目總數。",
        "apihelp-query+logevents-example-simple": "列出近期日誌事件。",
+       "apihelp-query+pagepropnames-summary": "列出所有在 wiki 使用的頁面屬性名稱。",
        "apihelp-query+pagepropnames-param-limit": "回傳的名稱數量上限。",
        "apihelp-query+pagepropnames-example-simple": "取得前 10 個屬性名稱。",
        "apihelp-query+pageprops-example-simple": "取得頁面 <kbd>Main Page</kbd> 與 <kbd>MediaWiki</kbd> 的屬性。",
        "apihelp-query+prefixsearch-param-limit": "回傳的結果數量上限。",
        "apihelp-query+prefixsearch-param-offset": "要略過的結果數量。",
        "apihelp-query+prefixsearch-example-simple": "搜尋開頭為 <kbd>meaning</kbd> 的頁面標題。",
+       "apihelp-query+prefixsearch-param-profile": "搜尋要使用的配置。",
        "apihelp-query+protectedtitles-param-namespace": "僅列出這些命名空間的標題。",
        "apihelp-query+protectedtitles-param-level": "僅列出具有這些保護層級的標題。",
        "apihelp-query+protectedtitles-param-limit": "要回傳的頁面總數。",
        "apihelp-query+protectedtitles-param-prop": "要取得的屬性。",
+       "apihelp-query+protectedtitles-paramvalue-prop-user": "添加做出添加保護操作的使用者。",
+       "apihelp-query+protectedtitles-paramvalue-prop-userid": "添加做出添加保護操作的使用者 ID。",
+       "apihelp-query+protectedtitles-paramvalue-prop-comment": "添加保護的註釋。",
+       "apihelp-query+protectedtitles-paramvalue-prop-parsedcomment": "添加保護的解析註釋。",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "添加保護層級。",
        "apihelp-query+protectedtitles-example-simple": "列出已保護的標題。",
+       "apihelp-query+querypage-summary": "取得透過特殊頁面 QueryPage-based 所提供的清單。",
        "apihelp-query+querypage-param-page": "特殊頁面的名稱。註:區分大小寫。",
        "apihelp-query+querypage-param-limit": "回傳的結果數量。",
+       "apihelp-query+querypage-example-ancientpages": "回傳來自 [[Special:Ancientpages]] 的結果。",
        "apihelp-query+random-summary": "取得隨機頁面集合",
        "apihelp-query+random-param-namespace": "僅回傳在這些命名空間的頁面。",
        "apihelp-query+random-param-redirect": "請改用 <kbd>$1filterredir=redirects</kbd>。",
        "apihelp-query+recentchanges-param-excludeuser": "不要列出由該使用者作出的更改。",
        "apihelp-query+recentchanges-param-tag": "僅列出以此標籤所標記的更改。",
        "apihelp-query+recentchanges-param-prop": "包含的額外資訊部份:",
+       "apihelp-query+recentchanges-paramvalue-prop-comment": "添加編輯的註釋。",
+       "apihelp-query+recentchanges-paramvalue-prop-parsedcomment": "添加編輯的解析註釋。",
        "apihelp-query+recentchanges-paramvalue-prop-flags": "添加編輯的標籤。",
        "apihelp-query+recentchanges-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
        "apihelp-query+recentchanges-paramvalue-prop-title": "添加編輯的頁面標題。",
        "apihelp-query+revisions-example-first5-user": "取得 <kbd>Main Page</kbd> 裡由使用者 <kbd>MediaWiki default</kbd> 所做出的最早前 5 筆修訂。",
        "apihelp-query+revisions+base-paramvalue-prop-ids": "修訂 ID。",
        "apihelp-query+revisions+base-paramvalue-prop-flags": "修訂標籤(小修改)。",
+       "apihelp-query+revisions+base-paramvalue-prop-timestamp": "修訂的時間戳記。",
        "apihelp-query+revisions+base-paramvalue-prop-user": "做出修訂的使用者。",
+       "apihelp-query+revisions+base-paramvalue-prop-userid": "修訂創建者的使用者 ID",
        "apihelp-query+revisions+base-paramvalue-prop-size": "修訂的長度(位元組)。",
+       "apihelp-query+revisions+base-paramvalue-prop-sha1": "修訂的 SHA-1(base 16)。",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "修訂標籤。",
        "apihelp-query+revisions+base-param-limit": "限制所回傳的修訂數量。",
        "apihelp-query+search-summary": "執行全文搜尋。",
        "apihelp-query+search-param-limit": "要回傳的頁面總數。",
        "apihelp-query+search-param-interwiki": "若可用的話,在搜尋裡包含跨 wiki 結果。",
        "apihelp-query+search-param-backend": "是否搜尋使用的後端,若否則為預設。",
+       "apihelp-query+search-param-sort": "設定回傳結果的排序。",
        "apihelp-query+search-example-simple": "搜尋 <kbd>meaning</kbd>。",
        "apihelp-query+search-example-text": "搜尋 <kbd>meaning</kbd> 的文字。",
        "apihelp-query+siteinfo-summary": "回傳有關站台的一般資訊。",
        "apihelp-query+siteinfo-param-prop": "要取得的資訊:",
        "apihelp-query+siteinfo-paramvalue-prop-general": "全面系統資訊。",
        "apihelp-query+siteinfo-paramvalue-prop-specialpagealiases": "特殊頁面別名清單。",
+       "apihelp-query+siteinfo-param-showalldb": "列出所有資料庫伺服器,不是只有最延遲的那台。",
        "apihelp-query+siteinfo-param-numberingroup": "列出在使用者群組裡的使用者數目。",
+       "apihelp-query+siteinfo-param-inlanguagecode": "用於本地化語言的語言代碼(盡可能)與外觀名稱。",
        "apihelp-query+siteinfo-example-simple": "索取站台資訊。",
        "apihelp-query+siteinfo-example-interwiki": "索取本地端跨 wiki 前綴的清單。",
        "apihelp-query+siteinfo-example-replag": "檢查目前的響應延遲。",
        "apihelp-query+usercontribs-paramvalue-prop-title": "添加標題與頁面的命名空間 ID。",
        "apihelp-query+usercontribs-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
        "apihelp-query+usercontribs-paramvalue-prop-comment": "添加編輯的註釋。",
-       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "添加編輯的已解析註解。",
+       "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "添加編輯的解析註釋。",
        "apihelp-query+usercontribs-paramvalue-prop-size": "添加編輯的新大小。",
        "apihelp-query+usercontribs-paramvalue-prop-flags": "添加編輯的標籤。",
        "apihelp-query+usercontribs-paramvalue-prop-patrolled": "標記已巡查編輯。",
        "apihelp-query+usercontribs-paramvalue-prop-autopatrolled": "標記自動巡查編輯。",
        "apihelp-query+usercontribs-paramvalue-prop-tags": "列出編輯的標籤。",
+       "apihelp-query+usercontribs-param-tag": "僅列出以此標籤所標記的修訂。",
+       "apihelp-query+usercontribs-param-toponly": "僅列出最新修訂的更改。",
        "apihelp-query+usercontribs-example-user": "顯示使用者 <kbd>Example</kbd> 的貢獻。",
+       "apihelp-query+usercontribs-example-ipprefix": "顯示所有來自於前綴為 <kbd>192.0.2.</kbd> 的 IP 地址貢獻。",
        "apihelp-query+userinfo-summary": "取得目前使用者的資訊。",
        "apihelp-query+userinfo-param-prop": "要包含的資訊部份:",
        "apihelp-query+userinfo-paramvalue-prop-groups": "列出目前使用者所隸屬的所有群組。",
        "apihelp-query+users-paramvalue-prop-rights": "列出各使用者所擁有的權限。",
        "apihelp-query+users-paramvalue-prop-editcount": "添加使用者的編輯數。",
        "apihelp-query+users-paramvalue-prop-registration": "添加使用者的註冊時間戳記。",
+       "apihelp-query+users-param-users": "要獲取的使用者清單。",
+       "apihelp-query+users-param-userids": "要獲取的使用者 ID 清單。",
+       "apihelp-query+users-param-token": "請改用 <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+watchlist-param-start": "起始列舉的時間戳記。",
        "apihelp-query+watchlist-param-end": "結束列舉的時間戳記。",
        "apihelp-query+watchlist-param-user": "此列出由該使用者作出的更改。",
        "apihelp-query+watchlist-paramvalue-prop-flags": "添加編輯的標籤。",
        "apihelp-query+watchlist-paramvalue-prop-user": "添加有做出編輯的使用者。",
        "apihelp-query+watchlist-paramvalue-prop-userid": "添加有做出編輯的使用者 ID。",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "添加編輯的註釋。",
+       "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "添加編輯的解析註釋。",
+       "apihelp-query+watchlist-paramvalue-prop-timestamp": "添加編輯的時間戳記。",
        "apihelp-query+watchlist-paramvalue-prop-tags": "列出項目的標籤。",
        "apihelp-query+watchlist-param-type": "要顯示的更改類型:",
        "apihelp-query+watchlist-paramvalue-type-edit": "一般頁面編輯。",
        "apihelp-revisiondelete-param-hide": "各修訂所要隱藏的內容。",
        "apihelp-revisiondelete-param-show": "各修訂所要取消隱藏的內容。",
        "apihelp-revisiondelete-param-reason": "刪除或取消刪除的原因。",
+       "apihelp-revisiondelete-param-tags": "在刪除日誌裡套用到項目的標籤。",
        "apihelp-rollback-summary": "撤修頁面的最後一次編輯。",
+       "apihelp-rollback-param-tags": "套用到回退的標籤。",
+       "apihelp-rollback-param-summary": "自定義編輯摘要。若為空,則使用預設摘要。",
+       "apihelp-rollback-param-watchlist": "無條件使用設置將頁面加入或移除目前使用者的監視清單或者是不更改監視清單。",
        "apihelp-setnotificationtimestamp-param-entirewatchlist": "在所有已監視頁面運作。",
+       "apihelp-setnotificationtimestamp-example-page": "重新設定用於 <kbd>Main page</kbd> 的通知狀態。",
+       "apihelp-setnotificationtimestamp-example-allpages": "重新設定在 <kbd>{{ns:user}}</kbd> 命名空間裡頁面的通知狀態。",
        "apihelp-setpagelanguage-summary": "更改頁面的語言。",
+       "apihelp-setpagelanguage-extended-description-disabled": "您不被允許在此 wiki 上變更頁面的語言。\n\n請啟用 <var>[[mw:Special:MyLanguage/Manual:$wgPageLanguageUseDB|$wgPageLanguageUseDB]]</var> 來進行此操作。",
        "apihelp-setpagelanguage-param-reason": "變更的原因。",
        "apihelp-setpagelanguage-example-language": "更改 <kbd>Main Page</kbd> 的語言成巴斯克語。",
        "apihelp-stashedit-summary": "在分享快取裡預備編輯。",
        "apihelp-tokens-summary": "取得資料修改動作的密鑰。",
        "apihelp-tokens-extended-description": "此模組已因支援 [[Special:ApiHelp/query+tokens|action=query&meta=tokens]] 而停用。",
        "apihelp-unblock-summary": "解除封鎖一位使用者。",
+       "apihelp-unblock-param-user": "要封鎖的使用者名稱、IP 位址或 IP 範圍。不能與 <var>$1id</var> 或 <var>$1userid</var> 一起使用",
+       "apihelp-unblock-param-userid": "要封鎖的使用者 ID。不可與 <var>$1id</var> 或 <var>$1user</var> 一同使用。",
        "apihelp-unblock-param-reason": "解除封鎖的原因。",
        "apihelp-unblock-param-tags": "在封鎖日誌裡更改套用到項目的標籤。",
        "apihelp-unblock-example-id": "解除封銷 ID #<kbd>105</kbd>。",
+       "apihelp-undelete-summary": "恢復已刪除頁面的修訂。",
        "apihelp-undelete-param-title": "要恢復的頁面標題。",
        "apihelp-undelete-param-reason": "還原的原因。",
        "apihelp-undelete-param-tags": "在刪除日誌裡更改套用到項目的標籤。",
        "apihelp-undelete-example-page": "取消刪除頁面 <kbd>Main Page</kbd>。",
        "apihelp-undelete-example-revisions": "取消刪除 <kbd>Main Page</kbd> 的兩筆修訂。",
        "apihelp-unlinkaccount-summary": "移除目前使用者所連結到的第三方帳號。",
+       "apihelp-upload-summary": "上傳檔案,或取得等待上傳的狀態。",
        "apihelp-upload-param-filename": "目標檔案名稱。",
        "apihelp-upload-param-comment": "上傳註釋。如果 <var>$1text</var> 未指定的話,也會作為新檔案用的初始頁面文字。",
        "apihelp-upload-param-text": "用於新檔案的初始頁面文字。",
        "api-format-prettyprint-header-hyperlinked": "這是$1格式的HTML實現。HTML對除錯很有用,但不適合應用程式使用。\n\n指定<var>format</var>參數以更改輸出格式。要查看$1格式的非HTML實現,設置[$3 <kbd>format=$2</kbd>]。\n\n參見[[mw:API|完整文件]],或[[Special:ApiHelp/main|API幫助]]以獲取更多信息。",
        "api-format-prettyprint-status": "此回應將會傳回HTTP狀態$1 $2。",
        "api-login-fail-badsessionprovider": "當使用$1無法登入。",
+       "api-login-fail-sameorigin": "當未套用相同原有方針時無法登入。",
        "api-pageset-param-titles": "要使用的標題清單。",
        "api-pageset-param-pageids": "要使用的頁面 ID 清單。",
        "api-pageset-param-revids": "要使用的修訂 ID 清單。",
        "api-help-param-upload": "必須使用 multipart/form-data 以檔案上傳的方式傳送。",
        "api-help-param-multi-separate": "將幾個值以 <kbd>|</kbd> 或 [[Special:ApiHelp/main#main/datatypes|alternative]] 分隔。",
        "api-help-param-multi-max": "上限值為 {{PLURAL:$1|$1}} (機器人為 {{PLURAL:$2|$2}})。",
+       "api-help-param-multi-max-simple": "值的最大數量為 {{PLURAL:$1|$1}}。",
        "api-help-param-multi-all": "要指定所有值,請使用<kbd>$1</kbd>。",
        "api-help-param-default": "預設值:$1",
        "api-help-param-default-empty": "預設值:<span class=\"apihelp-empty\">(空)</span>",
        "api-help-authmanagerhelper-returnurl": "為第三方身份驗證流程傳回URL,必須為絕對值。需要此值或<var>$1continue</var>兩者之一。\n\n在接收<samp>REDIRECT</samp>回應時,一般狀況下您將打開瀏覽器或網站瀏覽功能到特定的<samp>redirecttarget</samp> URL以進行第三方身份驗證流程。當它完成時,第三方會將瀏覽器或網站瀏覽功能送至此URL。您應當提取任何來自URL的查詢或POST參數,並將之作為<var>$1continue</var>請求傳遞至此API模組。",
        "api-help-authmanagerhelper-continue": "此請求是在先前的<samp>UI</samp>或<samp>REDIRECT</samp>回應之後的後續動作。必須為此值或<var>$1returnurl</var>。",
        "api-help-authmanagerhelper-additional-params": "此模組允許額外參數,取決於可用的身份驗證請求。使用<kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd>与<kbd>amirequestsfor=$1</kbd>(或之前來自此模組的回應,如果合適)以決定可用請求及其使用的欄位。",
+       "apierror-appendnotsupported": "無法附加到使用內容模組 $1 的頁面。",
        "apierror-articleexists": "您所嘗試建立的條目剛剛已被創建。",
+       "apierror-assertbotfailed": "斷言使用者擁有的 <code>bot</code> 權限失效。",
+       "apierror-assertnameduserfailed": "斷言使用者「$1」出錯。",
+       "apierror-assertuserfailed": "斷言使用者已登入失敗。",
        "apierror-autoblocked": "您的 IP 位址已經被自動封鎖,因為它曾經被一名已封鎖的使用者使用過。",
        "apierror-badgenerator-notgenerator": "模組 <kbd>$1</kbd> 不能作為產生器。",
        "apierror-badgenerator-unknown": "未知的 <kbd>generator=$1</kbd>。",
        "apierror-contentserializationexception": "內容序列化失敗:$1",
        "apierror-copyuploadbadurl": "不允許從此 URL 來上傳。",
        "apierror-csp-report": "處理 CSP 報告時錯誤:$1。",
+       "apierror-emptypage": "不允許建立空白的新頁面。",
        "apierror-filedoesnotexist": "檔案不存在。",
        "apierror-filenopath": "無法取得本地端檔案路徑。",
        "apierror-filetypecannotberotated": "無法旋轉的檔案類型。",
        "apierror-imageusage-badtitle": "<kbd>$1</kbd>的標題必須是檔案。",
        "apierror-import-unknownerror": "未知的匯入錯誤:$1",
        "apierror-invalidcategory": "您所輸入的分類名稱無效。",
+       "apierror-invalidlang": "用於參數 <var>$1</var> 的語言代碼無效。",
+       "apierror-invalidoldimage": "<var>oldimage</var> 參數含有無效格式。",
+       "apierror-invalidparammix-cannotusewith": "參數 <kbd>$1</kbd> 不能與 <kbd>$2</kbd> 一起使用。",
+       "apierror-invalidparammix-mustusewith": "<kbd>$1</kbd> 參數僅能與 <kbd>$2</kbd> 一起使用。",
        "apierror-invalidparammix": "{{PLURAL:$2|參數}} $1 不能一起使用。",
        "apierror-invalidsha1base36hash": "所提供的 SHA1Base36 雜湊無效。",
        "apierror-invalidsha1hash": "所提供的 SHA1 雜湊無效。",
        "apierror-invalidtitle": "錯誤標題「$1」。",
+       "apierror-invalidurlparam": "<var>$1urlparam</var> 的值無效(<kbd>$2=$3</kbd>)。",
        "apierror-invaliduser": "無效的使用者名稱「$1」。",
        "apierror-invaliduserid": "使用者 ID <var>$1</var> 無效。",
+       "apierror-maxbytes": "參數 <var>$1</var> 不能大於 $2 {{PLURAL:$2|位元組|位元組}}",
+       "apierror-maxchars": "參數 <var>$1</var> 不能多於 $2 個{{PLURAL:$2|字元|字元}}",
+       "apierror-maxlag-generic": "正等待資料庫伺服器:已延遲 $1 {{PLURAL:$1|秒|秒}}。",
+       "apierror-maxlag": "正等待$2:已延遲 $1 {{PLURAL:$1|秒|秒}}。",
+       "apierror-mimesearchdisabled": "MIME 搜尋在 Miser 模式裡被停用。",
        "apierror-missingcontent-pageid": "遺失頁面 ID 為 $1 的內容。",
        "apierror-missingcontent-revid": "遺失修訂 ID 為 $1 的內容。",
+       "apierror-missingparam-one-of": "{{PLURAL:$2|參數|參數其一}} $1 為必要。",
        "apierror-missingparam": "<var>$1</var>參數必須被設定。",
        "apierror-missingrev-pageid": "沒有頁面 ID 為 $1 的目前修訂。",
        "apierror-missingrev-title": "沒有標題為$1的目前修訂。",
        "apierror-missingtitle": "您所指定的頁面不存在。",
        "apierror-missingtitle-byname": "頁面$1不存在。",
+       "apierror-moduledisabled": "模組 <kbd>$1</kbd> 已停用。",
        "apierror-mustbeloggedin-changeauth": "必須登入,才能變更身分核對資取。",
        "apierror-mustbeloggedin-generic": "您必須登入。",
        "apierror-mustbeloggedin-linkaccounts": "您必須登入到連結帳號。",
index 9cf7acf..d0381cf 100644 (file)
@@ -838,17 +838,23 @@ class LocalisationCache {
                }
 
                # Fill in the fallback if it's not there already
-               if ( is_null( $coreData['fallback'] ) ) {
-                       $coreData['fallback'] = $code === 'en' ? false : 'en';
-               }
-               if ( $coreData['fallback'] === false ) {
-                       $coreData['fallbackSequence'] = [];
+               if ( ( is_null( $coreData['fallback'] ) || $coreData['fallback'] === false ) && $code === 'en' ) {
+                       $coreData['fallback'] = false;
+                       $coreData['originalFallbackSequence'] = $coreData['fallbackSequence'] = [];
                } else {
-                       $coreData['fallbackSequence'] = array_map( 'trim', explode( ',', $coreData['fallback'] ) );
+                       if ( !is_null( $coreData['fallback'] ) ) {
+                               $coreData['fallbackSequence'] = array_map( 'trim', explode( ',', $coreData['fallback'] ) );
+                       } else {
+                               $coreData['fallbackSequence'] = [];
+                       }
                        $len = count( $coreData['fallbackSequence'] );
 
-                       # Ensure that the sequence ends at en
-                       if ( $coreData['fallbackSequence'][$len - 1] !== 'en' ) {
+                       # Before we add the 'en' fallback for messages, keep a copy of
+                       # the original fallback sequence
+                       $coreData['originalFallbackSequence'] = $coreData['fallbackSequence'];
+
+                       # Ensure that the sequence ends at 'en' for messages
+                       if ( !$len || $coreData['fallbackSequence'][$len - 1] !== 'en' ) {
                                $coreData['fallbackSequence'][] = 'en';
                        }
                }
index fc37882..c781d71 100644 (file)
@@ -29,13 +29,6 @@ use Wikimedia\Rdbms\IDatabase;
  * @since 1.29
  */
 class ChangesListBooleanFilter extends ChangesListFilter {
-       // This can sometimes be different on Special:RecentChanges
-       // and Special:Watchlist, due to the double-legacy hooks
-       // (SpecialRecentChangesFilters and SpecialWatchlistFilters)
-
-       // but there will be separate sets of ChangesListFilterGroup and ChangesListFilter instances
-       // for those pages (it should work even if they're both loaded
-       // at once, but that can't happen).
        /**
         * Main unstructured UI i18n key
         *
index 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 b3e9422..652a87d 100644 (file)
@@ -73,15 +73,23 @@ class MWException extends Exception {
         * @return string Message with arguments replaced
         */
        public function msg( $key, $fallback /*[, params...] */ ) {
+               global $wgSitename;
                $args = array_slice( func_get_args(), 2 );
 
+               $res = false;
                if ( $this->useMessageCache() ) {
                        try {
-                               return wfMessage( $key, $args )->text();
+                               $res = wfMessage( $key, $args )->text();
                        } catch ( Exception $e ) {
                        }
                }
-               return wfMsgReplaceArgs( $fallback, $args );
+               if ( $res === false ) {
+                       $res = wfMsgReplaceArgs( $fallback, $args );
+                       // If an exception happens inside message rendering,
+                       // {{SITENAME}} sometimes won't be replaced.
+                       $res = preg_replace( '/\{\{SITENAME\}\}/', $wgSitename, $res );
+               }
+               return $res;
        }
 
        /**
@@ -154,6 +162,16 @@ class MWException extends Exception {
                global $wgOut, $wgSitename;
                if ( $this->useOutputPage() ) {
                        $wgOut->prepareErrorPage( $this->getPageTitle() );
+                       // Manually set the html title, since sometimes
+                       // {{SITENAME}} does not get replaced for exceptions
+                       // happening inside message rendering.
+                       $wgOut->setHTMLTitle(
+                               $this->msg(
+                                       'pagetitle',
+                                       "$1 - $wgSitename",
+                                       $this->getPageTitle()
+                               )
+                       );
 
                        $wgOut->addHTML( $this->getHTML() );
 
index 49cf71e..1f1cabe 100644 (file)
@@ -197,12 +197,17 @@ class MWExceptionRenderer {
         * @return string Message with arguments replaced
         */
        private static function msg( $key, $fallback /*[, params...] */ ) {
+               global $wgSitename;
                $args = array_slice( func_get_args(), 2 );
                try {
-                       return wfMessage( $key, $args )->text();
+                       $res = wfMessage( $key, $args )->text();
                } catch ( Exception $e ) {
-                       return wfMsgReplaceArgs( $fallback, $args );
+                       $res = wfMsgReplaceArgs( $fallback, $args );
+                       // If an exception happens inside message rendering,
+                       // {{SITENAME}} sometimes won't be replaced.
+                       $res = preg_replace( '/\{\{SITENAME\}\}/', $wgSitename, $res );
                }
+               return $res;
        }
 
        /**
index d1c9455..7aa8c78 100644 (file)
@@ -107,6 +107,5 @@ class PackedImageGallery extends TraditionalImageGallery {
         * @param int $num
         */
        public function setPerRow( $num ) {
-               return;
        }
 }
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 d988c29..60c63d6 100644 (file)
@@ -85,18 +85,19 @@ class HTMLTextField extends HTMLFormField {
                        'type',
                        'min',
                        'max',
-                       'pattern',
-                       'title',
                        'step',
-                       'list',
+                       'title',
                        'maxlength',
                        'tabindex',
                        'disabled',
                        'required',
                        'autofocus',
-                       'multiple',
                        'readonly',
                        'autocomplete',
+                       // Only used in HTML mode:
+                       'pattern',
+                       'list',
+                       'multiple',
                ];
 
                $attribs += $this->getAttributes( $allowedParams );
@@ -153,17 +154,22 @@ class HTMLTextField extends HTMLFormField {
                # @todo Enforce pattern, step, required, readonly on the server side as
                # well
                $allowedParams = [
+                       'type',
+                       'min',
+                       'max',
+                       'step',
+                       'title',
+                       'maxlength',
+                       'tabindex',
+                       'disabled',
+                       'required',
                        'autofocus',
+                       'readonly',
+                       'autocomplete',
+                       // Only used in OOUI mode:
                        'autosize',
-                       'disabled',
                        'flags',
                        'indicator',
-                       'maxlength',
-                       'readonly',
-                       'required',
-                       'tabindex',
-                       'type',
-                       'autocomplete',
                ];
 
                $attribs += OOUI\Element::configFromHtmlAttributes(
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 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 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 689326e..0b85fbe 100644 (file)
@@ -264,8 +264,6 @@ class JobQueueDB extends JobQueue {
                if ( $flags & self::QOS_ATOMIC ) {
                        $dbw->endAtomic( $method );
                }
-
-               return;
        }
 
        /**
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 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..6a42d58 100644 (file)
@@ -355,7 +355,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() );
                                        }
                                }
@@ -817,6 +817,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
 
@@ -2155,7 +2156,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 +2305,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 bf21a56..74e3179 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;
@@ -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 );
                }
@@ -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 = [ '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 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..dc2bb0c 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)
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 9764549..604a140 100644 (file)
@@ -1162,8 +1162,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 +1223,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 +1292,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 +1346,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 +1382,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 +1482,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 ) . '}'
                        . ']);';
        }
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 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 caa039b..43b4e98 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.
         *
index e94f3db..bf6c9bb 100644 (file)
@@ -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 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 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 908183d..432cfcc 100644 (file)
@@ -289,20 +289,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..ed91735 100644 (file)
@@ -4,6 +4,9 @@ namespace MediaWiki\Tidy;
 
 use MWException;
 
+/**
+ * @deprecated since 1.32, use RemexDriver
+ */
 abstract class RaggettBase extends TidyDriverBase {
        /**
         * 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 d61c29d..aaa7663 100644 (file)
@@ -1011,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 ) ) {
@@ -2166,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
@@ -2201,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;
index 6e907de..6b0c2aa 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 );
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..4184508 100644 (file)
@@ -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 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 6c57d8a..48156fe 100644 (file)
@@ -75,7 +75,8 @@
                        "سامي الرحيلي",
                        "Azouz.anis",
                        "Elbasyouny",
-                       "Omar Ghrida"
+                       "Omar Ghrida",
+                       "AHmed Khaled"
                ]
        },
        "tog-underline": "سطر تحت الوصلات:",
        "redirect-file": "اسم ملف",
        "redirect-logid": "معرف السجل",
        "redirect-not-exists": "المطلوب غير موجود",
+       "redirect-not-numeric": "قيمة غير رقمية",
        "fileduplicatesearch": "بحث عن ملفات مكررة",
        "fileduplicatesearch-summary": "ابحث عن الملفات المكررة بناء على قيم الهاش.",
        "fileduplicatesearch-filename": "اسم الملف:",
index b1977cf..920ae6b 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.",
        "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..596aebd 100644 (file)
        "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», які не заблякаваны.",
        "redirect-file": "Назва файлу",
        "redirect-logid": "ID журнала",
        "redirect-not-exists": "Значэньне ня знойдзена",
+       "redirect-not-numeric": "Значэньне ня лікавае",
        "fileduplicatesearch": "Пошук дублікатаў файлаў",
        "fileduplicatesearch-summary": "Пошук аднолькавых файлаў на падставе іх хэшаў.",
        "fileduplicatesearch-filename": "Назва файла:",
index 3be24fb..e833d9d 100644 (file)
        "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. Включвайте едно от двете или и двете във всяко запитване, което правите.",
+       "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:''$2''\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nМожете да се свържете с $1 или с някой от останалите [[{{MediaWiki:Grouppage-sysop}}|администратори]], за да обсъдите блокирането.\n\nМожете да използвате услугата „Пращане писмо на потребител“ само ако не ви е забранена употребата ѝ и ако сте посочили валидна електронна поща в [[Special:Preferences|настройките]] си.\n\nТекущият ви IP-адрес е $3, а номерът на блокирането ви е $5. Включвайте ги във всяко питане, което правите.",
        "systemblockedtext": "Вашето потребителско име или IP адрес беше автоматично блокирано от Медия Уики.\nПосочената причина е:\n\n:<em>$2</em>\n\n* Начало на блокирането: $8\n* Край на блокирането: $6\n* Блокирането се отнася за: $7\n\nВашият текущ IP адрес е $3.\nМоля, включете всичките детайли по-горе, ако правите каквито и да е запитвания.",
        "blockednoreason": "не е указана причина",
        "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е.",
+       "prefs-help-recentchangescount": "Ð\9cакÑ\81имален Ð±Ñ\80ой: 1000",
        "prefs-help-watchlist-token2": "Това е секретният ключ към уеб хранилката на вашия списък за наблюдение.\nВсеки, който го знае, би могъл да прегледа списъка ви за наблюдение, така че не го споделяйте.\nПри нужда можете да го [[Special:ResetTokens|изчистите]].",
        "prefs-help-tokenmanagement": "Можете да видите и нулирате тайния ключ за Вашата сметка, който може да има достъп до уеб хранилката на Вашия списък за наблюдение. Всеки, който знае ключа, ще може да види Вашия списък за наблюдение, така че не го споделяйте.",
        "savedprefs": "Настройките ви бяха съхранени.",
        "prefs-files": "Файлове",
        "prefs-custom-css": "Личен CSS",
        "prefs-custom-js": "Личен JS",
-       "prefs-common-config": "Общи настройки на CSS/JS за всички облици:",
+       "prefs-common-config": "Общи настройки на CSS/JSON/JavaScript за всички облици:",
        "prefs-reset-intro": "Тази страница може да се използва за възстановяване на потребителските настройки към стандартните за сайта.\nТова действие е необратимо.",
        "prefs-emailconfirm-label": "Потвърждаване на адрес за е-поща:",
        "youremail": "Е-поща:",
        "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|промяна|промени}}",
        "brokenredirects-edit": "редактиране",
        "brokenredirects-delete": "изтриване",
        "withoutinterwiki": "Страници без междуезикови препратки",
-       "withoutinterwiki-summary": "Следните страници не препращат към версии на други езици:",
+       "withoutinterwiki-summary": "Следните страници не са свързани с версии на други езици:",
        "withoutinterwiki-legend": "Представка",
        "withoutinterwiki-submit": "Показване",
        "fewestrevisions": "Страници с най-малко редакции",
        "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": "Цел",
        "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",
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..1224672 100644 (file)
        "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}}]])改其。",
        "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ō̤:",
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..7a2358c 100644 (file)
        "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..8b1de77 100644 (file)
        "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 18dc51a..4d28bd6 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.",
        "rcfilters-activefilters": "Active filters",
        "rcfilters-activefilters-hide": "Hide",
        "rcfilters-activefilters-show": "Show",
-       "rcfilters-activefilters-hide-tooltip": "Hide Active Filters area",
-       "rcfilters-activefilters-show-tooltip": "Show Active Filters area",
+       "rcfilters-activefilters-hide-tooltip": "Hide Active filters area",
+       "rcfilters-activefilters-show-tooltip": "Show Active filters area",
        "rcfilters-advancedfilters": "Advanced filters",
        "rcfilters-limit-title": "Results to show",
        "rcfilters-limit-and-date-label": "$1 {{PLURAL:$1|change|changes}}, $2",
        "rcfilters-highlighted-filters-list": "Highlighted: $1",
        "rcfilters-quickfilters": "Saved filters",
        "rcfilters-quickfilters-placeholder-title": "No filters saved yet",
-       "rcfilters-quickfilters-placeholder-description": "To save your filter settings and reuse them later, click the bookmark icon in the Active Filter area, below.",
+       "rcfilters-quickfilters-placeholder-description": "To save your filter settings and reuse them later, click the bookmark icon in the Active filters area, below.",
        "rcfilters-savedqueries-defaultlabel": "Saved filters",
        "rcfilters-savedqueries-rename": "Rename",
        "rcfilters-savedqueries-setdefault": "Set as default",
        "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..76962ef 100644 (file)
        "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",
        "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..f60c136 100644 (file)
        "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 3d501ac..974ddf4 100644 (file)
@@ -5,16 +5,16 @@
                ]
        },
        "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",
@@ -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ò",
        "viewdeleted_short": "Wè {{PLURAL:$1|roun modifikasyon souprimé|$1 modifikasyon souprimé}}",
        "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 :",
        "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",
        "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ò.",
        "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.",
        "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.",
        "botpasswords-label-delete": "Souprimé",
        "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é ?",
        "permissionserrors": "Érò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.",
+       "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.",
        "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é",
        "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",
        "dellogpage": "Journal dé soupré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-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)",
        "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",
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..924077c 100644 (file)
        "redirect-file": "שם קובץ",
        "redirect-logid": "מזהה יומן",
        "redirect-not-exists": "הערך לא נמצא",
+       "redirect-not-numeric": "הערך אינו מספרי",
        "fileduplicatesearch": "חיפוש קבצים כפולים",
        "fileduplicatesearch-summary": "חיפוש קבצים כפולים על בסיס ערכי הגיבוב שלהם.",
        "fileduplicatesearch-filename": "קובץ:",
index a28d22a..1557e56 100644 (file)
        "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",
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..d759491 100644 (file)
        "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 0c1916f..7df629b 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",
index f7e8441..b6541f8 100644 (file)
        "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..a351ede 100644 (file)
@@ -92,7 +92,8 @@
                        "Yusuke1109",
                        "Afaz",
                        "Oxbqskeptzwizkgdcxakhnrb",
-                       "Suyama"
+                       "Suyama",
+                       "고솜"
                ]
        },
        "tog-underline": "リンクの下線:",
        "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..7b0c6a5 100644 (file)
@@ -37,7 +37,7 @@
        "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",
@@ -60,7 +60,7 @@
        "tog-watchlisthidecategorization": "Dhelikaké kategorisasi kaca",
        "tog-ccmeonemails": "Kirimi aku turunan layang-èl sing takkirim 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",
        "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)",
        "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).",
        "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",
        "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",
+       "missing-article": "Basish dhatahé ora bisa nemokaké 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",
        "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.",
        "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.",
+       "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",
        "namespaceprotected": "Panjenengan ora duwé idin kanggo mbesut kaca ing mandala aran <strong>$1</strong>.",
        "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é",
+       "createacct-benefit-body3": "{{PLURAL:$1|kang nyumbang}} mentas waé",
        "badretype": "Tembung wadi sing 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.",
        "botpasswords-existing": "Tembung wadiné bot sing cumepak",
        "botpasswords-createnew": "Gawé anyar tembung wadiné bot",
        "botpasswords-editexisting": "Besut tembung wadiné bot sing anyar",
+       "botpasswords-label-needsreset": "(tembung wadi kudu panjenengan ambali setèl)",
        "botpasswords-label-appid": "Jeneng bot:",
        "botpasswords-label-create": "Gawé",
        "botpasswords-label-update": "Anyari",
        "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.",
        "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:",
        "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.-->",
+       "edittools-upload": "-",
        "nocreatetext": "{{SITENAME}} matesi bisané panjenengan nggawé kaca anyar.\nPanjenengan bisa bali lan mbesut kaca sing 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",
        "content-model-text": "tulisan barès",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
        "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",
        "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-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 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-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)",
        "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-no-file": "Barkas kang panjenengan karsakaké 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-show-file-submit": "Iya",
        "logdelete-selected": "{{PLURAL:$1|Log kapilih|Log kapilih}} kanggo:",
        "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-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].",
        "searchresults": "Kasiling golèk",
+       "search-filter-title-prefix-reset": "Golèk kabèh kaca",
        "searchresults-title": "Kasiling golèk \"$1\"",
        "titlematches": "Sesirah kaca cocog",
        "textmatches": "Tèks artikel sing cocog",
        "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:",
        "prefs-editwatchlist-clear": "Resiki pawawanganing sampéyan",
        "prefs-watchlist-days": "Cacahé dina sing dituduhaké ing dhaftar pangawasan:",
        "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-misc": "Liya-liya",
        "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:",
        "yourvariant": "Werna basa isi:",
        "saveusergroups": "Simpen golongan {{GENDER:$1|panganggo}}",
        "userrights-groupsmember": "Anggota saka:",
        "userrights-groupsmember-auto": "Anggota implisit saka:",
+       "userrights-groupsmember-type": "$1",
        "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-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-irreversible-marker": "$1*",
+       "userrights-no-shorten-expiry-marker": "$1#",
        "userrights-expiry-current": "Kadaluwarsa $1",
        "userrights-expiry-none": "Ora kadaluwarsa",
        "userrights-expiry": "Kadaluwarsa:",
        "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-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-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-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",
        "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",
        "newuserlogpage": "Log panganggo anyar",
        "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-browsearchive": "golèk kaca kang wis kabusek",
        "action-undelete": "wurung busak kaca",
        "action-suppressrevision": "tinjo lan balèkaké révisi sing didhelikaké",
        "action-suppressionlog": "deleng log priangga iki",
        "action-importupload": "impor kaca iki saka pamunggahan berkas",
        "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-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-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-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 sing mentas waé",
        "rcfilters-hours-title": "Jam-jam sing mentas waé",
        "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-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-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-minor-description": "Besutan sing 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-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",
        "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.",
+       "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.",
        "filename": "Jeneng barkas",
        "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.",
+       "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.",
        "lockmanager-fail-svr-acquire": "Ora bisa ngentokaké gembok nèng sasana $1.",
        "lockmanager-fail-svr-release": "Ora bisa nguculaké gembok neng sasana $1.",
        "zip-file-open-error": "Ana masalah nalika mbukak barkas kanggo pamriksan ZIP.",
-       "zip-wrong-format": "Barkas sing diisèkaké dudu barkas ZIP.",
+       "zip-wrong-format": "Barkas kang panjenengan lebokaké 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.",
        "uploadstash": "Unggah pandhelikan",
        "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_file": "(barkas kang panjenengan pilih saka komputer)",
        "listfiles-delete": "busak",
        "listfiles-summary": "Kaca mirunggan iki nuduhaké kabèh barkas sing kaunggah.",
        "listfiles_search_for": "Golèk jeneng gambar:",
        "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",
+       "unwatchedpages": "Kaca kang ora ingawasan",
        "listredirects": "Daftar pengalihan",
-       "unusedtemplates": "Cithakan sing ora kanggo",
+       "unusedtemplates": "Cithakan kang 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.",
        "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-users-active-desc": "Panganggo sing 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-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": "Kaca kang tanpa pranala basa",
        "withoutinterwiki-summary": "Kaca-kaca ing ngisor iki ora nggayut nyang vèrsi basa liyané.",
        "withoutinterwiki-legend": "Préfiks",
        "withoutinterwiki-submit": "Tuduhna",
        "nimagelinks": "Kanggo nèng {{PLURAL:$1|kaca|kaca}}",
        "ntransclusions": "kanggo nèng $1 {{PLURAL:$1|kaca|kaca}}",
        "specialpage-empty": "Ora ana sing perlu dilaporaké.",
-       "lonelypages": "Kaca sing lola",
+       "lonelypages": "Kaca kang 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",
+       "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é",
        "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",
+       "shortpages": "Kaca kang cendhak",
+       "longpages": "Kaca kang dawa",
+       "deadendpages": "Kaca kang buntu",
        "deadendpagestext": "Kaca-kaca ing ngisor iki ora nggayut nyang kaca liya ing {{SITENAME}}.",
-       "protectedpages": "Kaca sing direksa",
+       "protectedpages": "Kaca kang kareksa",
        "protectedpages-indef": "Namung rereksan tanpa watesan wektu",
        "protectedpages-cascade": "Amung kaca rineksan kang runtut",
        "protectedpages-noredirect": "Dhelikna alihan",
        "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.",
+       "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é.",
+       "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é",
        "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-results": "Kasil",
        "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-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",
+       "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",
        "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)",
        "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:",
+       "categoriesfrom": "Tuduhaké kategori kang kawiwitan:",
        "deletedcontributions": "Pisumbanging panganggo sing dibusak",
        "deletedcontributions-title": "Pisumbanging panganggo sing dibusak",
        "sp-deletedcontributions-contribs": "pasumbang",
        "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é.",
        "emailuser": "Kirimi panganggo iki layang-èl",
        "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",
        "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é",
        "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_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_minoredit": "Iki besutan cilik",
        "created": "kadamel",
        "changed": "kaubah",
        "deletepage": "Busak kaca",
        "dellogpage": "Log busak",
        "dellogpagetext": "Ing ngisor iki kapacak log pambusakan kaca sing 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:",
        "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.",
        "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}}",
        "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]].",
        "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",
        "pageinfo-robot-policy": "Diindhèks déning robot",
        "pageinfo-robot-index": "Éntuk",
        "pageinfo-robot-noindex": "Ora éntuk",
-       "pageinfo-watchers": "Cacahing sing ngawasi kaca",
+       "pageinfo-watchers": "Cacahé kang ngawasi kaca",
        "pageinfo-visiting-watchers": "Cacahé pandeleng kaca sing 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)",
index 9776999..d88229f 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": "မေင်ႋစိင်",
+       "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:အ်ုထိုဝ်အ်ုမေံလင်ႋ",
index 9945fe5..91d5477 100644 (file)
        "redirect-file": "파일 이름",
        "redirect-logid": "기록 ID",
        "redirect-not-exists": "값을 찾을 수 없습니다",
+       "redirect-not-numeric": "값이 숫자가 아닙니다",
        "fileduplicatesearch": "중복된 파일 검색",
        "fileduplicatesearch-summary": "파일 해시값을 이용해 중복 파일을 검색합니다.",
        "fileduplicatesearch-filename": "파일 이름:",
index 5b501c8..5cd97ce 100644 (file)
@@ -16,7 +16,8 @@
                        "Умар",
                        "아라",
                        "Amire80",
-                       "Stjn"
+                       "Stjn",
+                       "Raa555"
                ]
        },
        "tog-underline": "ЭлячӀунрин кӀаникай цӀар чӀугун",
        "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..91203e9 100644 (file)
        "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": "Бришење страници",
        "grant-basic": "Основни права",
        "grant-viewdeleted": "Преглед на избришани податотеки и страници",
        "grant-viewmywatchlist": "Преглед на вашите набљудувања",
-       "grant-viewrestrictedlogs": "Погл. ограничени дневнички ставки",
+       "grant-viewrestrictedlogs": "Преглед на ограничени дневнички ставки",
        "newuserlogpage": "Дневник на регистрирања на корисници",
        "newuserlogpagetext": "Ова е дневник на регистрирани корисници.",
        "rightslog": "Дневник на корисничките права",
        "redirect-file": "Име на податотека",
        "redirect-logid": "Назнака на дневникот",
        "redirect-not-exists": "Вредноста не е најдена",
+       "redirect-not-numeric": "Вредноста не е бројчена",
        "fileduplicatesearch": "Барање на дуплирани податотеки",
        "fileduplicatesearch-summary": "Пребарување на дуплирани податотеки по тарабни вредности.",
        "fileduplicatesearch-filename": "Податотека:",
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..48ed4cc 100644 (file)
@@ -2,13 +2,18 @@
        "@metadata": {
                "authors": [
                        "Dr Lotus Black",
-                       "Htawmonzel"
+                       "Htawmonzel",
+                       "Aue Nai"
                ]
        },
        "tog-underline": "လေန် မတာပၞောန်သၟဝ်",
        "tog-hideminor": "ပၞုက် အရာမပလေဝ်ဒါန်လဝ် ကိစ္စဟွံဇၞော် နူကဵု ပြဟ်ဟ်ဏအ်",
        "tog-hidepatrolled": "ပၞုက် အရာမပလေဝ်ဒါန်လဝ် ကိစ္စဇၞော်ဇၞော် နူကဵု ပြဟ်ဟ်ဏအ်",
        "tog-hidecategorization": "ပၞုက် အရာမဖျေဟ်ကဏ္ဍ ကုမုက်လိက်",
+       "tog-showhiddencats": "ထ္ၜးကဆံၚ်မပၞုက်လဝ်",
+       "tog-prefershttps": "လၟိုန်သုၚ်စောဲကေတ် လာၚ်မမၞုံဂီုကၠီု အခိၚ်မလုပ်လံက်အေန်",
+       "underline-always": "လၟိုန်အခါ",
+       "underline-never": "မွဲလှေ်ဟွံမွဲ",
        "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": "တးပဲါ",
+       "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": "ပလီု",
+       "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": "ဂၠာဲ",
+       "pool-timeout": "အခိၚ်အိုတ်အာယျ မၚ်မံၚ်သွက်ဂွံလုပ်",
+       "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": "ညးလွဟ် ဟွံကလိဂွံအခေါၚ်သွက်ဂွံပသောၚ်သ္အး ကမၠောန်ညးလွဟ်မအာတ်လဝ်အခေါၚ်ဂှ်",
+       "ok": "ခိုဟ်",
        "retrievedfrom": "ကလေင်သီကေတ်လဝ် နူ \"$1\"",
        "youhavenewmessages": "{{PLURAL:$3|မၞး ကလိဂွံ}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|မၞး ကလိဂွံ}} $1 နူ {{PLURAL:$3| မဒှ် ညးလွပ်တၞဟ်မွဲ|$3 ညးလွပ်ဂမၠိုင်}} ($2).",
        "viewsourcelink": "ထ္ၜး တမ်ရိုဟ်",
        "editsectionhint": "ဒၞာဲ မပလေဝ်ဒါန် - $1",
        "toc": "မာတိကာ",
+       "showtoc": "ထ္ၜး",
+       "hidetoc": "ဗဒန်",
+       "collapsible-collapse": "ဒေါမ်",
+       "collapsible-expand": "သၠဲ",
+       "confirmable-confirm": "ဒှ်{{GENDER:$1|ညးလွပ်}} ချိုတ်ပၠိုတ်ဟာ",
+       "confirmable-yes": "ယွံ",
+       "confirmable-no": "ဟအှ်ေ",
+       "thisisdeleted": "ဗဵု ဟွံသေၚ် ကလၚ်စွံ $1 ဟာ",
+       "viewdeleted": "ဗဵု $1 ဟာ",
        "site-atom-feed": "$1 ဒၞာဲ ဗလးပတိတ်",
        "page-atom-feed": "\"$1\" ဒၞာဲ ဗလးပတိတ်",
        "red-link-title": "$1(မုက်လဝ်ဏအ် ဟွံပြာကတ်)",
        "mainpage-nstab": "မုက်လိက်တမ်",
        "nosuchspecialpage": "မုက်လိက် တၟေင် ညံင်ရဴဏအ် ဟွံမဲ",
        "nospecialpagetext": "<strong>မၞး အာတ်မိက်လဝ် မုက်လိက်တၟေင် မဟွံမဲမွဲရ၊၊</strong>\n\nစရင် မုက်လိက်တၟေင် မနွံတအ်ဂှ် ဂွံဆဵုကေတ် ပ္ဍဲ [[Special:SpecialPages|{{int:specialpages}}]].",
+       "error": "ဗၠေတ်",
+       "databaseerror-function": "ကမၠောန်: $1",
+       "databaseerror-error": "ဗၠေတ်: $1",
        "badtitle": "က္ဍိုပ်လိက် ဟွံခိုဟ်",
        "badtitletext": "မုက်လိက် မအာတ်မိက်လဝ်ဂှ် ဟွံသၟဟ်အစောမ်၊ သၠာတ်သၠးဒၟံင် ဟွံသေင်မ္ဂး ဆက်စၠောအ်လေန်လဝ် ကုအရေဝ်ဘာသာနာနာ ဟွံသေင်မ္ဂး က္ဍိုပ်လိက် အပ္ဍဲအကြာဝဳကဳ ဟွံဒးရ၊၊\nဟိုတ်နူ စကာလဝ် မလိက် နဒဒှ်က္ဍိုပ်လိက်ဟွံဂွံ ပါလုပ်ဒၟံင် မွဲမ ဟွံသေင်မ္ဂး မဂၠိုင် ကုမ လေဝ် ဒှ်မာန်ရ၊၊",
        "viewsource": "ထ္ၜး တမ်ရိုဟ်",
        "viewsource-title": "ဗဵု တမ်ရိုဟ် သွက် $1",
        "viewsourcetext": "မၞး ဗဵု ကေုာံ စၠောအ်ကပ်ပဳကေတ် တမ်ရိုဟ် မုက်လိက်ဏအ် ဂွံရ၊၊",
+       "exception-nologin": "ဟွံ လုပ်လံက်အေန်လဝ်",
+       "welcomeuser": "ဒုၚ်တၠုၚ်,$1",
+       "welcomecreation-msg": "အကံက်မၞးခၞံကၠောန်တုဲယျ.\nမၞးပြံၚ်ကေတ်ဒြပ်မၞး{{SITENAME}}[[Special:စိတ်လုပ်စ|စိုတ်လုပ်စဂမၠိုၚ်]]ယဝ်မၞးနွံပၟိက်မ္ဂး.",
+       "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-benefit-heading": "{{SITENAME}} ဂှ် ကၠောန်လဝ် နကဵု မၞိဟ် ညံင်ရဴမၞးကီုရ၊၊",
        "createacct-benefit-body1": "{{PLURAL:$1|တင်ပလေဝ်ဒါန်|တင်ပလေဝ်ဒါန်ဂမၠိုင်}}",
        "createacct-benefit-body2": "{{PLURAL:$1|မုက်လိက်|မုက်လိက်ဂမၠိုင်}}",
        "createacct-benefit-body3": "ခြာဟွံလအ် {{PLURAL:$1|ညးမခၞံကၠောန်|ညးမခၞံကၠောန်ဂမၠိုင်}}",
+       "loginsuccesstitle": "လံက်အေန်တုဲ",
+       "loginsuccess": "<strong>လၟုဟ်မၞးဂှ်လံက်အေန်လဝ်ပ္ဍဲသွက်{{SITNAME}}ညံၚ်\"$1\" .</strong>",
+       "accountcreated": "ခၞံကၠောန်အကံက်တုဲ",
+       "accountcreatedtext": "အကံက်ညးလွပ်သွက် [[{{ns:ညးလွပ်}}:$1|$1]],([[{{ns:ဓရီုကျာ ညးလွပ်}}:$1|ဓရီုကျာ]]) ခၞံကၠောန်တုဲယျ.",
+       "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-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-submit-cancel": "တးပဲါ",
        "passwordreset": "ကလေင်စုတ် မလိက်ပၞုက်",
+       "passwordreset-username": "ယၟုညးလွပ်:",
+       "passwordreset-email": "ဌာန်အဳမေလ်တအ်",
+       "passwordreset-emailtitle": "ခၞံကၠောန်အကံက်သွက်{{SITENAME}}",
        "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>မ္ဂး၊ ပရေင်ပလေဝ်ဒါန်မၞး တြးပတိတ် နကဵု ယၟုသုင်စောဲ မၞးရောင်၊၊",
+       "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ယဝ်ရ မၞးမိက်ဂွံ သၟာန်မ္ဂး တင်ဂၞင် ဗွဲလတူတအ် သီုဖအိုတ်ဂှ် ဗၟံက်ထ္ၜးကဵုညိ၊၊",
+       "whitelistedittext": "သ္ပဂုဏ်တုဲ$1 သ္ဂောံဒါန်မုက်လိက်တအ်.",
+       "confirmedittext": "မၞးထေက်ကဵုဒးသ္ပဒတန်ကဵု ဌာန်ဒတန်အဳမေလ်မၞးကိုပ်ကၠာနူဟွံဒါန်မုက်တအ်.\nသ္ပဂုဏ်တုဲ ချိၚ်ကေုာံဒတန် ဌာန်ဒတန်အဳမေလ်မၞး နူမၞး[[Special:ပၟိက်ဂၞပ်စိုတ်| ပၟိက်ဂၞပ်စိုတ်ညးလွပ်]].",
+       "loginreqtitle": "နွံပၟိက်ကဵု လံက်အေန်",
        "loginreqlink": "လုပ်လံက်အေန်",
+       "loginreqpagetext": " သ္ပဂုဏ်တုဲ $1 သ္ဂောံဗဵုမုက်လိက်တၞဟ်တအ်.",
+       "accmailtitle": "ပြံၚ်ဏာ မအက္ခရ်ဗၞုက်",
        "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>.",
index b3fd486..47a0722 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:CreateAccount|सनोंद-प्रवेश करा]] ज्यामुळे, पुढे असे गैरसमज होणार नाहीत.",
        "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..9712ebf 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": "ရက်စွဲရွေးချယ်မှုအား ပြန်စရန်",
        "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 5831b82..01ba67e 100644 (file)
        "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.",
        "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..f92f2ea 100644 (file)
        "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",
index 9a0b8f6..1f5dade 100644 (file)
        "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..a02bd93 100644 (file)
        "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..cf4446d 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",
        "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..cf05767 100644 (file)
        "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.",
index 9d90fb4..aec7c7b 100644 (file)
        "sort-descending": "Упорядочить по убыванию",
        "sort-ascending": "Упорядочить по возрастанию",
        "nstab-main": "Статья",
-       "nstab-user": "Участник",
+       "nstab-user": "{{GENDER:{{ROOTPAGENAME}}|Участник|Участница}}",
        "nstab-media": "Мультимедиа",
        "nstab-special": "Служебная страница",
        "nstab-project": "О проекте",
        "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..e8a9b6e 100644 (file)
        "right-move": "Переменованя сторінок",
        "right-move-subpages": "Переменованя сторінок і їх підсторінок",
        "right-move-rootuserpages": "Переменованя корінёвых сторінок хоснователїв",
+       "right-move-categorypages": "Переменованя сторінок катеґорій",
        "right-movefile": "Переменовати файлы",
        "right-suppressredirect": "Нестворіня напрямлїня про переменоваю сторінкы",
        "right-upload": "Наладовованя файлів",
        "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 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..a265794 100644 (file)
        "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..084077e 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": "Иди",
        "acct_creation_throttle_hit": "Посетиоци овог викија који користе вашу IP адресу су већ отворили {{PLURAL:$1|1=један налог|$1 налога}} претходни $2, што је највећи дозвољени број у том временском периоду.\nЗбог тога посетиоци с ове IP адресе тренутно не могу отворити више налога.",
        "emailauthenticated": "Ваша имејл-адреса је потврђена на дан $2 у $3 ч.",
        "emailnotauthenticated": "Ваша имејл-адреса још није потврђена.\nНиједан имејл неће да буде послат ни у једном од следећих случајева.",
-       "noemailprefs": "Наведите имејл-адресу у својим подешавањима за оспособљавање ових могућности.",
+       "noemailprefs": "Наведите имејл-адресу у подешавањима за оспособљавање ових функција.",
        "emailconfirmlink": "Потврдите своју имејл-адресу",
        "invalidemailaddress": "Имејл-адреса не може да буде прихваћена јер је у неважећем облику.\nУнесите исправну адресу или оставите празно поље.",
        "cannotchangeemail": "Имејл-адресе налога не могу да се промене на овом викију.",
        "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": "Промени имејл",
        "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|подешавања]].",
        "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": "Да",
        "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": "Споји измене две странице:",
        "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": "Скорашње измене",
        "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",
        "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Требате да проверите историју брисања те датотеке пре него што наставите са њеним поновним оптремањем.",
        "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": "Не могу да емитујем датотеку $1.",
        "backend-fail-backup": "Не могу да направим резерву датотеке $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-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": "Датотека је празна",
        "filehist-deleteall": "избриши све",
        "filehist-deleteone": "избриши",
        "filehist-revert": "врати",
-       "filehist-current": "актуелна",
+       "filehist-current": "тренутна",
        "filehist-datetime": "Датум/време",
        "filehist-thumb": "Сличица",
        "filehist-thumbtext": "Минијатура за верзију на дан $1",
        "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": "Прикажи",
        "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": "Управо ћете блокирати корисника с укљученом могућношћу „сакриј корисника“. Овим ће корисничко име бити сакривено у свим списковима и извештајима. Желите ли то да урадите?",
+       "ipb-confirmhideuser": "Управо ћете блокирати корисника са укљученом функцијом „сакриј корисника”. Овим ће корисничко име бити сакривено у свим списковима и уносима у дневнику. Заиста желите то да урадите?",
        "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": "онемогућено отварање налога",
        "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": "Извези",
        "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": "Морате да се пријавите да бисте користили овај Вики",
        "markedaspatrolled": "Означено као патролирано",
        "markedaspatrolledtext": "Изабрана измена странице [[:$1]] означена је као патролирана.",
        "rcpatroldisabled": "Патролирање скорашњих измена је онемогућено",
-       "rcpatroldisabledtext": "Ð\9cогÑ\83Ñ\9bноÑ\81Ñ\82 Ð¿Ð°Ñ\82Ñ\80олиÑ\80аÑ\9aа Ñ\81коÑ\80аÑ\88Ñ\9aиÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð° Ñ\98е Ð°ÐºÑ\82Ñ\83елно онемогућена.",
+       "rcpatroldisabledtext": "ФÑ\83нкÑ\86иÑ\98а Ð¿Ð°Ñ\82Ñ\80олиÑ\80аÑ\9aа Ñ\81коÑ\80аÑ\88Ñ\9aиÑ\85 Ð¸Ð·Ð¼ÐµÐ½Ð° Ñ\98е Ñ\82Ñ\80енÑ\83Ñ\82но онемогућена.",
        "markedaspatrollederror": "Не могу да означим као патролирано.",
        "markedaspatrollederrortext": "Морате навести измену да бисте је означили као патролирану.",
        "markedaspatrollederror-noautopatrol": "Не можете да означите своје промене као патролиране.",
        "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}} је промењена",
        "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": "Назив датотеке:",
        "mediastatistics-header-unknown": "Непознато",
        "mediastatistics-header-bitmap": "Битмап слике",
        "mediastatistics-header-drawing": "Цртежи (векторске слике)",
-       "mediastatistics-header-audio": "Звук",
+       "mediastatistics-header-audio": "Звучни снимци",
        "mediastatistics-header-video": "Видеи",
        "mediastatistics-header-multimedia": "Обогаћени медији",
        "mediastatistics-header-office": "Канцеларија",
        "authmanager-authn-not-in-progress": "Потврда идентитета није у току или је дошло до губитка података о сесији. Почните испочетка.",
        "authmanager-authn-no-primary": "Не могу да проверим пружене акредитиве.",
        "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": "Отварање налога је онемогућено.",
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..d8139a7 100644 (file)
        "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..9dd9197 100644 (file)
        "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-mergehistory": "об'єднання історій редагувань сторінок",
        "right-userrights": "зміна всіх прав користувачів",
        "right-userrights-interwiki": "зміна прав користувачів у інших вікі",
-       "right-siteadmin": "Ð\91локування і розблокування бази даних",
+       "right-siteadmin": "блокування і розблокування бази даних",
        "right-override-export-depth": "експорт сторінок, включаючи пов'язані сторінки з глибиною до 5",
        "right-sendemail": "надсилання електронної пошти іншим користувачам",
        "right-managechangetags": "створення та (де)активування [[Special:Tags|міток]]",
index 2c50814..eb5ec22 100644 (file)
        "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": "未簽到",
index ce13ba8..a47816c 100644 (file)
        "redirect-file": "文件名",
        "redirect-logid": "日志ID",
        "redirect-not-exists": "没找到相应值",
+       "redirect-not-numeric": "输入的数值并不是数字",
        "fileduplicatesearch": "搜索重复文件",
        "fileduplicatesearch-summary": "根据哈希(hash)值搜索重复文件。",
        "fileduplicatesearch-filename": "文件名:",
index 96bfbd7..ec27bf0 100644 (file)
        "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且未回應無任何說明。",
        "redirect-file": "檔案名稱",
        "redirect-logid": "日誌 ID",
        "redirect-not-exists": "查無值",
+       "redirect-not-numeric": "值不是數字",
        "fileduplicatesearch": "搜尋重複檔案",
        "fileduplicatesearch-summary": "依據雜湊值 (Hash) 來搜尋重複的檔案。",
        "fileduplicatesearch-filename": "檔案名稱:",
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';
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' ],
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';
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';
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 b446cc1..6219476 100644 (file)
@@ -1669,7 +1669,6 @@ class FakeMaintenance extends Maintenance {
        protected $mSelf = "FakeMaintenanceScript";
 
        public function execute() {
-               return;
        }
 }
 
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 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..a279cda 100644 (file)
@@ -34,12 +34,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 +50,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', 'main' );
 
                if ( $userName === false ) {
                        $wgUser = User::newSystemUser( 'Maintenance script', [ 'steal' => true ] );
@@ -78,17 +82,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 === '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;
index bfbbcdc..02c8bed 100644 (file)
@@ -169,7 +169,7 @@ ERROR
                                'user',
                                'user_name',
                                [
-                                       'user_name > ' .$dbw->addQuotes( $lastUsername ),
+                                       'user_name > ' . $dbw->addQuotes( $lastUsername ),
                                ],
                                __METHOD__,
                                [
index b11b95f..7bec25a 100644 (file)
@@ -39,6 +39,7 @@ class PopulateChangeTagDef extends LoggedUpdateMaintenance {
                        true
                );
                $this->addOption( 'populate-only', 'Do not update change_tag_def table' );
+               $this->addOption( 'set-user-tags-only', 'Only update ctd_user_defined from valid_tag table' );
        }
 
        public function execute() {
@@ -61,10 +62,15 @@ class PopulateChangeTagDef extends LoggedUpdateMaintenance {
                                __METHOD__
                        )
                ) {
+                       if ( $this->hasOption( 'set-user-tags-only' ) ) {
+                               $this->setUserDefinedTags();
+                               return true;
+                       }
                        if ( !$this->hasOption( 'populate-only' ) ) {
                                $this->updateCountTag();
                        }
                        $this->backpopulateChangeTagId();
+                       $this->setUserDefinedTags();
                } else {
                        $this->updateCountTagId();
                }
@@ -75,6 +81,40 @@ class PopulateChangeTagDef extends LoggedUpdateMaintenance {
                return true;
        }
 
+       private function setUserDefinedTags() {
+               $dbr = $this->lbFactory->getMainLB()->getConnection( DB_REPLICA );
+
+               $userTags = $dbr->selectFieldValues(
+                       'valid_tag',
+                       'vt_tag',
+                       [],
+                       __METHOD__
+               );
+
+               if ( empty( $userTags ) ) {
+                       $this->output( "No user defined tags to set, moving on...\n" );
+                       return;
+               }
+
+               if ( $this->hasOption( 'dry-run' ) ) {
+                       $this->output(
+                               'These tags will have ctd_user_defined=1 : ' . implode( ', ', $userTags ) . "\n"
+                       );
+                       return;
+               }
+
+               $dbw = $this->lbFactory->getMainLB()->getConnection( DB_MASTER );
+
+               $dbw->update(
+                       'change_tag_def',
+                       [ 'ctd_user_defined' => 1 ],
+                       [ 'ctd_name' => $userTags ],
+                       __METHOD__
+               );
+               $this->lbFactory->waitForReplication();
+               $this->output( "Finished setting user defined tags in change_tag_def table\n" );
+       }
+
        private function updateCountTagId() {
                $dbr = $this->lbFactory->getMainLB()->getConnection( DB_REPLICA );
 
index 9beb0e3..6ac354a 100644 (file)
@@ -1,6 +1,7 @@
 ### Format of this file
 #
-# The top-level keys are module names (as registered in Resources.php).
+# The top-level keys are directory names (under resources/lib/).
+# They should match module names (as registered in Resources.php), but there are exceptions.
 # Each top-level key holds a resource descriptor that must have one of
 # the following `type` values:
 #
@@ -10,9 +11,9 @@
 #
 ### Type tar
 #
-# The `src` and `integrity` keys are quired.
+# The `src` and `integrity` keys are required.
 #
-# * `src`: Full URL to thes remote resource.
+# * `src`: Full URL to the remote resource.
 # * `integrity`: Cryptographic hash (integrity metadata format per <https://www.w3.org/TR/SRI/>).
 # * `dest`: An object mapping paths to files or directory from the remote resource to a destination
 #    in the module directory. The value of key in dest may be omitted, which will extract the key
 #
 ### Type file
 #
-# The `src` and `integrity` keys are quired.
+# The `src` and `integrity` keys are required.
 #
-# * `src`: Full URL to thes remote resource.
+# * `src`: Full URL to the remote resource.
 # * `integrity`: Cryptographic hash (integrity metadata format per <https://www.w3.org/TR/SRI/>).
 # * `dest`: The name of the file in the module directory. Default: Basename of URL.
 #
-### Type mult-file
+### Type multi-file
 #
 # The `files` key is required.
 #
@@ -38,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
index 41e579b..aa22c68 100644 (file)
@@ -45,8 +45,8 @@ libraries registered as ResourceLoader modules. See also foreign-resources.yaml.
 For sources that don't publish an integrity hash, omit "integrity" (or leave empty)
 and run the "make-sri" action to compute the missing hashes.
 
-This script runs in dry mode by default. Use --update to actually change, remove,
-or add files to /resources/lib/.
+This script runs in dry-run mode by default. Use --update to actually change,
+remove, or add files to resources/lib/.
 TEXT
                );
                $this->addArg( 'action', 'One of "update", "verify" or "make-sri"', true );
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 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 a0eab14..e907a15 100644 (file)
@@ -1,4 +1,4 @@
-( function ( mw ) {
+( function () {
        /**
         * Widget defining the button controlling the popup for the number of results
         *
@@ -73,7 +73,7 @@
                                mw.language.convertNumber( this.limitGroupModel.getDefaultParamValue() );
 
                        this.button = new OO.ui.PopupButtonWidget( {
-                               icon: 'advanced',
+                               icon: 'settings',
                                indicator: 'down',
                                label: mw.msg( 'rcfilters-limit-and-date-label', currentValue ),
                                $overlay: this.$overlay,
                }
        };
 
-}( 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..d3b64b0 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
                        .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..819bc23 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;
 
 
        // 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..e821ce8 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.
                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 de01b47..af014b9 100644 (file)
@@ -8,7 +8,6 @@ use Psr\Log\LoggerInterface;
 use Wikimedia\Rdbms\IDatabase;
 use Wikimedia\Rdbms\IMaintainableDatabase;
 use Wikimedia\Rdbms\Database;
-use Wikimedia\Rdbms\LBFactory;
 use Wikimedia\TestingAccessWrapper;
 
 /**
@@ -28,6 +27,7 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
 
        /**
         * The local service locator, created during setUp().
+        * @var MediaWikiServices
         */
        private $localServices;
 
@@ -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 );
@@ -291,38 +307,6 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                return $testConfig;
        }
 
-       /**
-        * @param ConfigFactory $oldConfigFactory
-        * @param LBFactory $oldLoadBalancerFactory
-        * @param MediaWikiServices $newServices
-        *
-        * @throws MWException
-        */
-       private static function installTestServices(
-               ConfigFactory $oldConfigFactory,
-               LBFactory $oldLoadBalancerFactory,
-               MediaWikiServices $newServices
-       ) {
-               // Use bootstrap config for all configuration.
-               // This allows config overrides via global variables to take effect.
-               $bootstrapConfig = $newServices->getBootstrapConfig();
-               $newServices->resetServiceForTesting( 'ConfigFactory' );
-               $newServices->redefineService(
-                       'ConfigFactory',
-                       self::makeTestConfigFactoryInstantiator(
-                               $oldConfigFactory,
-                               [ 'main' => $bootstrapConfig ]
-                       )
-               );
-               $newServices->resetServiceForTesting( 'DBLoadBalancerFactory' );
-               $newServices->redefineService(
-                       'DBLoadBalancerFactory',
-                       function ( MediaWikiServices $services ) use ( $oldLoadBalancerFactory ) {
-                               return $oldLoadBalancerFactory;
-                       }
-               );
-       }
-
        /**
         * @param ConfigFactory $oldFactory
         * @param Config[] $configurations
@@ -358,7 +342,7 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
         * Resets some non-service singleton instances and other static caches. It's not necessary to
         * reset services here.
         */
-       private function resetNonServiceCaches() {
+       public static function resetNonServiceCaches() {
                global $wgRequest, $wgJobClasses;
 
                foreach ( $wgJobClasses as $type => $class ) {
@@ -428,9 +412,8 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                        $this->resetDB( $this->db, $this->tablesUsed );
                }
 
-               $this->localServices->destroy();
+               self::restoreMwServices();
                $this->localServices = null;
-               MediaWikiServices::forceGlobalInstance( self::$originalServices );
        }
 
        /**
@@ -524,7 +507,7 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                }
 
                // Reset all caches between tests.
-               $this->resetNonServiceCaches();
+               self::resetNonServiceCaches();
 
                // XXX: reset maintenance triggers
                // Hook into period lag checks which often happen in long-running scripts
@@ -640,6 +623,11 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                        throw new Exception( __METHOD__ . ' must be called after MediaWikiTestCase::run()' );
                }
 
+               if ( $this->localServices !== MediaWikiServices::getInstance() ) {
+                       throw new Exception( __METHOD__ . ' will not work because the global MediaWikiServices '
+                               . 'instance has been replaced by test code.' );
+               }
+
                $this->localServices->disableService( $name );
                $this->localServices->redefineService(
                        $name,
@@ -726,6 +714,12 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                if ( !$this->localServices ) {
                        throw new Exception( __METHOD__ . ' must be called after MediaWikiTestCase::run()' );
                }
+
+               if ( $this->localServices !== MediaWikiServices::getInstance() ) {
+                       throw new Exception( __METHOD__ . ' will not work because the global MediaWikiServices '
+                               . 'instance has been replaced by test code.' );
+               }
+
                MWNamespace::clearCaches();
                Language::clearCaches();
 
@@ -895,6 +889,44 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
        protected function overrideMwServices(
                Config $configOverrides = null, array $services = []
        ) {
+               $newInstance = self::installMockMwServices( $configOverrides );
+
+               if ( $this->localServices ) {
+                       $this->localServices->destroy();
+               }
+
+               $this->localServices = $newInstance;
+
+               foreach ( $services as $name => $callback ) {
+                       $newInstance->redefineService( $name, $callback );
+               }
+
+               return $newInstance;
+       }
+
+       /**
+        * Creates a new "mock" MediaWikiServices instance, and installs it.
+        * This effectively resets all cached states in services, with the exception of
+        * the ConfigFactory and the DBLoadBalancerFactory service, which are inherited from
+        * the original MediaWikiServices.
+        *
+        * @note The new original MediaWikiServices instance can later be restored by calling
+        * restoreMwServices(). That original is determined by the first call to this method, or
+        * by setUpBeforeClass, whichever is called first. The caller is responsible for managing
+        * and, when appropriate, destroying any other MediaWikiServices instances that may get
+        * replaced when calling this method.
+        *
+        * @param Config|null $configOverrides Configuration overrides for the new MediaWikiServices
+        *        instance.
+        *
+        * @return MediaWikiServices the new mock service locator.
+        */
+       public static function installMockMwServices( Config $configOverrides = null ) {
+               // Make sure we have the original service locator
+               if ( !self::$originalServices ) {
+                       self::$originalServices = MediaWikiServices::getInstance();
+               }
+
                if ( !$configOverrides ) {
                        $configOverrides = new HashConfig();
                }
@@ -903,34 +935,65 @@ abstract class MediaWikiTestCase extends PHPUnit\Framework\TestCase {
                $oldLoadBalancerFactory = self::$originalServices->getDBLoadBalancerFactory();
 
                $testConfig = self::makeTestConfig( null, $configOverrides );
-               $newInstance = new MediaWikiServices( $testConfig );
+               $newServices = new MediaWikiServices( $testConfig );
 
                // Load the default wiring from the specified files.
                // NOTE: this logic mirrors the logic in MediaWikiServices::newInstance.
                $wiringFiles = $testConfig->get( 'ServiceWiringFiles' );
-               $newInstance->loadWiringFiles( $wiringFiles );
+               $newServices->loadWiringFiles( $wiringFiles );
 
                // Provide a traditional hook point to allow extensions to configure services.
-               Hooks::run( 'MediaWikiServices', [ $newInstance ] );
+               Hooks::run( 'MediaWikiServices', [ $newServices ] );
 
-               foreach ( $services as $name => $callback ) {
-                       $newInstance->redefineService( $name, $callback );
+               // Use bootstrap config for all configuration.
+               // This allows config overrides via global variables to take effect.
+               $bootstrapConfig = $newServices->getBootstrapConfig();
+               $newServices->resetServiceForTesting( 'ConfigFactory' );
+               $newServices->redefineService(
+                       'ConfigFactory',
+                       self::makeTestConfigFactoryInstantiator(
+                               $oldConfigFactory,
+                               [ 'main' => $bootstrapConfig ]
+                       )
+               );
+               $newServices->resetServiceForTesting( 'DBLoadBalancerFactory' );
+               $newServices->redefineService(
+                       'DBLoadBalancerFactory',
+                       function ( MediaWikiServices $services ) use ( $oldLoadBalancerFactory ) {
+                               return $oldLoadBalancerFactory;
+                       }
+               );
+
+               MediaWikiServices::forceGlobalInstance( $newServices );
+               return $newServices;
+       }
+
+       /**
+        * Restores the original, non-mock MediaWikiServices instance.
+        * The previously active MediaWikiServices instance is destroyed,
+        * if it is different from the original that is to be restored.
+        *
+        * @note this if for internal use by test framework code. It should never be
+        * called from inside a test case, a data provider, or a setUp or tearDown method.
+        *
+        * @return bool true if the original service locator was restored,
+        *         false if there was nothing  too do.
+        */
+       public static function restoreMwServices() {
+               if ( !self::$originalServices ) {
+                       return false;
                }
 
-               self::installTestServices(
-                       $oldConfigFactory,
-                       $oldLoadBalancerFactory,
-                       $newInstance
-               );
+               $currentServices = MediaWikiServices::getInstance();
 
-               if ( $this->localServices ) {
-                       $this->localServices->destroy();
+               if ( self::$originalServices === $currentServices ) {
+                       return false;
                }
 
-               MediaWikiServices::forceGlobalInstance( $newInstance );
-               $this->localServices = $newInstance;
+               MediaWikiServices::forceGlobalInstance( self::$originalServices );
+               $currentServices->destroy();
 
-               return $newInstance;
+               return true;
        }
 
        /**
@@ -1093,6 +1156,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,
@@ -1100,6 +1167,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 {
@@ -1241,52 +1313,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.
         *
@@ -2244,8 +2270,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 7c4be97..8b472d4 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;
@@ -500,7 +505,6 @@ class DerivedPageDataUpdaterTest extends MediaWikiTestCase {
 
                $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( '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.
         *
index df7ee72..20270d0 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+// phpcs:disable MediaWiki.Commenting.PhpunitAnnotations.NotClassTrait
+
 namespace MediaWiki\Tests\Storage;
 
 use CommentStoreComment;
index 58fd4e9..910cdc4 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;
@@ -949,7 +950,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();
@@ -1050,6 +1051,81 @@ abstract class RevisionStoreDbTestBase extends MediaWikiTestCase {
 
        /**
         * @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() {
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 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..806038a 100644 (file)
@@ -1,6 +1,7 @@
 <?php
 
 use MediaWiki\MediaWikiServices;
+use MediaWiki\Revision\SlotRenderingProvider;
 
 /**
  * @group ContentHandler
@@ -363,4 +364,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, '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, 'main' );
+
+               $this->assertEquals( [], $updates );
+       }
+
 }
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 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 dc805df..4cb2b47 100644 (file)
@@ -3,6 +3,7 @@
 use MediaWiki\Edit\PreparedEdit;
 use MediaWiki\MediaWikiServices;
 use MediaWiki\Storage\RevisionSlotsUpdate;
+use PHPUnit\Framework\MockObject\MockObject;
 use Wikimedia\TestingAccessWrapper;
 
 /**
@@ -104,18 +105,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 +607,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 +635,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
         */
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 61eb316..c6b9dee 100644 (file)
@@ -5,6 +5,7 @@ use MediaWiki\Storage\RevisionRecord;
 
 /**
  * @covers PoolWorkArticleView
+ * @group Database
  */
 class PoolWorkArticleViewTest extends MediaWikiTestCase {
 
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 aeaa1ae..19a1875 100644 (file)
@@ -673,43 +673,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 = [];
 
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 1ea5853..cc0f263 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+
 use Wikimedia\ScopedCallback;
 
 /**
@@ -135,6 +136,7 @@ class ParserTestTopLevelSuite extends PHPUnit_Framework_TestSuite {
 
        public function setUp() {
                wfDebug( __METHOD__ );
+
                $db = wfGetDB( DB_MASTER );
                $type = $db->getType();
                $prefix = $type === 'oracle' ?
@@ -142,7 +144,16 @@ class ParserTestTopLevelSuite extends PHPUnit_Framework_TestSuite {
                $this->oldTablePrefix = $db->tablePrefix();
                MediaWikiTestCase::setupTestDB( $db, $prefix );
                CloneDatabase::changePrefix( $prefix );
-               $teardown = $this->ptRunner->setDatabase( $db );
+
+               $this->ptRunner->setDatabase( $db );
+
+               MediaWikiTestCase::resetNonServiceCaches();
+
+               MediaWikiTestCase::installMockMwServices();
+               $teardown = new ScopedCallback( function () {
+                       MediaWikiTestCase::restoreMwServices();
+               } );
+
                $teardown = $this->ptRunner->setupUploads( $teardown );
                $this->ptTeardownScope = $teardown;
        }
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 ) );
+}() );