Merge "Accept 'OK' status results from search engine"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 30 Nov 2016 13:59:36 +0000 (13:59 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 30 Nov 2016 13:59:36 +0000 (13:59 +0000)
606 files changed:
.eslintrc.json [new file with mode: 0644]
.jscsrc [deleted file]
.jshintignore [deleted file]
.jshintrc [deleted file]
.mailmap
CREDITS
Gruntfile.js
HISTORY
RELEASE-NOTES-1.28 [deleted file]
RELEASE-NOTES-1.29
autoload.php
docs/extension.schema.json
docs/extension.schema.v1.json
docs/hooks.txt
includes/AjaxResponse.php
includes/Block.php
includes/DefaultSettings.php
includes/EditPage.php
includes/Message.php
includes/MimeMagic.php
includes/MovePage.php
includes/OutputPage.php
includes/ServiceWiring.php
includes/Setup.php
includes/TemplateParser.php
includes/actions/ViewAction.php
includes/api/ApiBase.php
includes/api/ApiClearHasMsg.php
includes/api/ApiFormatBase.php
includes/api/ApiHelp.php
includes/api/ApiMain.php
includes/api/ApiPageSet.php
includes/api/ApiParamInfo.php
includes/api/ApiQueryAllImages.php
includes/api/ApiQueryAllPages.php
includes/api/ApiQuerySiteinfo.php
includes/api/ApiResetPassword.php
includes/api/i18n/ast.json
includes/api/i18n/bgn.json
includes/api/i18n/de.json
includes/api/i18n/en.json
includes/api/i18n/es.json
includes/api/i18n/eu.json
includes/api/i18n/fr.json
includes/api/i18n/gl.json
includes/api/i18n/he.json
includes/api/i18n/id.json
includes/api/i18n/it.json
includes/api/i18n/ja.json
includes/api/i18n/ko.json
includes/api/i18n/lij.json
includes/api/i18n/lt.json
includes/api/i18n/nb.json
includes/api/i18n/nl.json
includes/api/i18n/pl.json
includes/api/i18n/pt.json
includes/api/i18n/qqq.json
includes/api/i18n/ru.json
includes/api/i18n/uk.json
includes/api/i18n/zh-hans.json
includes/auth/AuthManager.php
includes/auth/AuthenticationRequest.php
includes/auth/LocalPasswordPrimaryAuthenticationProvider.php
includes/auth/RememberMeAuthenticationRequest.php
includes/auth/TemporaryPasswordAuthenticationRequest.php
includes/auth/TemporaryPasswordPrimaryAuthenticationProvider.php
includes/auth/Throttler.php
includes/auth/UserDataAuthenticationRequest.php
includes/cache/MessageCache.php
includes/changes/RecentChange.php
includes/changetags/ChangeTags.php
includes/collation/Collation.php
includes/collation/IcuCollation.php
includes/collation/NumericUppercaseCollation.php
includes/content/CodeContentHandler.php
includes/context/RequestContext.php
includes/db/MWLBFactory.php
includes/debug/logger/LegacyLogger.php
includes/debug/logger/monolog/LogstashFormatter.php [new file with mode: 0644]
includes/exception/MWExceptionRenderer.php
includes/filerepo/ForeignDBRepo.php
includes/filerepo/ForeignDBViaLBRepo.php
includes/filerepo/LocalRepo.php
includes/filerepo/file/ForeignDBFile.php
includes/filerepo/file/LocalFile.php
includes/filerepo/file/OldLocalFile.php
includes/htmlform/HTMLForm.php
includes/htmlform/HTMLFormField.php
includes/htmlform/fields/HTMLAutoCompleteSelectField.php
includes/htmlform/fields/HTMLButtonField.php
includes/htmlform/fields/HTMLCheckMatrix.php
includes/htmlform/fields/HTMLDateTimeField.php
includes/htmlform/fields/HTMLFloatField.php
includes/htmlform/fields/HTMLFormFieldCloner.php
includes/htmlform/fields/HTMLIntField.php
includes/htmlform/fields/HTMLMultiSelectField.php
includes/htmlform/fields/HTMLRadioField.php
includes/htmlform/fields/HTMLRestrictionsField.php
includes/htmlform/fields/HTMLSelectAndOtherField.php
includes/htmlform/fields/HTMLSelectField.php
includes/htmlform/fields/HTMLTextField.php
includes/htmlform/fields/HTMLTitleTextField.php
includes/htmlform/fields/HTMLUserTextField.php
includes/import/WikiImporter.php
includes/installer/i18n/ar.json
includes/installer/i18n/ast.json
includes/installer/i18n/be-tarask.json
includes/installer/i18n/be.json
includes/installer/i18n/fr.json
includes/installer/i18n/ia.json
includes/installer/i18n/ja.json
includes/installer/i18n/ku-latn.json
includes/installer/i18n/lt.json
includes/installer/i18n/nb.json
includes/installer/i18n/nl.json
includes/installer/i18n/pt.json
includes/installer/i18n/sd.json
includes/installer/i18n/udm.json
includes/installer/i18n/uk.json
includes/libs/CryptRand.php
includes/libs/objectcache/WinCacheBagOStuff.php
includes/libs/rdbms/database/DatabasePostgres.php
includes/logging/DeleteLogFormatter.php
includes/media/MediaTransformOutput.php
includes/media/TransformationalImageHandler.php
includes/page/WikiFilePage.php
includes/page/WikiPage.php
includes/parser/CoreParserFunctions.php
includes/parser/Parser.php
includes/password/EncryptedPassword.php
includes/password/MWOldPassword.php
includes/registration/ExtensionProcessor.php
includes/resourceloader/ResourceLoader.php
includes/resourceloader/ResourceLoaderClientHtml.php
includes/resourceloader/ResourceLoaderContext.php
includes/resourceloader/ResourceLoaderFileModule.php
includes/resourceloader/ResourceLoaderImageModule.php
includes/resourceloader/ResourceLoaderModule.php
includes/resourceloader/ResourceLoaderUserOptionsModule.php
includes/resourceloader/ResourceLoaderUserTokensModule.php
includes/resourceloader/ResourceLoaderWikiModule.php
includes/session/SessionManager.php
includes/skins/QuickTemplate.php
includes/skins/Skin.php
includes/skins/SkinTemplate.php
includes/specialpage/ChangesListSpecialPage.php
includes/specialpage/LoginSignupSpecialPage.php
includes/specialpage/SpecialPageFactory.php
includes/specials/SpecialActiveusers.php
includes/specials/SpecialAllPages.php
includes/specials/SpecialAncientpages.php
includes/specials/SpecialBlock.php
includes/specials/SpecialBrokenRedirects.php
includes/specials/SpecialDoubleRedirects.php
includes/specials/SpecialEmailuser.php
includes/specials/SpecialListgrants.php
includes/specials/SpecialPasswordReset.php
includes/specials/SpecialTrackingCategories.php
includes/specials/SpecialUndelete.php
includes/specials/SpecialUpload.php
includes/specials/SpecialUserrights.php
includes/specials/pagers/ActiveUsersPager.php
includes/upload/UploadStash.php
includes/user/PasswordReset.php
includes/user/User.php
jsduck.json
languages/data/Names.php
languages/i18n/ace.json
languages/i18n/ady-cyrl.json
languages/i18n/aeb-arab.json
languages/i18n/af.json
languages/i18n/aln.json
languages/i18n/am.json
languages/i18n/an.json
languages/i18n/anp.json
languages/i18n/ar.json
languages/i18n/arc.json
languages/i18n/arq.json
languages/i18n/ary.json
languages/i18n/arz.json
languages/i18n/as.json
languages/i18n/ase.json
languages/i18n/ast.json
languages/i18n/av.json
languages/i18n/avk.json
languages/i18n/awa.json
languages/i18n/az.json
languages/i18n/azb.json
languages/i18n/ba.json
languages/i18n/ban.json
languages/i18n/bar.json
languages/i18n/bcc.json
languages/i18n/bcl.json
languages/i18n/be-tarask.json
languages/i18n/be.json
languages/i18n/bg.json
languages/i18n/bgn.json
languages/i18n/bho.json
languages/i18n/bjn.json
languages/i18n/bn.json
languages/i18n/bo.json
languages/i18n/bpy.json
languages/i18n/bqi.json
languages/i18n/br.json
languages/i18n/bs.json
languages/i18n/bto.json
languages/i18n/ca.json
languages/i18n/ce.json
languages/i18n/ceb.json
languages/i18n/ch.json
languages/i18n/ckb.json
languages/i18n/co.json
languages/i18n/cps.json
languages/i18n/crh-latn.json
languages/i18n/cs.json
languages/i18n/csb.json
languages/i18n/cv.json
languages/i18n/cy.json
languages/i18n/da.json
languages/i18n/de.json
languages/i18n/diq.json
languages/i18n/dsb.json
languages/i18n/dtp.json
languages/i18n/dty.json
languages/i18n/dv.json
languages/i18n/el.json
languages/i18n/en.json
languages/i18n/eo.json
languages/i18n/es.json
languages/i18n/et.json
languages/i18n/eu.json
languages/i18n/ext.json
languages/i18n/fa.json
languages/i18n/fi.json
languages/i18n/fo.json
languages/i18n/fr.json
languages/i18n/frc.json
languages/i18n/frp.json
languages/i18n/frr.json
languages/i18n/fur.json
languages/i18n/fy.json
languages/i18n/ga.json
languages/i18n/gag.json
languages/i18n/gan-hans.json
languages/i18n/gan-hant.json
languages/i18n/gd.json
languages/i18n/gl.json
languages/i18n/glk.json
languages/i18n/gom-deva.json
languages/i18n/gom-latn.json
languages/i18n/gor.json
languages/i18n/grc.json
languages/i18n/gsw.json
languages/i18n/gu.json
languages/i18n/gv.json
languages/i18n/haw.json
languages/i18n/he.json
languages/i18n/hi.json
languages/i18n/hif-latn.json
languages/i18n/hil.json
languages/i18n/hr.json
languages/i18n/hrx.json
languages/i18n/hsb.json
languages/i18n/ht.json
languages/i18n/hu.json
languages/i18n/hy.json
languages/i18n/ia.json
languages/i18n/id.json
languages/i18n/ie.json
languages/i18n/ig.json
languages/i18n/ilo.json
languages/i18n/inh.json
languages/i18n/is.json
languages/i18n/it.json
languages/i18n/ja.json
languages/i18n/jam.json
languages/i18n/jut.json
languages/i18n/jv.json
languages/i18n/ka.json
languages/i18n/kaa.json
languages/i18n/kab.json
languages/i18n/kbd-cyrl.json
languages/i18n/khw.json
languages/i18n/kk-arab.json
languages/i18n/kk-cyrl.json
languages/i18n/kk-latn.json
languages/i18n/km.json
languages/i18n/ko.json
languages/i18n/krc.json
languages/i18n/ksh.json
languages/i18n/ku-latn.json
languages/i18n/kw.json
languages/i18n/la.json
languages/i18n/lad.json
languages/i18n/lb.json
languages/i18n/lfn.json
languages/i18n/lg.json
languages/i18n/li.json
languages/i18n/lij.json
languages/i18n/liv.json
languages/i18n/lki.json
languages/i18n/lmo.json
languages/i18n/lo.json
languages/i18n/loz.json
languages/i18n/lrc.json
languages/i18n/lt.json
languages/i18n/ltg.json
languages/i18n/lus.json
languages/i18n/lv.json
languages/i18n/lzh.json
languages/i18n/mai.json
languages/i18n/map-bms.json
languages/i18n/mdf.json
languages/i18n/mg.json
languages/i18n/min.json
languages/i18n/mk.json
languages/i18n/ml.json
languages/i18n/mr.json
languages/i18n/ms.json
languages/i18n/mwl.json
languages/i18n/my.json
languages/i18n/myv.json
languages/i18n/mzn.json
languages/i18n/nah.json
languages/i18n/nap.json
languages/i18n/nb.json
languages/i18n/nds-nl.json
languages/i18n/nds.json
languages/i18n/ne.json
languages/i18n/nl.json
languages/i18n/nn.json
languages/i18n/os.json
languages/i18n/pa.json
languages/i18n/pam.json
languages/i18n/pcd.json
languages/i18n/pdc.json
languages/i18n/pfl.json
languages/i18n/pl.json
languages/i18n/pms.json
languages/i18n/pnb.json
languages/i18n/pnt.json
languages/i18n/prg.json
languages/i18n/ps.json
languages/i18n/pt-br.json
languages/i18n/pt.json
languages/i18n/qqq.json
languages/i18n/qug.json
languages/i18n/rm.json
languages/i18n/ro.json
languages/i18n/roa-tara.json
languages/i18n/ru.json
languages/i18n/rue.json
languages/i18n/sa.json
languages/i18n/sah.json
languages/i18n/sat.json
languages/i18n/sc.json
languages/i18n/sco.json
languages/i18n/sd.json
languages/i18n/sdc.json
languages/i18n/sdh.json
languages/i18n/se.json
languages/i18n/sei.json
languages/i18n/ses.json
languages/i18n/sgs.json
languages/i18n/sh.json
languages/i18n/shi.json
languages/i18n/shn.json
languages/i18n/si.json
languages/i18n/sk.json
languages/i18n/sl.json
languages/i18n/sli.json
languages/i18n/sq.json
languages/i18n/sr-ec.json
languages/i18n/sr-el.json
languages/i18n/srn.json
languages/i18n/stq.json
languages/i18n/su.json
languages/i18n/sv.json
languages/i18n/sw.json
languages/i18n/ta.json
languages/i18n/tcy.json
languages/i18n/te.json
languages/i18n/tet.json
languages/i18n/tg-cyrl.json
languages/i18n/tg-latn.json
languages/i18n/th.json
languages/i18n/tk.json
languages/i18n/tl.json
languages/i18n/tly.json
languages/i18n/to.json
languages/i18n/tpi.json
languages/i18n/tr.json
languages/i18n/tru.json
languages/i18n/ts.json
languages/i18n/tt-cyrl.json
languages/i18n/tt-latn.json
languages/i18n/tyv.json
languages/i18n/udm.json
languages/i18n/ug-arab.json
languages/i18n/uk.json
languages/i18n/ur.json
languages/i18n/uz.json
languages/i18n/vep.json
languages/i18n/vi.json
languages/i18n/vmf.json
languages/i18n/vo.json
languages/i18n/vot.json
languages/i18n/wa.json
languages/i18n/war.json
languages/i18n/wuu.json
languages/i18n/xal.json
languages/i18n/xmf.json
languages/i18n/yi.json
languages/i18n/yo.json
languages/i18n/zea.json
languages/i18n/zh-hans.json
languages/i18n/zh-hant.json
languages/messages/MessagesBn.php
languages/messages/MessagesCdo.php
languages/messages/MessagesKrl.php [new file with mode: 0644]
languages/messages/MessagesOlo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesUk.php
maintenance/Maintenance.php
maintenance/cleanupRemovedModules.php
maintenance/cleanupUploadStash.php
maintenance/doMaintenance.php
maintenance/findMissingFiles.php
maintenance/findOrphanedFiles.php
maintenance/importTextFiles.php
maintenance/populateContentModel.php
maintenance/protect.php
maintenance/purgeChangedFiles.php
maintenance/purgeParserCache.php
maintenance/runBatchedQuery.php
maintenance/storage/checkStorage.php
maintenance/updateCredits.php [new file with mode: 0644]
maintenance/wrapOldPasswords.php
package.json
phpcs.xml
resources/Resources.php
resources/lib/json2/json2.js [deleted file]
resources/lib/qunitjs/qunit.css
resources/lib/qunitjs/qunit.js
resources/src/jquery/jquery.accessKeyLabel.js
resources/src/jquery/jquery.autoEllipsis.js
resources/src/jquery/jquery.byteLimit.js
resources/src/jquery/jquery.color.js
resources/src/jquery/jquery.colorUtil.js
resources/src/jquery/jquery.confirmable.js
resources/src/jquery/jquery.expandableField.js
resources/src/jquery/jquery.hidpi.js
resources/src/jquery/jquery.highlightText.js
resources/src/jquery/jquery.localize.js
resources/src/jquery/jquery.mwExtension.js
resources/src/jquery/jquery.placeholder.js
resources/src/jquery/jquery.qunit.completenessTest.js
resources/src/jquery/jquery.spinner.js
resources/src/jquery/jquery.suggestions.js
resources/src/jquery/jquery.tablesorter.js
resources/src/jquery/jquery.textSelection.js
resources/src/json-skip.js [deleted file]
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.redirect.js
resources/src/mediawiki.language/languages/ga.js
resources/src/mediawiki.language/languages/he.js
resources/src/mediawiki.language/languages/hy.js
resources/src/mediawiki.language/mediawiki.language.js
resources/src/mediawiki.language/mediawiki.language.numbers.js
resources/src/mediawiki.legacy/protect.js
resources/src/mediawiki.legacy/wikibits.js
resources/src/mediawiki.less/mediawiki.ui/variables.less
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.MessagePoster.js
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.WikitextMessagePoster.js
resources/src/mediawiki.messagePoster/mediawiki.messagePoster.factory.js
resources/src/mediawiki.special/mediawiki.special.apisandbox.js
resources/src/mediawiki.special/mediawiki.special.edittags.js
resources/src/mediawiki.special/mediawiki.special.upload.js
resources/src/mediawiki.toolbar/toolbar.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/DiscordianDateTimeFormatter.js
resources/src/mediawiki.widgets.datetime/ProlepticGregorianDateTimeFormatter.js
resources/src/mediawiki.widgets/MediaSearch/broken-image.png [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsProvider.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsQueue.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceProvider.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceQueue.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchProvider.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchQueue.js [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.css [new file with mode: 0644]
resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js [new file with mode: 0644]
resources/src/mediawiki.widgets/mw.widgets.CalendarWidget.js
resources/src/mediawiki.widgets/mw.widgets.CategoryCapsuleItemWidget.js
resources/src/mediawiki.widgets/mw.widgets.CategorySelector.js
resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.DateInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.NamespaceInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleInputWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleSearchWidget.js
resources/src/mediawiki.widgets/mw.widgets.TitleWidget.js
resources/src/mediawiki.widgets/mw.widgets.UserInputWidget.js
resources/src/mediawiki/ForeignApi.js
resources/src/mediawiki/api.js
resources/src/mediawiki/api/edit.js
resources/src/mediawiki/api/parse.js
resources/src/mediawiki/api/upload.js
resources/src/mediawiki/api/watch.js
resources/src/mediawiki/htmlform/hide-if.js
resources/src/mediawiki/htmlform/htmlform.Element.js
resources/src/mediawiki/htmlform/multiselect.js
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.BookletLayout.js
resources/src/mediawiki/mediawiki.ForeignStructuredUpload.js
resources/src/mediawiki/mediawiki.ForeignUpload.js
resources/src/mediawiki/mediawiki.Title.js
resources/src/mediawiki/mediawiki.Title.phpCharToUpper.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.Upload.BookletLayout.js
resources/src/mediawiki/mediawiki.Upload.Dialog.js
resources/src/mediawiki/mediawiki.Upload.js
resources/src/mediawiki/mediawiki.Uri.js
resources/src/mediawiki/mediawiki.checkboxtoggle.js
resources/src/mediawiki/mediawiki.confirmCloseWindow.js
resources/src/mediawiki/mediawiki.debug.js
resources/src/mediawiki/mediawiki.errorLogger.js
resources/src/mediawiki/mediawiki.experiments.js
resources/src/mediawiki/mediawiki.feedback.js
resources/src/mediawiki/mediawiki.filewarning.js
resources/src/mediawiki/mediawiki.inspect.js
resources/src/mediawiki/mediawiki.jqueryMsg.js
resources/src/mediawiki/mediawiki.js
resources/src/mediawiki/mediawiki.log.js
resources/src/mediawiki/mediawiki.notification.js
resources/src/mediawiki/mediawiki.searchSuggest.js
resources/src/mediawiki/mediawiki.template.mustache.js
resources/src/mediawiki/mediawiki.user.blockcookie.js [new file with mode: 0644]
resources/src/mediawiki/mediawiki.user.js
resources/src/mediawiki/mediawiki.util.js
resources/src/mediawiki/mediawiki.viewport.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/rollback.js
resources/src/mediawiki/page/startup.js
resources/src/moment-dmy.js
resources/src/moment-locale-overrides.js
resources/src/polyfill-nodeTypes.js
resources/src/startup.js
tests/common/TestSetup.php
tests/common/TestsAutoLoader.php
tests/parser/ParserTestMockParser.php [new file with mode: 0644]
tests/parser/ParserTestRunner.php
tests/parser/parserTests.txt
tests/phpunit/MediaWikiTestCase.php
tests/phpunit/ResourceLoaderTestCase.php
tests/phpunit/data/localisationcache/ba.json [new file with mode: 0644]
tests/phpunit/data/localisationcache/en.json
tests/phpunit/data/localisationcache/ru.json
tests/phpunit/data/localisationcache/uk.json [deleted file]
tests/phpunit/includes/MessageTest.php
tests/phpunit/includes/OutputPageTest.php
tests/phpunit/includes/api/ApiMessageTest.php
tests/phpunit/includes/auth/AbstractPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/LegacyHookPreAuthenticationProviderTest.php
tests/phpunit/includes/auth/LocalPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/TemporaryPasswordPrimaryAuthenticationProviderTest.php
tests/phpunit/includes/auth/ThrottlerTest.php
tests/phpunit/includes/cache/GenderCacheTest.php
tests/phpunit/includes/cache/LocalisationCacheTest.php
tests/phpunit/includes/config/ConfigFactoryTest.php
tests/phpunit/includes/debug/logger/monolog/LogstashFormatterTest.php [new file with mode: 0644]
tests/phpunit/includes/htmlform/HTMLAutoCompleteSelectFieldTest.php
tests/phpunit/includes/htmlform/HTMLCheckMatrixTest.php
tests/phpunit/includes/import/ImportLinkCacheIntegrationTest.php
tests/phpunit/includes/import/ImportTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderClientHtmlTest.php
tests/phpunit/includes/resourceloader/ResourceLoaderTest.php
tests/phpunit/includes/specialpage/SpecialPageFactoryTest.php
tests/phpunit/includes/specials/SpecialRecentchangesTest.php
tests/phpunit/includes/user/PasswordResetTest.php
tests/phpunit/includes/user/UserTest.php
tests/phpunit/maintenance/MaintenanceTest.php
tests/phpunit/structure/ApiDocumentationTest.php
tests/phpunit/suite.xml
tests/phpunit/tests/MediaWikiTestCaseTest.php
tests/qunit/data/testrunner.js
tests/qunit/suites/resources/jquery/jquery.color.test.js
tests/qunit/suites/resources/jquery/jquery.makeCollapsible.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.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.upload.test.js
tests/qunit/suites/resources/mediawiki.api/mediawiki.api.watch.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.jqueryMsg.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.loader.test.js
tests/qunit/suites/resources/mediawiki/mediawiki.test.js
thumb.php

diff --git a/.eslintrc.json b/.eslintrc.json
new file mode 100644 (file)
index 0000000..044dd72
--- /dev/null
@@ -0,0 +1,18 @@
+{
+       "extends": "wikimedia",
+       "env": {
+               "browser": true,
+               "jquery": true,
+               "qunit": true
+       },
+       "globals": {
+               "require": false,
+               "module": false,
+               "mediaWiki": false,
+               "mwPerformance": false,
+               "OO": false
+       },
+       "rules": {
+               "dot-notation": 0
+       }
+}
diff --git a/.jscsrc b/.jscsrc
deleted file mode 100644 (file)
index 3f7e90d..0000000
--- a/.jscsrc
+++ /dev/null
@@ -1,36 +0,0 @@
-{
-       "preset": "wikimedia",
-       "es3": true,
-
-       "requireVarDeclFirst": null,
-
-       "requireDotNotation": { "allExcept": [ "keywords" ] },
-       "jsDoc": {
-               "checkAnnotations": {
-                       "preset": "jsduck5",
-                       "extra": {
-                               "context": "some",
-                               "see": "some"
-                       }
-               },
-               "checkParamNames": true,
-               "checkRedundantAccess": true,
-               "checkRedundantReturns": true,
-               "checkTypes": "strictNativeCase",
-               "requireNewlineAfterDescription": true,
-               "requireParamTypes": true,
-               "requireReturnTypes": true
-       },
-
-       "excludeFiles": [
-               "docs/**",
-               "extensions/**",
-               "node_modules/**",
-               "resources/lib/**",
-               "resources/src/jquery.tipsy/**",
-               "resources/src/jquery/jquery.farbtastic.js",
-               "resources/src/mediawiki.libs/**",
-               "skins/**",
-               "vendor/**"
-       ]
-}
diff --git a/.jshintignore b/.jshintignore
deleted file mode 100644 (file)
index fdde7d0..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
-# Generated documentation
-docs/**
-
-# third-party libs
-extensions/**
-node_modules/**
-resources/lib/**
-resources/src/jquery.tipsy/**
-resources/src/jquery/jquery.farbtastic.js
-resources/src/mediawiki.libs/**
-skins/**
-vendor/**
diff --git a/.jshintrc b/.jshintrc
deleted file mode 100644 (file)
index 441c4e3..0000000
--- a/.jshintrc
+++ /dev/null
@@ -1,33 +0,0 @@
-{
-       // Enforcing
-       "bitwise": true,
-       "eqeqeq": true,
-       "esversion": 3,
-       "freeze": true,
-       "futurehostile": true,
-       "latedef": "nofunc",
-       "noarg": true,
-       "nonew": true,
-       "strict": false,
-       "undef": true,
-       "unused": true,
-
-       // Relaxing
-       "laxbreak": true,
-       "multistr": true,
-
-       // Environment
-       "browser": true,
-
-       "globals": {
-               "require": false,
-               "module": false,
-               "mediaWiki": true,
-               "JSON": true,
-               "OO": true,
-               "mwPerformance": true,
-               "jQuery": false,
-               "QUnit": false,
-               "sinon": false
-       }
-}
index 5c82af8..dd968e8 100644 (file)
--- a/.mailmap
+++ b/.mailmap
@@ -1,30 +1,62 @@
+# Map author and committer names and email addresses to canonical real names
+# and email addresses.
+#
+# To update the CREDITS file, run maintenance/updateCredits.php
+#
+# Two types of entries are useful here. The first sets a canonical author
+# name for a given email address:
+#
+#   Canonical Author Name <author email>
+#
+# The second allows collecting alternate email addresses into a single
+# canonical author name and email address:
+#
+#   Canonical Author Name <author email> <alternate email>
+#
+# Mappings are only needed for authors who have used multiple author names
+# and/or author emails for revisions over time. Author names beginning with
+# "[BOT]" will be omitted from the CREDITS file.
+#
+# See also: https://git-scm.com/docs/git-shortlog#_mapping_authors
+#
+[BOT] Gerrit Code Review <gerrit@wikimedia.org>
 [BOT] Gerrit Patch Uploader <gerritpatchuploader@gmail.com>
+[BOT] jenkins-bot <jenkins-bot@gerrit.wikimedia.org>
+[BOT] jenkins-bot <jenkins-bot@gerrit.wikimedia.org> <jenkins-bot@wikimedia.org>
 [BOT] Translation updater bot <l10n-bot@translatewiki.net>
 Aaron Schulz <aschulz@wikimedia.org>
 Aaron Schulz <aschulz@wikimedia.org> <aaron@users.mediawiki.org>
 Adam Roses Wight <awight@wikimedia.org>
+Adam Roses Wight <awight@wikimedia.org> <spam@ludd.net>
 addshore <addshorewiki@gmail.com>
+Aditya Sastry <ganeshaditya1@gmail.com>
 Adrian Heine <adrian.heine@wikimedia.de>
-Alex Monk <krenair@gmail.com>
-Alex Monk <krenair@gmail.com> <krenair@wikimedia.org>
-Alex Z <mrzmanwiki@gmail.com> <mrzman@users.mediawiki.org>
-Alexander Emsenhuber <ialex.wiki@gmail.com>
-Alexander Emsenhuber <ialex.wiki@gmail.com> <ialex@users.mediawiki.org>
-Alexander Emsenhuber <ialex.wiki@gmail.com> <mediawiki@emsenhuber.ch>
+Alex Z. <mrzmanwiki@gmail.com> <mrzman@users.mediawiki.org>
+Alexandre Emsenhuber <ialex.wiki@gmail.com>
+Alexandre Emsenhuber <ialex.wiki@gmail.com> <ialex@users.mediawiki.org>
+Alexandre Emsenhuber <ialex.wiki@gmail.com> <mediawiki@emsenhuber.ch>
+Alexander Monk <krenair@gmail.com>
+Alexander Monk <krenair@gmail.com> <alex@wikimedia.org>
+Alexander Monk <krenair@gmail.com> <krenair@wikimedia.org>
 Alexia E. Smith <washuu@gmail.com>
 Amir E. Aharoni <amir.aharoni@mail.huji.ac.il>
 Amir E. Aharoni <amir.aharoni@mail.huji.ac.il> <amire80@users.mediawiki.org>
+Amir Sarabadani <ladsgroup@gmail.com> <Ladsgroup@gmail.com>
 Anders Wegge Jakobsen <awegge@gmail.com> <wegge@users.mediawiki.org>
 Andre Engels <andreengels@gmail.com> <a_engels@users.mediawiki.org>
+Andrew Garrett <agarrett@wikimedia.org>
 Andrew Garrett <agarrett@wikimedia.org> <werdna@users.mediawiki.org>
 Angela Beesley Starling <wiki@nge.la> <angelab@users.mediawiki.org>
 Antoine Musso <hashar@free.fr>
 Antoine Musso <hashar@free.fr> <hashar@users.mediawiki.org>
 Aran Dunkley <aran@organicdesign.co.nz> <nad@users.mediawiki.org>
 Ariel Glenn <ariel@wikimedia.org> <ariel@users.mediawiki.org>
+Ariel Glenn <ariel@wikimedia.org> <ariel@wikimedia.org>
 Arlo Breault <abreault@wikimedia.org>
+Arthur Richards <arichards@wikimedia.org>
 Arthur Richards <arichards@wikimedia.org> <awjrichards@users.mediawiki.org>
 Aryeh Gregor <simetrical+mw@gmail.com> <simetrical@users.mediawiki.org>
+Asher Feldman <afeldman@wikimedia.org>
 Asher Feldman <afeldman@wikimedia.org> <asher@users.mediawiki.org>
 aude <aude.wiki@gmail.com>
 Audrey Tang <audreyt@audreyt.org>
@@ -32,25 +64,30 @@ Audrey Tang <audreyt@audreyt.org> <au@localhost>
 ayush_garg <ayush.ce13@iitp.ac.in>
 Bahodir Mansurov <bmansurov@wikimedia.org>
 Bartosz Dziewoński <matma.rex@gmail.com>
-Bartosz Dziewoński <matma.rex@gmail.com> <matmarex@wikimedia.org>
 Bartosz Dziewoński <matma.rex@gmail.com> <bdziewonski@wikimedia.org>
+Bartosz Dziewoński <matma.rex@gmail.com> <matmarex@wikimedia.org>
 Ben Hartshorne <bhartshorne@wikimedia.org> <ben@users.mediawiki.org>
 Bene <benestar.wikimedia@gmail.com>
-Benjamin Lees <emufarmers@gmail.com> <emufarmers@users.mediawiki.org>
+Bene <benestar.wikimedia@gmail.com> <benestar.wikimedia@googlemail.com>
+Benny Situ <bsitu@wikimedia.org>
 Benny Situ <bsitu@wikimedia.org> <bsitu@users.mediawiki.org>
 Bertrand Grondin <bertrand.grondin@tiscali.fr> <grondin@users.mediawiki.org>
 Brad Jorsch <bjorsch@wikimedia.org>
+Brad Jorsch <bjorsch@wikimedia.org> <anomie.wikipedia@gmail.com>
 Brandon Harris <bharris@wikimedia.org> <bharris@users.mediawiki.org>
-Brian Wolff <bawolff+svn@gmail.com> <bawolff@users.mediawiki.org>
 Brian Wolff <bawolff+wn@gmail.com>
+Brian Wolff <bawolff+wn@gmail.com> <bawolff+svn@gmail.com>
+Brian Wolff <bawolff+wn@gmail.com> <bawolff@users.mediawiki.org>
 Brion Vibber <brion@wikimedia.org>
 Brion Vibber <brion@wikimedia.org> <brion@pobox.com>
 Brion Vibber <brion@wikimedia.org> <brion@users.mediawiki.org>
 Bryan Davis <bd808@wikimedia.org>
+Bryan Davis <bd808@wikimedia.org> <bd808@bd808.com>
+Bryan Tong Minh <bryan.tongminh@gmail.com>
 Bryan Tong Minh <bryan.tongminh@gmail.com> <btongminh@users.mediawiki.org>
 C. Scott Ananian <cscott@cscott.net>
 C. Scott Ananian <cscott@cscott.net> <cananian@wikimedia.org>
-cacycle@gerrit.wikimedia.org <cacyclewp@gmail.com>
+Cacycle <cacyclewp@gmail.com>
 cenarium <cenarium.sysop@gmail.com>
 Chad Horohoe <chadh@wikimedia.org>
 Chad Horohoe <chadh@wikimedia.org> <demon@users.mediawiki.org>
@@ -58,44 +95,64 @@ Charles Melbye <charlie@yourwiki.net> <charlie@users.mediawiki.org>
 Chiefwei <chiefwei1989@gmail.com>
 Chris McMahon <cmcmahon@wikimedia.org>
 Chris Steipp <csteipp@wikimedia.org>
-Christian Aistleitner <christian@quelltextlich.at> <qchris@users.mediawiki.org>
 Christian Aistleitner <christian@quelltextlich.at>
+Christian Aistleitner <christian@quelltextlich.at> <qchris@users.mediawiki.org>
 Christian Williams <orbit@framezero.com>
 Christian Williams <orbit@framezero.com> <christian@localhost>
 Christian Williams <orbit@framezero.com> <christian@wikia-inc.com>
+Christopher Johnson <root@bugzilla.wmde.de>
+church of emacs <churchofemacs@users.mediawiki.org>
+Cindy Cicalese <cicalese@mitre.org>
 ckoerner <nobelx@gmail.com>
 Conrad Irwin <conrad.irwin+wiki@gmail.com> <conrad@users.mediawiki.org>
 Dan Duvall <dduvall@wikimedia.org>
 dan-nl <d_entous@yahoo.com>
 Daniel A. R. Werner <daniel.a.r.werner@gmail.com>
 Daniel Cannon <cannon.danielc@gmail.com> <amidaniel@users.mediawiki.org>
+Daniel Friesen <mediawiki@danielfriesen.name>
+Daniel Friesen <mediawiki@danielfriesen.name> <daniel@nadir-seen-fire.com>
 Daniel Friesen <mediawiki@danielfriesen.name> <dantman@users.mediawiki.org>
+Daniel Friesen <mediawiki@danielfriesen.name> <pub-github@nadir-seen-fire.com>
 Daniel Kinzler <daniel.kinzler@wikimedia.de>
 Daniel Kinzler <daniel.kinzler@wikimedia.de> <daniel@users.mediawiki.org>
-Danny B <Wikipedia.Danny.B@email.cz> <danny_b@users.mediawiki.org>
+Danny B. <Wikipedia.Danny.B@email.cz>
+Danny B. <Wikipedia.Danny.B@email.cz> <danny.b@email.cz>
+Danny B. <Wikipedia.Danny.B@email.cz> <danny_b@users.mediawiki.org>
+Danny B. <Wikipedia.Danny.B@email.cz> <wikimedia.danny.b@email.cz>
+Darian Anthony Patrick <dpatrick@wikimedia.org>
+Darkdragon09 <ubuntu@ip-172-31-39-38.us-west-2.compute.internal>
 David Chan <david@sheetmusic.org.uk>
+Dereckson <dereckson@espace-win.org>
+Derk-Jan Hartman <hartman@videolan.org>
+Derk-Jan Hartman <hartman@videolan.org> <hartman.wiki@gmail.com>
 Derk-Jan Hartman <hartman@videolan.org> <hartman@users.mediawiki.org>
-Derk-Jan Hartman <hartman.wiki@gmail.com>
 Diederik van Liere <dvanliere@gmail.com> <diederik@users.mediawiki.org>
 Domas Mituzas <domas.mituzas@gmail.com> <midom@users.mediawiki.org>
 Douglas Gardner <douglas@chippy.ch>
 DPStokesNZ <duncan.stokes@gmail.com>
 Ebrahim Byagowi <ebrahim@gnu.org>
 Ed Sanders <esanders@wikimedia.org>
-Elliott Eggleston <ejegg@ejegg.com>
+Elliott Eggleston <eeggleston@wikimedia.org>
+Elliott Eggleston <eeggleston@wikimedia.org> <ejegg@ejegg.com>
 Emmanuel Engelhart <kelson@kiwix.org> <kelson42@users.mediawiki.org>
-eranroz <eranroz89@gmail.com>
+Emufarmers <emufarmers@gmail.com>
+Emufarmers <emufarmers@gmail.com> <emufarmers@users.mediawiki.org>
+Entlinkt <entlinkt@gmx-topmail.de>
+Eranroz <eranroz89@gmail.com>
 Erik Bernhardson <ebernhardson@wikimedia.org>
 Erik Moeller <erik@wikimedia.org>
 Erik Moeller <erik@wikimedia.org> <erik@users.mediawiki.org>
 Erwin Dokter <erwin@darcoury.nl>
 Evan McIntire <mcintire.evan@gmail.com>
+Evan Prodromou <evanprodromou@users.mediawiki.org> <evan@users.mediawiki.org>
 Federico Leva <federicoleva@tiscali.it>
 Fenzik Joseph <fenzik@gmail.com> <fenzik@users.mediawiki.org>
-Florianschmidtwelzow <florian.schmidt.welzow@t-online.de> <florian.schmidt.stargatewissen@gmail.com>
-Florianschmidtwelzow <florian.schmidt.welzow@t-online.de> Florian <florian.schmidt.welzow@t-online.de>
-Fomafix <fomafix@googlemail.com>
+Florian Schmidt <florian.schmidt.welzow@t-online.de>
+Florian Schmidt <florian.schmidt.welzow@t-online.de> <florian.schmidt.stargatewissen@gmail.com>
+fomafix <fomafix@googlemail.com>
+Fran Rogers <fran@dumetella.net>
 Fran Rogers <fran@dumetella.net> <krimpet@users.mediawiki.org>
+freakolowsky <freak@drajv.si>
 FunPika <funpikawiki@gmail.com>
 Gabriel Wicke <gwicke@wikimedia.org>
 Gabriel Wicke <gwicke@wikimedia.org> <gwicke@users.mediawiki.org>
@@ -110,31 +167,38 @@ glaisher <glaisher.wiki@gmail.com>
 Greg Sabino Mullane <greg@turnstep.com>
 Greg Sabino Mullane <greg@turnstep.com> <greg@endpoint.com>
 Greg Sabino Mullane <greg@turnstep.com> <greg@users.mediawiki.org>
+Grunny <mwgrunny@gmail.com>
 Guy Van den Broeck <guyvdb@gmail.com> <guyvdb@users.mediawiki.org>
 Happy-melon <happy-melon@live.com> <happy-melon@users.mediawiki.org>
 Helder <he7d3r@gmail.com>
 Helder <he7d3r@gmail.com> <helder.wiki@gmail.com>
 Hoo man <hoo@online.de>
+Huji <huji.huji@gmail.com>
 Huji <huji.huji@gmail.com> <huji@users.mediawiki.org>
 Ian Baker <ibaker@wikimedia.org> <raindrift@users.mediawiki.org>
 Ilmari Karonen <nospam@vyznev.net> <vyznev@users.mediawiki.org>
 Inez Korczyński <inez@wikia-inc.com>
 Inez Korczyński <inez@wikia-inc.com> <inez@users.mediawiki.org>
 isarra <s@zaori.org>
+isarra <s@zaori.org> <zhorishna@gmail.com>
 Ivan Lanin <ivanlanin@gmail.com> <ivanlanin@users.mediawiki.org>
-Jack Phoenix <jack@countervandalism.net> <ashley@users.mediawiki.org>
 Jack Phoenix <jack@countervandalism.net>
+Jack Phoenix <jack@countervandalism.net> <ashley@users.mediawiki.org>
 Jackmcbarn <jackmcbarn@gmail.com>
-Jackmcbarn <jackmcbarn@users.noreply.github.com>
+Jackmcbarn <jackmcbarn@gmail.com> <jackmcbarn@users.noreply.github.com>
 jagori <jagori79@gmail.com>
-James D. Forrester <jforrester@wikimedia.org>
+James Forrester <jforrester@wikimedia.org>
 Jan Gerber <j@thing.net> <j@users.mediawiki.org>
+Jan Luca Naumann <jan@jans-seite.de>
 Jan Luca Naumann <jan@jans-seite.de> <jan@users.mediawiki.org>
 Jan Paul Posma <jp.posma@gmail.com> <janpaul123@users.mediawiki.org>
 Jan Zerebecki <jan.wikimedia@zerebecki.de>
+Jared Flores <jaredflores2000@gmail.com>
 Jaroslav Škarvada <jskarvad@redhat.com>
 jarrettmunton <jmuntjmunt@gmail.com>
+Jason Richey <jasonr@wikia.com>
 Jason Richey <jasonr@wikia.com> <jasonr@users.mediawiki.org>
+Jason Richey <jasonr@wikia.com> <urichj00@users.mediawiki.org>
 Jeff Hall <jeffreyehall@gmail.com>
 Jeff Hall <jeffreyehall@gmail.com> <jhall@wikimedia.org>
 Jeff Janes <jeff.janes@gmail.com>
@@ -151,40 +215,58 @@ Jon Robson <jrobson@wikimedia.org> <jdlrobson@gmail.com>
 Juliusz Gonera <jgonera@gmail.com>
 Juliusz Gonera <jgonera@gmail.com> <jgonera@wikimedia.org>
 JuneHyeon Bae <devunt@gmail.com>
+Jure Kajzer <freak@drajv.si>
 Jure Kajzer <freak@drajv.si> <freakolowsky@users.mediawiki.org>
+Karun Dambiec <karun.84@gmx.de>
+Katie Filbert <aude.wiki@gmail.com>
 Katie Filbert <aude.wiki@gmail.com> <aude@users.mediawiki.org>
 Kevin Israel <pleasestand@live.com>
-Kunal Mehta <legoktm@gmail.com>
-Kunal Mehta <legoktm@gmail.com> <legoktm.wikipedia@gmail.com>
+Kunal Grover <kunalgrover05@gmail.com>
+Kunal Mehta <legoktm@member.fsf.org>
+Kunal Mehta <legoktm@member.fsf.org> <legoktm.wikipedia@gmail.com>
+Kunal Mehta <legoktm@member.fsf.org> <legoktm@gmail.com>
 Kwan Ting Chan <ktc@ktchan.info> <ktchan@users.mediawiki.org>
 lekshmi <andnlnbn18@gmail.com>
 Leo Koppelkamm <diebuche@gmail.com> <diebuche@users.mediawiki.org>
+Leon Liesener <leon.liesener@wikipedia.de>
 Leon Weber <leon@vserver152.masterssystems.com> <leon@users.mediawiki.org>
 Leonardo Gregianin <leogregianin@googlemail.com> <leogregianin@users.mediawiki.org>
 Leons Petrazickis <leons.petrazickis.haveyouconsiderednotincludingthisphrase@gmail.com> <leonsp@users.mediawiki.org>
-Liangent <liangent@gmail.com>
+liangent <liangent@gmail.com>
 Lisa Ridley <lhridley@gmail.com> <lhridley@users.mediawiki.org>
 Ljudusika <plo2000@i.ua>
 Luis Felipe Schenone <schenonef@gmail.com>
+Lupo <lupo.bugzilla@gmail.com>
 m4tx <m4tx@m4tx.pl>
+Madman <madman.enwiki@gmail.com>
 Magnus Manske <magnusmanske@googlemail.com> <magnusmanske@users.mediawiki.org>
 Manuel Schneider <manuel.schneider@wikimedia.ch> <80686@users.mediawiki.org>
+Marc-André Pelletier <marc@uberbox.org>
+Marcin Cieślak <saper@saper.info>
 Marcin Cieślak <saper@saper.info> <saper@users.mediawiki.org>
+Marco Falke <maic23@live.de>
+MarcoAurelio <strigiwm@gmail.com>
 Marielle Volz <marielle.volz@gmail.com>
 Marius Hoch <hoo@online.de>
-Mark A. Hershberger <mah@everybody.org>
-Mark A. Hershberger <mah@everybody.org> <mah@nichework.com>
-Mark A. Hershberger <mah@everybody.org> <mah@users.mediawiki.org>
 Mark Clements <mediawiki@kennel17.co.uk> <happydog@users.mediawiki.org>
+Mark Hershberger <mah@everybody.org>
+Mark Hershberger <mah@everybody.org> <mah@nichework.com>
+Mark Hershberger <mah@everybody.org> <mah@users.mediawiki.org>
+Mark Hershberger <mah@everybody.org> <mhershberger@wikimedia.org>
 Mark Holmquist <mtraceur@member.fsf.org>
+Mark Holmquist <mtraceur@member.fsf.org> <mholmquist@wikimedia.org>
 Marko Obrovac <mobrovac@wikimedia.org>
+Markus Glaser <glaser@hallowelt.biz>
+Markus Glaser <glaser@hallowelt.biz> <mglaser@users.mediawiki.org>
 Matt Johnston <mattj@emazestudios.com> <mattj@users.mediawiki.org>
 Matthew Britton <hugglegurch@gmail.com> <gurch@users.mediawiki.org>
 Matthew Flaschen <mflaschen@wikimedia.org>
 Matthias Mullie <git@mullie.eu>
+Matthias Mullie <git@mullie.eu> <mmullie@wikimedia.org>
 Matěj Grabovský <mgrabovsky@yahoo.com> <mgrabovsky@users.mediawiki.org>
 Max Semenik <maxsem.wiki@gmail.com>
 Max Semenik <maxsem.wiki@gmail.com> <maxsem@users.mediawiki.org>
+Max Semenik <maxsem.wiki@gmail.com> <semenik@gmail.com>
 mgooley <g0013y@gmail.com>
 Michael Dale <mdale@wikimedia.org> <dale@users.mediawiki.org>
 mjbmr <mjbmri@gmail.com>
@@ -192,23 +274,30 @@ Mohamed Magdy <mohamedmk@gmail.com> <alnokta@users.mediawiki.org>
 Moriel Schottlender <mschottlender@wikimedia.org>
 Moriel Schottlender <mschottlender@wikimedia.org> <moriel@gmail.com>
 Mormegil <mormegil@centrum.cz>
+MrBlueSky <mrbluesky@wikipedia.be>
+MrBlueSky <mrbluesky@wikipedia.be> <mrbluesky@localhost>
 Mukunda Modell <mmodell@wikimedia.org>
+Mwalker <mwalker@wikimedia.org>
 MZMcBride <g@mzmcbride.com>
 nadeesha <nadeesha@calcey.com> <nadeesha@users.mediawiki.org>
 Namit <namit.ohri@gmail.com>
 Nathaniel Herman <redwwjd@yahoo.com> <pinky@users.mediawiki.org>
 Neil Kandalgaonkar <neilk@wikimedia.org> <neilk@users.mediawiki.org>
 Nemo bis <federicoleva@tiscali.it>
-Nephele <nephele@skyhighway.com> <nephele@users.mediawiki.org>
+nephele <nephele@skyhighway.com> <nephele@users.mediawiki.org>
 Nick Jenkins <nickpj@gmail.com> <nickj@users.mediawiki.org>
 Nik Everett <neverett@wikimedia.org>
 Niklas Laxström <niklas.laxstrom@gmail.com>
 Niklas Laxström <niklas.laxstrom@gmail.com> <nikerabbit@users.mediawiki.org>
 Nimish Gautam <nimishg@wikimedia.org> <nimishg@users.mediawiki.org>
 Nuria Ruiz <nuria@wikimedia.org>
-Ori.livneh <ori@wikimedia.org>
+Ori Livneh <ori@wikimedia.org>
+Ori Livneh <ori@wikimedia.org> <ori.livneh@gmail.com>
 OverlordQ <wikipedia@thedarkcitadel.com> <overlordq@users.mediawiki.org>
+Owen Davis <owen@wikia-inc.com>
+Owen Davis <owen@wikia-inc.com> <owen@users.mediawiki.org>
 paladox <thomasmulhall410@yahoo.com>
+Patrick Reilly <preilly@wikimedia.org>
 Patrick Reilly <preilly@wikimedia.org> <preilly@users.mediawiki.org>
 Patrick Westerhoff <PatrickWesterhoff@gmail.com>
 Paul Copperman <paul.copperman@gmail.com> <pcopp@users.mediawiki.org>
@@ -223,9 +312,9 @@ PranavK <pranavmk98@gmail.com>
 Prateek Saxena <psaxena@wikimedia.org>
 Prateek Saxena <psaxena@wikimedia.org> <prtksxna@gmail.com>
 Priyanka Dhanda <pdhanda@wikimedia.org> <pdhanda@users.mediawiki.org>
-Purodha B Blissenbach <purodha@blissenbach.org>
-Purodha B Blissenbach <purodha@blissenbach.org> <purodha@users.mediawiki.org>
-Purodha B Blissenbach <purodha@blissenbach.org> <publi@web.de>
+Purodha Blissenbach <purodha@blissenbach.org>
+Purodha Blissenbach <purodha@blissenbach.org> <publi@web.de>
+Purodha Blissenbach <purodha@blissenbach.org> <purodha@users.mediawiki.org>
 Raimond Spekking <raimond.spekking@gmail.com>
 Raimond Spekking <raimond.spekking@gmail.com> <raymond@users.mediawiki.org>
 Remember the dot <rememberthedot@gmail.com> <rememberthedot@users.mediawiki.org>
@@ -233,13 +322,15 @@ Reza <reza.energy@gmail.com>
 Ricordisamoa <ricordisamoa@openmailbox.org>
 rillke <rillke@wikipedia.de>
 rillke <rillke@wikipedia.de> <rainerrillke@hotmail.com>
-River Tarnell <river@wikimedia.org> <river@users.mediawiki.org>
 River Tarnell <river@wikimedia.org> <kateturner@users.mediawiki.org>
+River Tarnell <river@wikimedia.org> <river@users.mediawiki.org>
 Roan Kattouw <roan.kattouw@gmail.com>
 Roan Kattouw <roan.kattouw@gmail.com> <catrope@users.mediawiki.org>
 Roan Kattouw <roan.kattouw@gmail.com> <roan@wikimedia.org>
 Rob Church <robchur@gmail.com> <robchurch@users.mediawiki.org>
+Rob Lanphier <robla@robla.net>
 Rob Lanphier <robla@robla.net> <robla@users.mediawiki.org>
+Rob Lanphier <robla@robla.net> <robla@wikimedia.org>
 Rob Moen <rmoen@mediawiki.org>
 Rob Moen <rmoen@mediawiki.org> <rmoen@users.mediawiki.org>
 Rob Moen <rmoen@mediawiki.org> <rmoen@wikimedia.org>
@@ -247,24 +338,30 @@ Robert Hoenig <indielives010@gmail.com>
 Robert Leverington <robert@rhl.me.uk> <roberthl@users.mediawiki.org>
 Robert Rohde <rarohde@gmail.com> <rarohde@users.mediawiki.org>
 Robert Stojnić <rainmansr@gmail.com> <rainman@users.mediawiki.org>
+Robin Pepermans <robinp.1273@gmail.com>
 Robin Pepermans <robinp.1273@gmail.com> <robin@users.mediawiki.org>
 robinhood701 <robinhood70@live.ca>
 Rohan <rohan1395@yahoo.com>
 Rotem Liss <rotemliss@gmail.com> <rotem@users.mediawiki.org>
 Rummana Yasmeen <ryasmeen@wikimedia.org>
 Russ Nelson <russnelson@gmail.com> <nelson@users.mediawiki.org>
-Ryan Kaldari <rkaldari@wikimedia.org> <kaldari@users.mediawiki.org>
 Ryan Kaldari <rkaldari@wikimedia.org>
 Ryan Kaldari <rkaldari@wikimedia.org> <kaldari@gmail.com>
+Ryan Kaldari <rkaldari@wikimedia.org> <kaldari@users.mediawiki.org>
+Ryan Lane <rlane32@gmail.com>
 Ryan Lane <rlane32@gmail.com> <laner@users.mediawiki.org>
+Ryan Lane <rlane32@gmail.com> <rlane@wikimedia.org>
+Ryan Schmidt <skizzerz@gmail.com>
+Ryan Schmidt <skizzerz@gmail.com> <skizzerz@skizzerz.net>
 Ryan Schmidt <skizzerz@gmail.com> <skizzerz@users.mediawiki.org>
 S Page <spage@wikimedia.org>
 Sam Reed <reedy@wikimedia.org>
+Sam Reed <reedy@wikimedia.org> <Reedy reedy@wikimedia.org>
+Sam Reed <reedy@wikimedia.org> <reedy@formey.wikimedia.org>
 Sam Reed <reedy@wikimedia.org> <reedy@users.mediawiki.org>
 Sam Smith <git@samsmith.io>
-Santhosh Thottingal <santhosh.thottingal@gmail.com> <santhosh@users.mediawiki.org>
 Santhosh Thottingal <santhosh.thottingal@gmail.com>
-saper <saper@saper.info>
+Santhosh Thottingal <santhosh.thottingal@gmail.com> <santhosh@users.mediawiki.org>
 Schnark <listenleser@gmail.com>
 Scimonster <tehalmightyscimonster@gmail.com>
 Sean Colombo <sean.colombo@gmail.com> <sean_colombo@users.mediawiki.org>
@@ -272,11 +369,14 @@ Sean Pringle <springle@wikimedia.org>
 Seb35 <seb35wikipedia@gmail.com>
 Sergio Santoro <santoro.srg@gmail.com>
 Shahyar <shahyar@gmail.com>
+Shinjiman <shinjiman@gmail.com>
 Shinjiman <shinjiman@gmail.com> <shinjiman@users.mediawiki.org>
 Siebrand Mazeland <s.mazeland@xs4all.nl>
 Siebrand Mazeland <s.mazeland@xs4all.nl> <siebrand@kitano.nl>
 Siebrand Mazeland <s.mazeland@xs4all.nl> <siebrand@users.mediawiki.org>
 Siebrand Mazeland <s.mazeland@xs4all.nl> <siebrand@wikimedia.org>
+Smriti Singh <smritis.31095@gmail.com>
+Sorawee Porncharoenwase <nullzero.free@gmail.com>
 Southparkfan <southparkfan223@hotmail.com>
 SQL <sxwiki@gmail.com> <sql@users.mediawiki.org>
 Stanislav Malyshev <smalyshev@gmail.com>
@@ -288,9 +388,10 @@ Steven Roddis <StevenRoddis@users.noreply.github.com>
 Subramanya Sastry <ssastry@wikimedia.org>
 Sucheta Ghoshal <sghoshal@wikimedia.org>
 Sumit Asthana <asthana.sumit23@gmail.com>
+Swalling <swalling@wikimedia.org>
 Thalia Chan <thalia@cantorion.org>
-TheDJ <hartman.wiki@gmail.com>
 Thiemo Mättig (WMDE) <thiemo.maettig@wikimedia.de>
+Thiemo Mättig (WMDE) <thiemo.maettig@wikimedia.de> <mr.heat@gmx.de>
 This, that and the other <at.light@live.com.au>
 tholam <t.lam@lamsinfosystem.com>
 Thomas Bleher <ThomasBleher@gmx.de> <tbleher@users.mediawiki.org>
@@ -305,29 +406,45 @@ Timo Tijhof <krinklemail@gmail.com> <krinkle@users.mediawiki.org>
 Timo Tijhof <krinklemail@gmail.com> <timo@wikimedia.org>
 Timo Tijhof <krinklemail@gmail.com> <ttijhof@wikimedia.org>
 Tina Johnson <tinajohnson.1234@gmail.com>
+Tisane <nathanlarson3141@gmail.com>
+Tjones <tjones@wikimedia.org>
 Tom Maaswinkel <tom.maaswinkel@12wiki.eu> <thedevilonline@users.mediawiki.org>
 Tomasz Finc <tfinc@wikimedia.org> <tomasz@users.mediawiki.org>
+Tomasz W. Kozlowski <tomasz@twkozlowski.com>
+Tomasz W. Kozlowski <tomasz@twkozlowski.com> <tomasz@twkozlowski.net>
+Tomasz W. Kozlowski <tomasz@twkozlowski.com> <twkozlowski@gmail.com>
 Tony Thomas <01tonythomas@gmail.com>
+Tpt <thomaspt@hotmail.fr>
 Trevor Parscal <trevorparscal@gmail.com>
 Trevor Parscal <trevorparscal@gmail.com> <tparscal@users.mediawiki.org>
 Trevor Parscal <trevorparscal@gmail.com> <tparscal@wikimedia.org>
 Tyler Cipriani <tcipriani@wikimedia.org>
 Tyler Romeo <tylerromeo@gmail.com>
-umherirrender <umherirrender_de.wp@web.de>
+Umherirrender <umherirrender_de.wp@web.de>
+Victor Vasiliev <vasilvv@mit.edu>
 Victor Vasiliev <vasilvv@mit.edu> <vasilievvv@users.mediawiki.org>
+Victor Vasiliev <vasilvv@mit.edu> <vasilvv@gmail.com>
 Vikas S Yaligar <vikasyaligar.it@gmail.com>
 Vivek Ghaisas <v.a.ghaisas@gmail.com>
 wctaiwan <wctaiwan@gmail.com>
 withoutaname <drevitchi@gmail.com>
 X! <soxred93@gmail.com> <soxred93@users.mediawiki.org>
+Yaron Koren <yaron57@gmail.com>
+Yaron Koren <yaron57@gmail.com> <yaron@users.mediawiki.org>
 Yaroslav Melnychuk <yaroslavmelnuchuk@gmail.com>
+Yongmin Hong <revi@member.fsf.org>
+Yongmin Hong <revi@member.fsf.org> <revi@pobox.com>
+Yongmin Hong <revi@member.fsf.org> <reviwiki@gmail.com>
 Yuri Astrakhan <yurik@wikimedia.org>
+Yuri Astrakhan <yurik@wikimedia.org> <yuriastrakhan@gmail.com>
 Yuri Astrakhan <yurik@wikimedia.org> <yurik@users.mediawiki.org>
 Yusuke Matsubara <whym@whym.org>
-YuviPanda <yuvipanda@gmail.com>
+Yuvi Panda <yuvipanda@gmail.com>
 Zak Greant <zak+mediawiki@fooassociates.com> <zak@users.mediawiki.org>
+Zhengzhu Feng <zhengzhu@gmail.com>
+Zhengzhu Feng <zhengzhu@gmail.com> <zhengzhu@users.mediawiki.org>
+Zppix <support@zppixballee.com>
 Ævar Arnfjörð Bjarmason <avarab@gmail.com> <avar@users.mediawiki.org>
+Étienne Beaulé <beauleetienne0@gmail.com>
 Željko Filipin <zeljko.filipin@gmail.com>
 Željko Filipin <zeljko.filipin@gmail.com> <zfilipin@wikimedia.org>
-Zhengzhu Feng <zhengzhu@gmail.com>
-Zhengzhu Feng <zhengzhu@gmail.com> <zhengzhu@users.mediawiki.org>
diff --git a/CREDITS b/CREDITS
index 46d5c9c..d9ff970 100644 (file)
--- a/CREDITS
+++ b/CREDITS
@@ -6,252 +6,656 @@ following names for their contribution to the product.
 -->
 <!-- Please notice that the following can be found parsed under Special:Version/Credits -->
 
-== Developers ==
-* Aaron Schulz
-* Alex Z.
-* Alexander Monk
-* Alexandre Emsenhuber
-* Andrew Garrett
-* Antoine Musso
-* Arthur Richards
-* Aryeh Gregor
-* Bartosz Dziewoński
-* Bertrand Grondin
-* Brad Jorsch
-* Brian Wolff
-* Brion Vibber
-* Bryan Davis
-* Bryan Tong Minh
-* Chad Horohoe
-* Charles Melbye
-* Chris Steipp
-* church of emacs
-* Daniel Friesen
-* Daniel Kinzler
-* Daniel Renfro
-* Danny B.
-* David McCabe
-* Derk-Jan Hartman
-* Domas Mituzas
-* Ed Sanders
-* Emufarmers
-* Fran Rogers
-* Greg Sabino Mullane
-* Guy Van den Broeck
-* Happy-melon
-* Hojjat
-* Ian Baker
-* Ilmari Karonen
-* Jack D. Pond
-* Jack Phoenix
-* Jackmcbarn
-* James Forrester
-* Jan Paul Posma
-* Jason Richey
-* Jeroen De Dauw
-* John Du Hart
-* Jon Harald Søby
-* Juliano F. Ravasi
-* JuneHyeon Bae
-* Leo Koppelkamm
-* Leon Weber
-* Leslie Hoare
-* Marco Schuster
-* Marius Hoch
-* Matěj Grabovský
-* Matt Johnston
-* Matthew Flaschen
-* Max Semenik
-* Meno25
-* MinuteElectron
-* Mohamed Magdy
-* Nathaniel Herman
-* Neil Kandalgaonkar
-* Nicolas Dumazet
-* Niklas Laxström
-* Ori Livneh
-* Patrick Reilly
-* Philip Tzou
-* Platonides
-* Purodha Blissenbach
-* Raimond Spekking
-* Remember the dot
-* Roan Kattouw
-* Robert Stojnić
-* Robin Pepermans
-* Rotem Liss
-* Ryan Kaldari
-* Ryan Lane
-* Ryan Schmidt
-* Sam Reed
-* Shinjiman
-* Siebrand Mazeland
-* Soxred93
-* SQL
-* Szymon Świerkosz
-* This, that and the other
-* Thomas Bleher
-* Thomas Gries
-* Tim Starling
-* Timo Tijhof
-* Trevor Parscal
-* Tyler Anthony Romeo
-* Victor Vasiliev
-* Yesid Carrillo
-* Yuri Astrakhan
-
-== Patch Contributors ==
+== Contributors ==
+<!-- Updates to this list made with maintenance/updateCredits.php -->
+<!-- BEGIN CONTRIBUTOR LIST -->
+* aalekhN
 * Aaron Ball
 * Aaron Pramana
+* Aaron Schulz
+* Aarti Dwivedi
+* Aashaka Shah
+* abhinand
+* Abhishek Das
+* Adam Miller
+* Adam Roses Wight
+* addshore
+* Aditya Sastry
+* Adrian Heine
+* Adrian Lang
+* Ævar Arnfjörð Bjarmason
 * Agbad
 * Ahmad Sherif
+* Ajayrahul P
+* Alangi Derick
+* Albert221
 * Alejandro Mery
+* AlephNull
+* Alex Ivanov
+* Alex Shih-Han Lin
+* Alex Z.
+* Alexander I. Mashin
+* Alexander Lehmann
+* Alexander Monk
+* Alexander Sigachov
+* Alexandre Emsenhuber
+* Alexia E. Smith
 * Amalthea
 * Amir E. Aharoni
+* Amir Sarabadani
+* ananay
+* Anders Wegge Jakobsen
+* Andre Engels
+* Andrew Bogott
 * Andrew Dunbar
+* Andrew Garrett
+* Andrew Green
+* Andrew H
+* Andrew Harris
+* Andrew Otto
+* Andrius R
+* andymw
+* Angela Beesley Starling
+* ankur
+* Antoine Musso
 * Antonio Ospite
+* apexkid
+* April King
+* Aran Dunkley
+* Arash Boostani
+* Arcane21
+* Ariel Glenn
+* Arlo Breault
+* Arne Heizmann
+* Arthur Richards
+* Aryeh Gregor
+* Asher Feldman
 * Asier Lostalé
+* ayush_garg
 * Azliq7
 * Bagariavivek
+* Bahodir Mansurov
+* balloonguy
+* Bartosz Dziewoński
 * Beau
+* Ben Davis
+* Ben Hartshorne
+* Bene
 * Benny Situ
 * Bergi
+* Bertrand Grondin
+* Bill Traynor
+* Billinghurst
+* billm
+* blotmandroid
+* Bogdan Stancescu
+* Boris Nagaev
 * Borislav Manolov
+* Brad Jorsch
+* Brandon Black
+* Brandon Harris
 * Brent G
+* Brent Garber
+* Brian Wolff
 * Brianna Laugher
+* Brion Vibber
+* Bryan Davis
+* Bryan Tong Minh
+* burthsceh
+* C. Scott Ananian
+* Cacycle
+* Calak
+* Camille Constans
+* Carl Fürstenberg
 * Carlin
 * Carsten Nielsen
+* Cblair91
+* cenarium
+* Chad Horohoe
+* Charles Melbye
+* Chiefwei
+* Chris McMahon
+* Chris Seaton
+* Chris Steipp
 * Christian Aistleitner
+* Christian List
 * Christian Neubauer
+* Christopher Johnson
+* church of emacs
+* Cindy Cicalese
+* ckoerner
 * Conrad Irwin
 * cryptocoryne
 * Dan Barrett
 * Dan Collins
+* Dan Duvall
 * Dan Nessett
+* Dan Poltawski
+* dan-nl
+* Daniel A. R. Werner
 * Daniel Arnold
+* Daniel Cannon
+* Daniel De Marco
+* Daniel Evans
+* Daniel Friesen
+* Daniel Kinzler
+* Daniel Renfro
 * Daniel Werner
+* DanielRenfro
+* Danny B.
+* Darian Anthony Patrick
+* Darkdragon09
+* DaSch
 * David Baumgarten
+* David Chan
+* David E. Narváez
+* David Lynch
+* David McCabe
+* David Mudrák
+* dcausse
+* dennisroczek
 * Denny Vrandecic
+* Dereckson
+* Derk-Jan Hartman
+* Derric Atzrott
+* Derrick Coetzee
 * Dévai Tamás
+* Devi Krishnan
+* Diederik van Liere
+* Domas Mituzas
+* Douglas Gardner
+* DPStokesNZ
+* dr0ptp4kt
 * Ebrahim Byagowi
+* Ed Sanders
+* Edward Chernenko
 * Edward Z. Yang
+* Elisabeth Bauer
+* Elliott Eggleston
 * Elvis Stansvik
+* Emil Podlaszewski
+* Emmanuel Engelhart
+* Emmanuel Gil Peyrot
+* Emmet Hikory
+* Emufarmers
+* enigmaeth
+* Entlinkt
 * Eranroz
+* Eric Evans
+* Eric Schneider
+* Erich Lerch
+* Erick Guan
+* Erik Bernhardson
+* Erik Moeller
 * Erwin Dokter
 * Étienne Beaulé
+* Evan McIntire
+* Evan Prodromou
+* ExplosiveHippo
+* Faidon Liambotis
 * Federico Leva
+* Fenzik Joseph
+* firebus
 * Florian Schmidt
 * fomafix
+* Fran Rogers
+* Fred Emmott
 * FunPika
 * Gabriel Wicke
+* Gary Guo
+* gbt248
 * Geoffrey Mon
+* georggi
+* Gergő Tisza
 * Gero Scholz
+* gicode
+* Giftpflanze
+* Gilles Dubuc
 * Gilles van den Hoven
+* Giuseppe Lavagetto
+* gladoscc
+* glaisher
+* Greg Maxwell
+* Greg Sabino Mullane
+* Gregory Szorc
 * Grunny
+* Guillaume Blanchard
+* Guy Van den Broeck
+* Happy-melon
+* haritha28
 * Harry Burt
+* Hazard-SJ
+* Hector A Escobedo
+* Helder
+* Henning Snater
+* Hojjat
+* Huji
+* Hydriz
+* Ian Baker
+* Ilmari Karonen
+* Inez Korczyński
+* IoannisKydonis
 * Ireas
+* isarra
+* Ivan Lanin
+* Jack D. Pond
+* Jack Phoenix
+* Jackmcbarn
 * Jacob Block
+* Jacob Clark
+* jagori
+* Jakub Vrana
+* James Earl Douglas
+* James Forrester
+* Jan Berkel
+* Jan Drewniak
 * Jan Gerber
 * Jan Luca Naumann
+* Jan Paul Posma
+* Jan Zerebecki
+* Jared Flores
+* Jaroslav Škarvada
+* jarrettmunton
+* jarry1250
 * Jaska Zedlik
+* Jason Richey
+* jeblad
+* Jeff Janes
+* jeff303
+* Jens Frank
+* Jens Ohlig
+* Jérémie Roquet
 * Jeremy Baron
+* Jeremy Postlethwaite
+* jeremyb
+* Jeroen De Dauw
+* Jerome Jamnicky
+* Jesús Martínez Novo
+* jhobs
+* Jiabao
 * Jidanni
+* Jimmy Collins
 * Jimmy Xu
+* joakin
+* Joan Creus
+* Joel Natividad
+* Joerg
+* Johan Dahlin
+* John Du Hart
 * John N
+* Jon Harald Søby
+* Jon Robson
 * Jonathan Wiltshire
+* Jools Wills
+* jsahleen
+* Julian Ostrow
+* Juliano F. Ravasi
+* Juliusz Gonera
+* JuneHyeon Bae
 * Jure Kajzer
+* Justin Du
+* Kai_WMDE
+* kaligula
+* Kartik Mistry
 * Karun Dambiec
 * Katie Filbert
 * Kevin Israel
+* Kghbln
+* Kim Eik
 * Kim Hyun-Joon
+* kipod
+* kishanio
+* konarak
+* krishna keshav
+* Krzysztof Krzyzaniak
+* Krzysztof Zbudniewek
+* Kunal Grover
+* Kunal Mehta
+* Kwan Ting Chan
+* Laurence Parry
+* Lee Bousfield
+* Lee Daniel Crocker
 * Lee Worden
 * Lejonel
+* lekshmi
+* Leo Koppelkamm
 * Leon Liesener
+* Leon Weber
+* Leonardo Gregianin
+* Leons Petrazickis
+* Leslie Hoare
+* Leszek Manicki
+* lethosor
+* Lewis Cawte
+* Liam Edwards-Playne
 * liangent
+* Lisa Ridley
+* Ljudusika
+* Lojjik Braughler
 * Louperivois
+* Ltrlg
+* Luc Van Oostenryck
 * Lucas Garczewski
 * Luigi Corsaro
+* Luis Felipe Schenone
 * Luke Faraone
+* Lupin
 * Lupo
+* lwelling
+* m4tx
 * Madman
+* madurangasiriwardena
+* Magnus Manske
 * Manuel Menal
+* Manuel Schneider
+* Marc Ordinas i Llopis
 * Marc-André Pelletier
 * Marcin Cieślak
+* Marco Falke
+* Marco Schuster
+* MarcoAurelio
 * Marcus Buck
+* Marius Hoch
+* Mark Bergsma
+* Mark Clements
 * Mark Hershberger
 * Mark Holmquist
+* Marko Obrovac
+* Markus Glaser
+* Markus Krötzsch
 * Marooned
+* Martin Urbanec
+* Massaf
+* Matěj Grabovský
+* matejsuchanek
 * Mathias Ertl
 * mati
+* Matt Fitzpatrick
+* Matt Johnston
+* Matt Russell
+* Matthew Bowker
 * Matthew Britton
+* Matthew Flaschen
+* Matthias Jordan
 * Matthias Mullie
+* MatthiasDD
 * Max
+* Max Semenik
 * Max Sikström
+* mayankmadan
+* Meno25
 * merl
+* Merlijn S. van Deen
+* MGChecker
+* mgooley
+* mhutti1
 * Michael Dale
 * Michael De La Rue
+* Michael Holloway
 * Michael M.
 * Michael Newton
 * Michael Walsh
+* Michał Łazowik
+* Michał Roszka
+* Michał Zieliński
 * Mike Horvath
+* Minh Nguyễn
+* MinuteElectron
+* Misza13
+* mjbmr
 * moejoe0000
+* Mohamed Magdy
+* Molly White
+* Moriel Schottlender
 * Mormegil
+* Mr. E23
 * MrBlueSky
 * MrPete
+* Mukunda Modell
+* Mwalker
+* mwjames
 * mybugs.mail
 * MZMcBride
+* nadeesha
 * Nakon
+* Namit
 * Nathan Larson
+* Nathaniel Herman
+* Neil Kandalgaonkar
+* Nemo bis
 * nephele
+* Nicholas Pisarro, Jr
+* Nick Jenkins
+* nicoco007
+* Nicolas Dumazet
+* Nicolas Weeger
 * Nik
+* Nik Everett
+* Niklas Laxström
 * Nikola Kovacs
+* Nikola Smolenski
 * Nikolaos S. Karastathis
+* Nimish Gautam
 * Nischay Nahata
+* nischayn22
+* nomoa
+* nullspoon
+* Nuria Ruiz
 * Nx.devnull
+* Ocean behind ears
 * Olaf Lenz
 * Olivier Finlay Beaton
+* onei
+* opatel99
+* Oren Held
+* Ori Livneh
+* oskar.jauch@gmail.com
+* OverlordQ
+* Owen Davis
+* Paa Kwesi Imbeah
+* paladox
 * Patricio Molina
+* Patrick Reilly
+* Patrick Westerhoff
+* Pau Giner
 * Paul Copperman
 * Paul Oranje
+* Pavel Astakhov
+* Pavel Selitskas
+* Pcoombe
+* Perside Rosalie
 * Peter Gehres
+* Peter Hedenskog
+* Peter Potrowl
+* Petr Bena
+* Petr Kadlec
 * Petr Onderka
+* Petr Pchelko
+* Philip Tzou
+* physikerwelt (Moritz Schubotz)
 * PieRRoMaN
+* Pikne
+* PiRSquared17
+* Platonides
+* Pmlineditor
+* pmolina
+* prageck
+* Pranav Ravichandran
+* PranavK
+* Prateek Saxena
+* Priyanka Dhanda
+* Prod
+* ptarjan
+* pubudu538
+* Purodha Blissenbach
+* quiddity
 * quietust
+* Quim Gil
+* rahul21
+* Raimond Spekking
+* Ramunas Geciauskas
+* Remember the dot
 * René Kijewski
+* Reza
 * rgcjonas
+* Ricordisamoa
+* rillke
+* River Tarnell
+* Roan Kattouw
+* Rob Church
+* Rob Lanphier
 * Rob Moen
+* Robert Hoenig
+* Robert Leverington
+* Robert Rohde
+* Robert Stojnić
 * Robert Treat
+* Robert Vogel
+* Robin Pepermans
+* robinhood701
 * RockMFR
+* Rohan
+* Roman Nosov
+* Roman Tsukanov
+* Rotem Liss
+* Rowan Collins
+* Russ Nelson
 * Russell Blau
 * Rusty Burchfield
+* Ruud Koot
+* Ryan Bies
+* Ryan Finnie
+* Ryan Kaldari
+* Ryan Lane
+* Ryan Schmidt
 * S Page
 * Salvatore Ingala
+* Sam Reed
+* Sam Smith
 * Santhosh Thottingal
+* Schnark
+* Scimonster
+* scnd
 * Scott Colcord
 * se4598
+* Sean Colombo
+* Sean Pringle
+* Seb35
+* Sebastian Brückner
 * Sébastien Santoro
+* Sergio Santoro
+* Sethakill
+* Shahyar
+* Shane Gibbons
+* Shane King
+* Shinjiman
+* shirayuki
+* Sidhant Gupta
+* Siebrand Mazeland
 * Simon Walker
+* Smriti Singh
 * Solitarius
+* Sorawee Porncharoenwase
 * Søren Løvborg
 * Southparkfan
+* Soxred93
+* SQL
 * Srikanth Lakshmanan
+* Stanislav Malyshev
 * Stefano Codari
+* Steinsplitter
+* Stephan Gambke
+* Stephan Muggli
+* Stephane Bisson
+* Stephen Liang
+* Steve Sanbeg
+* Steven Roddis
 * Str4nd
 * Subramanya Sastry
+* Sumit Asthana
 * svip
+* Swalling
+* Szymon Świerkosz
+* T.D. Corell
+* Tarquin
+* The Discoverer
 * The Evil IP address
+* theopolisme
+* Thiemo Mättig (WMDE)
+* This, that and the other
+* tholam
+* Thomas Arrow
+* Thomas Bleher
+* Thomas Dalton
+* Thomas Gries
+* ThomasV
+* Tim Hollmann
 * Tim Landscheidt
+* Tim Laqua
+* Tim Starling
+* Timo Tijhof
+* Tina Johnson
 * Tisane
+* tjlsangria
+* Tjones
+* TK-999
+* Tobias Gritschacher
+* Tom Arrow
+* Tom Gilder
+* Tom Maaswinkel
+* Tomasz Finc
+* Tomasz W. Kozlowski
+* Tomasz Wegrzanowski
+* tomek
+* Tony Thomas
+* Tpt
+* Trevor Parscal
+* TyA
+* Tychay
+* Tyler Anthony Romeo
+* Tyler Cipriani
+* Tyler Romeo
+* U-REDMOND\emadelw
+* UltrasonicNXT
 * Umherirrender
+* utkarsh95
 * Van de Bugger
+* Viačeslav
+* Victor Porton
+* Victor Vasiliev
+* victorbarbu
 * Ville Stadista
+* vishnu
 * Vitaliy Filippov
 * Vivek Ghaisas
+* vlakoff
+* Volker E
 * Waldir Pimenta
+* wctaiwan
+* Wikinaut
+* Wil Mahan
 * William Demchick
+* withoutaname
+* WMDE-Fisch
+* X!
+* XP1
+* Yaron Koren
+* Yaroslav Melnychuk
+* Yesid Carrillo
+* Yogesh K S
+* Yongmin Hong
+* yoonghm
+* Yuri Astrakhan
 * Yusuke Matsubara
 * Yuvi Panda
 * Zachary Hauri
+* Zak Greant
+* Željko Filipin
+* Zhaofeng Li
+* Zhengzhu Feng
+* Zppix
+* محمد شعیب
+<!-- END CONTRIBUTOR LIST -->
 
 == Translators ==
 
index a08db5c..55b7932 100644 (file)
@@ -1,33 +1,44 @@
-/*jshint node:true */
+/* eslint-env node */
+
 module.exports = function ( grunt ) {
-       grunt.loadNpmTasks( 'grunt-contrib-copy' );
-       grunt.loadNpmTasks( 'grunt-contrib-jshint' );
-       grunt.loadNpmTasks( 'grunt-stylelint' );
-       grunt.loadNpmTasks( 'grunt-contrib-watch' );
-       grunt.loadNpmTasks( 'grunt-banana-checker' );
-       grunt.loadNpmTasks( 'grunt-jscs' );
-       grunt.loadNpmTasks( 'grunt-jsonlint' );
-       grunt.loadNpmTasks( 'grunt-karma' );
 
        var wgServer = process.env.MW_SERVER,
                wgScriptPath = process.env.MW_SCRIPT_PATH,
                karmaProxy = {};
 
+       grunt.loadNpmTasks( 'grunt-banana-checker' );
+       grunt.loadNpmTasks( 'grunt-contrib-copy' );
+       grunt.loadNpmTasks( 'grunt-contrib-watch' );
+       grunt.loadNpmTasks( 'grunt-eslint' );
+       grunt.loadNpmTasks( 'grunt-jsonlint' );
+       grunt.loadNpmTasks( 'grunt-karma' );
+       grunt.loadNpmTasks( 'grunt-stylelint' );
+
        karmaProxy[ wgScriptPath ] = wgServer + wgScriptPath;
 
        grunt.initConfig( {
-               jshint: {
-                       options: {
-                               jshintrc: true
-                       },
-                       all: '.'
-               },
-               jscs: {
-                       all: '.'
+               eslint: {
+                       all: [
+                               '**/*.js',
+                               '!docs/**',
+                               '!tests/**',
+                               '!node_modules/**',
+                               '!resources/lib/**',
+                               '!resources/src/jquery.tipsy/**',
+                               '!resources/src/jquery/jquery.farbtastic.js',
+                               '!resources/src/mediawiki.libs/**',
+                               '!vendor/**',
+                               // Explicitly say "**/*.js" here in case of symlinks
+                               '!extensions/**/*.js',
+                               '!skins/**/*.js',
+                               // Skip functions aren't even parseable
+                               '!resources/src/dom-level2-skip.js',
+                               '!resources/src/es5-skip.js',
+                               '!resources/src/mediawiki.hidpi-skip.js'
+                       ]
                },
                jsonlint: {
                        all: [
-                               '.jscsrc',
                                '**/*.json',
                                '!{docs/js,extensions,node_modules,skins,vendor}/**'
                        ]
@@ -48,7 +59,7 @@ module.exports = function ( grunt ) {
                },
                watch: {
                        files: [
-                               '.{stylelintrc,jscsrc,jshintignore,jshintrc}',
+                               '.{stylelintrc,eslintrc.json}',
                                '**/*',
                                '!{docs,extensions,node_modules,skins,vendor}/**'
                        ],
@@ -103,7 +114,7 @@ module.exports = function ( grunt ) {
                return !!( process.env.MW_SERVER && process.env.MW_SCRIPT_PATH );
        } );
 
-       grunt.registerTask( 'lint', [ 'jshint', 'jscs', 'jsonlint', 'banana', 'stylelint' ] );
+       grunt.registerTask( 'lint', [ 'eslint', 'banana', 'stylelint' ] );
        grunt.registerTask( 'qunit', [ 'assert-mw-env', 'karma:main' ] );
 
        grunt.registerTask( 'test', [ 'lint' ] );
diff --git a/HISTORY b/HISTORY
index 6de7de4..28a9b86 100644 (file)
--- a/HISTORY
+++ b/HISTORY
@@ -1,4 +1,328 @@
-Change notes from older releases. For current info see RELEASE-NOTES-1.28.
+Change notes from older releases. For current info see RELEASE-NOTES-1.29.
+
+== MediaWiki 1.28 ==
+
+=== Changes since 1.28.0-rc1 ===
+* (T148957) Replace wgShowExceptionDetails with wgShowDBErrorBacktrace on db
+  errors.
+* (T148956) Only apply wgDBschema to postgres/mssql.
+* (T145991) Introduce separate log action for deleting pages on move.
+* (T141474) (T110464) Bypass login page if no user input is required.
+
+=== Changes since 1.28.0-rc0 ===
+* (T142210) The changes to move the parser "NewPP limit report" from a HTML
+  comment to a machine-readable JavaScript config option 'wgPageParseReport'
+  have been undone. They caused the human-readable limit report to be shown
+  incompletely or not at all. ParserOutput::setLimitReportData() and
+  getLimitReportData() behave as they did in MediaWiki 1.27 again.
+* (T149510) Value of {{DISPLAYTITLE:}} parser function will not be used for
+  the text of subheadings on a category page when creating it. This wasn't
+  working correctly.
+* (T106793) MediaWiki will no longer try to perform a HTTP redirect to the
+  canonical pretty URL when a non-pretty URL is used. It resulted in redirect
+  loops in some clients and in some server configurations. This undoes a change
+  made in MediaWiki 1.26.
+* (T149759) manifest_version: 2 was removed.
+
+=== Configuration changes in 1.28 ===
+* $wgSend404Code now affects status code of action=history if the page is not there.
+* BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
+  made by MediaWiki via a proxy. Relying on the http_proxy environment
+  variable is no longer supported.
+* The load.php entry point now enforces the existing policy of not allowing
+  access to session data, which includes the session user and the session
+  user's language. If such access is attempted, an exception will be thrown.
+* The number of internal PBKDF2 iterations used to derive the session secret
+  is configurable via $wgSessionPbkdf2Iterations.
+* Upload dialog's file upload log comment can now be configured separately for
+  local and foreign uploads.
+* $wgForeignUploadTargets now defaults to `[ 'local' ]`, where `'local'`
+  signifies local uploads. A value of `[]` (empty array) now means that
+  no upload targets are allowed, effectively disabling the upload dialog.
+* The deprecated $wgEditEncoding variable has been removed; it was only used
+  for Esperanto language character conversion. You are now recommended to use
+  input methods provided by the UniversalLanguageSelector extension.
+* When $wgPingback is true, MediaWiki will periodically ping
+  https://www.mediawiki.org/beacon with basic information about the local
+  MediaWiki installation. This data includes, for example, the type of system,
+  PHP version, and chosen database backend. This behavior is off by default.
+* When $wgEditSubmitButtonLabelPublish is true, MediaWiki will label the button
+  to store-to-database-and-show-to-others as "Publish page"/"Publish changes";
+  if false, the default, they will be "Save page"/"Save changes".
+* The 'editcontentmodel' permission is now granted to all logged-in users ('user').
+  instead of just administrators ('sysop'). Documentation for this feature is
+  available at <https://www.mediawiki.org/wiki/Help:ChangeContentModel>.
+* $wgRevisionCacheExpiry is now set to one week by default instead of being disabled.
+* Magic links are now disabled by default, and can be re-enabled by modifying the value
+  of $wgEnableMagicLinks. Their usage is discouraged, but if they are manually enabled,
+  a tracking category will be added to help identify usage and make it easier to migrate
+  away from. If you depend upon magic link functionality, it is requested that you comment
+  on <https://www.mediawiki.org/wiki/Requests_for_comment/Future_of_magic_links> and
+  explain your use case(s).
+* New config variable $wgCSPFalsePositiveUrls to control what URLs to ignore
+  in upcoming Content-Security-Policy feature's reporting.
+
+=== New features in 1.28 ===
+* User::isBot() method for checking if an account is a bot role account.
+* Added a new 'slideshow' mode for galleries.
+* Added a new hook, 'UserIsBot', to aid in determining if a user is a bot.
+* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better
+  interact with API parsing.
+* Added a new hook, 'UploadVerifyUpload', which can be used to reject a file
+  upload. Unlike 'UploadVerifyFile' it provides information about upload comment
+  and the file description page, but does not run for uploads to stash.
+* (T141604) Extensions can now provide a better error message when their
+  maintenance scripts are run without the extension being installed.
+* (T8948) Numeric sorting in categories is now supported by setting $wgCategoryCollation
+  to 'uca-default-u-kn' or 'uca-<langcode>-u-kn'. If you can't use UCA collations,
+  a 'numeric' collation is also available. If migrating from another
+  collation, you will need to run the updateCollation.php maintenance script.
+* Two new codes have been added to #time parser function: "xit" for days in current
+  month, and "xiz" for days passed in the year, both in Iranian calendar.
+* mw.Api has a new option, useUS, to use U+001F (Unit Separator) when
+  appropriate for sending multi-valued parameters. This defaults to true when
+  the mw.Api instance seems to be for the local wiki.
+* After a client performs an action which alters a database that has replica databases,
+  MediaWiki will wait for the replica databases to synchronize with the master database
+  while it renders the HTML output. However, if the output is a redirect to another wiki
+  on the wiki farm with a different domain, MediaWiki will instead alter the redirect
+  URL to include a ?cpPosTime parameter that triggers the database synchronization when
+  the URL is followed by the client. The same-domain case uses a new cpPosTime cookie.
+* Added new hooks, 'ApiQueryBaseBeforeQuery', 'ApiQueryBaseAfterQuery', and
+  'ApiQueryBaseProcessRow', to make it easier for extensions to add 'prop' and
+  'show' parameters to existing API query modules.
+
+=== External library changes in 1.28 ===
+
+==== Upgraded external libraries ====
+* Updated es5-shim from v4.1.5 to v4.5.8
+* Updated composer/semver from v1.4.1 to v1.4.2
+* Updated wikimedia/php-session-serializer from v1.0.3 to v1.0.4
+
+==== New external libraries ====
+* Added wikimedia/scoped-callback v1.0.0
+* Added wikimedia/wait-condition-loop v1.0.1
+
+=== Bug fixes in 1.28 ===
+* (T146496) action=history pages should return 404 HTTP error code if the page does not exist
+* (T137264) SECURITY: XSS in unclosed internal links
+* (T133147) SECURITY: Escape '<' and ']]>' in inline <style> blocks
+* (T133147) SECURITY: Require login to preview user CSS pages
+* (T132926) SECURITY: Do not allow undeleting a revision deleted file if it is
+  the top file
+* (T129738) SECURITY: Make $wgBlockDisablesLogin also restrict logged in
+  permissions
+* (T129738) SECURITY: Make blocks log users out if $wgBlockDisablesLogin is true
+* (T139670) Move 'UserGetRights' call before application of
+  Session::getAllowedUserRights()
+
+=== Action API changes in 1.28 ===
+* Added 'maxarticlesize' property to action=query&meta=siteinfo which contains
+  the value of $wgMaxArticleSize.
+* Property 'modulemessages' from action=parse&prop=modules was removed
+  (deprecated since 1.26).
+* The following response properties from action=login, deprecated in 1.27, are
+  now removed: lgtoken, cookieprefix, sessionid. Clients should handle cookies
+  to properly manage session state.
+* Submitting the lgtoken and lgpassword parameters in the query string to
+  action=login is now deprecated and outputs a warning. They should be submitted
+  in the POST body instead.
+* Submitting sensitive authentication request parameters to action=clientlogin,
+  action=createaccount, action=linkaccount, and action=changeauthenticationdata
+  in the query string is now deprecated and outputs a warning. They should be
+  submitted in the POST body instead.
+* (T141960) Multi-valued parameters may now be separated using U+001F (Unit Separator)
+  instead of the pipe character. This will be useful if some of the multiple
+  values need to contain pipes, e.g. for action=options.
+* The API will now warn if input is not NFC-normalized Unicode or if it
+  contains invalid characters.
+* The 'normalized' list output by action=query and other modules that use
+  ApiPageSet may contain entries where the 'from' value is percent-encoded as
+  the raw value cannot be represented in a valid API response. These are
+  indicated by a 'fromencoded' boolean alongside the existing 'from' parameter.
+* (T28680) action=paraminfo can now return info about all submodules of a
+  module without listing them all explicitly.
+* (T146770) It is now possible to assert that the current user is a specific
+  named user, using the 'assertuser' parameter.
+* (T141963) Added a 'known' property when missing-but-known titles (e.g. from
+  the 'TitleIsAlwaysKnown' hook) are output in various modules.
+
+=== Action API internal changes in 1.28 ===
+* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better
+  interact with ApiParse and ApiExpandTemplates.
+* (T139565) SECURITY: API: Generate head items in the context of the given title
+* (T115333) SECURITY: Check read permission when loading page content in ApiParse
+* ApiBase::getResultData() was removed (deprecated since 1.25)
+* ApiBase::makeHelpArrayToString() was removed (deprecated since 1.25)
+* ApiBase::makeHelpMsgParameters() was removed (deprecated since 1.25)
+* ApiBase::makeHelpMsg() was removed (deprecated since 1.25)
+* ApiFormatBase::formatHTML() was removed (deprecated since 1.25)
+* ApiFormatBase::getNeedsRawData() was removed (deprecated since 1.25)
+* ApiFormatBase::getWantsHelp() was removed (deprecated since 1.25)
+* ApiFormatBase::setBufferResult() was removed (deprecated since 1.25)
+* ApiFormatBase::setHelp() was removed (deprecated since 1.25)
+* ApiFormatBase::setUnescapeAmps() was removed (deprecated since 1.25)
+* ApiMain::makeHelpMsgHeader() was removed (deprecated since 1.25)
+* ApiMain::reallyMakeHelpMsg() was removed (deprecated since 1.25)
+* ApiMain::setHelp() was removed (deprecated since 1.25)
+* ApiResult::beginContinuation() was removed (deprecated since 1.25)
+* ApiResult::cleanUpUTF8() was removed (deprecated since 1.25)
+* ApiResult::convertStatusToArray() was removed (deprecated since 1.25)
+* ApiResult::disableSizeCheck() was removed (deprecated since 1.24)
+* ApiResult::enableSizeCheck() was removed (deprecated since 1.24)
+* ApiResult::endContinuation() was removed (deprecated since 1.25)
+* ApiResult::getData() was removed (deprecated since 1.25)
+* ApiResult::getIsRawMode() was removed (deprecated since 1.25)
+* ApiResult::setContent() was removed (deprecated since 1.25)
+* ApiResult::setContinueParam() was removed (deprecated since 1.25)
+* ApiResult::setElement() was removed (deprecated since 1.25)
+* ApiResult::setGeneratorContinueParam() was removed (deprecated since 1.25)
+* ApiResult::setIndexedTagName_internal() was removed (deprecated since 1.25)
+* ApiResult::setIndexedTagName_recursive() was removed (deprecated since 1.25)
+* ApiResult::setMainForContinuation() was removed (deprecated since 1.25)
+* ApiResult::setParsedLimit() was removed (deprecated since 1.25)
+* ApiResult::setRawMode() was removed (deprecated since 1.25)
+* ApiResult::size() was removed (deprecated since 1.25)
+* Added new hooks, 'ApiQueryBaseBeforeQuery', 'ApiQueryBaseAfterQuery', and
+  'ApiQueryBaseProcessRow', to make it easier for extensions to add 'prop' and
+  'show' parameters to existing API query modules. A query module can enable
+  these hooks by passing an array for $hookData to ApiQueryBase::select() and
+  by calling ApiQueryBase->processRow() before adding a row's data to the
+  result.
+
+=== Languages updated in 1.28 ===
+
+MediaWiki supports over 375 languages. Many localisations are updated
+regularly. Below only new and removed languages are listed, as well as
+changes to languages because of Phabricator reports.
+
+* (T137411) ban (Balinese), thanks to translators Adi Mayndra, Andru,
+  BASAbali, M. Adiputra, Naval Scene, Nemo bis, NoiX180, and 아라.
+* (T135867) shn (Shan), thanks to translators Khun Sar, Piangpha,
+  Saiddzone Saimawnkham, Saosukham, and Sengwan.
+* Czech (cs) and Slovak (sk) set as reciprocal fallbacks.
+* (T146744) Livvi-Karelian (olo) namespace messages created thanks to translator Ilja.mos.
+
+=== Other changes in 1.28 ===
+* (T128697) Improved handling of large diffs.
+* [BREAKING CHANGE] $wgExtendedLoginCookies has been removed. You can
+  use or update a custom session provider if needed.
+* Deprecated APIEditBeforeSave hook in favor of EditFilterMergedContent.
+* The 'UploadVerification' hook is deprecated. Use 'UploadVerifyFile' instead.
+* SiteConfiguration::isLocalVHost() was removed (deprecated since 1.25).
+* The 'UserLoginComplete' hook has a new parameter to differentiate between actual
+  login and visiting the login page while already logged in.
+* ResourceLoader::makeLoaderURL() was removed (deprecated since 1.24).
+* $.fn.liveAndTestAtStart was removed (deprecated since 1.24).
+* mw.util.tooltipAccessKeyPrefix was removed (deprecated since 1.24).
+* mw.util.tooltipAccessKeyRegexp was removed (deprecated since 1.24).
+* Linker::link() and Linker::linkKnown() were deprecated; please instead use
+  MediaWiki\Linker\LinkRenderer. In addition, the LinkBegin and LinkEnd hooks
+  were replaced by HtmlPageLinkRendererBegin and HtmlPageLinkRendererEnd
+  respectively. See docs/hooks.txt for the specific changes needed for those hooks.
+* Linker::formatSize() was deprecated. Use Language::formatSize() directly.
+* Aliases for Linker methods, deprecated since 1.21, were removed from Skin:
+  * Skin::commentBlock() (use Linker::commentBlock() instead)
+  * Skin::generateRollback() (use Linker::generateRollback() instead)
+  * Skin::link() (use MediaWiki\Linker\LinkRenderer instead)
+  * Skin::linkKnown() (use MediaWiki\Linker\LinkRenderer instead)
+  * Skin::userLink() (use Linker::userLink() instead)
+  * Skin::userToolLinks() (use Linker::userToolLinks() instead)
+* Disabled "bug 2702" HTML tidying of parsed UI messages on wikis where Tidy is
+  disabled.
+* DifferenceEngine::generateDiffBody() was removed (deprecated since 1.21).
+* UploadBase::stashFileGetKey() and UploadBase::stashSession() were deprecated.
+  Use ...->stashFile()->getFileKey() instead.
+* "Public domain" was removed as a wiki license option from the installer, in
+  favour of CC-0.
+* AuthenticationRequest::$required is now changed from REQUIRED to PRIMARY_REQUIRED
+  on requests needed by primary providers even if all primaries need them.
+  Primary providers are discouraged from returning multiple REQUIRED requests.
+* OOjs UI PHP widgets constructed with the `'infusable' => true` config option
+  will no longer be automatically infused. You should call `OO.ui.infuse()`
+  on them yourself from your JavaScript code.
+* parserTests.php has moved to tests/parser/parserTests.php
+* The command line options specific to parser tests have been removed from
+  phpunit.php: --regex and --keep-uploads. Instead of --regex, use --filter.
+  Instead of --keep-uploads, use the same option to parserTests.php, but you
+  must specify a directory with --upload-dir.
+* The 'jquery.arrowSteps' ResourceLoader module is now deprecated.
+* IP::isConfiguredProxy() and IP::isTrustedProxy() were removed. Callers should
+  migrate to using the same functions on a ProxyLookup instance, obtainable from
+  MediaWikiServices.
+* The ArticleAfterFetchContent, ArticleInsertComplete, ArticleSave, ArticleSaveComplete,
+  ArticleViewCustom, EditFilterMerged, EditPageGetDiffText, EditPageGetPreviewText and
+  ShowRawCssJs hooks will now emit deprecation warnings if used.
+* (T68404) CSS3 attr() function with url type is no longer allowed
+  in inline styles.
+* Database::getSearchEngine() is deprecated, use SearchEngineFactory::getSearchEngineClass
+  instead.
+
+== Compatibility ==
+
+MediaWiki 1.28 requires PHP 5.5.9 or later. There is experimental support for
+HHVM 3.6.5 or later.
+
+MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
+support for them is somewhat less mature. There is experimental support for
+Oracle and Microsoft SQL Server.
+
+The supported versions are:
+
+* MySQL 5.0.3 or later
+* PostgreSQL 8.3 or later
+* SQLite 3.3.7 or later
+* Oracle 9.0.1 or later
+* Microsoft SQL Server 2005 (9.00.1399)
+
+== Upgrading ==
+
+1.28 has several database changes since 1.27, and will not work without schema
+updates. Note that due to changes to some very large tables like the revision
+table, the schema update may take quite long (minutes on a medium sized site,
+many hours on a large site).
+
+If upgrading from before 1.11, and you are using a wiki as a commons
+repository, make sure that it is updated as well. Otherwise, errors may arise
+due to database schema changes.
+
+If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
+new database fields are filled with data.
+
+If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
+1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
+with MediaWiki 1.21.
+
+Don't forget to always back up your database before upgrading!
+
+See the file UPGRADE for more detailed upgrade instructions.
+
+For notes on 1.27.x and older releases, see HISTORY.
+
+== Online documentation ==
+
+Documentation for both end-users and site administrators is available on
+MediaWiki.org, and is covered under the GNU Free Documentation License (except
+for pages that explicitly state that their contents are in the public domain):
+
+       https://www.mediawiki.org/wiki/Special:MyLanguage/Documentation
+
+== Mailing list ==
+
+A mailing list is available for MediaWiki user support and discussion:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
+
+A low-traffic announcements-only list is also available:
+
+       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
+
+It's highly recommended that you sign up for one of these lists if you're
+going to run a public MediaWiki, so you can be notified of security fixes.
+
+== IRC help ==
+
+There's usually someone online in #mediawiki on irc.freenode.net.
 
 = MediaWiki 1.27 =
 
diff --git a/RELEASE-NOTES-1.28 b/RELEASE-NOTES-1.28
deleted file mode 100644 (file)
index 557162e..0000000
+++ /dev/null
@@ -1,320 +0,0 @@
-== MediaWiki 1.28 ==
-
-THIS IS NOT A RELEASE YET
-
-MediaWiki 1.28 is an alpha-quality branch and is not recommended for use in
-production.
-
-=== Changes since 1.28.0rc0 ===
-* (T142210) The changes to move the parser "NewPP limit report" from a HTML
-  comment to a machine-readable JavaScript config option 'wgPageParseReport'
-  have been undone. They caused the human-readable limit report to be shown
-  incompletely or not at all. ParserOutput::setLimitReportData() and
-  getLimitReportData() behave as they did in MediaWiki 1.27 again.
-* (T149510) Value of {{DISPLAYTITLE:}} parser function will not be used for
-  the text of subheadings on a category page when creating it. This wasn't
-  working correctly.
-* (T106793) MediaWiki will no longer try to perform a HTTP redirect to the
-  canonical pretty URL when a non-pretty URL is used. It resulted in redirect
-  loops in some clients and in some server configurations. This undoes a change
-  made in MediaWiki 1.26.
-
-=== Configuration changes in 1.28 ===
-* $wgSend404Code now affects status code of action=history if the page is not there.
-* BREAKING CHANGE: $wgHTTPProxy is now *required* for all external requests
-  made by MediaWiki via a proxy. Relying on the http_proxy environment
-  variable is no longer supported.
-* The load.php entry point now enforces the existing policy of not allowing
-  access to session data, which includes the session user and the session
-  user's language. If such access is attempted, an exception will be thrown.
-* The number of internal PBKDF2 iterations used to derive the session secret
-  is configurable via $wgSessionPbkdf2Iterations.
-* Upload dialog's file upload log comment can now be configured separately for
-  local and foreign uploads.
-* $wgForeignUploadTargets now defaults to `[ 'local' ]`, where `'local'`
-  signifies local uploads. A value of `[]` (empty array) now means that
-  no upload targets are allowed, effectively disabling the upload dialog.
-* The deprecated $wgEditEncoding variable has been removed; it was only used
-  for Esperanto language character conversion. You are now recommended to use
-  input methods provided by the UniversalLanguageSelector extension.
-* When $wgPingback is true, MediaWiki will periodically ping
-  https://www.mediawiki.org/beacon with basic information about the local
-  MediaWiki installation. This data includes, for example, the type of system,
-  PHP version, and chosen database backend. This behavior is off by default.
-* When $wgEditSubmitButtonLabelPublish is true, MediaWiki will label the button
-  to store-to-database-and-show-to-others as "Publish page"/"Publish changes";
-  if false, the default, they will be "Save page"/"Save changes".
-* The 'editcontentmodel' permission is now granted to all logged-in users ('user').
-  instead of just administrators ('sysop'). Documentation for this feature is
-  available at <https://www.mediawiki.org/wiki/Help:ChangeContentModel>.
-* $wgRevisionCacheExpiry is now set to one week by default instead of being disabled.
-* Magic links are now disabled by default, and can be re-enabled by modifying the value
-  of $wgEnableMagicLinks. Their usage is discouraged, but if they are manually enabled,
-  a tracking category will be added to help identify usage and make it easier to migrate
-  away from. If you depend upon magic link functionality, it is requested that you comment
-  on <https://www.mediawiki.org/wiki/Requests_for_comment/Future_of_magic_links> and
-  explain your use case(s).
-* New config variable $wgCSPFalsePositiveUrls to control what URLs to ignore
-  in upcoming Content-Security-Policy feature's reporting.
-
-=== New features in 1.28 ===
-* User::isBot() method for checking if an account is a bot role account.
-* Added a new 'slideshow' mode for galleries.
-* Added a new hook, 'UserIsBot', to aid in determining if a user is a bot.
-* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better
-  interact with API parsing.
-* Added a new hook, 'UploadVerifyUpload', which can be used to reject a file
-  upload. Unlike 'UploadVerifyFile' it provides information about upload comment
-  and the file description page, but does not run for uploads to stash.
-* (T141604) Extensions can now provide a better error message when their
-  maintenance scripts are run without the extension being installed.
-* (T8948) Numeric sorting in categories is now supported by setting $wgCategoryCollation
-  to 'uca-default-u-kn' or 'uca-<langcode>-u-kn'. If you can't use UCA collations,
-  a 'numeric' collation is also available. If migrating from another
-  collation, you will need to run the updateCollation.php maintenance script.
-* Two new codes have been added to #time parser function: "xit" for days in current
-  month, and "xiz" for days passed in the year, both in Iranian calendar.
-* mw.Api has a new option, useUS, to use U+001F (Unit Separator) when
-  appropriate for sending multi-valued parameters. This defaults to true when
-  the mw.Api instance seems to be for the local wiki.
-* After a client performs an action which alters a database that has replica databases,
-  MediaWiki will wait for the replica databases to synchronize with the master database
-  while it renders the HTML output. However, if the output is a redirect to another wiki
-  on the wiki farm with a different domain, MediaWiki will instead alter the redirect
-  URL to include a ?cpPosTime parameter that triggers the database synchronization when
-  the URL is followed by the client. The same-domain case uses a new cpPosTime cookie.
-* Added new hooks, 'ApiQueryBaseBeforeQuery', 'ApiQueryBaseAfterQuery', and
-  'ApiQueryBaseProcessRow', to make it easier for extensions to add 'prop' and
-  'show' parameters to existing API query modules.
-
-=== External library changes in 1.28 ===
-
-==== Upgraded external libraries ====
-* Updated es5-shim from v4.1.5 to v4.5.8
-* Updated composer/semver from v1.4.1 to v1.4.2
-* Updated wikimedia/php-session-serializer from v1.0.3 to v1.0.4
-
-==== New external libraries ====
-* Added wikimedia/scoped-callback v1.0.0
-* Added wikimedia/wait-condition-loop v1.0.1
-
-==== Removed and replaced external libraries ====
-
-=== Bug fixes in 1.28 ===
-* (T146496) action=history pages should return 404 HTTP error code if the page does not exist
-* (T137264) SECURITY: XSS in unclosed internal links
-* (T133147) SECURITY: Escape '<' and ']]>' in inline <style> blocks
-* (T133147) SECURITY: Require login to preview user CSS pages
-* (T132926) SECURITY: Do not allow undeleting a revision deleted file if it is
-  the top file
-* (T129738) SECURITY: Make $wgBlockDisablesLogin also restrict logged in
-  permissions
-* (T129738) SECURITY: Make blocks log users out if $wgBlockDisablesLogin is true
-* (T139670) Move 'UserGetRights' call before application of
-  Session::getAllowedUserRights()
-
-=== Action API changes in 1.28 ===
-* Added 'maxarticlesize' property to action=query&meta=siteinfo which contains
-  the value of $wgMaxArticleSize.
-* Property 'modulemessages' from action=parse&prop=modules was removed
-  (deprecated since 1.26).
-* The following response properties from action=login, deprecated in 1.27, are
-  now removed: lgtoken, cookieprefix, sessionid. Clients should handle cookies
-  to properly manage session state.
-* Submitting the lgtoken and lgpassword parameters in the query string to
-  action=login is now deprecated and outputs a warning. They should be submitted
-  in the POST body instead.
-* Submitting sensitive authentication request parameters to action=clientlogin,
-  action=createaccount, action=linkaccount, and action=changeauthenticationdata
-  in the query string is now deprecated and outputs a warning. They should be
-  submitted in the POST body instead.
-* (T141960) Multi-valued parameters may now be separated using U+001F (Unit Separator)
-  instead of the pipe character. This will be useful if some of the multiple
-  values need to contain pipes, e.g. for action=options.
-* The API will now warn if input is not NFC-normalized Unicode or if it
-  contains invalid characters.
-* The 'normalized' list output by action=query and other modules that use
-  ApiPageSet may contain entries where the 'from' value is percent-encoded as
-  the raw value cannot be represented in a valid API response. These are
-  indicated by a 'fromencoded' boolean alongside the existing 'from' parameter.
-* (T28680) action=paraminfo can now return info about all submodules of a
-  module without listing them all explicitly.
-* (T146770) It is now possible to assert that the current user is a specific
-  named user, using the 'assertuser' parameter.
-* (T141963) Added a 'known' property when missing-but-known titles (e.g. from
-  the 'TitleIsAlwaysKnown' hook) are output in various modules.
-
-=== Action API internal changes in 1.28 ===
-* Added a new hook, 'ApiMakeParserOptions', to allow extensions to better
-  interact with ApiParse and ApiExpandTemplates.
-* (T139565) SECURITY: API: Generate head items in the context of the given title
-* (T115333) SECURITY: Check read permission when loading page content in ApiParse
-* ApiBase::getResultData() was removed (deprecated since 1.25)
-* ApiBase::makeHelpArrayToString() was removed (deprecated since 1.25)
-* ApiBase::makeHelpMsgParameters() was removed (deprecated since 1.25)
-* ApiBase::makeHelpMsg() was removed (deprecated since 1.25)
-* ApiFormatBase::formatHTML() was removed (deprecated since 1.25)
-* ApiFormatBase::getNeedsRawData() was removed (deprecated since 1.25)
-* ApiFormatBase::getWantsHelp() was removed (deprecated since 1.25)
-* ApiFormatBase::setBufferResult() was removed (deprecated since 1.25)
-* ApiFormatBase::setHelp() was removed (deprecated since 1.25)
-* ApiFormatBase::setUnescapeAmps() was removed (deprecated since 1.25)
-* ApiMain::makeHelpMsgHeader() was removed (deprecated since 1.25)
-* ApiMain::reallyMakeHelpMsg() was removed (deprecated since 1.25)
-* ApiMain::setHelp() was removed (deprecated since 1.25)
-* ApiResult::beginContinuation() was removed (deprecated since 1.25)
-* ApiResult::cleanUpUTF8() was removed (deprecated since 1.25)
-* ApiResult::convertStatusToArray() was removed (deprecated since 1.25)
-* ApiResult::disableSizeCheck() was removed (deprecated since 1.24)
-* ApiResult::enableSizeCheck() was removed (deprecated since 1.24)
-* ApiResult::endContinuation() was removed (deprecated since 1.25)
-* ApiResult::getData() was removed (deprecated since 1.25)
-* ApiResult::getIsRawMode() was removed (deprecated since 1.25)
-* ApiResult::setContent() was removed (deprecated since 1.25)
-* ApiResult::setContinueParam() was removed (deprecated since 1.25)
-* ApiResult::setElement() was removed (deprecated since 1.25)
-* ApiResult::setGeneratorContinueParam() was removed (deprecated since 1.25)
-* ApiResult::setIndexedTagName_internal() was removed (deprecated since 1.25)
-* ApiResult::setIndexedTagName_recursive() was removed (deprecated since 1.25)
-* ApiResult::setMainForContinuation() was removed (deprecated since 1.25)
-* ApiResult::setParsedLimit() was removed (deprecated since 1.25)
-* ApiResult::setRawMode() was removed (deprecated since 1.25)
-* ApiResult::size() was removed (deprecated since 1.25)
-* Added new hooks, 'ApiQueryBaseBeforeQuery', 'ApiQueryBaseAfterQuery', and
-  'ApiQueryBaseProcessRow', to make it easier for extensions to add 'prop' and
-  'show' parameters to existing API query modules. A query module can enable
-  these hooks by passing an array for $hookData to ApiQueryBase::select() and
-  by calling ApiQueryBase->processRow() before adding a row's data to the
-  result.
-
-=== Languages updated in 1.28 ===
-
-MediaWiki supports over 350 languages. Many localisations are updated
-regularly. Below only new and removed languages are listed, as well as
-changes to languages because of Phabricator reports.
-
-* (T137411) ban (Balinese), thanks to translators Adi Mayndra, Andru,
-  BASAbali, M. Adiputra, Naval Scene, Nemo bis, NoiX180, and 아라.
-* (T135867) shn (Shan), thanks to translators Khun Sar, Piangpha,
-  Saiddzone Saimawnkham, Saosukham, and Sengwan.
-* Czech (cs) and Slovak (sk) set as reciprocal fallbacks.
-* (T146744) Livvi-Karelian (olo) namespace messages created thanks to translator Ilja.mos.
-
-=== Other changes in 1.28 ===
-* (T128697) Improved handling of large diffs.
-* [BREAKING CHANGE] $wgExtendedLoginCookies has been removed. You can
-  use or update a custom session provider if needed.
-* Deprecated APIEditBeforeSave hook in favor of EditFilterMergedContent.
-* The 'UploadVerification' hook is deprecated. Use 'UploadVerifyFile' instead.
-* SiteConfiguration::isLocalVHost() was removed (deprecated since 1.25).
-* The 'UserLoginComplete' hook has a new parameter to differentiate between actual
-  login and visiting the login page while already logged in.
-* ResourceLoader::makeLoaderURL() was removed (deprecated since 1.24).
-* $.fn.liveAndTestAtStart was removed (deprecated since 1.24).
-* mw.util.tooltipAccessKeyPrefix was removed (deprecated since 1.24).
-* mw.util.tooltipAccessKeyRegexp was removed (deprecated since 1.24).
-* Linker::link() and Linker::linkKnown() were deprecated; please instead use
-  MediaWiki\Linker\LinkRenderer. In addition, the LinkBegin and LinkEnd hooks
-  were replaced by HtmlPageLinkRendererBegin and HtmlPageLinkRendererEnd
-  respectively. See docs/hooks.txt for the specific changes needed for those hooks.
-* Linker::formatSize() was deprecated. Use Language::formatSize() directly.
-* Aliases for Linker methods, deprecated since 1.21, were removed from Skin:
-  * Skin::commentBlock() (use Linker::commentBlock() instead)
-  * Skin::generateRollback() (use Linker::generateRollback() instead)
-  * Skin::link() (use MediaWiki\Linker\LinkRenderer instead)
-  * Skin::linkKnown() (use MediaWiki\Linker\LinkRenderer instead)
-  * Skin::userLink() (use Linker::userLink() instead)
-  * Skin::userToolLinks() (use Linker::userToolLinks() instead)
-* Disabled "bug 2702" HTML tidying of parsed UI messages on wikis where Tidy is
-  disabled.
-* DifferenceEngine::generateDiffBody() was removed (deprecated since 1.21).
-* UploadBase::stashFileGetKey() and UploadBase::stashSession() were deprecated.
-  Use ...->stashFile()->getFileKey() instead.
-* "Public domain" was removed as a wiki license option from the installer, in
-  favour of CC-0.
-* AuthenticationRequest::$required is now changed from REQUIRED to PRIMARY_REQUIRED
-  on requests needed by primary providers even if all primaries need them.
-  Primary providers are discouraged from returning multiple REQUIRED requests.
-* OOjs UI PHP widgets constructed with the `'infusable' => true` config option
-  will no longer be automatically infused. You should call `OO.ui.infuse()`
-  on them yourself from your JavaScript code.
-* parserTests.php has moved to tests/parser/parserTests.php
-* The command line options specific to parser tests have been removed from
-  phpunit.php: --regex and --keep-uploads. Instead of --regex, use --filter.
-  Instead of --keep-uploads, use the same option to parserTests.php, but you
-  must specify a directory with --upload-dir.
-* The 'jquery.arrowSteps' ResourceLoader module is now deprecated.
-* IP::isConfiguredProxy() and IP::isTrustedProxy() were removed. Callers should
-  migrate to using the same functions on a ProxyLookup instance, obtainable from
-  MediaWikiServices.
-* The ArticleAfterFetchContent, ArticleInsertComplete, ArticleSave, ArticleSaveComplete,
-  ArticleViewCustom, EditFilterMerged, EditPageGetDiffText, EditPageGetPreviewText and
-  ShowRawCssJs hooks will now emit deprecation warnings if used.
-* (T68404) CSS3 attr() function with url type is no longer allowed
-  in inline styles.
-
-== Compatibility ==
-
-MediaWiki 1.28 requires PHP 5.5.9 or later. There is experimental support for
-HHVM 3.6.5 or later.
-
-MySQL is the recommended DBMS. PostgreSQL or SQLite can also be used, but
-support for them is somewhat less mature. There is experimental support for
-Oracle and Microsoft SQL Server.
-
-The supported versions are:
-
-* MySQL 5.0.3 or later
-* PostgreSQL 8.3 or later
-* SQLite 3.3.7 or later
-* Oracle 9.0.1 or later
-* Microsoft SQL Server 2005 (9.00.1399)
-
-== Upgrading ==
-
-1.28 has several database changes since 1.27, and will not work without schema
-updates. Note that due to changes to some very large tables like the revision
-table, the schema update may take quite long (minutes on a medium sized site,
-many hours on a large site).
-
-If upgrading from before 1.11, and you are using a wiki as a commons
-repository, make sure that it is updated as well. Otherwise, errors may arise
-due to database schema changes.
-
-If upgrading from before 1.7, you may want to run refreshLinks.php to ensure
-new database fields are filled with data.
-
-If you are upgrading from MediaWiki 1.4.x or earlier, you should upgrade to
-1.5 first. The upgrade script maintenance/upgrade1_5.php has been removed
-with MediaWiki 1.21.
-
-Don't forget to always back up your database before upgrading!
-
-See the file UPGRADE for more detailed upgrade instructions.
-
-For notes on 1.27.x and older releases, see HISTORY.
-
-== Online documentation ==
-
-Documentation for both end-users and site administrators is available on
-MediaWiki.org, and is covered under the GNU Free Documentation License (except
-for pages that explicitly state that their contents are in the public domain):
-
-       https://www.mediawiki.org/wiki/Special:MyLanguage/Documentation
-
-== Mailing list ==
-
-A mailing list is available for MediaWiki user support and discussion:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
-
-A low-traffic announcements-only list is also available:
-
-       https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce
-
-It's highly recommended that you sign up for one of these lists if you're
-going to run a public MediaWiki, so you can be notified of security fixes.
-
-== IRC help ==
-
-There's usually someone online in #mediawiki on irc.freenode.net.
index 5a38cf9..ab52544 100644 (file)
@@ -6,12 +6,23 @@ MediaWiki 1.29 is an alpha-quality branch and is not recommended for use in
 production.
 
 === Configuration changes in 1.29 ===
+* Default cookie expiration time has been reduced to 30 days. Login cookie expiration time is
+  kept at 180 days.
+* A new configuration variable has been added: $wgCookieSetOnAutoblock. This
+  determines whether to set a cookie when a user is autoblocked. Doing so means
+  that a blocked user, even after logging out and moving to a new IP address,
+  will still be blocked.
+* The resetpassword right and associated password reset capture feature has
+  been removed.
 
 === New features in 1.29 ===
+* (T5233) A cookie can now be set when a user is autoblocked, to track that user if
+  they move to a new IP address. This is disabled by default.
 
 === External library changes in 1.29 ===
 
 ==== Upgraded external libraries ====
+* Updated QUnit from v1.22.0 to v1.23.1.
 
 ==== New external libraries ====
 
@@ -24,6 +35,8 @@ production.
   action=createaccount, action=linkaccount, and action=changeauthenticationdata
   in the query string is now an error. They should be submitted in the POST
   body instead.
+* The capture option for action=resetpassword has been removed
+* action=clearhasmsg now requires a POST.
 
 === Action API internal changes in 1.29 ===
 
@@ -33,7 +46,16 @@ MediaWiki supports over 350 languages. Many localisations are updated
 regularly. Below only new and removed languages are listed, as well as
 changes to languages because of Phabricator reports.
 
+==== No fallback for Ukrainian ====
+* (T39314) The fallback from Ukrainian to Russian was removed. The Ukrainian
+  language will now use the default fallback language: English. When a translation
+  to Ukrainian is not available, an English string will be shown.
+
 === Other changes in 1.29 ===
+* Database::getSearchEngine() (deprecated in 1.28) was removed. Use
+  SearchEngineFactory::getSearchEngineClass() instead.
+* $wgSessionsInMemcached (deprecated in 1.20) was removed. No replacement is
+  required as all sessions are stored in Object Cache now.
 
 == Compatibility ==
 
index 30ef985..f0bbe92 100644 (file)
@@ -875,6 +875,7 @@ $wgAutoloadLocalClasses = [
        'MediaWiki\\Logger\\Monolog\\LegacyFormatter' => __DIR__ . '/includes/debug/logger/monolog/LegacyFormatter.php',
        'MediaWiki\\Logger\\Monolog\\LegacyHandler' => __DIR__ . '/includes/debug/logger/monolog/LegacyHandler.php',
        'MediaWiki\\Logger\\Monolog\\LineFormatter' => __DIR__ . '/includes/debug/logger/monolog/LineFormatter.php',
+       'MediaWiki\\Logger\\Monolog\\LogstashFormatter' => __DIR__ . '/includes/debug/logger/monolog/LogstashFormatter.php',
        'MediaWiki\\Logger\\Monolog\\SyslogHandler' => __DIR__ . '/includes/debug/logger/monolog/SyslogHandler.php',
        'MediaWiki\\Logger\\Monolog\\WikiProcessor' => __DIR__ . '/includes/debug/logger/monolog/WikiProcessor.php',
        'MediaWiki\\Logger\\NullSpi' => __DIR__ . '/includes/debug/logger/NullSpi.php',
index 2cf5fe1..30feaef 100644 (file)
                "SkinOOUIThemes": {
                        "type": "object"
                },
+               "PasswordPolicy": {
+                       "type": "object",
+                       "description": "Password policies"
+               },
+               "FileExtensions": {
+                       "type": "array",
+                       "description": "Preferred file extensions for uploading",
+                       "items": {
+                               "type": "string"
+                       }
+               },
                "callback": {
                        "type": [
                                "array",
index 8659dff..421ea5c 100644 (file)
                "SkinOOUIThemes": {
                        "type": "object"
                },
+               "PasswordPolicy": {
+                       "type": "object",
+                       "description": "Password policies"
+               },
+               "FileExtensions": {
+                       "type": "array",
+                       "description": "Preferred file extensions for uploading",
+                       "items": {
+                               "type": "string"
+                       }
+               },
                "callback": {
                        "type": [
                                "array",
index 4543077..a73d50f 100644 (file)
@@ -2464,6 +2464,13 @@ $revId: ID of the revision that was parsed to create $parserOutput
 'ParserCloned': Called when the parser is cloned.
 $parser: Newly-cloned Parser object
 
+'ParserFetchTemplate': Called when the parser fetches a template
+$parser: Parser Parser object or false
+$title: Title object of the template to be fetched
+$rev: Revision object of the template
+&$text: Transclusion text of the template or false or null
+&$deps: Array of template dependencies with 'title', 'page_id', 'rev_id' keys
+
 'ParserFirstCallInit': Called when the parser initialises for the first time.
 &$parser: Parser object being cleared
 
@@ -3217,6 +3224,15 @@ $engine: the search engine
   message key to use in the name column,
 $context: IContextSource object
 
+'SpecialTrackingCategories::preprocess': Called after LinkBatch on Special:TrackingCategories
+$specialPage: The SpecialTrackingCategories object
+$trackingCategories: Array of data from Special:TrackingCategories with msg and cats
+
+'SpecialTrackingCategories::generateCatLink': Called for each cat link on Special:TrackingCategories
+$specialPage: The SpecialTrackingCategories object
+$catTitle: The Title object of the linked category
+&$html: The Result html
+
 'SpecialUploadComplete': Called after successfully uploading a file from
 Special:Upload.
 &$form: The SpecialUpload object
@@ -3368,7 +3384,7 @@ PageArchive object has been created but before any further processing is done.
 &$archive: PageArchive object
 $title: Title object of the page that we're viewing
 
-'UndeleteForm::undelete': Called un UndeleteForm::undelete, after checking that
+'UndeleteForm::undelete': Called in UndeleteForm::undelete, after checking that
 the site is not in read-only mode, that the Title object is not null and after
 a PageArchive object has been constructed but before performing any further
 processing.
index 0686578..3e42c08 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Ajax
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Handle responses for Ajax requests (send headers, print
@@ -82,7 +83,7 @@ class AjaxResponse {
        function __construct( $text = null, Config $config = null ) {
                $this->mCacheDuration = null;
                $this->mVary = null;
-               $this->mConfig = $config ?: ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               $this->mConfig = $config ?: MediaWikiServices::getInstance()->getMainConfig();
 
                $this->mDisabled = false;
                $this->mText = '';
index a11ba26..8663d03 100644 (file)
@@ -1417,6 +1417,33 @@ class Block {
                $this->blocker = $user;
        }
 
+       /**
+        * Set the 'BlockID' cookie to this block's ID and expiry time. The cookie's expiry will be
+        * the same as the block's, unless it's greater than $wgCookieExpiration in which case
+        * $wgCookieExpiration will be used instead (defaults to 30 days).
+        *
+        * An empty value can also be set, in order to retain the cookie but remove the block ID
+        * (e.g. as used in User::getBlockedStatus).
+        *
+        * @param WebResponse $response The response on which to set the cookie.
+        * @param boolean $setEmpty Whether to set the cookie's value to the empty string.
+        */
+       public function setCookie( WebResponse $response, $setEmpty = false ) {
+               // Calculate the default expiry time.
+               $config = RequestContext::getMain()->getConfig();
+               $defaultExpiry = wfTimestamp() + $config->get( 'CookieExpiration' );
+
+               // Use the Block's expiry time only if it's less than the default.
+               $expiry = wfTimestamp( TS_UNIX, $this->getExpiry() );
+               if ( $expiry > $defaultExpiry ) {
+                       // The *default* default expiry is 30 days.
+                       $expiry = $defaultExpiry;
+               }
+
+               $cookieValue = $setEmpty ? '' : $this->getId();
+               $response->setCookie( 'BlockID', $cookieValue, $expiry );
+       }
+
        /**
         * Get the key and parameters for the corresponding error message.
         *
index 9d8ccf8..5557dca 100644 (file)
@@ -1586,7 +1586,7 @@ $wgEnableUserEmail = true;
 
 /**
  * Set to true to put the sending user's email in a Reply-To header
- * instead of From. ($wgEmergencyContact will be used as From.)
+ * instead of From. ($wgPasswordSender will be used as From.)
  *
  * Some mailers (eg SMTP) set the SMTP envelope sender to the From value,
  * which can cause problems with SPF validation and leak recipient addresses
@@ -2365,13 +2365,6 @@ $wgMainStash = 'db-replicated';
  */
 $wgParserCacheExpireTime = 86400;
 
-/**
- * Deprecated alias for $wgSessionsInObjectCache.
- *
- * @deprecated since 1.20; Use $wgSessionsInObjectCache
- */
-$wgSessionsInMemcached = true;
-
 /**
  * @deprecated since 1.27, session data is always stored in object cache.
  */
@@ -5864,7 +5857,7 @@ $wgProxyList = [];
 /**
  * Default cookie lifetime, in seconds. Setting to 0 makes all cookies session-only.
  */
-$wgCookieExpiration = 180 * 86400;
+$wgCookieExpiration = 30 * 86400;
 
 /**
  * Default login cookie lifetime, in seconds. Setting
@@ -5872,7 +5865,7 @@ $wgCookieExpiration = 180 * 86400;
  * calculate the cookie lifetime. As with $wgCookieExpiration, 0 will make
  * login cookies session-only.
  */
-$wgExtendedLoginCookieExpiration = null;
+$wgExtendedLoginCookieExpiration = 180 * 86400;
 
 /**
  * Set to set an explicit domain on the login cookies eg, "justthis.domain.org"
@@ -5926,6 +5919,12 @@ $wgCacheVaryCookies = [];
  */
 $wgSessionName = false;
 
+/**
+ * Whether to set a cookie when a user is autoblocked. Doing so means that a blocked user, even
+ * after logging out and moving to a new IP address, will still be blocked.
+ */
+$wgCookieSetOnAutoblock = false;
+
 /** @} */ # end of cookie settings }
 
 /************************************************************************//**
@@ -7510,6 +7509,7 @@ $wgLogActionsHandlers = [
        'contentmodel/change' => 'ContentModelLogFormatter',
        'contentmodel/new' => 'ContentModelLogFormatter',
        'delete/delete' => 'DeleteLogFormatter',
+       'delete/delete_redir' => 'DeleteLogFormatter',
        'delete/event' => 'DeleteLogFormatter',
        'delete/restore' => 'DeleteLogFormatter',
        'delete/revision' => 'DeleteLogFormatter',
@@ -7561,6 +7561,7 @@ $wgActionFilteredLogs = [
        ],
        'delete' => [
                'delete' => [ 'delete' ],
+               'delete_redir' => [ 'delete_redir' ],
                'restore' => [ 'restore' ],
                'event' => [ 'event' ],
                'revision' => [ 'revision' ],
@@ -8380,9 +8381,9 @@ $wgSearchRunSuggestedQuery = true;
 /**
  * Where popular password file is located.
  *
- * Default in core contains 50,000 most popular. This config
+ * Default in core contains 10,000 most popular. This config
  * allows you to change which file, in case you want to generate
- * a password file with > 50000 entries in it.
+ * a password file with > 10000 entries in it.
  *
  * @see maintenance/createCommonPasswordCdb.php
  * @since 1.27
index afa0574..745f8de 100644 (file)
@@ -2326,9 +2326,12 @@ class EditPage {
        }
 
        function setHeaders() {
-               global $wgOut, $wgUser, $wgAjaxEditStash;
+               global $wgOut, $wgUser, $wgAjaxEditStash, $wgCookieSetOnAutoblock;
 
                $wgOut->addModules( 'mediawiki.action.edit' );
+               if ( $wgCookieSetOnAutoblock === true ) {
+                       $wgOut->addModules( 'mediawiki.user.blockcookie' );
+               }
                $wgOut->addModuleStyles( 'mediawiki.action.edit.styles' );
 
                if ( $wgUser->getOption( 'showtoolbar' ) ) {
@@ -3407,6 +3410,7 @@ HTML
         *
         * @param Title $title
         * @param string $format Output format, valid values are any function of a Message object
+        * @param Language|string|null $langcode Language code or Language object.
         * @return string
         */
        public static function getCopyrightWarning( $title, $format = 'plain', $langcode = null ) {
@@ -3534,7 +3538,7 @@ HTML
                global $wgOut;
 
                if ( Hooks::run( 'EditPageBeforeConflictDiff', [ &$this, &$wgOut ] ) ) {
-                       $stats = $wgOut->getContext()->getStats();
+                       $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
                        $stats->increment( 'edit.failures.conflict' );
                        // Only include 'standard' namespaces to avoid creating unknown numbers of statsd metrics
                        if (
@@ -3673,7 +3677,7 @@ HTML
                global $wgOut, $wgRawHtml, $wgLang;
                global $wgAllowUserCss, $wgAllowUserJs;
 
-               $stats = $wgOut->getContext()->getStats();
+               $stats = MediaWikiServices::getInstance()->getStatsdDataFactory();
 
                if ( $wgRawHtml && !$this->mTokenOk ) {
                        // Could be an offsite preview attempt. This is very unsafe if
@@ -4067,7 +4071,7 @@ HTML
 
        /**
         * Returns an array of html code of the following buttons:
-        * save, diff, preview and live
+        * save, diff and preview
         *
         * @param int $tabindex Current tabindex
         *
@@ -4101,7 +4105,6 @@ HTML
                ] + Linker::tooltipAndAccesskeyAttribs( 'preview' );
                $buttons['preview'] = Html::submitButton( $this->context->msg( 'showpreview' )->text(),
                        $attribs );
-               $buttons['live'] = '';
 
                $attribs = [
                        'id' => 'wpDiff',
@@ -4402,26 +4405,26 @@ HTML
        }
 
        /**
-        * @param OutputPage &$out
+        * @param OutputPage $out
         * @since 1.29
         */
-       protected function addExplainConflictHeader( OutputPage &$out ) {
+       protected function addExplainConflictHeader( OutputPage $out ) {
                $out->wrapWikiMsg( "<div class='mw-explainconflict'>\n$1\n</div>", 'explainconflict' );
        }
 
        /**
         * @param string $name
         * @param mixed[] $customAttribs
-        * @param User $wgUser
+        * @param User $user
         * @return mixed[]
         * @since 1.29
         */
-       protected function buildTextboxAttribs( $name, array $customAttribs, User $wgUser ) {
+       protected function buildTextboxAttribs( $name, array $customAttribs, User $user ) {
                $attribs = $customAttribs + [
                                'accesskey' => ',',
                                'id' => $name,
-                               'cols' => $wgUser->getIntOption( 'cols' ),
-                               'rows' => $wgUser->getIntOption( 'rows' ),
+                               'cols' => $user->getIntOption( 'cols' ),
+                               'rows' => $user->getIntOption( 'rows' ),
                                // Avoid PHP notices when appending preferences
                                // (appending allows customAttribs['style'] to still work).
                                'style' => ''
@@ -4432,7 +4435,7 @@ HTML
                // * mw-editfont-monospace
                // * mw-editfont-sans-serif
                // * mw-editfont-serif
-               $class = 'mw-editfont-' . $wgUser->getOption( 'editfont' );
+               $class = 'mw-editfont-' . $user->getOption( 'editfont' );
 
                if ( isset( $attribs['class'] ) ) {
                        if ( is_string( $attribs['class'] ) ) {
index c1a12aa..85c78d6 100644 (file)
  * @since 1.17
  */
 class Message implements MessageSpecifier, Serializable {
+       /** Use message text as-is */
+       const FORMAT_PLAIN = 'plain';
+       /** Use normal wikitext -> HTML parsing (the result will be wrapped in a block-level HTML tag) */
+       const FORMAT_BLOCK_PARSE = 'block-parse';
+       /** Use normal wikitext -> HTML parsing but strip the block-level wrapper */
+       const FORMAT_PARSE = 'parse';
+       /** Transform {{..}} constructs but don't transform to HTML */
+       const FORMAT_TEXT = 'text';
+       /** Transform {{..}} constructs, HTML-escape the result */
+       const FORMAT_ESCAPED = 'escaped';
 
        /**
         * In which language to get this message. True, which is the default,
@@ -190,15 +200,8 @@ class Message implements MessageSpecifier, Serializable {
        protected $parameters = [];
 
        /**
-        * Format for the message.
-        * Supported formats are:
-        * * text (transform)
-        * * escaped (transform+htmlspecialchars)
-        * * block-parse
-        * * parse (default)
-        * * plain
-        *
         * @var string
+        * @deprecated
         */
        protected $format = 'parse';
 
@@ -347,8 +350,10 @@ class Message implements MessageSpecifier, Serializable {
         * @since 1.21
         *
         * @return string
+        * @deprecated since 1.29 formatting is not stateful
         */
        public function getFormat() {
+               wfDeprecated( __METHOD__, '1.29' );
                return $this->format;
        }
 
@@ -761,6 +766,7 @@ class Message implements MessageSpecifier, Serializable {
         */
        public function useDatabase( $useDatabase ) {
                $this->useDatabase = (bool)$useDatabase;
+               $this->message = null;
                return $this;
        }
 
@@ -796,9 +802,18 @@ class Message implements MessageSpecifier, Serializable {
         *
         * @since 1.17
         *
+        * @param string|null $format One of the FORMAT_* constants. Null means use whatever was used
+        *   the last time (this is for B/C and should be avoided).
+        *
         * @return string HTML
         */
-       public function toString() {
+       public function toString( $format = null ) {
+               if ( $format === null ) {
+                       $ex = new LogicException( __METHOD__ . ' using implicit format: ' . $this->format );
+                       \MediaWiki\Logger\LoggerFactory::getInstance( 'message-format' )->warning(
+                               $ex->getMessage(), [ 'exception' => $ex, 'format' => $this->format, 'key' => $this->key ] );
+                       $format = $this->format;
+               }
                $string = $this->fetchMessage();
 
                if ( $string === false ) {
@@ -808,6 +823,7 @@ class Message implements MessageSpecifier, Serializable {
                        // message key is user-controlled.
                        // '⧼' is used instead of '<' to side-step any
                        // double-escaping issues.
+                       // (Keep synchronised with mw.Message#toString in JS.)
                        return '⧼' . htmlspecialchars( $this->key ) . '⧽';
                }
 
@@ -821,23 +837,23 @@ class Message implements MessageSpecifier, Serializable {
                }
 
                # Replace parameters before text parsing
-               $string = $this->replaceParameters( $string, 'before' );
+               $string = $this->replaceParameters( $string, 'before', $format );
 
                # Maybe transform using the full parser
-               if ( $this->format === 'parse' ) {
+               if ( $format === self::FORMAT_PARSE ) {
                        $string = $this->parseText( $string );
                        $string = Parser::stripOuterParagraph( $string );
-               } elseif ( $this->format === 'block-parse' ) {
+               } elseif ( $format === self::FORMAT_BLOCK_PARSE ) {
                        $string = $this->parseText( $string );
-               } elseif ( $this->format === 'text' ) {
+               } elseif ( $format === self::FORMAT_TEXT ) {
                        $string = $this->transformText( $string );
-               } elseif ( $this->format === 'escaped' ) {
+               } elseif ( $format === self::FORMAT_ESCAPED ) {
                        $string = $this->transformText( $string );
                        $string = htmlspecialchars( $string, ENT_QUOTES, 'UTF-8', false );
                }
 
                # Raw parameter replacement
-               $string = $this->replaceParameters( $string, 'after' );
+               $string = $this->replaceParameters( $string, 'after', $format );
 
                return $string;
        }
@@ -852,17 +868,11 @@ class Message implements MessageSpecifier, Serializable {
         * @return string
         */
        public function __toString() {
-               if ( $this->format !== 'parse' ) {
-                       $ex = new LogicException( __METHOD__ . ' using implicit format: ' . $this->format );
-                       \MediaWiki\Logger\LoggerFactory::getInstance( 'message-format' )->warning(
-                               $ex->getMessage(), [ 'exception' => $ex, 'format' => $this->format, 'key' => $this->key ] );
-               }
-
                // PHP doesn't allow __toString to throw exceptions and will
                // trigger a fatal error if it does. So, catch any exceptions.
 
                try {
-                       return $this->toString();
+                       return $this->toString( self::FORMAT_PARSE );
                } catch ( Exception $ex ) {
                        try {
                                trigger_error( "Exception caught in " . __METHOD__ . " (message " . $this->key . "): "
@@ -871,10 +881,7 @@ class Message implements MessageSpecifier, Serializable {
                                // Doh! Cause a fatal error after all?
                        }
 
-                       if ( $this->format === 'plain' || $this->format === 'text' ) {
-                               return '<' . $this->key . '>';
-                       }
-                       return '&lt;' . htmlspecialchars( $this->key ) . '&gt;';
+                       return '⧼' . htmlspecialchars( $this->key ) . '⧽';
                }
        }
 
@@ -886,8 +893,8 @@ class Message implements MessageSpecifier, Serializable {
         * @return string Parsed HTML.
         */
        public function parse() {
-               $this->format = 'parse';
-               return $this->toString();
+               $this->format = self::FORMAT_PARSE;
+               return $this->toString( self::FORMAT_PARSE );
        }
 
        /**
@@ -898,8 +905,8 @@ class Message implements MessageSpecifier, Serializable {
         * @return string Unescaped message text.
         */
        public function text() {
-               $this->format = 'text';
-               return $this->toString();
+               $this->format = self::FORMAT_TEXT;
+               return $this->toString( self::FORMAT_TEXT );
        }
 
        /**
@@ -910,8 +917,8 @@ class Message implements MessageSpecifier, Serializable {
         * @return string Unescaped untransformed message text.
         */
        public function plain() {
-               $this->format = 'plain';
-               return $this->toString();
+               $this->format = self::FORMAT_PLAIN;
+               return $this->toString( self::FORMAT_PLAIN );
        }
 
        /**
@@ -922,8 +929,8 @@ class Message implements MessageSpecifier, Serializable {
         * @return string HTML
         */
        public function parseAsBlock() {
-               $this->format = 'block-parse';
-               return $this->toString();
+               $this->format = self::FORMAT_BLOCK_PARSE;
+               return $this->toString( self::FORMAT_BLOCK_PARSE );
        }
 
        /**
@@ -935,8 +942,8 @@ class Message implements MessageSpecifier, Serializable {
         * @return string Escaped message text.
         */
        public function escaped() {
-               $this->format = 'escaped';
-               return $this->toString();
+               $this->format = self::FORMAT_ESCAPED;
+               return $this->toString( self::FORMAT_ESCAPED );
        }
 
        /**
@@ -1070,13 +1077,14 @@ class Message implements MessageSpecifier, Serializable {
         *
         * @param string $message The message text.
         * @param string $type Either "before" or "after".
+        * @param string $format One of the FORMAT_* constants.
         *
         * @return string
         */
-       protected function replaceParameters( $message, $type = 'before' ) {
+       protected function replaceParameters( $message, $type = 'before', $format ) {
                $replacementKeys = [];
                foreach ( $this->parameters as $n => $param ) {
-                       list( $paramType, $value ) = $this->extractParam( $param );
+                       list( $paramType, $value ) = $this->extractParam( $param, $format );
                        if ( $type === $paramType ) {
                                $replacementKeys['$' . ( $n + 1 )] = $value;
                        }
@@ -1091,10 +1099,11 @@ class Message implements MessageSpecifier, Serializable {
         * @since 1.18
         *
         * @param mixed $param Parameter as defined in this class.
+        * @param string $format One of the FORMAT_* constants.
         *
         * @return array Array with the parameter type (either "before" or "after") and the value.
         */
-       protected function extractParam( $param ) {
+       protected function extractParam( $param, $format ) {
                if ( is_array( $param ) ) {
                        if ( isset( $param['raw'] ) ) {
                                return [ 'after', $param['raw'] ];
@@ -1113,7 +1122,7 @@ class Message implements MessageSpecifier, Serializable {
                        } elseif ( isset( $param['bitrate'] ) ) {
                                return [ 'before', $this->getLanguage()->formatBitrate( $param['bitrate'] ) ];
                        } elseif ( isset( $param['plaintext'] ) ) {
-                               return [ 'after', $this->formatPlaintext( $param['plaintext'] ) ];
+                               return [ 'after', $this->formatPlaintext( $param['plaintext'], $format ) ];
                        } else {
                                $warning = 'Invalid parameter for message "' . $this->getKey() . '": ' .
                                        htmlspecialchars( serialize( $param ) );
@@ -1124,10 +1133,27 @@ class Message implements MessageSpecifier, Serializable {
                                return [ 'before', '[INVALID]' ];
                        }
                } elseif ( $param instanceof Message ) {
+                       // Match language, flags, etc. to the current message.
+                       $msg = clone $param;
+                       if ( $msg->language !== $this->language || $msg->useDatabase !== $this->useDatabase ) {
+                               // Cache depends on these parameters
+                               $msg->message = null;
+                       }
+                       $msg->interface = $this->interface;
+                       $msg->language = $this->language;
+                       $msg->useDatabase = $this->useDatabase;
+                       $msg->title = $this->title;
+
+                       // DWIM
+                       if ( $format === 'block-parse' ) {
+                               $format = 'parse';
+                       }
+                       $msg->format = $format;
+
                        // Message objects should not be before parameters because
                        // then they'll get double escaped. If the message needs to be
                        // escaped, it'll happen right here when we call toString().
-                       return [ 'after', $param->toString() ];
+                       return [ 'after', $msg->toString( $format ) ];
                } else {
                        return [ 'before', $param ];
                }
@@ -1207,18 +1233,19 @@ class Message implements MessageSpecifier, Serializable {
         * @since 1.25
         *
         * @param string $plaintext String to ensure plaintext output of
+        * @param string $format One of the FORMAT_* constants.
         *
-        * @return string Input plaintext encoded for output to $this->format
+        * @return string Input plaintext encoded for output to $format
         */
-       protected function formatPlaintext( $plaintext ) {
-               switch ( $this->format ) {
-               case 'text':
-               case 'plain':
+       protected function formatPlaintext( $plaintext, $format ) {
+               switch ( $format ) {
+               case self::FORMAT_TEXT:
+               case self::FORMAT_PLAIN:
                        return $plaintext;
 
-               case 'parse':
-               case 'block-parse':
-               case 'escaped':
+               case self::FORMAT_PARSE:
+               case self::FORMAT_BLOCK_PARSE:
+               case self::FORMAT_ESCAPED:
                default:
                        return htmlspecialchars( $plaintext, ENT_QUOTES );
 
index c03bce7..f062d13 100644 (file)
  * @file
  */
 use MediaWiki\MediaWikiServices;
-use MediaWiki\Logger\LoggerFactory;
+use Wikimedia\Assert\Assert;
 
+/**
+ * @deprecated since 1.29
+ * MimeAnalyzer should be used instead of MimeMagic
+ */
 class MimeMagic extends MimeAnalyzer {
        /**
         * Get an instance of this class
         * @return MimeMagic
-        * @deprecated since 1.28
+        * @deprecated since 1.28 get a MimeAnalyzer instance form MediaWikiServices
         */
        public static function singleton() {
-               return MediaWikiServices::getInstance()->getMIMEAnalyzer();
-       }
-
-       /**
-        * @param array $params
-        * @param Config $mainConfig
-        * @return array
-        */
-       public static function applyDefaultParameters( array $params, Config $mainConfig ) {
-               $logger = LoggerFactory::getInstance( 'Mime' );
-               $params += [
-                       'typeFile' => $mainConfig->get( 'MimeTypeFile' ),
-                       'infoFile' => $mainConfig->get( 'MimeInfoFile' ),
-                       'xmlTypes' => $mainConfig->get( 'XMLMimeTypes' ),
-                       'guessCallback' =>
-                               function ( $mimeAnalyzer, &$head, &$tail, $file, &$mime ) use ( $logger ) {
-                                       // Also test DjVu
-                                       $deja = new DjVuImage( $file );
-                                       if ( $deja->isValid() ) {
-                                               $logger->info( __METHOD__ . ": detected $file as image/vnd.djvu\n" );
-                                               $mime = 'image/vnd.djvu';
-
-                                               return;
-                                       }
-                                       // Some strings by reference for performance - assuming well-behaved hooks
-                                       Hooks::run(
-                                               'MimeMagicGuessFromContent',
-                                               [ $mimeAnalyzer, &$head, &$tail, $file, &$mime ]
-                                       );
-                               },
-                       'extCallback' => function ( $mimeAnalyzer, $ext, &$mime ) {
-                               // Media handling extensions can improve the MIME detected
-                               Hooks::run( 'MimeMagicImproveFromExtension', [ $mimeAnalyzer, $ext, &$mime ] );
-                       },
-                       'initCallback' => function ( $mimeAnalyzer ) {
-                               // Allow media handling extensions adding MIME-types and MIME-info
-                               Hooks::run( 'MimeMagicInit', [ $mimeAnalyzer ] );
-                       },
-                       'logger' => $logger
-               ];
-
-               if ( $params['infoFile'] === 'includes/mime.info' ) {
-                       $params['infoFile'] = __DIR__ . "/libs/mime/mime.info";
-               }
-
-               if ( $params['typeFile'] === 'includes/mime.types' ) {
-                       $params['typeFile'] = __DIR__ . "/libs/mime/mime.types";
-               }
-
-               $detectorCmd = $mainConfig->get( 'MimeDetectorCommand' );
-               if ( $detectorCmd ) {
-                       $params['detectCallback'] = function ( $file ) use ( $detectorCmd ) {
-                               return wfShellExec( "$detectorCmd " . wfEscapeShellArg( $file ) );
-                       };
-               }
-
-               return $params;
+               // XXX: We know that the MimeAnalyzer is currently an instance of MimeMagic
+               $instance = MediaWikiServices::getInstance()->getMimeAnalyzer();
+               Assert::postcondition(
+                       $instance instanceof MimeMagic,
+                       __METHOD__ . ' should return an instance of ' . MimeMagic::class
+               );
+               return $instance;
        }
 }
index a8f6f8e..cbb4651 100644 (file)
@@ -457,7 +457,9 @@ class MovePage {
                                $nt->getArticleID(),
                                /* $commit */ false,
                                $errs,
-                               $user
+                               $user,
+                               [],
+                               'delete_redir'
                        );
 
                        if ( !$status->isGood() ) {
index 50629ba..43d71ab 100644 (file)
@@ -107,7 +107,10 @@ class OutputPage extends ContextSource {
        protected $mCategoryLinks = [];
 
        /** @var array */
-       protected $mCategories = [];
+       protected $mCategories = [
+               'hidden' => [],
+               'normal' => [],
+       ];
 
        /** @var array */
        protected $mIndicators = [];
@@ -1249,31 +1252,7 @@ class OutputPage extends ContextSource {
                        return;
                }
 
-               # Add the links to a LinkBatch
-               $arr = [ NS_CATEGORY => $categories ];
-               $lb = new LinkBatch;
-               $lb->setArray( $arr );
-
-               # Fetch existence plus the hiddencat property
-               $dbr = wfGetDB( DB_REPLICA );
-               $fields = array_merge(
-                       LinkCache::getSelectFields(),
-                       [ 'page_namespace', 'page_title', 'pp_value' ]
-               );
-
-               $res = $dbr->select( [ 'page', 'page_props' ],
-                       $fields,
-                       $lb->constructSet( 'page', $dbr ),
-                       __METHOD__,
-                       [],
-                       [ 'page_props' => [ 'LEFT JOIN', [
-                               'pp_propname' => 'hiddencat',
-                               'pp_page = page_id'
-                       ] ] ]
-               );
-
-               # Add the results to the link cache
-               $lb->addResultToCache( LinkCache::singleton(), $res );
+               $res = $this->addCategoryLinksToLBAndGetResult( $categories );
 
                # Set all the values to 'normal'.
                $categories = array_fill_keys( array_keys( $categories ), 'normal' );
@@ -1303,12 +1282,46 @@ class OutputPage extends ContextSource {
                                        continue;
                                }
                                $text = $wgContLang->convertHtml( $title->getText() );
-                               $this->mCategories[] = $title->getText();
+                               $this->mCategories[$type][] = $title->getText();
                                $this->mCategoryLinks[$type][] = Linker::link( $title, $text );
                        }
                }
        }
 
+       /**
+        * @param array $categories
+        * @return bool|ResultWrapper
+        */
+       protected function addCategoryLinksToLBAndGetResult( array $categories ) {
+               # Add the links to a LinkBatch
+               $arr = [ NS_CATEGORY => $categories ];
+               $lb = new LinkBatch;
+               $lb->setArray( $arr );
+
+               # Fetch existence plus the hiddencat property
+               $dbr = wfGetDB( DB_REPLICA );
+               $fields = array_merge(
+                       LinkCache::getSelectFields(),
+                       [ 'page_namespace', 'page_title', 'pp_value' ]
+               );
+
+               $res = $dbr->select( [ 'page', 'page_props' ],
+                       $fields,
+                       $lb->constructSet( 'page', $dbr ),
+                       __METHOD__,
+                       [],
+                       [ 'page_props' => [ 'LEFT JOIN', [
+                               'pp_propname' => 'hiddencat',
+                               'pp_page = page_id'
+                       ] ] ]
+               );
+
+               # Add the results to the link cache
+               $lb->addResultToCache( LinkCache::singleton(), $res );
+
+               return $res;
+       }
+
        /**
         * Reset the category links (but not the category list) and add $categories
         *
@@ -1332,12 +1345,26 @@ class OutputPage extends ContextSource {
        }
 
        /**
-        * Get the list of category names this page belongs to
+        * Get the list of category names this page belongs to.
         *
+        * @param string $type The type of categories which should be returned. Possible values:
+        *  * all: all categories of all types
+        *  * hidden: only the hidden categories
+        *  * normal: all categories, except hidden categories
         * @return array Array of strings
         */
-       public function getCategories() {
-               return $this->mCategories;
+       public function getCategories( $type = 'all' ) {
+               if ( $type === 'all' ) {
+                       $allCategories = [];
+                       foreach ( $this->mCategories as $categories ) {
+                               $allCategories = array_merge( $allCategories, $categories );
+                       }
+                       return $allCategories;
+               }
+               if ( !isset( $this->mCategories[$type] ) ) {
+                       throw new InvalidArgumentException( 'Invalid category type given: ' . $type );
+               }
+               return $this->mCategories[$type];
        }
 
        /**
index c2197a6..4fec472 100644 (file)
@@ -96,7 +96,7 @@ return [
                $config = $services->getMainConfig();
                return new ClassicInterwikiLookup(
                        $wgContLang,
-                       ObjectCache::getMainWANInstance(),
+                       $services->getMainWANObjectCache(),
                        $config->get( 'InterwikiExpiry' ),
                        $config->get( 'InterwikiCache' ),
                        $config->get( 'InterwikiScopes' ),
@@ -214,12 +214,56 @@ return [
        },
 
        'MimeAnalyzer' => function( MediaWikiServices $services ) {
-               return new MimeMagic(
-                       MimeMagic::applyDefaultParameters(
-                               [],
-                               $services->getMainConfig()
-                       )
-               );
+               $logger = LoggerFactory::getInstance( 'Mime' );
+               $mainConfig = $services->getMainConfig();
+               $params = [
+                       'typeFile' => $mainConfig->get( 'MimeTypeFile' ),
+                       'infoFile' => $mainConfig->get( 'MimeInfoFile' ),
+                       'xmlTypes' => $mainConfig->get( 'XMLMimeTypes' ),
+                       'guessCallback' =>
+                               function ( $mimeAnalyzer, &$head, &$tail, $file, &$mime ) use ( $logger ) {
+                                       // Also test DjVu
+                                       $deja = new DjVuImage( $file );
+                                       if ( $deja->isValid() ) {
+                                               $logger->info( __METHOD__ . ": detected $file as image/vnd.djvu\n" );
+                                               $mime = 'image/vnd.djvu';
+
+                                               return;
+                                       }
+                                       // Some strings by reference for performance - assuming well-behaved hooks
+                                       Hooks::run(
+                                               'MimeMagicGuessFromContent',
+                                               [ $mimeAnalyzer, &$head, &$tail, $file, &$mime ]
+                                       );
+                               },
+                       'extCallback' => function ( $mimeAnalyzer, $ext, &$mime ) {
+                               // Media handling extensions can improve the MIME detected
+                               Hooks::run( 'MimeMagicImproveFromExtension', [ $mimeAnalyzer, $ext, &$mime ] );
+                       },
+                       'initCallback' => function ( $mimeAnalyzer ) {
+                               // Allow media handling extensions adding MIME-types and MIME-info
+                               Hooks::run( 'MimeMagicInit', [ $mimeAnalyzer ] );
+                       },
+                       'logger' => $logger
+               ];
+
+               if ( $params['infoFile'] === 'includes/mime.info' ) {
+                       $params['infoFile'] = __DIR__ . "/libs/mime/mime.info";
+               }
+
+               if ( $params['typeFile'] === 'includes/mime.types' ) {
+                       $params['typeFile'] = __DIR__ . "/libs/mime/mime.types";
+               }
+
+               $detectorCmd = $mainConfig->get( 'MimeDetectorCommand' );
+               if ( $detectorCmd ) {
+                       $params['detectCallback'] = function ( $file ) use ( $detectorCmd ) {
+                               return wfShellExec( "$detectorCmd " . wfEscapeShellArg( $file ) );
+                       };
+               }
+
+               // XXX: MimeMagic::singleton currently requires this service to return an instance of MimeMagic
+               return new MimeMagic( $params );
        },
 
        'ProxyLookup' => function( MediaWikiServices $services ) {
@@ -238,7 +282,7 @@ return [
        'LinkCache' => function( MediaWikiServices $services ) {
                return new LinkCache(
                        $services->getTitleFormatter(),
-                       ObjectCache::getMainWANInstance()
+                       $services->getMainWANObjectCache()
                );
        },
 
index 357c76d..9f722af 100644 (file)
@@ -462,7 +462,7 @@ if ( $wgMaximalPasswordLength !== false ) {
 }
 
 // Backwards compatibility warning
-if ( !$wgSessionsInObjectCache && !$wgSessionsInMemcached ) {
+if ( !$wgSessionsInObjectCache ) {
        wfDeprecated( '$wgSessionsInObjectCache = false', '1.27' );
        if ( $wgSessionHandler ) {
                wfDeprecated( '$wgSessionsHandler', '1.27' );
index a1e6d5b..470a75c 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\MediaWikiServices;
+
 /**
  * Handles compiling Mustache templates into PHP rendering functions
  *
@@ -98,7 +100,7 @@ class TemplateParser {
                $fastHash = md5( $fileContents );
 
                // Fetch a secret key for building a keyed hash of the PHP code
-               $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               $config = MediaWikiServices::getInstance()->getMainConfig();
                $secretKey = $config->get( 'SecretKey' );
 
                if ( $secretKey ) {
index 4a7f623..0ba964f 100644 (file)
@@ -26,7 +26,7 @@
 /**
  * An action that views article content
  *
- * This is a wrapper that will call Article::render().
+ * This is a wrapper that will call Article::view().
  *
  * @ingroup Actions
  */
index 506ff73..0cd46e4 100644 (file)
@@ -67,7 +67,8 @@ abstract class ApiBase extends ContextSource {
         * - limit: An integer or the string 'max'. Default lower limit is 0 (but
         *   see PARAM_MIN), and requires that PARAM_MAX and PARAM_MAX2 be
         *   specified. Cannot be used with PARAM_ISMULTI.
-        * - namespace: An integer representing a MediaWiki namespace.
+        * - namespace: An integer representing a MediaWiki namespace. Forces PARAM_ALL = true to
+        *   support easily specifying all namespaces.
         * - NULL: Any string.
         * - password: Any non-empty string. Input value is private or sensitive.
         *   <input type="password"> would be an appropriate HTML form field.
@@ -171,8 +172,18 @@ abstract class ApiBase extends ContextSource {
         */
        const PARAM_SUBMODULE_PARAM_PREFIX = 16;
 
+       /**
+        * (boolean|string) When PARAM_TYPE has a defined set of values and PARAM_ISMULTI is true,
+        * this allows for an asterisk ('*') to be passed in place of a pipe-separated list of
+        * every possible value. If a string is set, it will be used in place of the asterisk.
+        * @since 1.29
+        */
+       const PARAM_ALL = 17;
+
        /**@}*/
 
+       const ALL_DEFAULT_STRING = '*';
+
        /** Fast query, standard limit. */
        const LIMIT_BIG1 = 500;
        /** Fast query, apihighlimits limit. */
@@ -920,6 +931,7 @@ abstract class ApiBase extends ContextSource {
                        $dupes = false;
                        $deprecated = false;
                        $required = false;
+                       $allowAll = false;
                } else {
                        $default = isset( $paramSettings[self::PARAM_DFLT] )
                                ? $paramSettings[self::PARAM_DFLT]
@@ -939,6 +951,9 @@ abstract class ApiBase extends ContextSource {
                        $required = isset( $paramSettings[self::PARAM_REQUIRED] )
                                ? $paramSettings[self::PARAM_REQUIRED]
                                : false;
+                       $allowAll = isset( $paramSettings[self::PARAM_ALL] )
+                               ? $paramSettings[self::PARAM_ALL]
+                               : false;
 
                        // When type is not given, and no choices, the type is the same as $default
                        if ( !isset( $type ) ) {
@@ -992,6 +1007,9 @@ abstract class ApiBase extends ContextSource {
 
                        if ( isset( $value ) && $type == 'namespace' ) {
                                $type = MWNamespace::getValidNamespaces();
+                               // By default, namespace parameters allow ALL_DEFAULT_STRING to be used to specify
+                               // all namespaces.
+                               $allowAll = true;
                        }
                        if ( isset( $value ) && $type == 'submodule' ) {
                                if ( isset( $paramSettings[self::PARAM_SUBMODULE_MAP] ) ) {
@@ -1027,12 +1045,19 @@ abstract class ApiBase extends ContextSource {
                        }
                }
 
+               $allSpecifier = ( is_string( $allowAll ) ? $allowAll : self::ALL_DEFAULT_STRING );
+               if ( $allowAll && $multi && is_array( $type ) && in_array( $allSpecifier, $type, true ) ) {
+                       ApiBase::dieDebug(
+                               __METHOD__,
+                               "For param $encParamName, PARAM_ALL collides with a possible value" );
+               }
                if ( isset( $value ) && ( $multi || is_array( $type ) ) ) {
                        $value = $this->parseMultiValue(
                                $encParamName,
                                $value,
                                $multi,
-                               is_array( $type ) ? $type : null
+                               is_array( $type ) ? $type : null,
+                               $allowAll ? $allSpecifier : null
                        );
                }
 
@@ -1215,9 +1240,13 @@ abstract class ApiBase extends ContextSource {
         *  separated by '|'?
         * @param string[]|null $allowedValues An array of values to check against. If
         *  null, all values are accepted.
+        * @param string|null $allSpecifier String to use to specify all allowed values, or null
+        *  if this behavior should not be allowed
         * @return string|string[] (allowMultiple ? an_array_of_values : a_single_value)
         */
-       protected function parseMultiValue( $valueName, $value, $allowMultiple, $allowedValues ) {
+       protected function parseMultiValue( $valueName, $value, $allowMultiple, $allowedValues,
+               $allSpecifier = null
+       ) {
                if ( ( trim( $value ) === '' || trim( $value ) === "\x1f" ) && $allowMultiple ) {
                        return [];
                }
@@ -1229,6 +1258,12 @@ abstract class ApiBase extends ContextSource {
                        ? self::LIMIT_SML2
                        : self::LIMIT_SML1;
 
+               if ( $allowMultiple && is_array( $allowedValues ) && $allSpecifier &&
+                       count( $valuesList ) === 1 && $valuesList[0] === $allSpecifier
+               ) {
+                       return $allowedValues;
+               }
+
                if ( self::truncateArray( $valuesList, $sizeLimit ) ) {
                        $this->logFeatureUsage( "too-many-$valueName-for-{$this->getModulePath()}" );
                        $this->setWarning( "Too many values supplied for parameter '$valueName': " .
index 13b3577..99242a8 100644 (file)
@@ -45,7 +45,7 @@ class ApiClearHasMsg extends ApiBase {
        }
 
        public function mustBePosted() {
-               return false;
+               return true;
        }
 
        protected function getExamplesMessages() {
index 4c406a7..67f54a8 100644 (file)
@@ -33,6 +33,7 @@ abstract class ApiFormatBase extends ApiBase {
        private $mIsHtml, $mFormat, $mUnescapeAmps, $mHelp;
        private $mBuffer, $mDisabled = false;
        private $mIsWrappedHtml = false;
+       private $mHttpStatus = false;
        protected $mForceDefaultParams = false;
 
        /**
@@ -147,6 +148,23 @@ abstract class ApiFormatBase extends ApiBase {
                }
        }
 
+       /**
+        * Set the HTTP status code to be used for the response
+        * @since 1.29
+        * @param int $code
+        */
+       public function setHttpStatus( $code ) {
+               if ( $this->mDisabled ) {
+                       return;
+               }
+
+               if ( $this->getIsHtml() ) {
+                       $this->mHttpStatus = $code;
+               } else {
+                       $this->getMain()->getRequest()->response()->statusHeader( $code );
+               }
+       }
+
        /**
         * Initialize the printer function and prepare the output headers.
         * @param bool $unused Always false since 1.25
@@ -212,6 +230,18 @@ abstract class ApiFormatBase extends ApiBase {
                                                ApiHelp::fixHelpLinks( $header )
                                        )
                                );
+
+                               if ( $this->mHttpStatus && $this->mHttpStatus !== 200 ) {
+                                       $out->addHTML(
+                                               Html::rawElement( 'div', [ 'class' => 'api-pretty-header api-pretty-status' ],
+                                                       $this->msg(
+                                                               'api-format-prettyprint-status',
+                                                               $this->mHttpStatus,
+                                                               HttpStatus::getMessage( $this->mHttpStatus )
+                                                       )->parse()
+                                               )
+                                       );
+                               }
                        }
 
                        if ( Hooks::run( 'ApiFormatHighlight', [ $context, $result, $mime, $format ] ) ) {
@@ -225,6 +255,8 @@ abstract class ApiFormatBase extends ApiBase {
                                $time = microtime( true ) - $this->getConfig()->get( 'RequestTime' );
                                $json = FormatJson::encode(
                                        [
+                                               'status' => (int)( $this->mHttpStatus ?: 200 ),
+                                               'statustext' => HttpStatus::getMessage( $this->mHttpStatus ?: 200 ),
                                                'html' => $out->getHTML(),
                                                'modules' => array_values( array_unique( array_merge(
                                                        $out->getModules(),
index 02efd7b..2a6c938 100644 (file)
@@ -645,6 +645,20 @@ class ApiHelp extends ApiBase {
                                                        if ( $extra ) {
                                                                $info[] = implode( ' ', $extra );
                                                        }
+
+                                                       $allowAll = isset( $settings[ApiBase::PARAM_ALL] )
+                                                               ? $settings[ApiBase::PARAM_ALL]
+                                                               : false;
+                                                       if ( $allowAll || $settings[ApiBase::PARAM_TYPE] === 'namespace' ) {
+                                                               if ( $settings[ApiBase::PARAM_TYPE] === 'namespace' ) {
+                                                                       $allSpecifier = ApiBase::ALL_DEFAULT_STRING;
+                                                               } else {
+                                                                       $allSpecifier = ( is_string( $allowAll ) ? $allowAll : ApiBase::ALL_DEFAULT_STRING );
+                                                               }
+                                                               $info[] = $context->msg( 'api-help-param-multi-all' )
+                                                                       ->params( $allSpecifier )
+                                                                       ->parse();
+                                                       }
                                                }
                                        }
 
index ce2f930..38299b4 100644 (file)
@@ -572,11 +572,7 @@ class ApiMain extends ApiBase {
 
                $response = $this->getRequest()->response();
                $headerStr = 'MediaWiki-API-Error: ' . $errCode;
-               if ( $e->getCode() === 0 ) {
-                       $response->header( $headerStr );
-               } else {
-                       $response->header( $headerStr, true, $e->getCode() );
-               }
+               $response->header( $headerStr );
 
                // Reset and print just the error message
                ob_clean();
@@ -585,7 +581,7 @@ class ApiMain extends ApiBase {
                $this->createErrorPrinter();
 
                try {
-                       $this->printResult( true );
+                       $this->printResult( $e->getCode() );
                } catch ( UsageException $ex ) {
                        // The error printer itself is failing. Try suppressing its request
                        // parameters and redo.
@@ -595,7 +591,10 @@ class ApiMain extends ApiBase {
                        $this->mPrinter = null;
                        $this->createErrorPrinter();
                        $this->mPrinter->forceDefaultParams();
-                       $this->printResult( true );
+                       if ( $e->getCode() ) {
+                               $response->statusHeader( 200 ); // Reset in case the fallback doesn't want a non-200
+                       }
+                       $this->printResult( $e->getCode() );
                }
        }
 
@@ -1441,7 +1440,7 @@ class ApiMain extends ApiBase {
                        MWDebug::appendDebugInfoToApiResult( $this->getContext(), $this->getResult() );
 
                        // Print result data
-                       $this->printResult( false );
+                       $this->printResult();
                }
        }
 
@@ -1621,15 +1620,18 @@ class ApiMain extends ApiBase {
        /**
         * Print results using the current printer
         *
-        * @param bool $isError
+        * @param int $httpCode HTTP status code, or 0 to not change
         */
-       protected function printResult( $isError ) {
+       protected function printResult( $httpCode = 0 ) {
                if ( $this->getConfig()->get( 'DebugAPI' ) !== false ) {
                        $this->setWarning( 'SECURITY WARNING: $wgDebugAPI is enabled' );
                }
 
                $printer = $this->mPrinter;
                $printer->initPrinter( false );
+               if ( $httpCode ) {
+                       $printer->setHttpStatus( $httpCode );
+               }
                $printer->execute();
                $printer->closePrinter();
        }
index 46c57b8..1a509c5 100644 (file)
@@ -23,6 +23,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * This class contains a list of pages that the client has requested.
@@ -915,7 +916,7 @@ class ApiPageSet extends ApiBase {
                }
 
                // Get gender information
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $genderCache->doQuery( $usernames, __METHOD__ );
        }
 
@@ -1197,7 +1198,7 @@ class ApiPageSet extends ApiBase {
                        }
                }
                // Get gender information
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $genderCache->doQuery( $usernames, __METHOD__ );
 
                return $linkBatch;
index caf0cd7..ffc3fc2 100644 (file)
@@ -406,6 +406,21 @@ class ApiParamInfo extends ApiBase {
                                        $item['type'] = array_values( $item['type'] );
                                        ApiResult::setIndexedTagName( $item['type'], 't' );
                                }
+
+                               // Add 'allspecifier' if applicable
+                               if ( $item['type'] === 'namespace' ) {
+                                       $allowAll = true;
+                                       $allSpecifier = ApiBase::ALL_DEFAULT_STRING;
+                               } else {
+                                       $allowAll = isset( $settings[ApiBase::PARAM_ALL] )
+                                               ? $settings[ApiBase::PARAM_ALL]
+                                               : false;
+                                       $allSpecifier = ( is_string( $allowAll ) ? $allowAll : ApiBase::ALL_DEFAULT_STRING );
+                               }
+                               if ( $allowAll && $item['multi'] &&
+                                       ( is_array( $item['type'] ) || $item['type'] === 'namespace' ) ) {
+                                       $item['allspecifier'] = $allSpecifier;
+                               }
                        }
                        if ( isset( $settings[ApiBase::PARAM_MAX] ) ) {
                                $item['max'] = $settings[ApiBase::PARAM_MAX];
index 553995c..8734f38 100644 (file)
@@ -44,10 +44,10 @@ class ApiQueryAllImages extends ApiQueryGeneratorBase {
         * which may not necessarily be the same as the local DB.
         *
         * TODO: allow querying non-local repos.
-        * @return Database
+        * @return IDatabase
         */
        protected function getDB() {
-               return $this->mRepo->getSlaveDB();
+               return $this->mRepo->getReplicaDB();
        }
 
        public function execute() {
index 0ce1939..6a0f124 100644 (file)
@@ -23,6 +23,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Query module to enumerate all available pages.
@@ -206,7 +207,7 @@ class ApiQueryAllPages extends ApiQueryGeneratorBase {
                        foreach ( $res as $row ) {
                                $users[] = $row->page_title;
                        }
-                       GenderCache::singleton()->doQuery( $users, __METHOD__ );
+                       MediaWikiServices::getInstance()->getGenderCache()->doQuery( $users, __METHOD__ );
                        $res->rewind(); // reset
                }
 
index 0bb7ff8..19e0c93 100644 (file)
@@ -253,6 +253,8 @@ class ApiQuerySiteinfo extends ApiQueryBase {
                $data['maxuploadsize'] = UploadBase::getMaxUploadSize();
                $data['minuploadchunksize'] = (int)$config->get( 'MinUploadChunkSize' );
 
+               $data['galleryoptions'] = $config->get( 'GalleryOptions' );
+
                $data['thumblimits'] = $config->get( 'ThumbLimits' );
                ApiResult::setArrayType( $data['thumblimits'], 'BCassoc' );
                ApiResult::setIndexedTagName( $data['thumblimits'], 'limit' );
index 042ad69..2d7f5df 100644 (file)
@@ -65,13 +65,13 @@ class ApiResetPassword extends ApiBase {
 
                $passwordReset = new PasswordReset( $this->getConfig(), AuthManager::singleton() );
 
-               $status = $passwordReset->isAllowed( $this->getUser(), $params['capture'] );
+               $status = $passwordReset->isAllowed( $this->getUser() );
                if ( !$status->isOK() ) {
                        $this->dieStatus( Status::wrap( $status ) );
                }
 
                $status = $passwordReset->execute(
-                       $this->getUser(), $params['user'], $params['email'], $params['capture']
+                       $this->getUser(), $params['user'], $params['email']
                );
                if ( !$status->isOK() ) {
                        $status->value = null;
@@ -80,12 +80,6 @@ class ApiResetPassword extends ApiBase {
 
                $result = $this->getResult();
                $result->addValue( [ 'resetpassword' ], 'status', 'success' );
-               if ( $params['capture'] ) {
-                       $passwords = $status->getValue() ?: [];
-                       ApiResult::setArrayType( $passwords, 'kvp', 'user' );
-                       ApiResult::setIndexedTagName( $passwords, 'p' );
-                       $result->addValue( [ 'resetpassword' ], 'passwords', $passwords );
-               }
        }
 
        public function isWriteMode() {
@@ -111,7 +105,6 @@ class ApiResetPassword extends ApiBase {
                        'email' => [
                                ApiBase::PARAM_TYPE => 'string',
                        ],
-                       'capture' => false,
                ];
 
                $resetRoutes = $this->getConfig()->get( 'PasswordResetRoutes' );
index d28165d..fccdc0f 100644 (file)
@@ -8,6 +8,11 @@
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Llista d'alderique]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios de la API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Fallos y solicitúes]\n</div>\n<strong>Estau:</strong> Toles carauterístiques qu'apaecen nesta páxina tendríen de funcionar, pero la API inda ta en desendolcu activu, y puede camudar en cualquier momentu. Suscríbete a la [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ llista de corréu mediawiki-api-announce] p'avisos sobro anovamientos.\n\n<strong>Solicitúes incorreutes:</strong> Cuando s'unvíen solicitúes incorreutes a la API, unvíase una cabecera HTTP cola clave \"MediaWiki-API-Error\" y, darréu, tanto'l valor de la cabecera como'l códigu d'error devueltu pondránse al mesmu valor. Pa más información, consulta [[mw:API:Errors_and_warnings|API: Errores y avisos]].\n\n<strong>Pruebes:</strong> Pa facilitar les pruebes de solicitúes API, consulta [[Special:ApiSandbox]].",
        "apihelp-main-param-action": "Qué aición facer.",
        "apihelp-main-param-format": "El formatu de la salida.",
+       "apihelp-main-param-maxlag": "El retrasu (lag) máximu puede utilizase cuando MediaWiki ta instaláu nun conxuntu de bases de datos replicaes. Pa evitar les aiciones que pudieran causar un retrasu entá mayor na replicación del sitiu, esti parámetru puede causar que'l cliente espere hasta que'l retrasu de replicación sía menor que'l valor especificáu. En casu de retrasu escesivu, devuélvese un códigu d'error <samp>maxlag</samp> con un mensaxe asemeyáu a <samp>Esperando a $host: $lag segundos de retrasu<s/amp>.<br />Ver [[mw:Manual:Maxlag_parameter|Manual:Parámetru maxlag]] pa más información.",
+       "apihelp-main-param-smaxage": "Establez l'encabezáu HTTP <code>s-maxage</code> de control de caché a esta cantidá de segundos. Los errores nunca se guarden na caché.",
+       "apihelp-main-param-maxage": "Establez l'encabezáu HTTP <code>max-age</code> de control de caché a esta cantidá de segundos. Los errores nunca se guarden na caché.",
+       "apihelp-main-param-assert": "Comprobar que l'usuariu tien sesión aniciada si'l valor ye <kbd>user</kbd> o que tien el permisu de bot si ye <kbd>bot</kbd>.",
+       "apihelp-main-param-assertuser": "Comprobar que'l usuariu actual ye l'usuariu nomáu.",
        "apihelp-main-param-servedby": "Incluyir el nome del host que sirvió la solicitú nes resultancies.",
        "apihelp-main-param-curtimestamp": "Incluyir la marca de tiempu actual na resultancia.",
        "apihelp-block-description": "Bloquiar a un usuariu.",
index 4fe6a04..6f8f596 100644 (file)
@@ -4,5 +4,8 @@
                        "Ibrahim khashrowdi"
                ]
        },
-       "apihelp-block-description": "کار زوروکئ بستین"
+       "apihelp-block-description": "کار زوروکئ بستین",
+       "apihelp-createaccount-param-name": "کار زورؤکین نام.",
+       "apihelp-login-param-name": "کار زورؤکین نام.",
+       "apihelp-userrights-param-user": "کار زورؤکین نام."
 }
index a0668c9..f1ce435 100644 (file)
        "apihelp-xmlfm-description": "Daten im XML-Format ausgeben (schöngedruckt in HTML).",
        "api-format-title": "MediaWiki-API-Ergebnis",
        "api-format-prettyprint-header": "Dies ist die HTML-Repräsentation des $1-Formats. HTML ist zur Fehlerbehebung gut, aber unpassend für den Anwendungsgebrauch.\n\nGib den Parameter <var>format</var> an, um das Ausgabeformat zu ändern. Um die Nicht-HTML-Repräsentation des $1-Formats anzusehen, lege <kbd>format=$2</kbd> fest.\n\nSiehe die [[mw:API|vollständige Dokumentation]] oder die [[Special:ApiHelp/main|API-Hilfe]] für weitere Informationen.",
+       "api-format-prettyprint-status": "Diese Antwort wird mit dem HTTP-Status $1 $2 zurückgegeben.",
        "api-pageset-param-titles": "Eine Liste der Titel, an denen gearbeitet werden soll.",
        "api-pageset-param-pageids": "Eine Liste der Seitenkennungen, an denen gearbeitet werden soll.",
        "api-pageset-param-revids": "Eine Liste der Versionskennungen, an denen gearbeitet werden soll.",
        "api-help-param-upload": "Muss als Dateiupload mithilfe eines multipart/form-data-Formular bereitgestellt werden.",
        "api-help-param-multi-separate": "Werte mit <kbd>|</kbd> trennen oder [[Special:ApiHelp/main#main/datatypes|Alternative]].",
        "api-help-param-multi-max": "Maximale Anzahl der Werte ist {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} für Bots).",
+       "api-help-param-multi-all": "Um alle Werte anzugeben, verwende <kbd>$1</kbd>.",
        "api-help-param-default": "Standard: $1",
        "api-help-param-default-empty": "Standard: <span class=\"apihelp-empty\">(leer)</span>",
        "api-help-param-token": "Ein „$1“-Token abgerufen von [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
index fe73a56..28cd746 100644 (file)
        "apihelp-resetpassword-description-noroutes": "No password reset routes are available.\n\nEnable routes in <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> to use this module.",
        "apihelp-resetpassword-param-user": "User being reset.",
        "apihelp-resetpassword-param-email": "Email address of the user being reset.",
-       "apihelp-resetpassword-param-capture": "Return the temporary passwords that were sent. Requires the <code>passwordreset</code> user right.",
        "apihelp-resetpassword-example-user": "Send a password reset email to user <kbd>Example</kbd>.",
        "apihelp-resetpassword-example-email": "Send a password reset email for all users with email address <kbd>user@example.com</kbd>.",
 
        "api-format-title": "MediaWiki API result",
        "api-format-prettyprint-header": "This is the HTML representation of the $1 format. HTML is good for debugging, but is unsuitable for application use.\n\nSpecify the <var>format</var> parameter to change the output format. To see the non-HTML representation of the $1 format, set <kbd>format=$2</kbd>.\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
        "api-format-prettyprint-header-only-html": "This is an HTML representation intended for debugging, and is unsuitable for application use.\n\nSee the [[mw:API|complete documentation]], or the [[Special:ApiHelp/main|API help]] for more information.",
+       "api-format-prettyprint-status": "This response would be returned with HTTP status $1 $2.",
 
        "api-pageset-param-titles": "A list of titles to work on.",
        "api-pageset-param-pageids": "A list of page IDs to work on.",
        "api-help-param-upload": "Must be posted as a file upload using multipart/form-data.",
        "api-help-param-multi-separate": "Separate values with <kbd>|</kbd> or [[Special:ApiHelp/main#main/datatypes|alternative]].",
        "api-help-param-multi-max": "Maximum number of values is {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} for bots).",
+       "api-help-param-multi-all": "To specify all values, use <kbd>$1</kbd>.",
        "api-help-param-default": "Default: $1",
        "api-help-param-default-empty": "Default: <span class=\"apihelp-empty\">(empty)</span>",
        "api-help-param-token": "A \"$1\" token retrieved from [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
index 7442fd7..1078a6d 100644 (file)
@@ -24,7 +24,9 @@
                        "Dgstranz",
                        "Copper12",
                        "Irus",
-                       "Hamilton Abreu"
+                       "Hamilton Abreu",
+                       "Pompilos",
+                       "Igv"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentación]]\n* [[mw:API:FAQ|Preguntas frecuentes]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de correo]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anuncios de la API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Errores y peticiones]\n</div>\n<strong>Estado:</strong> Todas las características que se muestran en esta página deberían funcionar, pero la API aún se encuentra en desarrollo activo y puede cambiar en cualquier momento. Suscríbete a [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ la lista de correo de mediawiki-api-announce] para estar al día de las actualizaciones.\n\n<strong>Solicitudes erróneas:</strong> Cuando se envían solicitudes erróneas a la API, se envía una cabecera HTTP con la clave \"MediaWiki-API-Error\". El valor de la cabecera y el código de error devuelto tomarán el mismo valor. Para más información, véase [[mw:API:Errors_and_warnings|API: Errores y advertencias]].\n\n<strong>Pruebas:</strong> para facilitar las pruebas de solicitudes a la API, consulta [[Special:ApiSandbox]].",
        "apihelp-edit-param-tags": "Cambia las etiquetas para aplicarlas a la revisión.",
        "apihelp-edit-param-minor": "Edición menor.",
        "apihelp-edit-param-notminor": "Edición no menor.",
-       "apihelp-edit-param-bot": "Marcar esta edición como de bot.",
+       "apihelp-edit-param-bot": "Marcar esta edición como edición de bot.",
        "apihelp-edit-param-basetimestamp": "Marca de tiempo de la revisión base, usada para detectar conflictos de edición. Se puede obtener mediante [[Special:ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]]",
        "apihelp-edit-param-starttimestamp": "Marca de tiempo de cuando empezó el proceso de edición, usada para detectar conflictos de edición. Se puede obtener un valor apropiado usando <var>[[Special:ApiHelp/main|curtimestamp]]</var> cuando comiences el proceso de edición (por ejemplo, al cargar el contenido de la página por editar).",
        "apihelp-edit-param-recreate": "Reemplazar los errores acerca de la página de haber sido eliminados en el ínterin.",
        "apihelp-query+langlinks-param-url": "Obtener la URL completa o no (no se puede usar con <var>$1prop</var>).",
        "apihelp-query+langlinks-param-prop": "Qué propiedades adicionales obtener para cada enlace interlingüe:",
        "apihelp-query+langlinks-paramvalue-prop-url": "Añade el URL completo.",
-       "apihelp-query+langlinks-paramvalue-prop-autonym": "Añade el nombre del idioma nativo.",
+       "apihelp-query+langlinks-paramvalue-prop-autonym": "Añade el nombre nativo del idioma.",
        "apihelp-query+langlinks-param-lang": "Devolver solo enlaces de idioma con este código de idioma.",
        "apihelp-query+langlinks-param-dir": "La dirección en que ordenar la lista.",
        "apihelp-query+links-param-limit": "Cuántos enlaces se devolverán.",
        "apihelp-tag-example-rev": "Añadir la etiqueta <kbd>vandalism</kbd> al identificador de revisión 123 sin especificar un motivo",
        "apihelp-tag-example-log": "Eliminar la etiqueta <kbd>spam</kbd> de la entrada del registro con identificador 123 con el motivo <kbd>Wrongly applied</kbd>",
        "apihelp-unblock-description": "Desbloquear un usuario.",
-       "apihelp-unblock-param-user": "Nombre de usuario, dirección IP o rango de direcciones IP para desbloquear. No se puede utilizar junto con <var>$1id</var>.",
+       "apihelp-unblock-param-user": "Nombre de usuario, dirección IP o intervalo de direcciones IP para desbloquear. No se puede utilizar junto con <var>$1id</var>.",
        "apihelp-unblock-param-reason": "Motivo del desbloqueo.",
        "apihelp-unblock-example-id": "Desbloquear el bloqueo de ID #<kbd>105</kbd>",
        "apihelp-unblock-example-user": "Desbloquear al usuario <kbd>Bob</kbd> con el motivo <kbd>Sorry Bob</kbd>",
index 5f09064..be2f9a0 100644 (file)
@@ -3,7 +3,8 @@
                "authors": [
                        "Subi",
                        "Sator",
-                       "An13sa"
+                       "An13sa",
+                       "Gorkaazk"
                ]
        },
        "apihelp-main-param-action": "Zein ekintza burutuko da.",
@@ -48,7 +49,7 @@
        "apihelp-login-param-name": "Erabiltzaile izena.",
        "apihelp-login-param-password": "Pasahitza.",
        "apihelp-login-param-domain": "Domeinua (hautazkoa).",
-       "apihelp-login-example-login": "Saioa hasi",
+       "apihelp-login-example-login": "Hasi saioa",
        "apihelp-move-description": "Orrialde bat mugitu",
        "apihelp-move-param-reason": "Berrizenpenaren arrazoia.",
        "apihelp-move-param-noredirect": "Birzuzenketarik ez sortu.",
index 84dad2c..9a923c7 100644 (file)
        "apihelp-expandtemplates-paramvalue-prop-ttl": "Le délai maximum après lequel la mise en cache de ce résultat doit être invalidée.",
        "apihelp-expandtemplates-paramvalue-prop-modules": "Tous les modules ResourceLoader que les fonctions d’analyse ont demandé d’ajouter à la sortie. Soit <kbd>jsconfigvars</kbd> soit <kbd>encodedjsconfigvars</kbd> doit être demandé avec <kbd>modules</kbd>.",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Donne les variables de configuration JavaScript spécifiques à la page.",
-       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Donne les variables de configuration JavaScript spécifiques à la page sous forme de chaîne JSON.",
+       "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Donne les variables de configuration JavaScript spécifiques à la page sous la forme d'une chaîne JSON.",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "L’arbre d’analyse XML de l’entrée.",
        "apihelp-expandtemplates-param-includecomments": "S’il faut inclure les commentaires HTML dans la sortie.",
        "apihelp-expandtemplates-param-generatexml": "Générer l’arbre d’analyse XML (remplacé par $1prop=parsetree).",
        "apihelp-feedcontributions-param-feedformat": "Le format du flux.",
        "apihelp-feedcontributions-param-user": "Pour quels utilisateurs récupérer les contributions.",
        "apihelp-feedcontributions-param-namespace": "Par quels espaces de nom filtrer les contributions.",
-       "apihelp-feedcontributions-param-year": "Depuis l’année (et plus récent).",
+       "apihelp-feedcontributions-param-year": "De l’année (et antérieur).",
        "apihelp-feedcontributions-param-month": "Depuis le mois (et plus récent).",
        "apihelp-feedcontributions-param-tagfilter": "Filtrer les contributions qui ont ces balises.",
        "apihelp-feedcontributions-param-deletedonly": "Afficher uniquement les contributions supprimées.",
        "apihelp-resetpassword-description-noroutes": "Aucun chemin pour réinitialiser le mot de passe n’est disponible.\n\nActiver les chemins dans <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> pour utiliser ce module.",
        "apihelp-resetpassword-param-user": "Utilisateur ayant été réinitialisé.",
        "apihelp-resetpassword-param-email": "Adresse courriel de l’utilisateur ayant été réinitialisé.",
-       "apihelp-resetpassword-param-capture": "Renvoyer les mots de passe temporaires déjà envoyés. Nécessite le droit utilisateur <code>passwordreset</code>.",
        "apihelp-resetpassword-example-user": "Envoyer un courriel de réinitialisation du mot de passe à l’utilisateur <kbd>Exemple</kbd>.",
        "apihelp-resetpassword-example-email": "Envoyer un courriel pour la réinitialisation de mot de passe à tous les utilisateurs avec une adresse email <kbd>user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "Supprimer et annuler la suppression des révisions.",
        "api-format-title": "Résultat de l’API de MediaWiki",
        "api-format-prettyprint-header": "Voici la représentation HTML du format $1. HTML est utile pour le débogage, mais inapproprié pour être utilisé dans une application.\n\nSpécifiez le paramètre <var>format</var> pour modifier le format de sortie. Pour voir la représentation non HTML du format $1, mettez <kbd>format=$2</kbd>.\n\nVoyez la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
        "api-format-prettyprint-header-only-html": "Ceci est une représentation HTML à des fins de déboguage, et n’est pas approprié à une utilisation applicative.\n\nVoir la [[mw:API|documentation complète]], ou l’[[Special:ApiHelp/main|aide de l’API]] pour plus d’information.",
+       "api-format-prettyprint-status": "Cette réponse serait retournée avec l'état HTTP $1 $2.",
        "api-pageset-param-titles": "Une liste des titres sur lesquels travailler.",
        "api-pageset-param-pageids": "Une liste des IDs de page sur lesquelles travailler.",
        "api-pageset-param-revids": "Une liste des IDs de révision sur lesquelles travailler.",
        "api-help-param-upload": "Doit être envoyé comme un fichier importé utilisant multipart/form-data.",
        "api-help-param-multi-separate": "Valeurs séparées par <kbd>|</kbd> ou [[Special:ApiHelp/main#main/datatypes|autre]].",
        "api-help-param-multi-max": "Le nombre maximal de valeurs est {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} pour les robots).",
+       "api-help-param-multi-all": "Pour spécifier toutes les valeurs, utiliser <kbd>$1</kbd>.",
        "api-help-param-default": "Par défaut : $1",
        "api-help-param-default-empty": "Par défaut : <span class=\"apihelp-empty\">(vide)</span>",
        "api-help-param-token": "Un jeton « $1 » récupéré par [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
index 902221a..69fdf56 100644 (file)
        "apihelp-resetpassword-description-noroutes": "Non están dispoñibles as rutas de reinicio de contrasinal \n\nActive as rutas en <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> para usar este módulo.",
        "apihelp-resetpassword-param-user": "Usuario sendo reinicializado.",
        "apihelp-resetpassword-param-email": "Está reinicializándose o enderezo de correo electrónico do usuario.",
-       "apihelp-resetpassword-param-capture": "Devolve os contrasinais temporais que se enviaron. Require o dereito de usuario <code>passwordreset</code> .",
        "apihelp-resetpassword-example-user": "Enviar un correo de reinicialización de contrasinal ó usuario <kbd>Exemplo</kbd>.",
        "apihelp-resetpassword-example-email": "Enviar un correo de reinicialización de contrasinal a todos os usuarios con enderezo de correo electrónico <kbd>usario@exemplo.com</kbd>.",
        "apihelp-revisiondelete-description": "Borrar e restaurar revisións.",
        "api-format-title": "Resultado de API de MediaWiki",
        "api-format-prettyprint-header": "Esta é a representación HTML do formato $1. HTML é bó para depurar, pero non é axeitado para usar nunha aplicación.\n\nEspecifique o parámetro <var>format</var> para cambiar o formato de saída. Para ver a representación non-HTML do formato $1, fixe <kbd>format=$2</kbd>.\n\n\nRevise a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para obter máis información.",
        "api-format-prettyprint-header-only-html": "Esta é unha representación HTML empregada para a depuración de erros, e non é axeitada para o uso de aplicacións.\n\nVexa a [[mw:API|documentación completa]], ou a [[Special:ApiHelp/main|axuda da API]] para máis información.",
+       "api-format-prettyprint-status": "Esta resposta será devolta co estado de HTTP $1 $2.",
        "api-pageset-param-titles": "Lista de títulos nos que traballar.",
        "api-pageset-param-pageids": "Lista de identificadores de páxina nos que traballar.",
        "api-pageset-param-revids": "Unha lista de IDs de modificacións sobre as que traballar.",
        "api-help-param-upload": "Debe ser enviado como un ficheiro importado usando multipart/form-data.",
        "api-help-param-multi-separate": "Separe os valores con <kbd>|</kbd> ou [[Special:ApiHelp/main#main/datatypes|outros]].",
        "api-help-param-multi-max": "O número máximo de valores é {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} para os bots).",
+       "api-help-param-multi-all": "Para especificar tódolos valores use <kbd>$1</kbd>.",
        "api-help-param-default": "Por defecto: $1",
        "api-help-param-default-empty": "Por defecto: <span class=\"apihelp-empty\">(baleiro)</span>",
        "api-help-param-token": "Un identificador \"$1\" recuperado por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
index 16e6d8a..52b28d6 100644 (file)
        "apihelp-resetpassword-description-noroutes": "אין מסלולים לאיפוס ססמה.\n\nכדי להשתמש במודול הזה, יש להפעיל מסלולים ב־<var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>.",
        "apihelp-resetpassword-param-user": "המשתמש שמאופס.",
        "apihelp-resetpassword-param-email": "כתובת הדוא\"ל של המשתמש שהסיסמה שלו מאופסת.",
-       "apihelp-resetpassword-param-capture": "החזרת הססמאות הזמניות שנשלחו. דורש את ההרשאה <code>passwordreset</code>.",
        "apihelp-resetpassword-example-user": "שליחת מכתב איפוס ססמה למשתמש <kbd>Example</kbd>.",
        "apihelp-resetpassword-example-email": "שליחת מכתב איפוס ססמה לכל המשתמשים שהכתובת שלהם היא <kbd>user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "מחיקה ושחזור ממחיקה של גרסאות.",
        "api-format-title": "תוצאה של API של מדיה־ויקי",
        "api-format-prettyprint-header": "זהו ייצוג ב־HTML של תסדיר $1. תסדיר HTML טוב לתיקון שגיאות, אבל אינו מתאים ליישומים.\n\nיש לציין את הפרמטר <var>format</var> כדי לשנות את תסדיר הפלט. כדי לראות ייצוג של תסדיר $1 לא ב־HTML יש לרשום <kbd>format=$2</kbd>.\n\nר' את [[mw:API|התיעוד המלא]], או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
        "api-format-prettyprint-header-only-html": "זה ייצוג HTML שמיועד לניפוי שגיאות ואינו מתאים לשימוש ביישומים.\n\nר' את [[mw:API|התיעוד המלא]] או את [[Special:ApiHelp/main|העזרה של API]] למידע נוסף.",
+       "api-format-prettyprint-status": "התשובה הזאת הייתה מוחזרת עם סטטוס ה־HTTP מס' $1 עם הטקסט $2.",
        "api-pageset-param-titles": "רשימת כותרות.",
        "api-pageset-param-pageids": "רשימת מזהי דף לעבוד עליהם.",
        "api-pageset-param-revids": "רשימת מזהי גרסה לעבוד עליהם.",
        "api-help-param-upload": "חייב להישלח (posted) בתור העלאת קובץ באמצעות multipart/form-data.",
        "api-help-param-multi-separate": "הפרדה בין ערכים נעשית באמצעות <kbd>|</kbd> או [[Special:ApiHelp/main#main/datatypes|תו חלופי]].",
        "api-help-param-multi-max": "מספר הערכים המרבי הוא {{PLURAL:$1|$1}} (עבור בוטים – {{PLURAL:$2|$2}}).",
+       "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-param-token": "אסימון \"$1\" שאוחזר מ־[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
index d93dc23..b585885 100644 (file)
@@ -4,7 +4,8 @@
                        "WongKentir",
                        "Beeyan",
                        "Rachmat.Wahidi",
-                       "Kenrick95"
+                       "Kenrick95",
+                       "Presidenvolksraad"
                ]
        },
        "apihelp-main-param-action": "Tindakan manakah yang akan dilakukan.",
@@ -94,5 +95,6 @@
        "apihelp-login-example-login": "Masuk log.",
        "apihelp-query+prefixsearch-param-profile": "Cari profil untuk digunakan.",
        "apihelp-query+search-param-qiprofile": "Meminta profil independen untuk digunakan (berefek pada algoritma peringkat).",
-       "apihelp-revisiondelete-param-ids": "Penanda untuk perubahan yang akan dihapus"
+       "apihelp-revisiondelete-param-ids": "Penanda untuk perubahan yang akan dihapus",
+       "api-format-prettyprint-status": "Tanggapan ini akan dikembalikan dengan status $1 $2 HTTP."
 }
index 48521a1..ea3f415 100644 (file)
        "apihelp-resetpassword-description-noroutes": "Non sono disponibili rotte per la reimpostazione della password.\n\nAbilita le rotte in <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var> per usare questo modulo.",
        "apihelp-resetpassword-param-user": "Utente in corso di ripristino.",
        "apihelp-resetpassword-param-email": "Indirizzo di posta elettronica dell'utente in corso di ripristino.",
-       "apihelp-resetpassword-param-capture": "Restituisce le password temporanee che erano state inviate. Richiede il diritto utente <code>passwordreset</code>.",
        "apihelp-resetpassword-example-user": "Invia una mail per reimpostare la password all'utente <kbd>Example</kbd>.",
        "apihelp-resetpassword-example-email": "Invia una mail per reimpostare la password a tutti gli utenti con indirizzo di posta elettronica <kbd>user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "Cancella e ripristina le versioni.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=Il valore deve essere compreso|2=I valori devono essere compresi}} tra $2 e $3.",
        "api-help-param-multi-separate": "Separa i valori con <kbd>|</kbd> o [[Special:ApiHelp/main#main/datatypes|alternativa]].",
        "api-help-param-multi-max": "Il numero massimo di valori è {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} per i bot).",
+       "api-help-param-multi-all": "Per specificare tutti i valori, utilizza <kbd>$1</kbd>.",
        "api-help-param-default": "Predefinito: $1",
        "api-help-param-default-empty": "Predefinito: <span class=\"apihelp-empty\">(vuoto)</span>",
        "api-help-param-token": "Un token \"$1\" recuperato da [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
index f85ea9f..d9d079b 100644 (file)
@@ -10,7 +10,8 @@
                        "Sujiniku",
                        "Macofe",
                        "Suchichi02",
-                       "Kkairri"
+                       "Kkairri",
+                       "ネイ"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|説明文書]]\n* [[mw:API:FAQ|よくある質問]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api メーリングリスト]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 告知]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R バグの報告とリクエスト]\n</div>\n<strong>状態:</strong> このページに表示されている機能は全て動作するはずですが、この API は未だ活発に開発されており、変更される可能性があります。アップデートの通知を受け取るには、[https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ the mediawiki-api-announce メーリングリスト]に参加してください。\n\n<strong>誤ったリクエスト:</strong> 誤ったリクエストが API に送られた場合、\"MediaWiki-API-Error\" HTTP ヘッダーが送信され、そのヘッダーの値と送り返されるエラーコードは同じ値にセットされます。より詳しい情報は [[mw:API:Errors_and_warnings|API: Errors and warnings]] を参照してください。\n\n<strong>テスト:</strong> API のリクエストのテストは、[[Special:ApiSandbox]]で簡単に行えます。",
        "apihelp-opensearch-example-te": "<kbd>Te</kbd> から始まるページを検索する。",
        "apihelp-options-param-reset": "個人設定をサイトの既定値にリセットする。",
        "apihelp-options-param-resetkinds": "<var>$1reset</var> が設定されている場合、リセットする設定項目の種類のリスト。",
-       "apihelp-options-param-change": "名前=値 の形式 (例えば skin=vector) で整形された変更のリスト。値はパイプ文字を含むことができません。optionname|otheroption|... のように値が与えられない (イコール記号すら無い) 場合、設定は既定値にリセットされます。",
+       "apihelp-options-param-change": "名前=値 の形式 (例えば skin=vector) で整形された変更のリスト。optionname|otheroption|... のように値が与えられなかった (イコール記号すら無い) 場合、設定は既定値にリセットされます。与えられた値がパイプ(<kbd>|</kbd>)を含む場合、[[Special:ApiHelp/main#main/datatypes|ほかのセパレーター]]をお使いください。",
        "apihelp-options-example-reset": "すべて初期設定に戻す。",
        "apihelp-options-example-change": "<kbd>skin</kbd> および <kbd>hideminor</kbd> の個人設定を変更する。",
        "apihelp-options-example-complex": "すべての個人設定を初期化し、<kbd>skin</kbd> および <kbd> nickname </kbd> を設定する。",
index f15bec1..012ca8e 100644 (file)
@@ -13,7 +13,8 @@
                        "Yearning",
                        "Priviet",
                        "Ykhwong",
-                       "Jonghaya"
+                       "Jonghaya",
+                       "Jerrykim306"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|설명문서]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api 메일링 리스트]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce API 알림 사항]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R 버그 및 요청]\n</div>\n<strong>상태:</strong> 이 페이지에 보이는 모든 기능은 정상적으로 작동하지만, API는 여전히 활발하게 개발되고 있으며, 언제든지 변경될 수 있습니다. 업데이트 공지를 받아보려면 [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ mediawiki-api-announce 메일링 리스트]를 구독하십시오.\n\n<strong>잘못된 요청:</strong> API에 잘못된 요청이 전송되면 \"MediaWiki-API-Error\" 키가 포함된 HTTP 헤더가 전송되며 반환되는 헤더와 오류 코드의 값은 동일한 값으로 설정됩니다. 자세한 정보에 대해서는 [[mw:API:Errors_and_warnings|API:오류와 경고]]를 참조하십시오.\n\n<strong>테스트하기:</strong> API 요청 테스트를 용이하게 하려면, [[Special:ApiSandbox]]를 보십시오.",
@@ -23,6 +24,7 @@
        "apihelp-main-param-smaxage": "<code>s-maxage</code> HTTP 캐시 컨트롤 헤더를 설정합니다. 오류는 캐시되지 않습니다.",
        "apihelp-main-param-maxage": "<code>max-age</code> HTTP 캐시 컨트롤 헤더를 설정합니다. 오류는 캐시되지 않습니다.",
        "apihelp-main-param-assert": "<kbd>user</kbd> 플래그가 설정되어 있다면 로그인 여부를 체크하며, <kbd>bot</kbd>  플래그가 설정되어 있다면 봇 사용자 권한이 설정되어 있는지 확인합니다.",
+       "apihelp-main-param-assertuser": "현재 사용자가 지명된 사용자인지 확인합니다.",
        "apihelp-main-param-requestid": "주어진 요청 값은 응답에 포함됩니다. 요청을 구분하기 위해 사용될 수 있습니다.",
        "apihelp-main-param-servedby": "결과에 요청을 처리한 호스트네임을 포함합니다.",
        "apihelp-main-param-curtimestamp": "결과의 타임스탬프를 포함합니다.",
        "apihelp-feedwatchlist-param-feedformat": "피드 포맷.",
        "apihelp-feedwatchlist-example-default": "주시문서 목록 피드를 보여줍니다.",
        "apihelp-filerevert-description": "파일을 이전 판으로 되돌립니다.",
+       "apihelp-filerevert-param-comment": "업로드 댓글입니다.",
        "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd>를 <kbd>2011-03-05T15:27:40Z</kbd> 판으로 되돌립니다.",
        "apihelp-help-description": "지정된 모듈의 도움말을 보여줍니다.",
        "apihelp-help-param-helpformat": "도움말 출력 포맷.",
+       "apihelp-help-example-main": "메인 모듈의 도움말입니다.",
        "apihelp-help-example-recursive": "모든 도움말을 한 페이지로 모읍니다.",
        "apihelp-imagerotate-description": "하나 이상의 그림을 회전합니다.",
        "apihelp-imagerotate-param-rotation": "시계 방향으로 회전할 그림의 각도.",
        "api-help-param-type-limit": "유형: 정수 또는 <kbd>max</kbd>",
        "api-help-param-type-integer": "유형: {{PLURAL:$1|1=정수|2=정수 목록}}",
        "api-help-param-type-boolean": "유형: 부울 ([[Special:ApiHelp/main#main/datatypes|자세한 정보]])",
+       "api-help-param-type-user": "유형: {{PLURAL:$1|1=사용자 이름|2=사용자 이름 목록}}",
        "api-help-param-list": "{{PLURAL:$1|1=다음 값 중 하나|2=값 (<kbd>{{!}}</kbd>로 구분)}}: $2",
        "api-help-param-list-can-be-empty": "{{PLURAL:$1|0=비어 있어야 함|비어 있을 수 있거나 $2}}",
        "api-help-param-limit": "$1 초과는 허용되지 않습니다.",
        "api-help-examples": "{{PLURAL:$1|예시}}:",
        "api-help-permissions": "{{PLURAL:$1|권한}}:",
        "api-help-permissions-granted-to": "{{PLURAL:$1|다음 그룹에 부여됨}}: $2",
+       "api-help-right-apihighlimits": "API 쿼리에서 더 높은 제한 사용 (느린 쿼리: $1, 빠른 쿼리: $2) 느린 쿼리에 대한 제한은 다중값 매개변수에도 적용됩니다.",
        "api-help-open-in-apisandbox": "<small>[연습장에서 열기]</small>",
        "api-help-authmanagerhelper-messageformat": "반환 메시지에 사용할 형식.",
-       "api-credits": "API 개발자:\n* Roan Kattouw (선임 개발자, 2007년 9월–2009년)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Yuri Astrakhan (초기 개발자, 선임 개발자 2006년 9월~2007년 9월)\n* Brad Jorsch (선임 개발자 2013년–현재)\n\n당신의 의견이나 제안, 질문은 mediawiki-api@lists.wikimedia.org 로 보내주시거나,\nhttps://phabricator.wikimedia.org/ 에 버그 보고를 해 주시기 바랍니다."
+       "api-credits": "API 개발자:\n* Yuri Astrakhan (만든이, 선임 개발자 2006년 9월~2007년 9월)\n* Roan Kattouw (선임 개발자, 2007년 9월–2009년)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (선임 개발자 2013년–현재)\n\n당신의 의견이나 제안, 질문은 mediawiki-api@lists.wikimedia.org 로 보내주시고,\n버그 보고는 https://phabricator.wikimedia.org/ 에 해주시기 바랍니다."
 }
index 5ea8613..45680f4 100644 (file)
        "apihelp-feedrecentchanges-param-hidecategorization": "Ascondi e variaçioin d'apartegninça a-e categorie.",
        "apihelp-feedrecentchanges-param-tagfilter": "Filtra pe etichetta.",
        "apihelp-feedrecentchanges-param-target": "Mostra solo e modifiche a-e paggine collegæ da questa paggina.",
-       "apihelp-feedrecentchanges-param-showlinkedto": "Fanni védde sôlo i cangiaménti a-e pàggine colegæ a-a quella speçificâ",
+       "apihelp-feedrecentchanges-param-showlinkedto": "Fanni védde sôlo i cangiaménti a-e pàggine conligæ a-a quella speçificâ",
        "apihelp-feedrecentchanges-param-categories": "Mostra solo e variaçioin in sce-e paggine de tutte queste categorie.",
        "apihelp-feedrecentchanges-param-categories_any": "Mostra invece solo e variaçioin in sce-e paggine inte 'na qualonque categoria.",
        "apihelp-feedrecentchanges-example-simple": "Mostra i urtime modiffiche.",
        "apihelp-import-param-namespace": "Importa inte questo namespace. O no poeu ese doeuviou insemme a <var>$1rootpage</var>.",
        "apihelp-import-param-rootpage": "Importa comme sottopaggina de questa paggina. O no poeu ese doeuviou insemme a <var>$1namespace</var>.",
        "apihelp-import-example-import": "Importa [[meta:Help:ParserFunctions]] into namespace 100 con cronologia completa.",
-       "apihelp-linkaccount-description": "Colegamento de 'n'utença de 'n provider de terçe parte a l'utente corente.",
+       "apihelp-linkaccount-description": "Conligamento de 'n'utença de 'n provider de terçe parte a l'utente corente.",
        "apihelp-linkaccount-example-link": "Avvia o processo de collegamento a 'n'utença da <kbd>Example</kbd>.",
        "apihelp-login-description": "Accedi e otegni i cookie d'aotenticaçion.\n\nQuest'açion dev'ese doeuviâ escluxivamente in combinaçion con [[Special:BotPasswords]]; doeuviâla pe l'accesso a l'account prinçipâ o l'è deprecou e o poeu fallî sença preaviso. Pe acedere in moddo seguo a l'utença prinçipâ, doeuvia <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-description-nobotpasswords": "Accedi e otegni i cookies d'aotenticaçion.\n\nQuest'açion a l'è deprecâ e a poeu fallî sença preaviso. Pe acede in moddo seguo, doeuvia [[Special:ApiHelp/clientlogin|action=clientlogin]].",
index ea169a4..25012ba 100644 (file)
        "apihelp-query+watchlist-paramvalue-type-new": "Puslapio sukūrimai.",
        "apihelp-stashedit-param-title": "Puslapio pavadinimas buvo redaguotas.",
        "apihelp-stashedit-param-sectiontitle": "Naujo skyriaus pavadinimas.",
-       "apihelp-stashedit-param-text": "Puslapio turinys."
+       "apihelp-stashedit-param-text": "Puslapio turinys.",
+       "api-format-prettyprint-status": "Šis atsakymas būtų gražintas su HTTP statusu $1 $2."
 }
index 47488c0..3df95e7 100644 (file)
@@ -3,23 +3,44 @@
                "authors": [
                        "Jeblad",
                        "Chameleon222",
-                       "Macofe"
+                       "Macofe",
+                       "Jon Harald Søby"
                ]
        },
        "apihelp-main-param-action": "Hvilken handling skal utføres",
        "apihelp-main-param-format": "Resultatets format.",
+       "apihelp-main-param-assert": "Verifiser at brukeren er logget inn om satt til <kbd>user</kbd>, eller har botrettighet om satt til <kbd>bot</kbd>.",
+       "apihelp-main-param-assertuser": "Verifiser at den nåværende brukeren er den navngitte brukeren.",
+       "apihelp-main-param-requestid": "En gitt verdi her vil inkluderes i responsen. Kan brukes til å skille forespørsler fra hverandre.",
        "apihelp-main-param-servedby": "Inkluder navnet på tjeneren som utførte forespørselen i resultatene.",
        "apihelp-main-param-curtimestamp": "Inkluder det nåværende tidsmerket i resultatet.",
+       "apihelp-main-param-uselang": "Språk å bruke for meldingsoversettelser. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> med <kbd>siprop=languages</kbd> returnerer en liste over språkkoder, eller spesifiser <kbd>user</kbd> for å bruke den nåværende brukerens språkpreferanser, eller spesifiser <kbd>content</kbd> for å bruke denne wikiens innholdsspråk.",
        "apihelp-block-description": "Blokker en bruker.",
        "apihelp-block-param-user": "Brukernavn, IP-adresse eller IP-intervall som skal blokkeres.",
+       "apihelp-block-param-expiry": "Utløpstid. Kan være relativ (f.eks. <kbd>5 months</kbd> eller <kbd>2 weeks</kbd>) eller absolutt (f.eks. <kbd>2014-09-18T12:34:56Z</kbd>). Om den er satt til <kbd>infinite</kbd>, <kbd>indefinite</kbd> eller <kbd>never</kbd> vil blokkeringen ikke ha noen utløpsdato.",
        "apihelp-block-param-reason": "Årsak for blokkering.",
        "apihelp-block-param-anononly": "Blokker bare anonyme brukere (dvs. hindre anonyme redigeringer fra denne IP-adressen).",
        "apihelp-block-param-nocreate": "Hindre kontoopprettelse.",
        "apihelp-block-param-autoblock": "Blokker automatisk sist brukte IP-adresse og alle etterfølgende IP-adresser de prøver å logge inn fra.",
        "apihelp-block-param-noemail": "Hindre brukeren å sende e-post via wikien. (Krever rettigheten <code>blockemail</code>).",
        "apihelp-block-param-hidename": "Skjul brukernavnet fra blokkeringsloggen. (Krever rettigheten <code>hideuser</code>).",
+       "apihelp-block-param-allowusertalk": "La brukeren redigere sin egen diskusjonsside (avhenger av <var>[[mw:Manual:$wgBlockAllowsUTEdit|$wgBlockAllowsUTEdit]]</var>).",
+       "apihelp-block-param-reblock": "Overstyr den gamle blokkeringen om brukeren allerede er blokkert.",
+       "apihelp-block-param-watchuser": "Overvåk brukerens eller IP-adressas bruker- og brukerdiskusjonssider.",
+       "apihelp-block-example-ip-simple": "Blokker adressa <kbd>192.0.2.5</kbd> i tre dager med årsak <kbd>First strike</kbd>.",
+       "apihelp-block-example-user-complex": "Blokker brukeren <kbd>Vandal</kbd> på ubestemnt tid med årsak <kbd>Vandalism</kbd>, og forhindre ny kontooppretting og sending av epost.",
+       "apihelp-changeauthenticationdata-description": "Endre autentiseringsdata for den nåværende brukeren.",
+       "apihelp-changeauthenticationdata-example-password": "Forsøk å endre den nåværende brukerens passord til <kbd>ExamplePassword</kbd>.",
+       "apihelp-checktoken-description": "Sjekk gyldigheten til et tegn fra <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-checktoken-param-type": "Type tegn som testes.",
+       "apihelp-checktoken-param-token": "Tegn å teste.",
+       "apihelp-checktoken-param-maxtokenage": "Maksimalt tillatt alder på tegnet, i sekunder.",
+       "apihelp-checktoken-example-simple": "Test gyldigheten til et <kbd>csrf</kbd>-tegn.",
        "apihelp-clearhasmsg-description": "Fjerner <code>hasmsg</code>-flagget for den aktuelle brukeren.",
        "apihelp-clearhasmsg-example-1": "Fjern <code>hasmsg</code>-flagget for aktuell bruker.",
+       "apihelp-clientlogin-description": "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-compare-description": "Hent forskjellen mellom to sider.\n\nEt revisjonsnummer, en sidetittel eller en side-ID for både «fra» og «til» må sendes.",
        "apihelp-compare-param-fromtitle": "Første tittel å sammenligne.",
        "apihelp-compare-param-fromid": "Første side-ID å sammenligne.",
        "apihelp-compare-param-torev": "Andre revisjon å sammenligne.",
        "apihelp-compare-example-1": "Lag en diff mellom revisjon 1 og 2.",
        "apihelp-createaccount-description": "Opprett en ny brukerkonto.",
+       "apihelp-createaccount-param-preservestate": "Om <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> returnerte true for <samp>hashprimarypreservedstate</samp> bør forespørsler merket som <samp>primary-required</samp> omgås. Om den returnerte en ikke-tom verdi for <samp>preservedusername</samp> kan det brukernavnet brukes for <var>username</var>-parameteren.",
+       "apihelp-createaccount-example-create": "Start prosessen med å opprette brukeren <kbd>Example</kbd> med passordet <kbd>ExamplePassword</kbd>.",
        "apihelp-createaccount-param-name": "Brukernavn.",
        "apihelp-createaccount-param-password": "Passord (ignorert dersom <var>$1mailpassword</var> er satt).",
        "apihelp-createaccount-param-domain": "Domene for ekstern autentisering (valgfritt).",
+       "apihelp-createaccount-param-token": "Kontoopprettingstegn som hentet i den første forespørselen.",
        "apihelp-createaccount-param-email": "Brukerens e-postadresse (valgfritt).",
        "apihelp-createaccount-param-realname": "Brukerens virkelige navn (valgfritt).",
        "apihelp-createaccount-param-mailpassword": "Dersom satt til en verdi vil et tilfeldig passord bli sendt med e-post til brukeren.",
        "apihelp-createaccount-param-language": "Språkkode å bruke som standard for brukeren (valgfritt, standardverdien er innholdsspråket).",
        "apihelp-createaccount-example-pass": "Opprett bruker <kbd>testuser</kbd> med passordet <kbd>test123</kbd>.",
        "apihelp-createaccount-example-mail": "Opprett bruker <kbd>testmailuser</kbd> og send et tilfeldig generert passord med e-post.",
+       "apihelp-cspreport-description": "Brukes av nettlesere for å rapportere brudd på Content Security Policy. Denne modulen bør aldri brukes utenom av en CSP-mottakelig nettleser.",
        "apihelp-delete-description": "Slett en side.",
        "apihelp-delete-param-title": "Tittel til siden som skal slettes. Kan ikke brukes sammen med <var>$1pageid</var>.",
        "apihelp-delete-param-pageid": "Side-ID til siden som skal slettes. Kan ikke brukes sammen med <var>$1title</var>.",
        "apihelp-delete-param-reason": "Årsak for slettingen. Dersom ikke satt vil en automatisk generert årsak bli brukt.",
+       "apihelp-delete-param-tags": "Endringstagger å legge til oppslaget i slettingsloggen.",
        "apihelp-delete-param-watch": "Legg til siden til aktuell brukers overvåkningsliste.",
        "apihelp-delete-param-unwatch": "Fjern siden fra aktuell brukers overvåkningsliste.",
+       "apihelp-delete-param-oldimage": "Navnet på det gamle bildet som skal slettes som oppgitt av [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
        "apihelp-delete-example-simple": "Slett <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "Slett <kbd>Main Page</kbd> med grunnen <kbd>Preparing for move</kbd>.",
        "apihelp-disabled-description": "Denne modulen har blitt deaktivert",
        "apihelp-edit-param-section": "Avsnittsnummer. <kbd>0</kbd> for det øverste avsnittet, <kbd>new</kbd> for et nytt avsnitt.",
        "apihelp-edit-param-sectiontitle": "Tittelen for et nytt avsnitt.",
        "apihelp-edit-param-text": "Sideinnhold.",
+       "apihelp-edit-param-summary": "Redigeringssammendrag. Også seksjonstittel når $1section=new og $1sectiontitle ikke er satt.",
+       "apihelp-edit-param-tags": "Endringstagger som skal brukes på revisjonen.",
        "apihelp-edit-param-minor": "Mindre redigering.",
+       "apihelp-edit-param-notminor": "Ikke mindre redigering.",
        "apihelp-edit-param-bot": "Merk denne redigeringen som en botendring.",
+       "apihelp-edit-param-basetimestamp": "Tidsstempel for grunnrevisjonen, brukes for å oppdage redigeringskonflikter. Kan hentes via [[Special.ApiHelp/query+revisions|action=query&prop=revisions&rvprop=timestamp]].",
+       "apihelp-edit-param-starttimestamp": "Tidsstempel for når redigeringsprosessen begynte, brukes for å oppdage redigeringskonflikter. En gyldig verdi kan hentes med <var>[[Special:ApiHelp/main|curtimestamp]]</var> når man begynner en redigeringsprosess (f.eks. når man laster sideinnholdet som redigeres).",
+       "apihelp-edit-param-recreate": "Overstyr feil om at siden har blitt slettet i mellomtiden.",
        "apihelp-edit-param-createonly": "Ikke rediger siden dersom den finnes allerede.",
        "apihelp-edit-param-nocreate": "Gi en feilmelding dersom dersom siden ikke finnes.",
        "apihelp-edit-param-watch": "Legg til siden til aktuell brukers overvåkningsliste.",
        "apihelp-logout-description": "Logg ut og fjern sesjonsdata.",
        "apihelp-logout-example-logout": "Logg ut den aktuelle brukeren.",
        "apihelp-move-description": "Flytt en side.",
-       "apihelp-dbg-description": "Resultatdata i PHP's var_export() format.",
-       "apihelp-dbgfm-description": "Resultatdata i PHP's var_export() format (pen utskrift i HTML).",
        "apihelp-json-description": "Resultatdata i JSON-format.",
        "apihelp-none-description": "Ingen resultat.",
        "api-help-flag-readrights": "Denne modulen krever lesetilgang.",
index 89e2b21..ac2c8b7 100644 (file)
@@ -61,7 +61,7 @@
        "apihelp-edit-param-tags": "Wijzigingslabels om aan de versie toe te voegen.",
        "apihelp-edit-param-minor": "Kleine bewerking.",
        "apihelp-edit-param-notminor": "Geen kleine bewerking.",
-       "apihelp-edit-param-bot": "Deze bewerking als bot markeren.",
+       "apihelp-edit-param-bot": "Deze bewerking markeren als gedaan door een robot.",
        "apihelp-edit-param-createonly": "De pagina niet bewerken als die al bestaat.",
        "apihelp-edit-param-nocreate": "Een foutmelding geven als de pagina niet bestaat.",
        "apihelp-edit-param-watch": "Voeg de pagina toe aan de volglijst van de huidige gebruiker.",
index 4c31ca8..7ba3854 100644 (file)
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=Wartość musi|2=Wartości muszą}} być pomiędzy $2 a $3.",
        "api-help-param-multi-separate": "Oddziel wartości za pomocą <kbd>|</kbd> lub [[Special:ApiHelp/main#main/datatypes|alternatywy]].",
        "api-help-param-multi-max": "Maksymalna liczba wartości to {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} dla botów).",
+       "api-help-param-multi-all": "Aby wskazać wszystkie wartości, użyj <kbd>$1</kbd>.",
        "api-help-param-default": "Domyślnie: $1",
        "api-help-param-default-empty": "Domyślnie: <span class=\"apihelp-empty\">(puste)</span>",
        "api-help-param-token": "Token \"$1\" zdobyty z [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
index 26cc5ec..20a2eda 100644 (file)
@@ -5,21 +5,22 @@
                        "Fúlvio",
                        "Macofe",
                        "Jkb8",
-                       "Hamilton Abreu"
+                       "Hamilton Abreu",
+                       "Mansil"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Documentação]]\n* [[mw:API:FAQ|FAQ]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Lista de discussão]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Anúncios da API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Erros e pedidos]\n</div>\n<strong>Estado:</strong> Todas as funcionalidades mostradas nesta página devem ter o comportamento documentado mas a API ainda está em desenvolvimento ativo e pode ser alterada a qualquer momento. Inscreva-se na [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ lista de discussão mediawiki-api-announce] para ser informado acerca das atualizações.\n\n<strong>Pedidos incorretos:</strong> Quando são enviados pedidos incorretos à API, será devolvido um cabeçalho HTTP com a chave \"MediaWiki-API-Error\" e depois tanto o valor desse cabeçalho como o código de erro devolvido serão definidos com o mesmo valor. Para mais informação, consulte [[mw:API:Errors_and_warnings|API:Erros e avisos]].\n\n<strong>Testes:</strong> Para testar facilmente pedidos à API, visite [[Special:ApiSandbox|Testes da API]].",
        "apihelp-main-param-action": "A operação a ser realizada.",
        "apihelp-main-param-format": "O formato do resultado.",
-       "apihelp-main-param-maxlag": "O atraso máximo pode ser usado quando o MediaWiki é instalado num <i>cluster</i> de bases de dados replicadas. Para impedir que as operações causem ainda mais atrasos de replicação do <i>site</i>, este parâmetro pode fazer o cliente aguardar até que o atraso de replicação seja inferior ao valor especificado. Caso o atraso atual exceda esse valor, o código de erro <samp>maxlag</samp> é devolvido com uma mensagem como <samp>À espera do servidor $host: $lag segundos de atraso</samp>.<br />Consulte [[mw:Manual:Maxlag_parameter|Manual: Parâmetro maxlag]] para mais informações.",
-       "apihelp-main-param-smaxage": "Definir no cabeçalho HTTP <code>s-maxage</code> de controlo da <i>cache</i> este número de segundos. Os erros nunca são armazenados na <i>cache</i>.",
-       "apihelp-main-param-maxage": "Definir no cabeçalho HTTP <code>max-age</code> de controlo da <i>cache</i> este número de segundos. Os erros nunca são armazenados na <i>cache</i>.",
+       "apihelp-main-param-maxlag": "O atraso máximo pode ser usado quando o MediaWiki é instalado num ''cluster'' de bases de dados replicadas. Para impedir que as operações causem ainda mais atrasos de replicação do ''site'', este parâmetro pode fazer o cliente aguardar até que o atraso de replicação seja inferior ao valor especificado. Caso o atraso atual exceda esse valor, o código de erro <samp>maxlag</samp> é devolvido com uma mensagem como <samp>À espera do servidor $host: $lag segundos de atraso</samp>.<br />Consulte [[mw:Manual:Maxlag_parameter|Manual: Parâmetro maxlag]] para mais informações.",
+       "apihelp-main-param-smaxage": "Definir no cabeçalho HTTP <code>s-maxage</code> de controlo da ''cache'' este número de segundos. Os erros nunca são armazenados na ''cache''.",
+       "apihelp-main-param-maxage": "Definir no cabeçalho HTTP <code>max-age</code> de controlo da ''cache'' este número de segundos. Os erros nunca são armazenados na ''cache''.",
        "apihelp-main-param-assert": "Se definido com o valor <kbd>user</kbd>, verificar que o utilizador está autenticado. Se definido com o valor <kbd>bot</kbd>, verificar que o utilizador tem o privilégio de conta robô.",
        "apihelp-main-param-assertuser": "Verificar que o utilizador atual é o utilizador nomeado.",
        "apihelp-main-param-requestid": "Qualquer valor fornecido aqui será incluído na resposta. Pode ser usado para distinguir pedidos.",
-       "apihelp-main-param-servedby": "Incluir o nome do servidor que serviu o pedido nos resultados.",
+       "apihelp-main-param-servedby": "Incluir nos resultados o nome do servidor que serviu o pedido.",
        "apihelp-main-param-curtimestamp": "Incluir a data e hora atuais no resultado.",
-       "apihelp-main-param-origin": "Ao aceder à API usando um pedido AJAX entre domínios (CORS), coloque aqui o domínio de origem. Isto tem de ser incluído em todas as verificações prévias e, portanto, tem de fazer parte do URI do pedido (e não do conteúdo do POST).\n\nPara pedidos autenticados, este valor tem de corresponder de forma exata a um dos cabeçalhos <code>Origin</code>, portanto tem de ser algo como <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parâmetro não for igual ao cabeçalho <code>Origin</code>, será devolvida a resposta 403. Se este parâmetro for igual ao cabeçalho <code>Origin</code> e a origem for permitida (<i>white-listed</i>) os cabeçalhos <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serão preenchidos.\n\nPara pedidos não autenticados, especifique o valor <kbd>*</kbd>. Isto fará com que o cabeçalho <code>Access-Control-Allow-Origin</code>\nseja preenchido, mas <code>Access-Control-Allow-Credentials</code> terá o valor <code>false</code> e o acesso a todos os dados específicos do utilizador está restringido.",
+       "apihelp-main-param-origin": "Ao aceder à API usando um pedido AJAX entre domínios (CORS), coloque aqui o domínio de origem. Isto tem de ser incluído em todas as verificações prévias e, portanto, tem de fazer parte do URI do pedido (e não do conteúdo do POST).\n\nPara pedidos autenticados, este valor tem de corresponder de forma exata a um dos cabeçalhos <code>Origin</code>, portanto, tem de ser algo como <kbd>https://en.wikipedia.org</kbd> ou <kbd>https://meta.wikimedia.org</kbd>. Se este parâmetro não for igual ao cabeçalho <code>Origin</code>, será devolvida a resposta 403. Se este parâmetro for igual ao cabeçalho <code>Origin</code> e a origem for permitida (''white-listed'') os cabeçalhos <code>Access-Control-Allow-Origin</code> e <code>Access-Control-Allow-Credentials</code> serão preenchidos.\n\nPara pedidos não autenticados, especifique o valor <kbd>*</kbd>. Isto fará com que o cabeçalho <code>Access-Control-Allow-Origin</code>\nseja preenchido, mas <code>Access-Control-Allow-Credentials</code> terá o valor <code>false</code> e o acesso a todos os dados específicos do utilizador está restringido.",
        "apihelp-main-param-uselang": "Língua a usar nas traduções de mensagens. <kbd>[[Special:ApiHelp/query+siteinfo|action=query&meta=siteinfo]]</kbd> com <kbd>siprop=languages</kbd> devolve uma lista de códigos de língua, ou especifique <kbd>user</kbd> para usar a língua nas preferências do utilizador atual, ou especifique <kbd>content</kbd> para usar a língua de conteúdo desta wiki.",
        "apihelp-block-description": "Bloquear um utilizador.",
        "apihelp-block-param-user": "O nome de utilizador, endereço IP ou gama de endereços IP a serem bloqueados.",
@@ -81,9 +82,9 @@
        "apihelp-delete-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
        "apihelp-delete-param-unwatch": "Remover a página das páginas vigiadas do utilizador atual.",
        "apihelp-delete-param-oldimage": "O nome da imagem antiga a ser eliminada, tal como fornecido por [[Special:ApiHelp/query+imageinfo|action=query&prop=imageinfo&iiprop=archivename]].",
-       "apihelp-delete-example-simple": "Eliminar <kbd>Main Page</kbd>.",
+       "apihelp-delete-example-simple": "Eliminar a página <kbd>Main Page</kbd>.",
        "apihelp-delete-example-reason": "Eliminar <kbd>Main Page</kbd> com o motivo <kbd>Preparing for move</kbd>.",
-       "apihelp-disabled-description": "O módulo foi desativado.",
+       "apihelp-disabled-description": "Este módulo foi desativado.",
        "apihelp-edit-description": "Criar e editar páginas.",
        "apihelp-edit-param-title": "Título da página a ser editada. Não pode ser usado em conjunto com <var>$1pageid</var>.",
        "apihelp-edit-param-pageid": "Identificador da página a ser editada. Não pode ser usado em conjunto com <var>$1title</var>.",
        "apihelp-edit-param-unwatch": "Remover a página da lista de páginas vigiadas do utilizador atual.",
        "apihelp-edit-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
        "apihelp-edit-param-md5": "A chave MD5 do parâmetro $1text, ou os parâmetros $1prependtext e $1appendtext concatenados. Se estiver definido, a edição não será realizada a menos que a chave seja correta.",
-       "apihelp-edit-param-prependtext": "Adicionar este texto ao início da página. Substitui $1text.",
-       "apihelp-edit-param-appendtext": "Adicionar este texto ao fim da página. Substitui $1text.\n\nPara acrescentar uma nova secção no fim da página, usar $1section=new em vez deste parâmetro.",
-       "apihelp-edit-param-undo": "Desfazer esta revisão. Substitui $1text, $1prependtext e $1appendtext.",
+       "apihelp-edit-param-prependtext": "Adicionar este texto ao início da página. Tem precedência sobre $1text.",
+       "apihelp-edit-param-appendtext": "Adicionar este texto ao fim da página. Tem precedência sobre $1text.\n\nPara acrescentar uma nova secção no fim da página, usar $1section=new em vez deste parâmetro.",
+       "apihelp-edit-param-undo": "Desfazer esta revisão. Tem precedência sobre $1text, $1prependtext e $1appendtext.",
        "apihelp-edit-param-undoafter": "Desfazer todas as revisões desde $1undo até esta. Se não for definido, desfazer só uma revisão.",
        "apihelp-edit-param-redirect": "Resolver automaticamente redirecionamentos.",
        "apihelp-edit-param-contentformat": "Formato para seriação do conteúdo, usado para o texto de entrada.",
        "apihelp-expandtemplates-paramvalue-prop-categories": "Quaisquer categorias existentes na entrada que não estão representadas no texto em notação wiki de saída.",
        "apihelp-expandtemplates-paramvalue-prop-properties": "Propriedades da página, definidas por palavras mágicas expandidas, no texto em notação wiki.",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "Indica se o resultado é volátil e não deve ser reutilizado noutra parte da página.",
-       "apihelp-expandtemplates-paramvalue-prop-ttl": "O período máximo a partir do qual os armazenamentos do resultado na <i>cache</i> devem ser invalidados.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "O período máximo a partir do qual os armazenamentos do resultado na ''cache'' devem ser invalidados.",
        "apihelp-expandtemplates-paramvalue-prop-modules": "Quaisquer módulos ResourceLoader que as funções do analisador sintático solicitaram que fossem adicionados ao resultado de saída. Um dos valores <kbd>jsconfigvars</kbd> ou <kbd>encodedjsconfigvars</kbd> tem de ser solicitado em conjunto com o valor <kbd>modules</kbd>.",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Devolve as variáveis de configuração JavaScript específicas desta página.",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Devolve as variáveis de configuração JavaScript específicas da página, no formato de uma ''string'' JSON.",
        "apihelp-feedcontributions-param-namespace": "O espaço nominal pelo qual as contribuições serão filtradas.",
        "apihelp-feedcontributions-param-year": "Desde o ano.",
        "apihelp-feedcontributions-param-month": "Desde o mês.",
-       "apihelp-feedcontributions-param-tagfilter": "Filtrar as contribuições que têm estas etiquetas.",
+       "apihelp-feedcontributions-param-tagfilter": "Filtrar as contribuições para produzir as que têm estas etiquetas.",
        "apihelp-feedcontributions-param-deletedonly": "Mostrar apenas as contribuições eliminadas.",
        "apihelp-feedcontributions-param-toponly": "Mostrar apenas as edições mais recentes.",
        "apihelp-feedcontributions-param-newonly": "Mostrar apenas as edições que são criações de páginas.",
        "apihelp-import-example-import": "Importar [[meta:Help:ParserFunctions]] para o espaço nominal 100 com o historial completo.",
        "apihelp-linkaccount-description": "Ligar uma conta de um fornecedor terceiro ao utilizador atual.",
        "apihelp-linkaccount-example-link": "Iniciar o processo de ligação a uma conta do fornecedor <kbd>Example</kbd>.",
-       "apihelp-login-description": "Entrar e obter <i>cookies</i> de autenticação.\n\nEsta operação só deve ser usada em combinação com [[Special:BotPasswords]]; a sua utilização para entrar com a conta principal é obsoleta e poderá falhar sem aviso. Para entrar com a conta principal de forma segura, use <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
-       "apihelp-login-description-nobotpasswords": "Entrar e obter <i>cookies</i> de autenticação.\n\nEsta operação é obsoleta e poderá falhar sem aviso. Para entrar de forma segura, use <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description": "Entrar e obter ''cookies'' de autenticação.\n\nEsta operação só deve ser usada em combinação com [[Special:BotPasswords]]; a sua utilização para entrar com a conta principal é obsoleta e poderá falhar sem aviso. Para entrar com a conta principal de forma segura, use <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
+       "apihelp-login-description-nobotpasswords": "Entrar e obter ''cookies'' de autenticação.\n\nEsta operação é obsoleta e poderá falhar sem aviso. Para entrar de forma segura, use <kbd>[[Special:ApiHelp/clientlogin|action=clientlogin]]</kbd>.",
        "apihelp-login-param-name": "Nome de utilizador.",
        "apihelp-login-param-password": "Palavra-passe.",
        "apihelp-login-param-domain": "Domínio (opcional).",
        "apihelp-login-example-login": "Entrar.",
        "apihelp-logout-description": "Terminar a sessão e limpar os dados da sessão.",
        "apihelp-logout-example-logout": "Terminar a sessão do utilizador atual.",
-       "apihelp-managetags-description": "Executar tarefas de gestão relacionadas com a alteração de etiquetas.",
+       "apihelp-managetags-description": "Executar tarefas de gestão relacionadas com etiquetas de modificação.",
        "apihelp-managetags-param-operation": "A operação que será realizada:\n;create:Criar uma nova etiqueta de modificação para uso manual.\n;delete:Remover da base de dados uma etiqueta de modificação, incluindo remover a etiqueta de todas as revisões, entradas nas mudanças recentes e entradas do registo onde ela é utilizada.\n;activate:Ativar uma etiqueta de modificação, permitindo que os utilizadores a apliquem manualmente.\n;deactivate:Desativar uma etiqueta de modificação, impedindo que os utilizadores a apliquem manualmente.",
        "apihelp-managetags-param-tag": "Etiqueta a ser criada, eliminada, ativada ou desativada. Para criar uma etiqueta ela não pode existir. Para eliminar uma etiqueta, ela tem de existir. Para ativar uma etiqueta, ela tem de existir e não estar a ser utilizada por nenhuma extensão. Para desativar uma etiqueta, ela tem de estar ativa e definida manualmente.",
        "apihelp-managetags-param-reason": "Um motivo, opcional, para a criação, eliminação, ativação ou desativação da etiqueta.",
        "apihelp-opensearch-param-warningsaserror": "Se forem gerados avisos com <kbd>format=json</kbd>, devolver um erro da API em vez de ignorá-los.",
        "apihelp-opensearch-example-te": "Encontrar as páginas que começam por <kbd>Te</kbd>.",
        "apihelp-options-description": "Alterar as preferências do utilizador atual.\n\nSó podem ser definidas as opções que estão registadas no núcleo do MediaWiki ou numa das extensões instaladas, ou opções cuja chave tem o prefixo <code>userjs-</code> (que são supostas ser usadas por ''scripts'' de utilizador).",
-       "apihelp-options-param-reset": "Reiniciar preferências para os valores por omissão do site.",
+       "apihelp-options-param-reset": "Reiniciar preferências para os valores por omissão do ''site''.",
        "apihelp-options-param-resetkinds": "Lista dos tipos de opções a reiniciar quando a opção <var>$1reset</var> está definida.",
        "apihelp-options-param-change": "Listas das alterações, na forma nome=valor (isto é, skin=vector). Se não for fornecido nenhum valor (nem sequer um sinal de igualdade), por exemplo, nomedaopção|outraopção|..., a opção será reiniciada para o seu valor por omissão. Se qualquer dos valores passados contém uma barra vertical (<kbd>|</kbd>), use um [[Special:ApiHelp/main#main/datatypes|separador alternativo para valores múltiplos]] de forma a obter o comportamento correto.",
        "apihelp-options-param-optionname": "O nome da opção que deve ser configurada com o valor dado por <var>$1optionvalue</var>.",
        "apihelp-parse-param-text": "Texto a analisar. Usar <var>$1title</var> ou <var>$1contentmodel</var> para controlar o modelo de conteúdo.",
        "apihelp-parse-param-summary": "Resumo a analisar.",
        "apihelp-parse-param-page": "Analisar o conteúdo desta página. Não pode ser usado em conjunto com <var>$1text</var> e <var>$1title</var>.",
-       "apihelp-parse-param-pageid": "Analisar o conteúdo desta página. Substitui <var>$1page</var>.",
+       "apihelp-parse-param-pageid": "Analisar o conteúdo desta página. Tem precedência sobre <var>$1page</var>.",
        "apihelp-parse-param-redirects": "Se <var>$1page</var> ou <var>$1pageid</var> estiverem definidos para um redirecionamento, resolvê-lo.",
-       "apihelp-parse-param-oldid": "Analisar o conteúdo desta revisão. Substitui <var>$1page</var> e <var>$1pageid</var>.",
+       "apihelp-parse-param-oldid": "Analisar o conteúdo desta revisão. Tem precedência sobre <var>$1page</var> e <var>$1pageid</var>.",
        "apihelp-parse-param-prop": "As informações que devem ser obtidas:",
        "apihelp-parse-paramvalue-prop-text": "Fornece o texto analisado, de um texto com notação wiki.",
        "apihelp-parse-paramvalue-prop-langlinks": "Fornece os links interlínguas do texto analisado.",
        "apihelp-parse-paramvalue-prop-limitreportdata": "Fornece o relatório de limites de forma estruturada. Não fornece dados quando <var>$1disablelimitreport</var> está definido.",
        "apihelp-parse-paramvalue-prop-limitreporthtml": "Fornece a versão HTML do relatório de limites. Não fornece dados quando <var>$1disablelimitreport</var> está definido.",
        "apihelp-parse-paramvalue-prop-parsetree": "A árvore de análise XML do conteúdo da revisão (requer o modelo de conteúdo <code>$1</code>).",
-       "apihelp-parse-param-pst": "Fazer uma transformação anterior à gravação, do texto de entrada, antes de analisá-lo. Só é válido quando usado com texto.",
-       "apihelp-parse-param-onlypst": "Fazer uma transformação anterior à gravação (PST, ''pre-save transform'') do texto de entrada, mas não o analisar. Devolve o mesmo texto após aplicação da PST. Só é válido quando usado com <var>$1text</var>.",
+       "apihelp-parse-param-pst": "Fazer uma transformação de pré-gravação ao texto de entrada, antes de analisá-lo. Só é válido quando usado com texto.",
+       "apihelp-parse-param-onlypst": "Fazer uma transformação de pré-gravação (PST, ''pre-save transform'') ao texto de entrada, mas não o analisar. Devolve o mesmo texto após aplicação da PST. Só é válido quando usado com <var>$1text</var>.",
        "apihelp-parse-param-effectivelanglinks": "Inclui links interlínguas fornecidos por extensões (para ser usado com <kbd>$1prop=langlinks</kbd>).",
        "apihelp-parse-param-section": "Analisar apenas o conteúdo desta secção.\n\nQuando tiver o valor <kbd>new</kbd>, analisar <var>$1text</var> e <var>$1sectiontitle</var> como se fosse adicionar uma nova secção à página.\n\n<kbd>new</kbd> só é permitido quando se especifica <var>text</var>.",
        "apihelp-parse-param-sectiontitle": "O novo título da secção quando <var>section</var> tem o valor <kbd>new</kbd>.\n\nAo contrário da edição de páginas, este não toma o valor de <var>summary</var> se for omitido ou estiver vazio.",
        "apihelp-protect-example-protect": "Proteger uma página.",
        "apihelp-protect-example-unprotect": "Desproteger uma página definindo a restrição <kbd>all</kbd> (isto é, todos podem executar a operação).",
        "apihelp-protect-example-unprotect2": "Desproteger uma página definindo que não há restrições.",
-       "apihelp-purge-description": "Limpar a <i>cache</i> para os títulos especificados.\n\nRequer um pedido POST se o utilizador não tiver iniciado uma sessão.",
+       "apihelp-purge-description": "Limpar a ''cache'' para os títulos especificados.\n\nRequer um pedido POST se o utilizador não tiver iniciado uma sessão.",
        "apihelp-purge-param-forcelinkupdate": "Atualizar as tabelas de ligações.",
        "apihelp-purge-param-forcerecursivelinkupdate": "Atualizar a tabela de ligações, e atualizar as tabelas de ligações de qualquer página que usa esta página como modelo.",
        "apihelp-purge-example-simple": "Purgar as páginas <kbd>Main Page</kbd> e <kbd>API</kbd>.",
        "apihelp-purge-example-generator": "Purgar as primeiras 10 páginas no espaço nominal principal.",
-       "apihelp-query-description": "Obter dados do MediaWiki e acerca dele.\n\nTodas as modificações de dados têm primeiro de usar um pedido para adquirir uma chave, de forma a impedir ações abusivas de <i>sites</i> maliciosos.",
+       "apihelp-query-description": "Obter dados do MediaWiki e acerca dele.\n\nTodas as modificações de dados têm primeiro que usar um pedido para adquirir uma chave, de forma a impedir ações abusivas de ''sites'' maliciosos.",
        "apihelp-query-param-prop": "As propriedades a serem obtidas para as páginas consultadas.",
        "apihelp-query-param-list": "As listas a serem obtidas.",
        "apihelp-query-param-meta": "Os metadados a serem obtidos.",
        "apihelp-query-param-indexpageids": "Incluir uma secção adicional de identificadores de página que lista todos os identificadores de página devolvidos.",
        "apihelp-query-param-export": "Exportar as revisões atuais de todas as páginas fornecidas ou geradas.",
-       "apihelp-query-param-exportnowrap": "Devolver o XML de exportação sem o envolver num resultado XML (o mesmo formato que [[Special:Export]]). Só pode ser usado com $1export.",
-       "apihelp-query-param-iwurl": "Indica se deve ser obtido o URL completo quando o título é um <i>link</i> interwikis.",
+       "apihelp-query-param-exportnowrap": "Devolver o XML de exportação sem envolvê-lo num resultado XML (o mesmo formato que [[Special:Export]]). Só pode ser usado com $1export.",
+       "apihelp-query-param-iwurl": "Indica se deve ser obtido o URL completo quando o título é um ''link'' interwikis.",
        "apihelp-query-param-rawcontinue": "Devolver os dados em bruto de <samp>query-continue</samp> para continuar.",
        "apihelp-query-example-revisions": "Obter [[Special:ApiHelp/query+siteinfo|informação do ''site'']] e as [[Special:ApiHelp/query+revisions|revisões]] da página <kbd>Main Page</kbd>.",
        "apihelp-query-example-allpages": "Obter as revisões das páginas que começam por <kbd>API/</kbd>.",
        "apihelp-query+allimages-param-prefix": "Procurar todos os títulos de imagem que começam por este valor. Só pode ser usado com $1sort=name.",
        "apihelp-query+allimages-param-minsize": "Limitar só às imagens com este número mínimo de bytes.",
        "apihelp-query+allimages-param-maxsize": "Limitar só às imagens com este número máximo de bytes.",
-       "apihelp-query+allimages-param-sha1": "Resumo criptográfico SHA1 da imagem. Substitui $1sha1base36.",
+       "apihelp-query+allimages-param-sha1": "Resumo criptográfico SHA1 da imagem. Tem precedência sobre $1sha1base36.",
        "apihelp-query+allimages-param-sha1base36": "Resumo criptográfico SHA1 da imagem em base 36 (usado no MediaWiki).",
        "apihelp-query+allimages-param-user": "Devolver só os ficheiros carregados por este utilizador. Só pode ser usado com $1sort=timestamp. Não pode ser usado em conjunto com $1filterbots.",
        "apihelp-query+allimages-param-filterbots": "Como filtrar os ficheiros carregados por robôs. Só pode ser usado com $1sort=timestamp. Não pode ser usado em conjunto com $1user.",
        "apihelp-query+mystashedfiles-paramvalue-prop-size": "Obter o tamanho do ficheiro e as dimensões da imagem.",
        "apihelp-query+mystashedfiles-paramvalue-prop-type": "Obter o tipo MIME e o tipo de multimédia do ficheiro.",
        "apihelp-query+mystashedfiles-param-limit": "Quantos ficheiros a serem obtidos.",
+       "apihelp-query+mystashedfiles-example-simple": "Obter a chave, o tamanho e as dimensões em píxeis dos ficheiros na área de ficheiros escondidos do utilizador.",
+       "apihelp-query+alltransclusions-description": "Listar todas as transclusões (páginas incorporadas utilizando &#123;&#123;x&#125;&#125;), incluindo as que estejam em falta.",
        "apihelp-query+alltransclusions-param-from": "O título da transclusão a partir do qual será começada a enumeração.",
        "apihelp-query+alltransclusions-param-to": "O título da transclusão no qual será terminada a enumeração.",
        "apihelp-query+alltransclusions-param-prefix": "Procurar todos os títulos transcluídos que começam por este valor.",
        "apihelp-query+allusers-param-limit": "O número total de nomes de utilizador a serem devolvidos.",
        "apihelp-query+allusers-param-witheditsonly": "Listar só os utilizadores que realizaram edições.",
        "apihelp-query+allusers-param-activeusers": "Listar só os utilizadores ativos {{PLURAL:$1|no último dia|nos últimos $1 dias}}.",
-       "apihelp-query+allusers-param-attachedwiki": "Com <kbd>$1prop=centralids</kbd>, indicar também se o utilizador tem uma ligação (''attachment'') à wiki designada por este identificador.",
+       "apihelp-query+allusers-param-attachedwiki": "Com <kbd>$1prop=centralids</kbd>, indicar também se o utilizador tem ligação com a wiki designada por este identificador.",
        "apihelp-query+allusers-example-Y": "Listar utilizadores, começando pelo <kbd>Y</kbd>.",
        "apihelp-query+authmanagerinfo-description": "Obter informação sobre o atual estado de autenticação.",
        "apihelp-query+authmanagerinfo-param-securitysensitiveoperation": "Testar se o estado atual de autenticação do utilizador é suficiente para a operação especificada, que exige condições seguras.",
        "apihelp-query+authmanagerinfo-param-requestsfor": "Obter informação sobre os pedidos de autenticação que são necessários para a operação de autenticação especificada.",
+       "apihelp-query+authmanagerinfo-example-login": "Obter os pedidos que podem ser usados ao iniciar uma sessão.",
+       "apihelp-query+authmanagerinfo-example-login-merged": "Obter os pedidos que podem ser usados ao iniciar uma sessão, com os campos combinados.",
        "apihelp-query+authmanagerinfo-example-securitysensitiveoperation": "Testar se a autenticação é suficiente para a operação <kbd>foo</kbd>.",
+       "apihelp-query+backlinks-description": "Encontrar todas as páginas que contêm ligações para a página indicada.",
+       "apihelp-query+backlinks-param-title": "O título a ser procurado. Não pode ser usado em conjunto com <var>$1pageid</var>.",
+       "apihelp-query+backlinks-param-pageid": "O identificador do título a ser procurado. Não pode ser usado em conjunto com <var>$1title</var>.",
        "apihelp-query+backlinks-param-namespace": "O espaço nominal a ser enumerado.",
        "apihelp-query+backlinks-param-dir": "A direção de listagem.",
-       "apihelp-query+backlinks-param-limit": "O número total de páginas a serem devolvidas. Se <var>$1redirect</var> estiver ativado, o nível aplica-se a cada nível em separado (o que significa que até 2 * <var>$1limit</var> resultados podem ser devolvidos).",
-       "apihelp-query+backlinks-example-simple": "Mostrar ligações para <kbd>Main page</kbd>.",
-       "apihelp-query+backlinks-example-generator": "Obter informações sobre as páginas com ligação para <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-param-filterredir": "Como filtrar os redirecionamentos. Se definido como <kbd>nonredirects</kbd> quando <var>$1redirect</var> está ativado, isto só é aplicado ao segundo nível.",
+       "apihelp-query+backlinks-param-limit": "O número total de páginas a serem devolvidas. Se <var>$1redirect</var> estiver ativado, o limite aplica-se a cada nível em separado (o que significa que até 2 * <var>$1limit</var> resultados podem ser devolvidos).",
+       "apihelp-query+backlinks-param-redirect": "Se a página que contém a ligação é um redirecionamento, procurar também todas as páginas que contêm ligações para esse redirecionamento. O limite máximo é reduzido para metade.",
+       "apihelp-query+backlinks-example-simple": "Mostrar as ligações para <kbd>Main page</kbd>.",
+       "apihelp-query+backlinks-example-generator": "Obter informações sobre as páginas com ligações para <kbd>Main page</kbd>.",
        "apihelp-query+blocks-description": "Listar todos os utilizadores e endereços IP bloqueados.",
        "apihelp-query+blocks-param-start": "A data e hora a partir da qual será começada a enumeração.",
        "apihelp-query+blocks-param-end": "A data e hora na qual será terminada a enumeração.",
        "apihelp-query+blocks-param-limit": "O número máximo de bloqueios a listar.",
        "apihelp-query+blocks-param-prop": "As propriedades a serem obtidas:",
        "apihelp-query+blocks-paramvalue-prop-id": "Adiciona o identificador do bloqueio.",
+       "apihelp-query+blocks-paramvalue-prop-user": "Adiciona o nome do utilizador bloqueado.",
        "apihelp-query+blocks-paramvalue-prop-userid": "Adiciona o identificador do utilizador bloqueado.",
+       "apihelp-query+blocks-paramvalue-prop-by": "Adiciona o nome do utilizador que fez o bloqueio.",
        "apihelp-query+blocks-paramvalue-prop-byid": "Adiciona o identificador do utilizador que fez o bloqueio.",
+       "apihelp-query+blocks-paramvalue-prop-timestamp": "Adiciona a data e hora de realização do bloqueio.",
        "apihelp-query+blocks-paramvalue-prop-expiry": "Adiciona a data e hora de expiração do bloqueio.",
+       "apihelp-query+blocks-paramvalue-prop-reason": "Adiciona o motivo apresentado para o bloqueio.",
        "apihelp-query+blocks-paramvalue-prop-range": "Adiciona o intervalo de endereços IP afetado pelo bloqueio.",
+       "apihelp-query+blocks-paramvalue-prop-flags": "Etiqueta o bloqueio com (autoblock, anononly, etc.).",
        "apihelp-query+blocks-param-show": "Mostrar só os bloqueios que preenchem estes critérios.\nPor exemplo, para ver só bloqueios indefinidos de endereços IP, defina <kbd>$1show=ip|!temp</kbd>.",
        "apihelp-query+blocks-example-simple": "Listar bloqueios.",
        "apihelp-query+blocks-example-users": "Listar os bloqueios dos utilizadores <kbd>Alice</kbd> e <kbd>Bob</kbd>.",
        "apihelp-query+categories-description": "Listar todas as categorias às quais as páginas pertencem.",
        "apihelp-query+categories-param-prop": "As propriedades adicionais que devem ser obtidas para cada categoria:",
        "apihelp-query+categories-paramvalue-prop-sortkey": "Adiciona a chave de ordenação (''string'' hexadecimal) e o prefixo da chave de ordenação (parte legível) da categoria.",
+       "apihelp-query+categories-paramvalue-prop-timestamp": "Adiciona a data e hora a que a categoria foi adicionada.",
+       "apihelp-query+categories-paramvalue-prop-hidden": "Etiqueta as categorias que estão ocultadas com <code>_&#95;HIDDENCAT_&#95;</code>.",
        "apihelp-query+categories-param-show": "Os tipos de categorias que serão mostrados.",
        "apihelp-query+categories-param-limit": "O número de categorias a serem devolvidas.",
        "apihelp-query+categories-param-categories": "Listar só estas categorias. Útil para verificar se uma determinada página está numa determinada categoria.",
        "apihelp-query+categories-param-dir": "A direção de listagem.",
        "apihelp-query+categories-example-simple": "Obter uma lista das categorias às quais pertence a página <kbd>Albert Einstein</kbd>.",
+       "apihelp-query+categories-example-generator": "Obter informação sobre todas as categorias usadas na página <kbd>Albert Einstein</kbd>.",
+       "apihelp-query+categoryinfo-description": "Devolve informação sobre as categorias indicadas.",
+       "apihelp-query+categoryinfo-example-simple": "Obter informações sobre <kbd>Category:Foo</kbd> e <kbd>Category:Bar</kbd>.",
        "apihelp-query+categorymembers-description": "Listar todas as páginas numa categoria específica.",
        "apihelp-query+categorymembers-param-title": "A categoria que será enumerada (obrigatório). Tem de incluir o prefixo <kbd>{{ns:category}}:</kbd>. Não pode ser usado em conjunto com <var>$1pageid</var>.",
        "apihelp-query+categorymembers-param-pageid": "Identificador da categoria a ser enumerada. Não pode ser usado em conjunto com <var>$1title</var>.",
        "apihelp-query+categorymembers-param-prop": "As informações que devem ser incluídas:",
        "apihelp-query+categorymembers-paramvalue-prop-ids": "Adiciona o identificador da página.",
+       "apihelp-query+categorymembers-paramvalue-prop-title": "Adiciona o título e o identificador do espaço nominal da página.",
        "apihelp-query+categorymembers-paramvalue-prop-sortkey": "Adiciona a chave usada para a ordenação da categoria (''string'' hexadecimal).",
+       "apihelp-query+categorymembers-paramvalue-prop-sortkeyprefix": "Adiciona o prefixo da chave usada para a ordenação da categoria (parte legível da chave de ordenação).",
        "apihelp-query+categorymembers-paramvalue-prop-type": "Adiciona o tipo com que a página foi categorizada (<samp>page</samp>, <samp>subcat</samp> ou <samp>file</samp>).",
+       "apihelp-query+categorymembers-paramvalue-prop-timestamp": "Adiciona a data e hora de inclusão da página.",
+       "apihelp-query+categorymembers-param-namespace": "Incluir só as páginas destes espaços nominais. Note que pode usar <kbd>$1type=subcat</kbd> ou <kbd>$1type=file</kbd> em vez de <kbd>$1namespace=14</kbd> ou <kbd>6</kbd>.",
        "apihelp-query+categorymembers-param-type": "O tipo de membros de categoria que devem ser incluídos. Ignorado se <kbd>$1sort=timestamp</kbd> estiver definido.",
        "apihelp-query+categorymembers-param-limit": "O número máximo de páginas a serem devolvidas.",
        "apihelp-query+categorymembers-param-sort": "Propriedade pela qual fazer a ordenação.",
        "apihelp-query+categorymembers-param-dir": "A direção da ordenação.",
        "apihelp-query+categorymembers-param-start": "A data e hora da página a partir da qual será começada a listagem. Só pode ser usado em conjunto com <kbd>$1sort=timestamp</kbd>.",
        "apihelp-query+categorymembers-param-end": "A data e hora da página na qual será terminada a listagem. Só pode ser usado em conjunto com <kbd>$1sort=timestamp</kbd>.",
+       "apihelp-query+categorymembers-param-starthexsortkey": "A chave de ordenação a partir da qual a listagem será começada, como devolvida por <kbd>$1prop=sortkey</kbd>. Só pode ser usado com <kbd>$1sort=sortkey</kbd>.",
+       "apihelp-query+categorymembers-param-endhexsortkey": "A chave de ordenação na qual a listagem será terminada, como devolvida por <kbd>$1prop=sortkey</kbd>. só pode ser usado com <kbd>$1sort=sortkey</kbd>.",
+       "apihelp-query+categorymembers-param-startsortkeyprefix": "O prefixo da chave de ordenação a partir do qual a listagem será começada. Só pode ser usado com <kbd>$1sort=sortkey</kbd>. Tem precedência sobre <var>$1starthexsortkey</var>.",
+       "apihelp-query+categorymembers-param-endsortkeyprefix": "O prefixo da chave de ordenação <strong>antes</strong> do qual a listagem será terminada (não <strong>no</strong> qual; se este valor ocorrer não será incluído!). Só pode ser usado com <kbd>$1sort=sortkey</kbd>. Tem precedência sobre <var>$1starthexsortkey</var>.",
+       "apihelp-query+categorymembers-param-startsortkey": "Em vez dele, usar $1starthexsortkey.",
+       "apihelp-query+categorymembers-param-endsortkey": "Em vez dele, usar $1endhexsortkey.",
+       "apihelp-query+categorymembers-example-simple": "Obter as primeiras 10 páginas na categoria <kbd>Category:Physics</kbd>.",
+       "apihelp-query+categorymembers-example-generator": "Obter informações sobre as primeiras 10 páginas na categoria <kbd>Category:Physics</kbd>.",
+       "apihelp-query+contributors-description": "Obter a lista do contribuidores autenticados e a contagem dos contribuidores anónimos de uma página.",
+       "apihelp-query+contributors-param-group": "Incluir só os utilizadores nos grupos indicados. Não inclui os grupos implícitos ou de promoção automática como *, utilizador, ou autoconfirmado.",
+       "apihelp-query+contributors-param-excludegroup": "Excluir os utilizadores nos grupos indicados. Não inclui os grupos implícitos ou de promoção automática como *, utilizador, ou autoconfirmado.",
+       "apihelp-query+contributors-param-rights": "Incluir só os utilizadores com as permissões indicadas. Não inclui as permissões atribuídas por grupos implícitos ou de promoção automática como *, utilizador, ou autoconfirmado.",
+       "apihelp-query+contributors-param-excluderights": "Excluir os utilizadores com as permissões indicadas. Não inclui as permissões atribuídas por grupos implícitos ou de promoção automática como *, utilizador, ou autoconfirmado.",
        "apihelp-query+contributors-param-limit": "O número de contribuidores a serem devolvidos.",
-       "apihelp-query+deletedrevisions-param-start": "A data e hora a partir da qual será começada a enumeração. Ignorado ao processar uma lista de identificadores de revisão.",
-       "apihelp-query+deletedrevisions-param-end": "A data e hora na qual será terminada a enumeração. Ignorado ao processar uma lista de identificadores de revisão.",
+       "apihelp-query+contributors-example-simple": "Mostrar os contribuidores da página <kbd>Main Page</kbd>.",
+       "apihelp-query+deletedrevisions-description": "Obter informações sobre as revisões eliminadas.\n\nPode ser usado de várias maneiras:\n# Obter as revisões eliminadas para um conjunto de páginas, definindo títulos ou identificadores de página. Ordenados por título e data e hora.\n# Obter dados sobre um conjunto de revisões eliminadas definindo os respetivos ids: com identificadores de revisão. Ordenados pelo identificador de revisão.",
+       "apihelp-query+deletedrevisions-param-start": "A data e hora da revisão a partir da qual será começada a enumeração. Ignorado ao processar uma lista de identificadores de revisão.",
+       "apihelp-query+deletedrevisions-param-end": "A data e hora da revisão na qual será terminada a enumeração. Ignorado ao processar uma lista de identificadores de revisão.",
        "apihelp-query+deletedrevisions-param-tag": "Listar só as revisões marcadas com esta etiqueta.",
        "apihelp-query+deletedrevisions-param-user": "Listar só as revisões deste utilizador.",
        "apihelp-query+deletedrevisions-param-excludeuser": "Não listar as revisões deste utilizador.",
        "apihelp-query+deletedrevisions-example-revids": "Listar a informação da revisão eliminada <kbd>123456</kbd>.",
        "apihelp-query+deletedrevs-description": "Listar as revisões eliminadas.\n\nOpera em três modos:\n# Listar as revisões eliminadas dos títulos indicados, ordenadas por data e hora.\n# Listar as contribuições eliminadas do utilizador indicado, ordenadas por data e hora (sem especificar títulos).\n# Listar todas as revisões eliminadas no espaço nominal indicado, ordenadas por título e por data e hora (sem especificar títulos, sem definir $1user).\n\nAlguns parâmetros só se aplicam a alguns modos e são ignorados noutros.",
        "apihelp-query+deletedrevs-paraminfo-modes": "{{PLURAL:$1|Modo|Modos}}: $2",
-       "apihelp-query+deletedrevs-param-start": "A data e hora a partir da qual será começada a enumeração.",
-       "apihelp-query+deletedrevs-param-end": "A data e hora na qual será terminada a enumeração.",
+       "apihelp-query+deletedrevs-param-start": "A data e hora da revisão a partir da qual será começada a enumeração.",
+       "apihelp-query+deletedrevs-param-end": "A data e hora da revisão na qual será terminada a enumeração.",
        "apihelp-query+deletedrevs-param-from": "Começar a listagem neste título.",
        "apihelp-query+deletedrevs-param-to": "Terminar a listagem neste título.",
        "apihelp-query+deletedrevs-param-prefix": "Procurar todos os títulos de página que começam por este valor.",
        "apihelp-query+deletedrevs-example-mode2": "Listar as últimas 50 contribuições eliminadas do utilizador <kbd>Bob</kbd> (modo 2).",
        "apihelp-query+deletedrevs-example-mode3-main": "Listar as primeiras 50 revisões eliminadas no espaço nominal principal (modo 3).",
        "apihelp-query+deletedrevs-example-mode3-talk": "Listar as primeiras 50 páginas eliminadas no espaço nominal {{ns:talk}} (modo 3).",
+       "apihelp-query+disabled-description": "Este módulo de consulta foi desativado.",
        "apihelp-query+duplicatefiles-description": "Listar todos os ficheiros que são duplicados dos ficheiros indicados com base no seu resumo criptográfico.",
        "apihelp-query+duplicatefiles-param-limit": "O número de ficheiros duplicados a serem devolvidos.",
        "apihelp-query+duplicatefiles-param-dir": "A direção de listagem.",
+       "apihelp-query+duplicatefiles-param-localonly": "Procurar ficheiros só no repositório local.",
+       "apihelp-query+duplicatefiles-example-simple": "Procurar os ficheiros duplicados de [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+duplicatefiles-example-generated": "Procurar duplicados de todos os ficheiros.",
+       "apihelp-query+embeddedin-description": "Encontrar todas as páginas que incorporam (transcluem) o título indicado.",
+       "apihelp-query+embeddedin-param-title": "O título a procurar. Não pode ser usado em conjunto com $1pageid.",
+       "apihelp-query+embeddedin-param-pageid": "O identificador da página a procurar. Não pode ser usado em conjunto com $1title.",
        "apihelp-query+embeddedin-param-namespace": "O espaço nominal a ser enumerado.",
        "apihelp-query+embeddedin-param-dir": "A direção de listagem.",
+       "apihelp-query+embeddedin-param-filterredir": "Como filtrar os redirecionamentos.",
        "apihelp-query+embeddedin-param-limit": "O número total de páginas a serem devolvidas.",
+       "apihelp-query+embeddedin-example-simple": "Mostrar as páginas que transcluem <kbd>Template:Stub</kbd>.",
+       "apihelp-query+embeddedin-example-generator": "Obter informação sobre as páginas que transcluem <kbd>Template:Stub</kbd>.",
        "apihelp-query+extlinks-description": "Devolve todos os URL externos (que não sejam interwikis) das páginas especificadas.",
        "apihelp-query+extlinks-param-limit": "O número de ''links'' a serem devolvidos.",
-       "apihelp-query+extlinks-param-protocol": "Protocolo do URL. Se vazio e <var>$1query</var> está definido, o protocolo é <kbd>http</kbd>. Deixe isto e  <var>$1query</var> vazios para listar todos os <i>links</i> externos.",
+       "apihelp-query+extlinks-param-protocol": "Protocolo do URL. Se vazio e <var>$1query</var> está definido, o protocolo é <kbd>http</kbd>. Deixe isto e  <var>$1query</var> vazios para listar todos os ''links'' externos.",
        "apihelp-query+extlinks-param-query": "Texto de pesquisa sem protocolo. Útil para verificar se uma determinada página contém um determinado URL externo.",
+       "apihelp-query+extlinks-param-expandurl": "Expandir os URL relativos a protocolo com o protocolo canónico.",
        "apihelp-query+extlinks-example-simple": "Obter uma lista das ligações externas na <kbd>Main Page</kbd>.",
        "apihelp-query+exturlusage-description": "Enumerar as páginas que contêm um determinado URL.",
        "apihelp-query+exturlusage-param-prop": "As informações que devem ser incluídas:",
        "apihelp-query+exturlusage-paramvalue-prop-ids": "Adiciona o identificador da página.",
+       "apihelp-query+exturlusage-paramvalue-prop-title": "Adiciona o título e o identificador do espaço nominal da página.",
        "apihelp-query+exturlusage-paramvalue-prop-url": "Adiciona o URL usado na página.",
-       "apihelp-query+exturlusage-param-protocol": "Protocolo do URL. Se vazio e <var>$1query</var> está definido, o protocolo é <kbd>http</kbd>. Deixe isto e  <var>$1query</var> vazios para listar todos os <i>links</i> externos.",
+       "apihelp-query+exturlusage-param-protocol": "Protocolo do URL. Se vazio e <var>$1query</var> está definido, o protocolo é <kbd>http</kbd>. Deixe isto e  <var>$1query</var> vazios para listar todos os ''links'' externos.",
+       "apihelp-query+exturlusage-param-query": "Texto da pesquisa sem um protocolo. Ver [[Special:LinkSearch]]. Deixar vazio para listar todos os ''links'' externos.",
        "apihelp-query+exturlusage-param-namespace": "Os espaços nominais a serem enumerados.",
        "apihelp-query+exturlusage-param-limit": "O número de páginas a serem devolvidas.",
-       "apihelp-query+exturlusage-param-expandurl": "Expandir URL relativos a protocolos com o protocolo canónico.",
+       "apihelp-query+exturlusage-param-expandurl": "Expandir os URL relativos a protocolo com o protocolo canónico.",
+       "apihelp-query+exturlusage-example-simple": "Mostrar as páginas com ligações para <kbd>http://www.mediawiki.org</kbd>.",
        "apihelp-query+filearchive-description": "Enumerar todos os ficheiros eliminados sequencialmente.",
        "apihelp-query+filearchive-param-from": "O título da imagem a partir do qual será começada a enumeração.",
        "apihelp-query+filearchive-param-to": "O título da imagem no qual será terminada a enumeração.",
        "apihelp-query+filearchive-param-prefix": "Procurar todos os títulos de imagem que começam por este valor.",
+       "apihelp-query+filearchive-param-limit": "O número total de imagens a devolver.",
        "apihelp-query+filearchive-param-dir": "A direção de listagem.",
-       "apihelp-query+filearchive-param-sha1": "O resumo criptográfico SHA-1 da imagem. Anula $1sha1base36.",
+       "apihelp-query+filearchive-param-sha1": "O resumo criptográfico SHA-1 da imagem. Tem precedência sobre $1sha1base36.",
        "apihelp-query+filearchive-param-sha1base36": "O resumo criptográfico da imagem na base 36 (usado no MediaWiki).",
        "apihelp-query+filearchive-param-prop": "As informações da imagem que devem ser obtidas:",
        "apihelp-query+filearchive-paramvalue-prop-sha1": "Adiciona o resumo criptográfico SHA-1 da imagem.",
+       "apihelp-query+filearchive-paramvalue-prop-timestamp": "Adiciona a data e hora da versão carregada.",
        "apihelp-query+filearchive-paramvalue-prop-user": "Adiciona o utilizador que carregou a versão da imagem.",
+       "apihelp-query+filearchive-paramvalue-prop-size": "Adiciona o tamanho da imagem em ''bytes'' e a altura, largura e contagem de páginas (se aplicável).",
+       "apihelp-query+filearchive-paramvalue-prop-dimensions": "Nome alternativo para ''size''.",
        "apihelp-query+filearchive-paramvalue-prop-description": "Adiciona a descrição da versão da imagem.",
+       "apihelp-query+filearchive-paramvalue-prop-parseddescription": "Fazer a análise sintática da descrição da versão.",
        "apihelp-query+filearchive-paramvalue-prop-mime": "Adiciona o tipo MIME da imagem.",
+       "apihelp-query+filearchive-paramvalue-prop-mediatype": "Adiciona o tipo de multimédia da imagem.",
+       "apihelp-query+filearchive-paramvalue-prop-metadata": "Lista os metadados Exif para a versão da imagem.",
        "apihelp-query+filearchive-paramvalue-prop-bitdepth": "Adiciona a profundidade em ''bits'' da versão.",
+       "apihelp-query+filearchive-paramvalue-prop-archivename": "Adiciona o nome de ficheiro da versão arquivada das versões anteriores à última.",
        "apihelp-query+filearchive-example-simple": "Mostrar uma lista de todos os ficheiros eliminados.",
+       "apihelp-query+filerepoinfo-description": "Devolver meta informação sobre os repositórios de imagens configurados na wiki.",
        "apihelp-query+filerepoinfo-param-prop": "As propriedades do repositório que devem ser obtidas (em algumas wikis poderão haver mais disponíveis):\n;apiurl:URL para a API do repositório - útil para obter informação de imagens do servidor.\n;name:A chave para o repositório - usada, por exemplo, em <var>[[mw:Manual:$wgForeignFileRepos|$wgForeignFileRepos]]</var> e nos valores de retorno de [[Special:ApiHelp/query+imageinfo|imageinfo]].\n;displayname:O nome legível da wiki repositório.\n;rooturl:URL de raiz para endereços de imagens.\n;local:Se o repositório é o local ou não.",
+       "apihelp-query+filerepoinfo-example-simple": "Obter informações sobre os repositórios de ficheiros.",
+       "apihelp-query+fileusage-description": "Encontrar todas as páginas que usam os ficheiros indicados.",
        "apihelp-query+fileusage-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+fileusage-paramvalue-prop-pageid": "O identificador de cada página.",
+       "apihelp-query+fileusage-paramvalue-prop-title": "O título de cada página.",
        "apihelp-query+fileusage-paramvalue-prop-redirect": "Indicar se a página é um redirecionamento.",
+       "apihelp-query+fileusage-param-namespace": "Incluir só as páginas destes espaços nominais.",
        "apihelp-query+fileusage-param-limit": "O número de elementos a serem devolvidos.",
+       "apihelp-query+fileusage-param-show": "Mostrar só as páginas que correspondem a estes critérios:\n;redirect:Mostrar só os redirecionamentos.\n;!redirect:Mostrar só os não redirecionamentos.",
        "apihelp-query+fileusage-example-simple": "Obter uma lista das páginas que usam [[:File:Example.jpg]].",
        "apihelp-query+fileusage-example-generator": "Obter informação sobre as páginas que usam [[:File:Example.jpg]].",
        "apihelp-query+imageinfo-description": "Devolve informação do ficheiro e o historial de carregamentos.",
        "apihelp-query+imageinfo-param-prop": "As informações do ficheiro que devem ser obtidas:",
        "apihelp-query+imageinfo-paramvalue-prop-timestamp": "Adiciona a data e hora da versão carregada.",
+       "apihelp-query+imageinfo-paramvalue-prop-user": "Adiciona o utilizador que carregou cada versão de ficheiro.",
+       "apihelp-query+imageinfo-paramvalue-prop-userid": "Adiciona o identificador do utilizador que carregou cada versão de ficheiro.",
+       "apihelp-query+imageinfo-paramvalue-prop-comment": "O comentário da versão.",
+       "apihelp-query+imageinfo-paramvalue-prop-parsedcomment": "Fazer a análise sintática do comentário da versão.",
        "apihelp-query+imageinfo-paramvalue-prop-canonicaltitle": "Adiciona o título canónico do ficheiro.",
        "apihelp-query+imageinfo-paramvalue-prop-url": "Devolve URL para o ficheiro e página de descrição.",
        "apihelp-query+imageinfo-paramvalue-prop-size": "Adiciona o tamanho do ficheiro em ''bytes'' e a altura, largura e contagem de páginas (se aplicável).",
+       "apihelp-query+imageinfo-paramvalue-prop-dimensions": "Nome alternativo para ''size''.",
        "apihelp-query+imageinfo-paramvalue-prop-sha1": "Adiciona o resumo criptográfico SHA-1 do ficheiro.",
+       "apihelp-query+imageinfo-paramvalue-prop-mime": "Adiciona o tipo MIME do ficheiro.",
        "apihelp-query+imageinfo-paramvalue-prop-thumbmime": "Adiciona o tipo MIME da miniatura (requer URL e o parâmetro $1urlwidth).",
+       "apihelp-query+imageinfo-paramvalue-prop-mediatype": "Adiciona o tipo de multimédia do ficheiro.",
+       "apihelp-query+imageinfo-paramvalue-prop-metadata": "Lista os metadados Exif para a versão do ficheiro.",
+       "apihelp-query+imageinfo-paramvalue-prop-commonmetadata": "Lista os metadados genéricos do formato de ficheiro para a versão do ficheiro.",
+       "apihelp-query+imageinfo-paramvalue-prop-extmetadata": "Lista os metadados formatados, combinados de várias fontes. Os resultados estão no formato HTML.",
        "apihelp-query+imageinfo-paramvalue-prop-archivename": "Adiciona o nome de ficheiro da versão arquivada das versões anteriores à última.",
        "apihelp-query+imageinfo-paramvalue-prop-bitdepth": "Adiciona a profundidade em ''bits'' da versão.",
+       "apihelp-query+imageinfo-paramvalue-prop-uploadwarning": "Usado pela página Special:Upload para obter informação sobre um ficheiro existente. Não se destina a ser usado fora do núcleo central do MediaWiki.",
+       "apihelp-query+imageinfo-param-limit": "O número de revisões a serem devolvidas por ficheiro.",
        "apihelp-query+imageinfo-param-start": "Data e hora a partir da qual será começada a listagem.",
        "apihelp-query+imageinfo-param-end": "Data e hora na qual será terminada a listagem.",
        "apihelp-query+imageinfo-param-urlwidth": "Se $2prop=url está definido, será devolvido um URL para uma imagem redimensionada com este comprimento.\nPor razões de desempenho, se esta opção for usada não serão devolvidas mais de $1 imagens redimensionadas.",
+       "apihelp-query+imageinfo-param-urlheight": "Semelhante a $1urlwidth.",
+       "apihelp-query+imageinfo-param-metadataversion": "Versão de metadados a ser usada. Se for especificado o valor <kbd>latest</kbd>, usar a versão mais recente. Por omissão tem o valor <kbd>1</kbd> para compatibilidade com versões anteriores.",
        "apihelp-query+imageinfo-param-extmetadatalanguage": "Em que língua obter extmetadata. Isto afeta tanto a tradução que será obtida, caso existam várias, como a formatação de números e vários outros valores.",
+       "apihelp-query+imageinfo-param-extmetadatamultilang": "Se estiverem disponíveis traduções para a propriedade extmetadata, obtê-las todas.",
+       "apihelp-query+imageinfo-param-extmetadatafilter": "Se for especificado e não estiver vazio, só serão devolvidas estas chaves para $1prop=extmetadata.",
+       "apihelp-query+imageinfo-param-urlparam": "Um parâmetro de texto específico do objeto. Por exemplo, ficheiros PDF podem usar <kbd>page15-100px</kbd>. <var>$1urlwidth</var> tem de ser usado e ser consistente com <var>$1urlparam</var>.",
+       "apihelp-query+imageinfo-param-localonly": "Procurar ficheiros só no repositório local.",
+       "apihelp-query+imageinfo-example-simple": "Obter informação sobre a versão atual do ficheiro [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageinfo-example-dated": "Obter informação sobre as versões de [[:File:Test.jpg]] a partir de 2008.",
+       "apihelp-query+images-description": "Devolve todos os ficheiros contidos nas páginas indicadas.",
        "apihelp-query+images-param-limit": "O número de ficheiros a serem devolvidos.",
        "apihelp-query+images-param-images": "Listar só estes ficheiros. Útil para verificar se uma determinada página tem um determinado ficheiro.",
        "apihelp-query+images-param-dir": "A direção de listagem.",
        "apihelp-query+images-example-simple": "Obter uma lista dos ficheiros usados na página [[Main Page]].",
        "apihelp-query+images-example-generator": "Obter informação sobre todos os ficheiros usados na página [[Main Page]].",
+       "apihelp-query+imageusage-description": "Encontrar todas as páginas que utilizam o título da imagem indicada.",
+       "apihelp-query+imageusage-param-title": "O título a procurar. Não pode ser usado em conjunto com $1pageid.",
+       "apihelp-query+imageusage-param-pageid": "O identificador da página a procurar. Não pode ser usado em conjunto com $1title.",
        "apihelp-query+imageusage-param-namespace": "O espaço nominal a ser enumerado.",
        "apihelp-query+imageusage-param-dir": "A direção de listagem.",
+       "apihelp-query+imageusage-param-filterredir": "Como filtrar redirecionamentos. Se definido como <kbd>nonredirects</kbd> quando <var>$1redirect</var> está ativado, isto só é aplicado ao segundo nível.",
        "apihelp-query+imageusage-param-limit": "O número total de páginas a serem devolvidas. Se <var>$1redirect</var> estiver ativado, o nível aplica-se a cada nível em separado (o que significa que até 2 * <var>$1limit</var> resultados podem ser devolvidos).",
-       "apihelp-query+info-description": "Obter informação básica da página.",
+       "apihelp-query+imageusage-param-redirect": "Se a página que contém a ligação é um redirecionamento, procurar também todas as páginas que contêm ligações para esse redirecionamento. O limite máximo é reduzido para metade.",
+       "apihelp-query+imageusage-example-simple": "Mostrar as páginas que usam [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+imageusage-example-generator": "Obter informações sobre as páginas que usam o ficheiro [[:File:Albert Einstein Head.jpg]].",
+       "apihelp-query+info-description": "Obter a informação básica da página.",
        "apihelp-query+info-param-prop": "As propriedades adicionais que devem ser obtidas:",
        "apihelp-query+info-paramvalue-prop-protection": "Listar o nível de proteção de cada página.",
        "apihelp-query+info-paramvalue-prop-talkid": "O identificador da página de discussão de cada página que não seja de discussão.",
+       "apihelp-query+info-paramvalue-prop-watched": "Listar o estado de vigilância de cada página.",
+       "apihelp-query+info-paramvalue-prop-watchers": "O número de vigilantes, se for permitido.",
+       "apihelp-query+info-paramvalue-prop-visitingwatchers": "O número de vigilantes de cada página que visitaram edições recentes dessa página, se permitido.",
        "apihelp-query+info-paramvalue-prop-notificationtimestamp": "A data e hora das notificações de alterações de cada página vigiada.",
+       "apihelp-query+info-paramvalue-prop-subjectid": "O identificador da página progenitora de cada página de discussão.",
        "apihelp-query+info-paramvalue-prop-url": "Fornece um URL completo, um URL de edição e o URL canónico, para cada página.",
        "apihelp-query+info-paramvalue-prop-readable": "Indica se o utilizador pode ler esta página.",
+       "apihelp-query+info-paramvalue-prop-preload": "Fornece o texto devolvido por EditFormPreloadText.",
+       "apihelp-query+info-paramvalue-prop-displaytitle": "Fornece a forma como o título da página é apresentado.",
        "apihelp-query+info-param-testactions": "Testar se o utilizador pode realizar certas operações na página.",
        "apihelp-query+info-param-token": "Em substituição, usar [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
-       "apihelp-query+iwbacklinks-param-title": "Link interwikis a ser procurado. Tem de ser usado em conjunto com <var>$1blprefix</var>.",
+       "apihelp-query+info-example-simple": "Obter informações sobre a página <kbd>Main Page</kbd>.",
+       "apihelp-query+info-example-protection": "Obter informação geral e de proteção sobre a página <kbd>Main Page</kbd>.",
+       "apihelp-query+iwbacklinks-description": "Encontrar todas as páginas que contêm o ''link'' interwikis indicado.\n\nPode ser usado para encontrar todos os ''links'' com um determinado prefixo, ou todos os ''links'' para um título (com um prefixo indicado). Não usar nenhum dos dois parâmetros significa efetivamente ''todos os ''links'' interwikis''.",
+       "apihelp-query+iwbacklinks-param-prefix": "O prefixo interwikis.",
+       "apihelp-query+iwbacklinks-param-title": "O ''link'' interwikis a ser procurado. Tem de ser usado em conjunto com <var>$1blprefix</var>.",
        "apihelp-query+iwbacklinks-param-limit": "O número total de páginas a serem devolvidas.",
        "apihelp-query+iwbacklinks-param-prop": "As propriedades a serem obtidas:",
-       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Adiciona o prefixo da ligação interwikis.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwprefix": "Adiciona o prefixo do ''link'' interwikis.",
+       "apihelp-query+iwbacklinks-paramvalue-prop-iwtitle": "Adiciona o título do ''link'' interwikis.",
        "apihelp-query+iwbacklinks-param-dir": "A direção de listagem.",
+       "apihelp-query+iwbacklinks-example-simple": "Obter as páginas que contêm ligações para [[wikibooks:Test]].",
+       "apihelp-query+iwbacklinks-example-generator": "Obter informação sobre as páginas que contêm ligações para [[wikibooks:Test]].",
+       "apihelp-query+iwlinks-description": "Devolve todos os ''links'' interwikis das páginas indicadas.",
        "apihelp-query+iwlinks-param-url": "Indica se deve ser obtido o URL completo (não pode ser usado com $1prop).",
        "apihelp-query+iwlinks-param-prop": "As propriedades adicionais que devem ser obtidas para cada ''link'' interlínguas:",
        "apihelp-query+iwlinks-paramvalue-prop-url": "Adiciona o URL completo.",
        "apihelp-query+iwlinks-param-limit": "O número de ''links'' interwikis a serem devolvidos.",
+       "apihelp-query+iwlinks-param-prefix": "Devolver só os ''links'' interwikis com este prefixo.",
        "apihelp-query+iwlinks-param-title": "Link interwikis a ser procurado. Tem de ser usado em conjunto com <var>$1prefix</var>.",
        "apihelp-query+iwlinks-param-dir": "A direção de listagem.",
+       "apihelp-query+iwlinks-example-simple": "Obter os ''links'' interwikis da página <kbd>Main Page</kbd>.",
+       "apihelp-query+langbacklinks-description": "Encontrar todas as páginas que contêm ligações para o ''link'' interlínguas indicado.\n\nPode ser usado para encontrar todos os ''links'' para um determinado código de língua, ou todos os ''links'' para um determinado título (de uma língua). Se nenhum for usado, isso efetivamente significa \"todos os ''links'' interlínguas\".\n\nNote que os ''links'' interlínguas adicionados por extensões podem não ser considerados.",
+       "apihelp-query+langbacklinks-param-lang": "A língua do ''link'' interlínguas.",
        "apihelp-query+langbacklinks-param-title": "Link interlínguas a ser procurado. Tem de ser usado com $1lang.",
        "apihelp-query+langbacklinks-param-limit": "O número total de páginas a serem devolvidas.",
        "apihelp-query+langbacklinks-param-prop": "As propriedades a serem obtidas:",
        "apihelp-query+langbacklinks-paramvalue-prop-lllang": "Adiciona o código de língua da ligação interlínguas.",
+       "apihelp-query+langbacklinks-paramvalue-prop-lltitle": "Adiciona o título do ''link'' interlínguas.",
        "apihelp-query+langbacklinks-param-dir": "A direção de listagem.",
+       "apihelp-query+langbacklinks-example-simple": "Obter as páginas que contêm ligações para [[:fr:Test]].",
+       "apihelp-query+langbacklinks-example-generator": "Obter informações sobre as páginas que contêm ligações para [[:fr:Test]].",
+       "apihelp-query+langlinks-description": "Devolve todos os ''links'' interlínguas das páginas indicadas.",
        "apihelp-query+langlinks-param-limit": "O número de ''links'' interlínguas a serem devolvidos.",
        "apihelp-query+langlinks-param-url": "Indica se deve ser obtido o URL completo (não pode ser usado com $1prop).",
        "apihelp-query+langlinks-param-prop": "As propriedades adicionais que devem ser obtidas para cada ''link'' interlínguas:",
        "apihelp-query+langlinks-paramvalue-prop-url": "Adiciona o URL completo.",
+       "apihelp-query+langlinks-paramvalue-prop-langname": "Adiciona o nome da língua localizado (melhor esforço). Usar <var>$1inlanguagecode</var> para controlar a língua.",
        "apihelp-query+langlinks-paramvalue-prop-autonym": "Adiciona o nome nativo da língua.",
-       "apihelp-query+langlinks-param-title": "Link a ser procurado. Tem de ser usado com <var>$1lang</var>.",
+       "apihelp-query+langlinks-param-lang": "Devolver só os ''links'' interlínguas com este código de língua.",
+       "apihelp-query+langlinks-param-title": "''Link'' a ser procurado. Tem de ser usado com <var>$1lang</var>.",
        "apihelp-query+langlinks-param-dir": "A direção de listagem.",
+       "apihelp-query+langlinks-param-inlanguagecode": "O código de língua para os nomes de língua localizados.",
+       "apihelp-query+langlinks-example-simple": "Obter os ''links'' interlínguas da página <kbd>Main Page</kbd>.",
+       "apihelp-query+links-description": "Devolve todos os ''links'' das páginas indicadas.",
+       "apihelp-query+links-param-namespace": "Mostrar apenas os ''links'' destes espaços nominais.",
        "apihelp-query+links-param-limit": "O número de ''links'' a serem devolvidos.",
        "apihelp-query+links-param-titles": "Listar só as ligações para estes títulos. Útil para verificar se uma determinada página contém ligações para um determinado título.",
        "apihelp-query+links-param-dir": "A direção de listagem.",
+       "apihelp-query+links-example-simple": "Obter os ''links'' da página <kbd>Main Page</kbd>.",
+       "apihelp-query+links-example-generator": "Obter informação sobre as páginas ligadas na página <kbd>Main Page</kbd>.",
+       "apihelp-query+links-example-namespaces": "Obter os ''links'' da página <kbd>Main Page</kbd> nos espaços nominais {{ns:user}} e {{ns:template}}.",
+       "apihelp-query+linkshere-description": "Encontrar todas as páginas que contêm ''links'' para as páginas indicadas.",
        "apihelp-query+linkshere-param-prop": "As propriedades a serem obtidas:",
+       "apihelp-query+linkshere-paramvalue-prop-pageid": "O identificador de cada página.",
+       "apihelp-query+linkshere-paramvalue-prop-title": "O título de cada página.",
        "apihelp-query+linkshere-paramvalue-prop-redirect": "Indicar se a página é um redirecionamento.",
-       "apihelp-query+linkshere-param-limit": "O número de elementos a serem devolvidos.",
+       "apihelp-query+linkshere-param-namespace": "Incluir só as páginas nestes espaços nominais.",
+       "apihelp-query+linkshere-param-limit": "O número de páginas a serem devolvidas.",
+       "apihelp-query+linkshere-param-show": "Mostrar só as páginas que correspondem a estes critérios:\n;redirect:Mostrar só os redirecionamentos.\n;!redirect:Mostrar só os não redirecionamentos.",
+       "apihelp-query+linkshere-example-simple": "Obter uma lista das páginas com ligações para a página [[Main Page]].",
+       "apihelp-query+linkshere-example-generator": "Obter informação sobre as páginas com ligações para a página [[Main Page]].",
+       "apihelp-query+logevents-description": "Obter eventos dos registos.",
        "apihelp-query+logevents-param-prop": "As propriedades a serem obtidas:",
-       "apihelp-query+logevents-paramvalue-prop-ids": "Adiciona o identificador do evento no registo.",
-       "apihelp-query+logevents-paramvalue-prop-type": "Adiciona o tipo do evento no registo.",
-       "apihelp-query+logevents-paramvalue-prop-userid": "Adiciona o identificador do utilizador responsável pelo evento no registo.",
-       "apihelp-query+logevents-paramvalue-prop-comment": "Adiciona o comentário do evento no registo.",
+       "apihelp-query+logevents-paramvalue-prop-ids": "Adiciona o identificador do evento do registo.",
+       "apihelp-query+logevents-paramvalue-prop-title": "Adiciona o título da página do evento do registo.",
+       "apihelp-query+logevents-paramvalue-prop-type": "Adiciona o tipo do evento do registo.",
+       "apihelp-query+logevents-paramvalue-prop-user": "Adiciona o utilizador responsável pelo evento do registo.",
+       "apihelp-query+logevents-paramvalue-prop-userid": "Adiciona o identificador do utilizador responsável pelo evento do registo.",
+       "apihelp-query+logevents-paramvalue-prop-timestamp": "Adiciona a data e hora do evento do registo.",
+       "apihelp-query+logevents-paramvalue-prop-comment": "Adiciona o comentário do evento do registo.",
+       "apihelp-query+logevents-paramvalue-prop-parsedcomment": "Adiciona o comentário do evento do registo, após análise sintática.",
+       "apihelp-query+logevents-paramvalue-prop-details": "Lista detalhes adicionais sobre o evento do registo.",
+       "apihelp-query+logevents-paramvalue-prop-tags": "Lista as etiquetas do evento do registo.",
+       "apihelp-query+logevents-param-type": "Filtrar as entradas do registo para produzir só as deste tipo.",
+       "apihelp-query+logevents-param-action": "Filtrar as entradas do registo para produzir só as desta operação. Tem precedência sobre <var>$1type</var>. Na lista dos valores possíveis, os valores com o carácter de substituição asterisco <kbd>action/*</kbd> podem conter outros valores após a barra (/).",
        "apihelp-query+logevents-param-start": "A data e hora a partir da qual será começada a enumeração.",
        "apihelp-query+logevents-param-end": "A data e hora na qual será terminada a enumeração.",
+       "apihelp-query+logevents-param-user": "Filtrar as entradas para produzir só as criadas pelo utilizador indicado.",
+       "apihelp-query+logevents-param-title": "Filtrar as entradas para produzir só as relacionadas com uma página.",
+       "apihelp-query+logevents-param-namespace": "Filtrar as entradas para produzir só as que estão no espaço nominal indicado.",
+       "apihelp-query+logevents-param-prefix": "Filtrar as entradas para produzir só as que começam por este prefixo.",
        "apihelp-query+logevents-param-tag": "Listar só as entradas de eventos marcadas com esta etiqueta.",
        "apihelp-query+logevents-param-limit": "O número total de entradas de eventos a serem devolvidas.",
        "apihelp-query+logevents-example-simple": "Listar os eventos recentes do registo.",
        "apihelp-query+protectedtitles-paramvalue-prop-level": "Adiciona o nível de proteção.",
        "apihelp-query+protectedtitles-example-simple": "Lista os títulos protegidos.",
        "apihelp-query+protectedtitles-example-generator": "Encontrar as ligações para os títulos protegidos que pertencem ao espaço nominal principal.",
+       "apihelp-query+querypage-description": "Obter uma lista fornecida por uma página especial baseada em consultas (''QueryPage'').",
        "apihelp-query+querypage-param-page": "O nome da página especial. Note que este é sensível a maiúsculas e minúsculas.",
        "apihelp-query+querypage-param-limit": "O número de resultados a serem devolvidos.",
+       "apihelp-query+querypage-example-ancientpages": "Devolver os resultados da página [[Special:Ancientpages]].",
        "apihelp-query+random-description": "Obter um conjunto de páginas aleatórias.\n\nAs páginas são listadas em sequência fixa, só o ponto de início da listagem é aleatório. Isto significa, por exemplo, que se a primeira página aleatória na lista é <samp>Main Page</samp>, a página <samp>List of fictional monkeys</samp> será <em>sempre</em> a segunda, a página <samp>List of people on stamps of Vanuatu</samp> a terceira, etc.",
        "apihelp-query+random-param-namespace": "Devolver só as páginas que estão nestes espaços nominais.",
        "apihelp-query+random-param-limit": "Limitar o número de páginas aleatórias que serão devolvidas.",
        "apihelp-query+recentchanges-description": "Enumerar as mudanças recentes.",
        "apihelp-query+recentchanges-param-start": "A data e hora a partir da qual será começada a enumeração.",
        "apihelp-query+recentchanges-param-end": "A data e hora na qual será terminada a enumeração.",
-       "apihelp-query+recentchanges-param-namespace": "Filtrar só as mudanças nestes espaços nominais.",
+       "apihelp-query+recentchanges-param-namespace": "Filtrar as mudanças para produzir só as destes espaços nominais.",
        "apihelp-query+recentchanges-param-user": "Listar só as mudanças feitas por este utilizador.",
        "apihelp-query+recentchanges-param-excludeuser": "Não listar as mudanças feitas por este utilizador.",
        "apihelp-query+recentchanges-param-tag": "Listar só as mudanças marcadas com esta etiqueta.",
        "apihelp-query+redirects-param-show": "Mostrar só as páginas que correspondem a estes critérios:\n;fragment:Mostrar só os redirecionamentos com um fragmento.\n;!fragment:Mostrar só os redirecionamentos sem um fragmento.",
        "apihelp-query+redirects-example-simple": "Obter uma lista dos redirecionamentos para a página [[Main Page]].",
        "apihelp-query+redirects-example-generator": "Obter informação sobre todos os redirecionamentos para a página [[Main Page]].",
-       "apihelp-query+revisions-description": "Obter informação da revisão.\n\nPode ser usado de várias maneiras:\n# Obter dados sobre um conjunto de páginas (última revisão), definindo títulos ou identificadores de páginas.\n# Obter as revisões de uma página indicada, usando títulos ou identificadores de páginas, com início, fim ou limite.\n# Obter dados sobre um conjunto de revisões definindo identificadores de revisões.",
+       "apihelp-query+revisions-description": "Obter informação da revisão.\n\nPode ser usado de várias maneiras:\n# Obter dados sobre um conjunto de páginas (última revisão), definindo títulos ou identificadores de páginas.\n# Obter as revisões de uma página indicada, usando títulos ou identificadores de páginas, com start, end ou limit.\n# Obter dados sobre um conjunto de revisões definindo os respetivos identificadores de revisões.",
        "apihelp-query+revisions-paraminfo-singlepageonly": "Só pode ser usado com uma única página (modo #2)",
        "apihelp-query+revisions-param-startid": "O identificador de revisão a partir do qual será começada a enumeração.",
        "apihelp-query+revisions-param-endid": "Terminar a enumeração de revisões neste identificador de revisão.",
        "apihelp-query+revisions-param-excludeuser": "Excluir as revisões deste utilizador.",
        "apihelp-query+revisions-param-tag": "Listar só as revisões marcadas com esta etiqueta.",
        "apihelp-query+revisions-param-token": "Que chaves obter para cada revisão.",
+       "apihelp-query+revisions-example-content": "Obter dados com o conteúdo da última revisão dos títulos <kbd>API</kbd> e <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-last5": "Obter as últimas 5 revisões da página <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-first5": "Obter as primeiras 5 revisões da página <kbd>Main Page</kbd>.",
        "apihelp-query+revisions-example-first5-after": "Obter as primeiras 5 revisões da página <kbd>Main Page</kbd> feitas após 2006-05-01.",
        "apihelp-query+revisions+base-paramvalue-prop-content": "O texto da revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-tags": "As etiquetas para a revisão.",
        "apihelp-query+revisions+base-paramvalue-prop-parsetree": "A árvore de análise XML do conteúdo da revisão (requer o modelo de conteúdo <code>$1</code>).",
+       "apihelp-query+revisions+base-param-limit": "Limitar o número de revisões que serão devolvidas.",
+       "apihelp-query+revisions+base-param-expandtemplates": "Expandir predefinições no conteúdo da revisão (requer $1prop=content).",
+       "apihelp-query+revisions+base-param-generatexml": "Gerar a árvore de análise sintática em XML do conteúdo da revisão (requer $1prop=content; substituído por <kbd>$1prop=parsetree</kbd>).",
+       "apihelp-query+revisions+base-param-parse": "Fazer a análise sintática do conteúdo da revisão (requer $1prop=content). Por motivos de desempenho, se esta opção for usada $1limit é forçado a ser 1.",
+       "apihelp-query+revisions+base-param-section": "Obter apenas o conteúdo da secção que tem este número.",
+       "apihelp-query+revisions+base-param-diffto": "O identificador da revisão contra a qual será tirada uma lista de diferenças de cada revisão. Usar <kbd>prev</kbd> (anterior), <kbd>next</kbd> (seguinte) e <kbd>cur</kbd> (atual).",
+       "apihelp-query+revisions+base-param-difftotext": "O texto contra o qual será tirada uma lista de diferenças de cada revisão. Só produz as diferenças para um número limitado de revisões. Tem precedência sobre <var>$1diffto</var>. Se <var>$1section</var> estiver definido, só o conteúdo dessa secção será comparado contra o texto.",
+       "apihelp-query+revisions+base-param-difftotextpst": "Fazer uma transformação de pré-gravação ao texto antes de calcular as diferenças. Só é válido quando usado com <var>$1difftotext</var>.",
+       "apihelp-query+revisions+base-param-contentformat": "O formato de seriação usado para <var>$1difftotext</var> e esperado para o conteúdo produzido.",
+       "apihelp-query+search-description": "Efetuar uma pesquisa do texto integral.",
        "apihelp-query+search-param-search": "Procurar os títulos de página ou o conteúdo que corresponda a este valor. Pode usar o texto da pesquisa para invocar funcionalidades de pesquisa especiais, dependendo dos meios de pesquisa do servidor da wiki.",
+       "apihelp-query+search-param-namespace": "Pesquisar só nestes espaços nominais.",
        "apihelp-query+search-param-what": "O tipo de pesquisa a executar.",
        "apihelp-query+search-param-info": "Quais os metadados a serem devolvidos.",
        "apihelp-query+search-param-prop": "As propriedades a serem devolvidas:",
+       "apihelp-query+search-param-qiprofile": "O perfil independente das pesquisas a ser usado (afeta o algoritmo de classificação).",
        "apihelp-query+search-paramvalue-prop-size": "Adiciona o tamanho da página em ''bytes''.",
        "apihelp-query+search-paramvalue-prop-wordcount": "Adiciona o número de palavras da página.",
        "apihelp-query+search-paramvalue-prop-timestamp": "Adiciona a data e hora a que a página foi editada pela última vez.",
        "apihelp-query+search-param-limit": "O número total de páginas a serem devolvidas.",
        "apihelp-query+search-param-interwiki": "Incluir resultados interwikis na pesquisa, se disponíveis.",
        "apihelp-query+search-param-backend": "O servidor de pesquisas a ser usado, se diferente do servidor padrão.",
-       "apihelp-query+search-param-enablerewrites": "Ativar reescrita da consulta interna. Alguns motores de busca podem reescrever a consulta, substituindo-a por outra que consideram que dará melhores resultados, como acontece na correção de erros de ortografia.",
-       "apihelp-query+search-example-simple": "Procurar <kbd>meaning</kbd>.",
+       "apihelp-query+search-param-enablerewrites": "Ativar a reescrita da pesquisa interna. Alguns motores de pesquisa podem reescrever a pesquisa, substituindo-a por outra que consideram que dará melhores resultados, como acontece na correção de erros de ortografia.",
+       "apihelp-query+search-example-simple": "Pesquisar <kbd>meaning</kbd>.",
+       "apihelp-query+search-example-text": "Pesquisar <kbd>meaning</kbd> nos textos.",
        "apihelp-query+search-example-generator": "Obter informação sobre as páginas devolvidas por uma pesquisa do termo <kbd>meaning</kbd>.",
        "apihelp-query+siteinfo-description": "Devolver informação geral sobre o ''site''.",
        "apihelp-query+siteinfo-param-prop": "A informação a ser obtida:",
        "apihelp-query+siteinfo-param-filteriw": "Devolver só as entradas locais, ou só as não locais, do mapa de interwikis.",
        "apihelp-query+siteinfo-param-showalldb": "Listar todos os servidores da base de dados, não só aquele que tem maior atraso.",
        "apihelp-query+siteinfo-param-numberingroup": "Lista o número de utilizadores nos grupos de utilizadores.",
-       "apihelp-query+siteinfo-param-inlanguagecode": "Código de língua dos nomes localizados (o melhor possível) das línguas e temas.",
-       "apihelp-query+siteinfo-example-simple": "Obter informação do ''site''.",
+       "apihelp-query+siteinfo-param-inlanguagecode": "O código de língua dos nomes localizados (o melhor possível) das línguas e dos temas.",
+       "apihelp-query+siteinfo-example-simple": "Obter as informações do ''site''.",
        "apihelp-query+siteinfo-example-interwiki": "Obter uma lista dos prefixos interwikis locais.",
        "apihelp-query+siteinfo-example-replag": "Verificar o atraso de replicação atual.",
        "apihelp-query+stashimageinfo-description": "Devolve informações dos ficheiros escondidos.",
        "apihelp-query+usercontribs-param-limit": "O número máximo de contribuições a serem devolvidas.",
        "apihelp-query+usercontribs-param-start": "A data e hora da contribuição pela qual será começada a devolução de resultados.",
        "apihelp-query+usercontribs-param-end": "A data e hora da contribuição na qual será terminada a devolução de resultados.",
+       "apihelp-query+usercontribs-param-user": "Os utilizadores cujas contribuições serão obtidas.",
+       "apihelp-query+usercontribs-param-userprefix": "Obter as contribuições de todos os utilizadores cujos nomes começam por este valor. Tem precedência sobre $1user.",
        "apihelp-query+usercontribs-param-namespace": "Listar só as contribuições nestes espaços nominais.",
+       "apihelp-query+usercontribs-param-prop": "Incluir informações adicionais:",
        "apihelp-query+usercontribs-paramvalue-prop-ids": "Adiciona os identificadores da página e da revisão.",
+       "apihelp-query+usercontribs-paramvalue-prop-title": "Adiciona o título e o identificador do espaço nominal da página.",
        "apihelp-query+usercontribs-paramvalue-prop-timestamp": "Adiciona a data e hora da edição.",
+       "apihelp-query+usercontribs-paramvalue-prop-comment": "Adiciona o comentário da edição.",
        "apihelp-query+usercontribs-paramvalue-prop-parsedcomment": "Adiciona o comentário da edição, após análise sintática.",
+       "apihelp-query+usercontribs-paramvalue-prop-size": "Adiciona o novo tamanho da edição.",
        "apihelp-query+usercontribs-paramvalue-prop-sizediff": "Adiciona a diferença de tamanho entre a edição e a sua progenitora.",
-       "apihelp-query+usercontribs-paramvalue-prop-flags": "Adiciona indicações da edição.",
+       "apihelp-query+usercontribs-paramvalue-prop-flags": "Adiciona as etiquetas da edição.",
+       "apihelp-query+usercontribs-paramvalue-prop-patrolled": "Etiqueta as edições patrulhadas.",
+       "apihelp-query+usercontribs-paramvalue-prop-tags": "Lista as etiquetas da edição.",
+       "apihelp-query+usercontribs-param-show": "Mostrar só as contribuições que correspondem a estes critérios; por exemplo, só as edições não menores: <kbd>$2show=!minor</kbd>.\n\nSe um dos valores <kbd>$2show=patrolled</kbd> ou <kbd>$2show=!patrolled</kbd> estiver definido, as revisões feitas há mais de <var>[[mw:Manual:$wgRCMaxAge|$wgRCMaxAge]]</var> ($1 {{PLURAL:$1|segundo|segundos}}) não serão mostradas.",
        "apihelp-query+usercontribs-param-tag": "Listar só as revisões marcadas com esta etiqueta.",
        "apihelp-query+usercontribs-param-toponly": "Listar só as alterações que são a revisão mais recente.",
+       "apihelp-query+usercontribs-example-user": "Mostrar as contribuições do utilizador <kbd>Example</kbd>.",
        "apihelp-query+usercontribs-example-ipprefix": "Mostrar as contribuições de todos os endereços IP com o prefixo <kbd>192.0.2.</kbd>.",
+       "apihelp-query+userinfo-description": "Obter informações sobre o utilizador atual.",
        "apihelp-query+userinfo-param-prop": "As informações que devem ser incluídas:",
+       "apihelp-query+userinfo-paramvalue-prop-blockinfo": "Etiquetas que indicam se o utilizador atual está bloqueado, por quem, e qual o motivo.",
        "apihelp-query+userinfo-paramvalue-prop-hasmsg": "Adiciona uma etiqueta <samp>messages</samp> se o utilizador atual tem mensagens pendentes.",
+       "apihelp-query+userinfo-paramvalue-prop-groups": "Lista todos os grupos aos quais o utilizador atual pertence.",
+       "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "Lista todos os grupos aos quais o utilizador atual pertence automaticamente.",
+       "apihelp-query+userinfo-paramvalue-prop-rights": "Lista todas as permissões que o utilizador atual tem.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lista os grupos aos quais o utilizador atual pode ser adicionado ou de onde pode ser removido.",
+       "apihelp-query+userinfo-paramvalue-prop-options": "Lista todas as preferências que o utilizador atual definiu.",
        "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">Obsoleto.</span> Obter uma chave para alterar as preferências do utilizador atual.",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "Adiciona a contagem de edições do utilizador atual.",
+       "apihelp-query+userinfo-paramvalue-prop-ratelimits": "Lista todas as frequências limite do utilizador atual.",
        "apihelp-query+userinfo-paramvalue-prop-realname": "Adiciona o nome real do utilizador.",
        "apihelp-query+userinfo-paramvalue-prop-email": "Adicionar o correio eletrónico do utilizador e a data de autenticação do correio eletrónico.",
+       "apihelp-query+userinfo-paramvalue-prop-acceptlang": "Faz eco do cabeçalho <code>Accept-Language</code> enviado pelo cliente num formato estruturado.",
        "apihelp-query+userinfo-paramvalue-prop-registrationdate": "Adiciona a data de registo do utilizador.",
        "apihelp-query+userinfo-paramvalue-prop-unreadcount": "Adiciona a contagem de páginas não lidas da lista de páginas vigiadas do utilizador (máximo $1; devolve <samp>$2</samp> se forem mais).",
        "apihelp-query+userinfo-paramvalue-prop-centralids": "Adiciona os identificadores centrais e o estado de ligação central (''attachment'') do utilizador.",
+       "apihelp-query+userinfo-param-attachedwiki": "Com <kbd>$1prop=centralids</kbd>, indicar se o utilizador tem ligação com a wiki designada por este identificador.",
+       "apihelp-query+userinfo-example-simple": "Obter informações sobre o utilizador atual.",
+       "apihelp-query+userinfo-example-data": "Obter informações adicionais sobre o utilizador atual.",
+       "apihelp-query+users-description": "Obter informações sobre uma lista de utilizadores.",
        "apihelp-query+users-param-prop": "As informações que devem ser incluídas:",
+       "apihelp-query+users-paramvalue-prop-blockinfo": "Etiquetas que indicam se o utilizador está bloqueado, por quem, e qual o motivo.",
+       "apihelp-query+users-paramvalue-prop-groups": "Lista todos os grupos aos quais cada utilizador pertence.",
+       "apihelp-query+users-paramvalue-prop-implicitgroups": "Lista todos os grupos aos quais um utilizador pertence automaticamente.",
+       "apihelp-query+users-paramvalue-prop-rights": "Lista todas as permissões que cada utilizador tem.",
        "apihelp-query+users-paramvalue-prop-editcount": "Adiciona a contagem de edições do utilizador.",
        "apihelp-query+users-paramvalue-prop-registration": "Adiciona a data e hora de registo do utilizador.",
+       "apihelp-query+users-paramvalue-prop-emailable": "Etiqueta que indica se o utilizador pode e quer receber correio eletrónico através de [[Special:Emailuser]].",
+       "apihelp-query+users-paramvalue-prop-gender": "Etiqueta que indica o género do utilizador. Devolve \"male\" (masculino), \"female\" (feminino) ou \"unknown\" (desconhecido).",
        "apihelp-query+users-paramvalue-prop-centralids": "Adiciona os identificadores centrais e o estado de ligação central (''attachment'') do utilizador.",
+       "apihelp-query+users-paramvalue-prop-cancreate": "Indica se pode ser criada uma conta para os nomes de utilizador não registados, mas válidos.",
+       "apihelp-query+users-param-attachedwiki": "Com <kbd>$1prop=centralids</kbd>, indicar se o utilizador tem ligação com a wiki designada por este identificador.",
+       "apihelp-query+users-param-users": "Uma lista de utilizadores dos quais serão obtidas informações.",
        "apihelp-query+users-param-token": "Em substituição, usar <kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>.",
+       "apihelp-query+users-example-simple": "Devolver informações sobre o utilizador <kbd>Example</kbd>.",
        "apihelp-query+watchlist-description": "Obter mudanças recentes das páginas vigiadas do utilizador atual.",
+       "apihelp-query+watchlist-param-allrev": "Incluir múltiplas revisões da mesma página dentro do intervalo de tempo indicado.",
        "apihelp-query+watchlist-param-start": "A data e hora da mudança recente a partir da qual será começada a enumeração.",
        "apihelp-query+watchlist-param-end": "A data e hora da mudança recente na qual será terminada a enumeração.",
-       "apihelp-query+watchlist-param-user": "Listar só as alterações deste utilizador.",
+       "apihelp-query+watchlist-param-namespace": "Filtrar as mudanças para produzir só as dos espaços nominais indicados.",
+       "apihelp-query+watchlist-param-user": "Listar só as mudanças deste utilizador.",
+       "apihelp-query+watchlist-param-excludeuser": "Não listar as mudanças deste utilizador.",
        "apihelp-query+watchlist-param-limit": "O número total de resultados a serem devolvidos por pedido.",
        "apihelp-query+watchlist-param-prop": "As propriedades adicionais que devem ser obtidas:",
        "apihelp-query+watchlist-paramvalue-prop-ids": "Adiciona identificadores de revisões e de páginas.",
+       "apihelp-query+watchlist-paramvalue-prop-title": "Adiciona o título da página.",
        "apihelp-query+watchlist-paramvalue-prop-flags": "Adiciona etiquetas para a edição.",
+       "apihelp-query+watchlist-paramvalue-prop-user": "Adiciona o utilizador que fez a edição.",
        "apihelp-query+watchlist-paramvalue-prop-userid": "Adiciona o identificador do utilizador que realizou a edição.",
+       "apihelp-query+watchlist-paramvalue-prop-comment": "Adiciona o comentário da edição.",
        "apihelp-query+watchlist-paramvalue-prop-parsedcomment": "Adiciona o comentário da edição, após análise sintática.",
        "apihelp-query+watchlist-paramvalue-prop-timestamp": "Adiciona a data e hora da edição.",
+       "apihelp-query+watchlist-paramvalue-prop-patrol": "Etiqueta que indica as edições que são patrulhadas.",
        "apihelp-query+watchlist-paramvalue-prop-sizes": "Adiciona os tamanhos novo e antigo da página.",
        "apihelp-query+watchlist-paramvalue-prop-notificationtimestamp": "Adiciona a data e hora da última vez em que o utilizador foi notificado da edição.",
        "apihelp-query+watchlist-paramvalue-prop-loginfo": "Adiciona informação do registo quando apropriado.",
+       "apihelp-query+watchlist-param-show": "Mostrar só as entradas que correspondem a estes critérios. Por exemplo, para ver só as edições menores feitas por utilizadores autenticados, definir $1show=minor|!anon.",
        "apihelp-query+watchlist-param-type": "Os tipos de alterações a serem mostradas:",
+       "apihelp-query+watchlist-paramvalue-type-edit": "Edições normais.",
+       "apihelp-query+watchlist-paramvalue-type-external": "Mudanças externas.",
+       "apihelp-query+watchlist-paramvalue-type-new": "Criações de páginas.",
+       "apihelp-query+watchlist-paramvalue-type-log": "Entradas do registo.",
+       "apihelp-query+watchlist-paramvalue-type-categorize": "Alterações de pertença a categorias.",
        "apihelp-query+watchlist-param-owner": "Usado com $1token para aceder à lista de páginas vigiadas de outro utilizador.",
        "apihelp-query+watchlist-param-token": "Uma chave de segurança (disponível nas [[Special:Preferences#mw-prefsection-watchlist|preferências]] do utilizador) para permitir acesso à lista de páginas vigiadas de outro utilizador.",
+       "apihelp-query+watchlist-example-simple": "Listar a revisão mais recente das páginas com mudanças recentes na lista de páginas vigiadas do utilizador atual.",
        "apihelp-query+watchlist-example-props": "Obter informação adicional sobre a revisão mais recente das páginas vigiadas do utilizador atual que tenham sido alteradas.",
+       "apihelp-query+watchlist-example-allrev": "Obter informações sobre todas as mudanças recentes às páginas vigiadas do utilizador atual.",
        "apihelp-query+watchlist-example-generator": "Obter informações das páginas na lista de páginas vigiadas do utilizador atual que tenham sido recentemente alteradas.",
+       "apihelp-query+watchlist-example-generator-rev": "Obter informações de revisão para as mudanças recentes às páginas vigiadas do utilizador atual.",
        "apihelp-query+watchlist-example-wlowner": "Listar a revisão mais recente das páginas na lista de páginas vigiadas do utilizador <kbd>Example</kbd> que tenham sido recentemente alteradas.",
+       "apihelp-query+watchlistraw-description": "Obter todas as páginas na lista de páginas vigiadas do utilizador atual.",
        "apihelp-query+watchlistraw-param-namespace": "Listar só as páginas nos espaços nominais indicados.",
        "apihelp-query+watchlistraw-param-limit": "O número total de resultados a serem devolvidos por pedido.",
        "apihelp-query+watchlistraw-param-prop": "As propriedades adicionais que devem ser obtidas:",
        "apihelp-query+watchlistraw-example-simple": "Listar as páginas na lista de páginas vigiadas do utilizador atual.",
        "apihelp-query+watchlistraw-example-generator": "Obter informações das páginas na lista de páginas vigiadas do utilizador atual.",
        "apihelp-removeauthenticationdata-description": "Remover os dados de autenticação do utilizador atual.",
+       "apihelp-removeauthenticationdata-example-simple": "Tentar remover os dados do utilizador atual para o pedido de autenticação <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-resetpassword-description": "Enviar a um utilizador uma mensagem eletrónica de reinício da palavra-passe.",
+       "apihelp-resetpassword-description-noroutes": "Não estão disponíveis rotas de reinício da palavra-passe.\n\nPara usar este módulo, ative uma rota em <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>.",
+       "apihelp-resetpassword-param-user": "O utilizar cuja palavra-passe será reiniciada.",
+       "apihelp-resetpassword-param-email": "O correio eletrónico do utilizador cuja palavra-passe será reiniciada.",
+       "apihelp-resetpassword-example-user": "Enviar uma mensagem eletrónica para reinício da palavra-passe ao utilizador <kbd>Example</kbd>.",
+       "apihelp-resetpassword-example-email": "Enviar uma mensagem eletrónica para reinício da palavra-passe a todos os utilizadores com o correio eletrónico <kbd>user@example.com</kbd>.",
+       "apihelp-revisiondelete-description": "Eliminar e restaurar revisões.",
+       "apihelp-revisiondelete-param-type": "O tipo de eliminação de revisão que está a ser feito.",
+       "apihelp-revisiondelete-param-target": "O título de página para a eliminação da revisão, se for necessário para o tipo de eliminação.",
+       "apihelp-revisiondelete-param-ids": "Os identificadores das revisões a serem eliminadas.",
+       "apihelp-revisiondelete-param-hide": "O que deve ser ocultado para cada revisão.",
+       "apihelp-revisiondelete-param-show": "O que deve ser mostrado para cada revisão.",
+       "apihelp-revisiondelete-param-suppress": "Indica se devem ser suprimidos os dados aos administradores como a todos os restantes utilizadores.",
+       "apihelp-revisiondelete-param-reason": "O motivo da eliminação ou restauro.",
+       "apihelp-revisiondelete-example-revision": "Ocultar o conteúdo da revisão <kbd>12345</kbd> na página <kbd>Main Page</kbd>.",
+       "apihelp-revisiondelete-example-log": "Ocultar todos os dados na entrada <kbd>67890</kbd> do registo com o motivo <kbd>BLP violation</kbd>.",
+       "apihelp-rollback-description": "Desfazer a última edição da página.\n\nSe o último utilizador a editar a página realizou várias edições em sequência, estas serão todas desfeitas.",
+       "apihelp-rollback-param-title": "O título da página a reverter. Não pode ser usado em conjunto com <var>$1pageid</var>.",
+       "apihelp-rollback-param-pageid": "O identificador da página a reverter. Não pode ser usado em conjunto com <var>$1title</var>.",
+       "apihelp-rollback-param-tags": "As etiquetas a aplicar à reversão.",
+       "apihelp-rollback-param-user": "O nome do utilizador cujas edições vão ser revertidas.",
+       "apihelp-rollback-param-summary": "Resumo personalizado da edição. Se estiver vazio, será utilizado o resumo por omissão.",
+       "apihelp-rollback-param-markbot": "Marcar as edições revertidas e a reversão como edições de robôs.",
        "apihelp-rollback-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
+       "apihelp-rollback-example-simple": "Reverter as últimas edições da página <kbd>Main Page</kbd> pelo utilizador <kbd>Example</kbd>.",
        "apihelp-rollback-example-summary": "Reverter as últimas edições da página <kbd>Main Page</kbd> pelo utilizador IP <kbd>192.0.2.5</kbd> com o resumo <kbd>Reverting vandalism</kbd>, e marcar essas edições e a reversão como edições de robôs.",
+       "apihelp-rsd-description": "Exportar um esquema (''schema'') RSD (Really Simple Discovery).",
+       "apihelp-rsd-example-simple": "Exportar o esquema RSD.",
        "apihelp-setnotificationtimestamp-description": "Atualizar a data e hora de notificação de alterações às páginas vigiadas.\n\nIsto afeta o realce das páginas alteradas, na lista de páginas vigiadas e no histórico, e o envio de mensagens de correio quando a preferência \"{{int:tog-enotifwatchlistpages}}\" está ativada.",
+       "apihelp-setnotificationtimestamp-param-entirewatchlist": "Trabalhar em todas as páginas vigiadas.",
        "apihelp-setnotificationtimestamp-param-timestamp": "A data e hora a definir como data e hora da notificação.",
        "apihelp-setnotificationtimestamp-param-torevid": "A revisão para a qual definir a data e hora de notificação (só uma página).",
        "apihelp-setnotificationtimestamp-param-newerthanrevid": "A revisão da qual definir que a data e hora de notificação é mais recente (só uma página).",
        "apihelp-setnotificationtimestamp-example-all": "Reiniciar o estado de notificação de todas as páginas vigiadas.",
+       "apihelp-setnotificationtimestamp-example-page": "Reiniciar o estado de notificação da página <kbd>Main page</kbd>.",
        "apihelp-setnotificationtimestamp-example-pagetimestamp": "Definir a data e hora de notificação para a página <kbd>Main page</kbd> de forma a que todas as edições desde 1 de janeiro de 2012 passem a ser consideradas não vistas",
        "apihelp-setnotificationtimestamp-example-allpages": "Reiniciar o estado de notificação das páginas no espaço nominal <kbd>{{ns:user}}</kbd>.",
-       "apihelp-stashedit-description": "Preparar uma edição na <i>cache</i> partilhada.\n\nIsto destina-se a ser usado via AJAX a partir do formulário de edição, para melhorar o desempenho da gravação da página.",
+       "apihelp-stashedit-description": "Preparar uma edição na ''cache'' partilhada.\n\nIsto destina-se a ser usado via AJAX a partir do formulário de edição, para melhorar o desempenho da gravação da página.",
        "apihelp-stashedit-param-title": "Título da página que está a ser editada.",
+       "apihelp-stashedit-param-section": "Número da secção. <kbd>0</kbd> para a secção do topo, <kbd>new</kbd> para uma secção nova.",
+       "apihelp-stashedit-param-sectiontitle": "O título para uma secção nova.",
+       "apihelp-stashedit-param-text": "O conteúdo da página.",
+       "apihelp-stashedit-param-stashedtexthash": "O resumo criptográfico do conteúdo da página, resultante de uma colocação anterior na área de ficheiros escondidos, a ser usado em vez de outro.",
+       "apihelp-stashedit-param-contentmodel": "O modelo de conteúdo do novo conteúdo.",
+       "apihelp-stashedit-param-contentformat": "O formato de seriação do conteúdo usado para o texto de entrada.",
+       "apihelp-stashedit-param-baserevid": "O identificador de revisão da revisão de base.",
+       "apihelp-stashedit-param-summary": "O resumo da mudança.",
+       "apihelp-tag-description": "Adicionar ou remover as etiquetas de modificação aplicadas a revisões individuais ou a entradas do registo.",
+       "apihelp-tag-param-rcid": "Um ou mais identificadores de mudanças recentes às quais adicionar ou remover a etiqueta.",
+       "apihelp-tag-param-revid": "Um ou mais identificadores de revisões às quais adicionar ou remover a etiqueta.",
+       "apihelp-tag-param-logid": "Um ou mais identificadores de entradas do registo às quais adicionar ou remover a etiqueta.",
+       "apihelp-tag-param-add": "As etiquetas a serem adicionadas. Só podem ser adicionadas as etiquetas definidas manualmente.",
+       "apihelp-tag-param-remove": "As etiquetas a serem removidas. Só podem ser removidas as etiquetas definidas manualmente ou completamente indefinidas.",
+       "apihelp-tag-param-reason": "O motivo da alteração.",
+       "apihelp-tag-example-rev": "Adicionar a etiqueta <kbd>vandalism</kbd> à revisão com o identificador 123, sem especificar um motivo.",
+       "apihelp-tag-example-log": "Remover a etiqueta <kbd>spam</kbd> da entrada do registo com o identificador 123, com o motivo <kbd>Wrongly applied</kbd>.",
        "apihelp-tokens-description": "Obter chaves para operações de modificação de dados.\n\nEste módulo é obsoleto e foi substituído por [[Special:ApiHelp/query+tokens|action=query&meta=tokens]].",
        "apihelp-tokens-param-type": "Tipos de chave a pedir.",
        "apihelp-tokens-example-edit": "Obter uma chave de edição (padrão).",
        "apihelp-unblock-param-id": "Identificador do bloqueio a desfazer (obtido com <kbd>list=blocks</kbd>). Não pode ser usado em conjunto com <var>$1user</var>.",
        "apihelp-unblock-param-user": "Nome de utilizador, endereço IP ou gama de endereços IP a desbloquear. Não pode ser usado em conjunto com <var>$1id</var>.",
        "apihelp-unblock-param-reason": "Motivo para o desbloqueio.",
+       "apihelp-unblock-param-tags": "As etiquetas de modificação a aplicar à entrada no registo de bloqueios.",
        "apihelp-unblock-example-id": "Desfazer o bloqueio com o identificador #<kbd>105</kbd>.",
        "apihelp-unblock-example-user": "Desbloquear o utilizador <kbd>Bob</kbd> com o motivo <kbd>Sorry Bob</kbd>.",
+       "apihelp-undelete-description": "Restaurar revisões de uma página eliminada.\n\nPode obter-se uma lista de revisões eliminadas (incluindo as datas e horas de eliminação) com [[Special:ApiHelp/query+deletedrevs|list=deletedrevs]] e uma lista de identificadores de ficheiros eliminados com [[Special:ApiHelp/query+filearchive|list=filearchive]].",
        "apihelp-undelete-param-title": "Título da página a restaurar.",
+       "apihelp-undelete-param-reason": "Motivo para restaurar a página.",
+       "apihelp-undelete-param-tags": "Etiquetas de modificação a aplicar à entrada no registo de eliminações.",
+       "apihelp-undelete-param-timestamps": "As datas e horas das revisões a serem restauradas. Se ambos os parâmetros <var>$1timestamps</var> e <var>$1fileids</var> estiverem vazios, serão restauradas todas as revisões.",
+       "apihelp-undelete-param-fileids": "Os identificadores das revisões a serem restauradas. Se ambos os parâmetros <var>$1timestamps</var> e <var>$1fileids</var> estiverem vazios, serão restauradas todas as revisões.",
        "apihelp-undelete-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
-       "apihelp-upload-param-watch": "Vigiar página.",
+       "apihelp-undelete-example-page": "Restaurar a página <kbd>Main Page</kbd>.",
+       "apihelp-undelete-example-revisions": "Restaurar duas revisões da página <kbd>Main Page</kbd>.",
+       "apihelp-unlinkaccount-description": "Remover do utilizador atual uma conta ligada de uma wiki terceira.",
+       "apihelp-unlinkaccount-example-simple": "Tentar remover a ligação do utilizador atual ao fornecedor associado com <kbd>FooAuthenticationRequest</kbd>.",
+       "apihelp-upload-description": "Atualizar um ficheiro, ou obter o estado de carregamentos pendentes.\n\nEstão disponíveis vários métodos:\n* Carregar diretamente o conteúdo do ficheiro, usando o parâmetro <var>$1file</var>.\n* Carregar o ficheiro por segmentos, usando os parâmetros <var>$1filesize</var>, <var>$1chunk</var> e <var>$1offset</var>.\n* Instruir o servidor do MediaWiki para obter o ficheiro a partir de um URL, usando o parâmetro <var>$1url</var>.\n* Terminar um carregamento anterior que falhou devido a avisos, usando o parâmetro <var>$1filekey</var>.\nNote que o POST do HTTP tem de ser feito como um carregamento de ficheiro (isto é, usando <code>multipart/form-data</code>) ao enviar o <var>$1file</var>.",
+       "apihelp-upload-param-filename": "O nome de destino do ficheiro.",
+       "apihelp-upload-param-comment": "O comentário do carregamento. Também é usado como texto da página inicial para ficheiros novos se <var>$1text</var> não for especificado.",
+       "apihelp-upload-param-tags": "Etiquetas de modificação a aplicar à entrada do carregamento no registo e à revisão da página de ficheiro.",
+       "apihelp-upload-param-text": "Texto inicial da página para ficheiros novos.",
+       "apihelp-upload-param-watch": "Vigiar a página.",
        "apihelp-upload-param-watchlist": "Adicionar ou remover incondicionalmente a página da lista de páginas vigiadas do utilizador atual, usar as preferências ou não alterar o estado de vigilância.",
        "apihelp-upload-param-ignorewarnings": "Ignorar todos os avisos.",
-       "apihelp-upload-param-url": "URL de onde obter o ficheiro.",
+       "apihelp-upload-param-file": "O conteúdo do ficheiro.",
+       "apihelp-upload-param-url": "O URL de onde obter o ficheiro.",
+       "apihelp-upload-param-filekey": "Chave que identifica um carregamento prévio que está temporariamente na área de ficheiros escondidos.",
+       "apihelp-upload-param-sessionkey": "O mesmo que $1filekey, mantido para compatibilidade com versões anteriores.",
+       "apihelp-upload-param-stash": "Se definido, o servidor irá colocar temporariamente o ficheiro na área de ficheiros escondidos em vez de o adicionar ao repositório.",
+       "apihelp-upload-param-filesize": "O tamanho do carregamento completo.",
+       "apihelp-upload-param-offset": "Posição do segmento em ''bytes''.",
+       "apihelp-upload-param-chunk": "O conteúdo do segmento.",
+       "apihelp-upload-param-async": "Tornar assíncronas as operações sobre ficheiros possivelmente grandes, quando possível.",
+       "apihelp-upload-param-checkstatus": "Obter só o estado de carregamento para a chave de ficheiro indicada.",
        "apihelp-upload-example-url": "Carregar de um URL.",
-       "apihelp-userrights-param-user": "Nome de utilizador(a).",
-       "apihelp-userrights-param-userid": "ID de utilizador.",
+       "apihelp-upload-example-filekey": "Prosseguir um carregamento que falhou devido a avisos.",
+       "apihelp-userrights-description": "Alterar os membros de um grupo de utilizadores.",
+       "apihelp-userrights-param-user": "O nome de utilizador.",
+       "apihelp-userrights-param-userid": "O identificador de utilizador.",
        "apihelp-userrights-param-add": "Adicionar o utilizador a estes grupos.",
-       "apihelp-userrights-param-remove": "Remover este utilizador destes grupos.",
+       "apihelp-userrights-param-remove": "Remover o utilizador destes grupos.",
+       "apihelp-userrights-param-reason": "O motivo da alteração.",
+       "apihelp-userrights-example-user": "Adicionar o utilizador <kbd>FooBot</kbd> ao grupo <kbd>bot</kbd> e removê-lo dos grupos <kbd>sysop</kbd> e <kbd>bureaucrat</kbd>.",
+       "apihelp-userrights-example-userid": "Adicionar o utilizador com o identificador <kbd>123</kbd> ao grupo <kbd>bot</kbd> e removê-lo dos grupos <kbd>sysop</kbd> e <kbd>bureaucrat</kbd>.",
        "apihelp-watch-description": "Adicionar ou remover páginas da lista de páginas vigiadas do utilizador atual.",
-       "apihelp-watch-example-unwatch": "Deixar de vigiar a página <kbd>Página Principal</kbd>.",
-       "apihelp-json-description": "Produzir dados de saída no formato JSON.",
+       "apihelp-watch-param-title": "A página a vigiar ou deixar de ser vigiada. Em vez disto, usar <var>$1titles</var>.",
+       "apihelp-watch-param-unwatch": "Se definido, a página deixará de ser vigiada, em vez de o ser.",
+       "apihelp-watch-example-watch": "Vigiar a página <kbd>Main Page</kbd>.",
+       "apihelp-watch-example-unwatch": "Deixar de vigiar a página <kbd>Main Page</kbd>.",
+       "apihelp-watch-example-generator": "Vigiar as primeiras páginas do espaço nominal principal.",
+       "apihelp-format-example-generic": "Devolver o resultado da consulta no formato $1.",
+       "apihelp-format-param-wrappedhtml": "Devolver o HTML com realce sintático e os módulos ResourceLoader associados, na forma de um objeto JSON.",
+       "apihelp-json-description": "Produzir os dados de saída no formato JSON.",
+       "apihelp-json-param-callback": "Se especificado, envolve o resultado de saída na forma de uma chamada para uma função. Por segurança, todos os dados específicos do utilizador estarão restringidos.",
+       "apihelp-json-param-utf8": "Se especificado, codifica a maioria dos caracteres não ASCII (mas não todos) em UTF-8, em vez de substitui-los por sequências de escape hexadecimais. É o comportamento padrão quando <var>formatversion</var> não tem o valor <kbd>1</kbd>.",
+       "apihelp-json-param-ascii": "Se especificado, codifica todos caracteres não ASCII usando sequências de escape hexadecimais. É o comportamento padrão quando <var>formatversion</var> tem o valor <kbd>1</kbd>.",
+       "apihelp-json-param-formatversion": "Formatação do resultado de saída:\n;1:Formato compatível com versões anteriores (booleanos ao estilo XML, <samp>*</samp> chaves para nodos de conteúdo, etc.).\n;2:Formato moderno experimental. As especificações podem mudar!\n;latest:Usar o formato mais recente (atualmente <kbd>2</kbd>), mas pode ser alterado sem aviso prévio.",
+       "apihelp-jsonfm-description": "Produzir os dados de saída em formato JSON (realce sintático em HTML).",
+       "apihelp-none-description": "Não produzir nada.",
+       "apihelp-php-description": "Produzir os dados de saída em formato PHP seriado.",
+       "apihelp-php-param-formatversion": "Formatação do resultado de saída:\n;1:Formato compatível com versões anteriores (booleanos ao estilo XML, <samp>*</samp> chaves para nodos de conteúdo, etc.).\n;2:Formato moderno experimental. As especificações podem mudar!\n;latest:Usar o formato mais recente (atualmente <kbd>2</kbd>), mas pode ser alterado sem aviso prévio.",
+       "apihelp-phpfm-description": "Produzir os dados de saída em formato PHP seriado (realce sintático em HTML).",
+       "apihelp-rawfm-description": "Produzir os dados de saída, incluindo elementos para despiste de erros, em formato JSON (realce sintático em HTML).",
+       "apihelp-xml-description": "Produzir os dados de saída em formato XML.",
        "apihelp-xml-param-xslt": "Se especificado, adiciona a página nomeada como uma folha de estilo XSL. O valor tem de ser um título no espaço nominal {{ns:mediawiki}} e acabar em <code>.xsl</code>.",
+       "apihelp-xml-param-includexmlnamespace": "Se especificado, adiciona um espaço nominal XML.",
+       "apihelp-xmlfm-description": "Produzir os dados de saída em formato XML (realce sintático em HTML).",
+       "api-format-title": "Resultado da API do MediaWiki.",
+       "api-format-prettyprint-header": "Esta é a representação em HTML do formato $1. O HTML é bom para o despiste de erros, mas inadequado para uso na aplicação.\n\nEspecifique o parâmetro <var>format</var> para alterar o formato de saída. Para ver a representação que não é em HTML do formato $1, defina <kbd>format=$2</kbd>.\n\nConsulte a [[mw:API|documentação completa]], ou a [[Special:ApiHelp/main|ajuda da API]] para mais informação.",
+       "api-format-prettyprint-header-only-html": "Esta é uma representação em HTML para ser usada no despiste de erros, mas inadequada para uso na aplicação.\n\nConsulte a [[mw:API|documentação completa]], ou a [[Special:ApiHelp/main|ajuda da API]] para mais informação.",
+       "api-format-prettyprint-status": "Esta resposta seria devolvida com o estado de HTTP: $1 $2.",
+       "api-pageset-param-titles": "Uma lista dos títulos a serem trabalhados.",
+       "api-pageset-param-pageids": "Uma lista dos identificadores de página a serem trabalhados.",
+       "api-pageset-param-revids": "Uma lista dos identificadores de revisões a serem trabalhados.",
+       "api-pageset-param-generator": "Obter a lista de páginas nas quais trabalhar, executando o módulo de consulta especificado.\n\n<strong>Nota:</strong> Os nomes dos parâmetros de geradores têm de ser prefixados com um \"g\", veja os exemplos.",
+       "api-pageset-param-redirects-generator": "Resolver automaticamente os redirecionamentos listados nos parâmetros  <var>$1titles</var>, <var>$1pageids</var> e <var>$1revids</var>, e nas páginas devolvidas por <var>$1generator</var>.",
+       "api-pageset-param-redirects-nogenerator": "Resolver automaticamente os redirecionamentos listados nos parâmetros <var>$1titles</var>, <var>$1pageids</var> e <var>$1revids</var>.",
+       "api-pageset-param-converttitles": "Converter os títulos noutras variantes de língua, se necessário. Só funciona se a língua de conteúdo da wiki suporta a conversão entre variantes. As línguas que suportam conversão entre variantes incluem $1.",
        "api-help-title": "Ajuda da API do MediaWiki",
        "api-help-lead": "Esta é uma página de documentação da API do MediaWiki gerada automaticamente.\n\nDocumentação e exemplos: https://www.mediawiki.org/wiki/API",
        "api-help-main-header": "Módulo principal",
        "api-help-param-deprecated": "Obsoleto.",
        "api-help-param-required": "Este parâmetro é obrigatório.",
        "api-help-datatypes-header": "Tipo de dados",
-       "api-help-datatypes": "O formato de entrada para o MediaWiki deve ser UTF-8 normalizado de acordo com a norma NFC. O MediaWiki pode converter outros tipos de entrada, mas isto pode causar a falha de algumas operações (tais como [[Special:ApiHelp/edit|edições]] com verificações MD5).\n\nAlguns tipos de parâmetros nos pedidos à API necessitam de mais explicações:\n;boolean\n:Os parâmetros booleanos funcionam como as caixas de seleção HTML: se o parâmetro for especificado, independentemente do valor, é considerado verdadeiro. Para um valor falso, omitir o parâmetro completo.\n;timestamp\n:As datas e horas podem ser especificados em vários formatos. O formato de data e hora ISO 8601 é recomendado. Todas as horas estão em UTC, qualquer inclusão de fuso horário é ignorada.\n:* Data e hora ISO 8601, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (pontuação e <kbd>Z</kbd> são opcionais)\n:* Data e hora ISO 8601 com segundos fracionários (ignorado), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (traços, dois pontos e <kbd>Z</kbd> são opcionais)\n:* Formato do MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Formato numérico genérico, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (fuso horário opcional de <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, ou <kbd>-<var>##</var></kbd> são ignorados)\n:* Formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (o fuso horário pode ser omitido), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (o fuso horário pode ser omitido), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato C ctime, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Segundos desde 1970-01-01T00:00:00Z como um inteiro de 1 a 13 dígitos (excluindo <kbd>0</kbd>)\n:* O texto <kbd>now</kbd>\n;separador alternativo de valores múltiplos\n:Os parâmetros que aceitam vários valores são normalmente fornecidos com os valores separados por uma barra vertical (<i>pipe</i>), por exemplo <kbd>parâmetro=valor1|valor2</kbd> ou <kbd>parâmetro=valor1%7Cvalor2</kbd>. Se um valor contém a barra vertical, use U+001F (Separador de Unidades) como separador ''e'' prefixe o valor com U+001F, isto é, <kbd>parâmetro=%1Fvalor1%1Fvalor2</kbd>.",
+       "api-help-datatypes": "O formato de entrada para o MediaWiki deve ser UTF-8, normalizado de acordo com a norma NFC. O MediaWiki pode converter outros tipos de entrada, mas esta conversão pode originar a falha de algumas operações (tais como as [[Special:ApiHelp/edit|edições]] com verificações MD5).\n\nAlguns tipos de parâmetros nos pedidos à API necessitam de mais explicações:\n;boolean\n:Os parâmetros booleanos funcionam como as caixas de seleção HTML: se o parâmetro for especificado, independentemente do seu valor, é considerado verdadeiro. Para um valor falso, omitir o parâmetro completo.\n;timestamp\n:As datas e horas podem ser especificadas em vários formatos. É recomendado o formato ISO 8601. Todas as horas estão em UTC, qualquer inclusão do fuso horário é ignorada.\n:* Data e hora ISO 8601, <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>Z</kbd> (pontuação e <kbd>Z</kbd> são opcionais)\n:* Data e hora ISO 8601 com segundos fracionários (estes são ignorados), <kbd><var>2001</var>-<var>01</var>-<var>15</var>T<var>14</var>:<var>56</var>:<var>00</var>.<var>00001</var>Z</kbd> (traços, dois pontos e <kbd>Z</kbd> são opcionais)\n:* Formato do MediaWiki, <kbd><var>2001</var><var>01</var><var>15</var><var>14</var><var>56</var><var>00</var></kbd>\n:* Formato numérico genérico, <kbd><var>2001</var>-<var>01</var>-<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd> (fuso horário opcional <kbd>GMT</kbd>, <kbd>+<var>##</var></kbd>, ou <kbd>-<var>##</var></kbd> são ignorados)\n:* Formato EXIF, <kbd><var>2001</var>:<var>01</var>:<var>15</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:*Formato RFC 2822 (o fuso horário pode ser omitido), <kbd><var>Mon</var>, <var>15</var> <var>Jan</var> <var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato RFC 850 (o fuso horário pode ser omitido), <kbd><var>Monday</var>, <var>15</var>-<var>Jan</var>-<var>2001</var> <var>14</var>:<var>56</var>:<var>00</var></kbd>\n:* Formato C ctime, <kbd><var>Mon</var> <var>Jan</var> <var>15</var> <var>14</var>:<var>56</var>:<var>00</var> <var>2001</var></kbd>\n:* Segundos desde 1970-01-01T00:00:00Z como um inteiro de 1 a 13 algarismos (excluindo <kbd>0</kbd>)\n:* O texto <kbd>now</kbd>\n;separador alternativo de valores múltiplos\n:Os parâmetros que aceitam vários valores são normalmente fornecidos com os valores separados por uma barra vertical (''pipe''), por exemplo <kbd>parâmetro=valor1|valor2</kbd> ou <kbd>parâmetro=valor1%7Cvalor2</kbd>. Se um valor contém a barra vertical, use como separador o U+001F (Separador de Unidades) ''e'' prefixe o valor com U+001F, isto é, <kbd>parâmetro=%1Fvalor1%1Fvalor2</kbd>.",
        "api-help-param-type-limit": "Tipo: inteiro ou <kbd>max</kbd>",
        "api-help-param-type-integer": "Tipo: {{PLURAL:$1|1=inteiro|2=lista de números inteiros}}",
        "api-help-param-type-boolean": "Tipo: booleano ([[Special:ApiHelp/main#main/datatypes|detalhes]])",
        "api-help-param-integer-min": "{{PLURAL:$1|1=O valor não pode ser inferior a|2=Os valores não podem ser inferiores a}} $2.",
        "api-help-param-integer-max": "{{PLURAL:$1|1=O valor não pode ser superior a|2=Os valores não podem ser superiores a}} $3.",
        "api-help-param-integer-minmax": "{{PLURAL:$1|1=O valor tem de estar compreendido|2=Os valores têm de estar compreendidos}} entre $2 e $3.",
-       "api-help-param-upload": "Tem ser enviado (<i>posted</i>) como um carregamento de ficheiro usando multipart/form-data.",
+       "api-help-param-upload": "Tem ser enviado (''posted'') como um carregamento de ficheiro usando multipart/form-data.",
        "api-help-param-multi-separate": "Separar os valores com <kbd>|</kbd> ou [[Special:ApiHelp/main#main/datatypes|alternativas]].",
        "api-help-param-multi-max": "O número máximo de valores é {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} para robôs).",
+       "api-help-param-multi-all": "Para especificar todos os valores, use <kbd>$1</kbd>.",
        "api-help-param-default": "Valor por omissão: $1",
        "api-help-param-default-empty": "Padrão: <span class=\"apihelp-empty\">(vazio)</span>",
        "api-help-param-token": "Uma chave \"$1\" obtida de [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
-       "api-help-param-token-webui": "Para efeitos de compatibilidade, a chave usada na interface <i>web</i> também é aceite.",
-       "api-help-param-disabled-in-miser-mode": "Desativado devido ao [[mw:Manual:$wgMiserMode|modo avarento]] (<i>miser mode</i>).",
-       "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> devido ao [[mw:Manual:$wgMiserMode|modo avarento]]  (<i>miser mode</i>), usar isto pode resultar na devolução de menos de <var>$1limit</var> resultados antes de continuar; em casos extremos pode não ser devolvido qualquer resultado.",
+       "api-help-param-token-webui": "Para efeitos de compatibilidade, a chave usada na interface ''web'' também é aceite.",
+       "api-help-param-disabled-in-miser-mode": "Desativado devido ao [[mw:Manual:$wgMiserMode|modo avarento]] (''miser mode'').",
+       "api-help-param-limited-in-miser-mode": "<strong>Nota:</strong> devido ao [[mw:Manual:$wgMiserMode|modo avarento]] (''miser mode''), usar isto pode resultar na devolução de menos de <var>$1limit</var> resultados antes de continuar; em casos extremos pode não ser devolvido qualquer resultado.",
        "api-help-param-direction": "A direção da enumeração:\n;newer:Listar o mais antigo primeiro. Nota: $1start tem de estar antes de $1end.\n;older:Listar o mais recente primeiro (padrão). Nota: $1start tem de estar depois de $1end.",
        "api-help-param-continue": "Quando houver mais resultados disponíveis, usar isto para continuar",
        "api-help-param-no-description": "<span class=\"apihelp-empty\">(sem descrição)</span>",
        "api-help-authmanagerhelper-messageformat": "Formato a usar nas mensagens de saída.",
        "api-help-authmanagerhelper-mergerequestfields": "Combinar a informação de todos os pedidos de autenticação numa única matriz.",
        "api-help-authmanagerhelper-preservestate": "Preservar o estado de uma tentativa de autenticação anterior falhada, se possível.",
-       "api-help-authmanagerhelper-returnurl": "O URL de retorno para processos de autenticação por terceiros tem de ser absoluto. É obrigatório fornecer este URL ou <var>$1continue</var>.\n\nTipicamente, após receber uma resposta <samp>REDIRECT</samp>, abrirá um <i>browser</i> ou uma <i>web view</i> para o URL <samp>redirecttarget</samp> especificado, para dar lugar ao processo de autenticação por terceiros. Quando esse processo terminar, a terceira entidade encaminhará o <i>browser</i> ou a <i>web view</i> para este URL. Deve extrair do URL quaisquer parâmetros de consulta ou de POST, e passá-los como um pedido <var>$1continue</var> a este módulo da API.",
+       "api-help-authmanagerhelper-returnurl": "O URL de retorno para processos de autenticação por terceiros tem de ser absoluto. É obrigatório fornecer este URL ou <var>$1continue</var>.\n\nTipicamente, após receber uma resposta <samp>REDIRECT</samp>, abrirá um ''browser'' ou uma ''web view'' para o URL <samp>redirecttarget</samp> especificado, para dar lugar ao processo de autenticação por terceiros. Quando esse processo terminar, a terceira entidade encaminhará o ''browser'' ou a ''web view'' para este URL. Deve extrair do URL quaisquer parâmetros de consulta ou de POST, e passá-los como um pedido <var>$1continue</var> a este módulo da API.",
        "api-help-authmanagerhelper-continue": "Este pedido é uma continuação após uma resposta anterior com o valor <samp>UI</samp> ou <samp>REDIRECT</samp>. É obrigatório fornecer este parâmetro ou o parâmetro <var>$1returnurl</var>.",
        "api-help-authmanagerhelper-additional-params": "Este módulo aceita parâmetros adicionais, dependendo dos pedidos de autenticação disponíveis. Use <kbd>[[Special:ApiHelp/query+authmanagerinfo|action=query&meta=authmanagerinfo]]</kbd> com <kbd>amirequestsfor=$1</kbd> (ou uma resposta anterior deste módulo, se aplicável) para determinar os pedidos disponíveis e os campos que estes utilizam.",
        "api-credits-header": "Créditos",
-       "api-credits": "Programadores da API:\n* Yuri Astrakhan (criador, programador principal set 2006–set 2007)\n* Roan Kattouw (programador principal set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (programador principal 2013–presente)\n\nPor favor, envie os seus comentários, sugestões e perguntas para mediawiki-api@lists.wikimedia.org ou crie um relatório de defeitos em https://phabricator.wikimedia.org/."
+       "api-credits": "Programadores da API:\n* Yuri Astrakhan (criador, programador principal, set 2006–set 2007)\n* Roan Kattouw (programador principal, set 2007–2009)\n* Victor Vasiliev\n* Bryan Tong Minh\n* Sam Reed\n* Brad Jorsch (programador principal, 2013–presente)\n\nPode enviar os seus comentários, sugestões e perguntas para o endereço mediawiki-api@lists.wikimedia.org, ou reportar quaisquer defeitos que encontre em https://phabricator.wikimedia.org/."
 }
index 95d6485..fd6a4dd 100644 (file)
        "apihelp-resetpassword-description-noroutes": "{{doc-apihelp-description|resetpassword|info=This message is used when no known routes are enabled in <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>.|seealso={{msg-mw|apihelp-resetpassword-description}}}}",
        "apihelp-resetpassword-param-user": "{{doc-apihelp-param|resetpassword|user}}",
        "apihelp-resetpassword-param-email": "{{doc-apihelp-param|resetpassword|email}}",
-       "apihelp-resetpassword-param-capture": "{{doc-apihelp-param|resetpassword|capture}}",
        "apihelp-resetpassword-example-user": "{{doc-apihelp-example|resetpassword}}",
        "apihelp-resetpassword-example-email": "{{doc-apihelp-example|resetpassword}}",
        "apihelp-revisiondelete-description": "{{doc-apihelp-description|revisiondelete}}",
        "api-format-title": "{{technical}}\nPage title when API output is pretty-printed in HTML.",
        "api-format-prettyprint-header": "{{technical}} Displayed as a header when API output is pretty-printed in HTML.\n\nParameters:\n* $1 - Format name\n* $2 - Non-pretty-printing module name",
        "api-format-prettyprint-header-only-html": "{{technical}} Displayed as a header when API output is pretty-printed in HTML, but there is no non-html module.\n\nParameters:\n* $1 - Format name",
+       "api-format-prettyprint-status": "{{technical}} Displayed as a header when API pretty-printed output is used for a response that uses an unusual HTTP status code.\n\nParameters:\n* $1 - HTTP status code (integer)\n* $2 - Standard English text for the status code.",
        "api-pageset-param-titles": "{{doc-apihelp-param|pageset|titles|description=the \"titles\" parameter in pageset-using modules}}",
        "api-pageset-param-pageids": "{{doc-apihelp-param|pageset|pageids|description=the \"pageids\" parameter in pageset-using modules}}",
        "api-pageset-param-revids": "{{doc-apihelp-param|pageset|revids|description=the \"revids\" parameter in pageset-using modules}}",
        "api-help-param-upload": "{{technical}} Used to indicate that an 'upload'-type parameter must be posted as a file upload using multipart/form-data",
        "api-help-param-multi-separate": "Used to indicate how to separate multiple values. Not used with {{msg-mw|api-help-param-list}}.",
        "api-help-param-multi-max": "Used to indicate the maximum number of values accepted for a multi-valued parameter.\n\nParameters:\n* $1 - Maximum value without the apihighlimits right\n* $2 - Maximum value with the apihighlimits right",
+       "api-help-param-multi-all": "Used to indicate what string can be used to specify all possible values of a multi-valued parameter. \n\nParameters:\n* $1 - String to specify all possible values of the parameter",
        "api-help-param-default": "Used to display the default value for an API parameter\n\nParameters:\n* $1 - Default value\n\nSee also:\n* {{msg-mw|api-help-param-default-empty}}\n{{Identical|Default}}",
        "api-help-param-default-empty": "Used to display the default value for an API parameter when that default is an empty value\n\nSee also:\n* {{msg-mw|api-help-param-default}}",
        "api-help-param-token": "{{doc-apihelp-param|description=any 'token' parameter|paramstart=2|params=\n* $1 - Token type|noseealso=1}}",
index 67c1a50..2879020 100644 (file)
@@ -18,7 +18,9 @@
                        "Айсар",
                        "Гизатуллина",
                        "MaxSem",
-                       "Irus"
+                       "Irus",
+                       "MaxBioHazard",
+                       "Kareyac"
                ]
        },
        "apihelp-main-description": "<div class=\"hlist plainlinks api-main-links\">\n* [[mw:API:Main_page|Документация]]\n* [[mw:API:FAQ|ЧаВО]]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api Почтовая рассылка]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-api-announce Новости API]\n* [https://phabricator.wikimedia.org/maniphest/query/GebfyV4uCaLd/#R Ошибки и запросы]\n</div>\n<strong>Статус:</strong> Все отображаемые на этой странице функции должны работать, однако API находится в статусе активной разработки и может измениться в любой момент. Подпишитесь на [https://lists.wikimedia.org/pipermail/mediawiki-api-announce/ почтовую рассылку mediawiki-api-announce], чтобы быть в курсе обновлений.\n\n<strong>Ошибочные запросы:</strong> Если API получает запрос с ошибкой, вернётся заголовок HTTP с ключом «MediaWiki-API-Error», после чего значение заголовка и код ошибки будут отправлены обратно и установлены в то же значение. Более подробную информацию см. [[mw:API:Errors_and_warnings|API: Ошибки и предупреждения]].\n\n<strong>Тестирование:</strong> для удобства тестирования API-запросов, см. [[Special:ApiSandbox]].",
        "apihelp-edit-param-tags": "Изменить теги для подачи заявки на пересмотр.",
        "apihelp-edit-param-minor": "Незначительное изменение (малая правка).",
        "apihelp-edit-param-notminor": "Значительное изменение (обычная, не «малая», правка).",
-       "apihelp-edit-param-bot": "Пометьте этот редактировать как изменить скрипт.",
+       "apihelp-edit-param-bot": "Пометить правку как сделанную ботом.",
        "apihelp-edit-param-recreate": "Возвращает сообщение об ошибке не, если страница тем временем был удален.",
        "apihelp-edit-param-createonly": "Не редактировать страницу, если она уже существует.",
        "apihelp-edit-param-nocreate": "Выбрасывать ошибку, если страницы не существует.",
        "apihelp-edit-param-undoafter": "Отменить все изменения от $1, чтобы отменить это. Если не набор, просто отменить одну ревизию.",
        "apihelp-edit-param-redirect": "Автоматически разрешать редиректы.",
        "apihelp-edit-param-contentformat": "Формат сериализации содержимого, используемый для ввода текста.",
-       "apihelp-edit-param-contentmodel": "Ð\9cоделÑ\8c Ñ\81одеÑ\80жимого нового содержимого.",
+       "apihelp-edit-param-contentmodel": "Ð\9aонÑ\82енÑ\82наÑ\8f Ð¼Ð¾Ð´ÐµÐ»Ñ\8c нового содержимого.",
        "apihelp-edit-param-token": "Маркер всегда должен быть послан в качестве последнего параметра, или, по крайней мере, после $1текстовый параметр.",
        "apihelp-edit-example-edit": "Редактировать страницу",
        "apihelp-edit-example-prepend": "Добавить магическое слово <kbd>_&#95;NOTOC_&#95;</kbd> в начало страницы.",
        "apihelp-emailuser-param-text": "Содержание письма",
        "apihelp-emailuser-param-ccme": "Отправить копию этого сообщения мне.",
        "apihelp-emailuser-example-email": "Отправить письмо пользователю <kbd>WikiSysop</kbd> с текстом <kbd>Content</kbd>.",
-       "apihelp-expandtemplates-description": "Расширяет все шаблоны в тексте.",
+       "apihelp-expandtemplates-description": "Разворачивает все шаблоны в викитекст.",
        "apihelp-expandtemplates-param-title": "Заголовок страницы.",
        "apihelp-expandtemplates-param-text": "Викитекст для конвертирования",
-       "apihelp-expandtemplates-param-revid": "Ð\98денÑ\82иÑ\84икаÑ\82оÑ\80 Ñ\80евизии, Ð´Ð»Ñ\8f <nowiki>{{REVISIONID}}</nowiki> Ð¸ Ð¿Ð¾Ð´Ð¾Ð±Ð½Ñ\8bе Ð¿ÐµÑ\80еменнÑ\8bе.",
-       "apihelp-expandtemplates-param-prop": "Какие данные получить.\n\nОбратите внимание, что если значение не выбрано, то результат будет содержать тексте, но выход будет в устаревший формат.",
+       "apihelp-expandtemplates-param-revid": "Ð\9dомеÑ\80 Ð²ÐµÑ\80Ñ\81ии, Ð´Ð»Ñ\8f <nowiki>{{REVISIONID}}</nowiki> Ð¸ Ð°Ð½Ð°Ð»Ð¾Ð³Ð¸Ñ\87нÑ\8bÑ\85 Ð¿ÐµÑ\80еменнÑ\8bÑ\85.",
+       "apihelp-expandtemplates-param-prop": "Какие фрагменты информации получить.\n\nОбратите внимание, что если ни одно из значений не выбрано, результат будет содержать викитекст, но вывод будет в устаревшем формате.",
        "apihelp-expandtemplates-paramvalue-prop-wikitext": "Расширенный викитекст",
        "apihelp-expandtemplates-paramvalue-prop-categories": "Любой категории присутствуют во входных данных, которые не представлены в тексте вывод.",
        "apihelp-expandtemplates-paramvalue-prop-properties": "Страница свойств определяются расширенные волшебные слова в тексте.",
        "apihelp-expandtemplates-paramvalue-prop-volatile": "Есть ли выход летучих и не должны использоваться повторно в другом месте на странице.",
-       "apihelp-expandtemplates-paramvalue-prop-ttl": "Максимальное время, через которое кэширует результат должен быть признан недействительным.",
+       "apihelp-expandtemplates-paramvalue-prop-ttl": "Максимальное время, по прошествии которого кэш результата должен быть признан недействительным.",
        "apihelp-expandtemplates-paramvalue-prop-jsconfigvars": "Дает переменные конфигурации JavaScript конкретной странице.",
        "apihelp-expandtemplates-paramvalue-prop-encodedjsconfigvars": "Дает переменные конфигурации JavaScript, определенных на страницу в виде строки JSON.",
        "apihelp-expandtemplates-paramvalue-prop-parsetree": "Дерево разбора XML входных данных.",
        "apihelp-expandtemplates-param-includecomments": "Нужно ли включать комментарии HTML на выходе.",
        "apihelp-expandtemplates-param-generatexml": "Создать XML-дерево разбора (заменить $1prop=parsetree).",
-       "apihelp-feedcontributions-description": "Возвращает вклад пользователей корма.",
+       "apihelp-feedcontributions-description": "Возвращает список правок участника.",
        "apihelp-feedcontributions-param-feedformat": "Биреү форматы",
        "apihelp-feedcontributions-param-user": "Что пользователи, чтобы получить взносы.",
+       "apihelp-feedcontributions-param-namespace": "По какому пространству имён фильтровать вклад.",
        "apihelp-feedcontributions-param-year": "От года (и ранее).",
        "apihelp-feedcontributions-param-month": "От месяца (и ранее).",
+       "apihelp-feedcontributions-param-tagfilter": "Взносы фильтра, которые имеют эти теги.",
        "apihelp-feedcontributions-param-deletedonly": "Показать только удалённые правки.",
        "apihelp-feedcontributions-param-toponly": "Показать только правки, являющиеся последними версиями.",
        "apihelp-feedcontributions-param-newonly": "Показывать только правки, являющиеся созданием страниц.",
        "apihelp-filerevert-description": "Файлды иҫке версияға ҡайтарырға.",
        "apihelp-filerevert-param-filename": "Целевое имя файла без префикса File:.",
        "apihelp-filerevert-param-comment": "Загрузить комментарий.",
-       "apihelp-filerevert-example-revert": "<kbd>Wiki.png</kbd>на версии <kbd>2011-03-05T15:27:40Z</kbd> сброса.",
+       "apihelp-filerevert-example-revert": "Откат <kbd>Wiki.png</kbd> к версии от <kbd>2011-03-05T15:27:40Z</kbd>.",
        "apihelp-help-param-helpformat": "Белешмә яҙыу форматы.",
        "apihelp-help-example-main": "Помощь по главному модулю.",
        "apihelp-help-example-recursive": "Вся справка в одном разделе.",
index 8b53c02..d5b4c62 100644 (file)
        "apihelp-options-description": "Змінити налаштування поточного користувача.\n\nМожна встановити лише опції, які зареєстровані у ядрі або в одному з інстальованих розширень, або опції з префіксом ключів <code>userjs-</code> (призначені для використання користувацькими скриптами).",
        "apihelp-options-param-reset": "Встановлює налаштування сайту за замовчуванням.",
        "apihelp-options-param-resetkinds": "Список типів опцій для перевстановлення, коли вказана опція <var>$1reset</var>.",
-       "apihelp-options-param-change": "СпиÑ\81ок Ð·Ð¼Ñ\96н, Ð²Ñ\96дÑ\84оÑ\80маÑ\82ованиÑ\85 Ñ\8fк Ð½Ð°Ð·Ð²Ð°=знаÑ\87еннÑ\8f (напÑ\80., skin=vector). Ð\97наÑ\87еннÑ\8f Ð½Ðµ Ð¼Ð¾Ð¶Ðµ Ð¼Ñ\96Ñ\81Ñ\82иÑ\82и Ð²ÐµÑ\80Ñ\82икалÑ\8cниÑ\85 Ñ\80иÑ\81ок. Ð¯ÐºÑ\89о Ð·Ð½Ð°Ñ\87еннÑ\8f Ð½Ðµ Ð²ÐºÐ°Ð·Ð°Ð½Ðµ (навÑ\96Ñ\82Ñ\8c Ð½ÐµÐ¼Ð°Ñ\94 Ð·Ð½Ð°ÐºÐ° Ñ\80Ñ\96вноÑ\81Ñ\82Ñ\96) , Ð½Ð°Ð¿Ñ\80., optionname|otheroption|â\80¦, Ð¾Ð¿Ñ\86Ñ\96Ñ\8e Ð±Ñ\83де Ð¿ÐµÑ\80евÑ\81Ñ\82ановлено Ð´Ð¾ Ñ\97Ñ\97 Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм.",
+       "apihelp-options-param-change": "СпиÑ\81ок Ð·Ð¼Ñ\96н, Ð²Ñ\96дÑ\84оÑ\80маÑ\82ованиÑ\85 Ñ\8fк Ð½Ð°Ð·Ð²Ð°=знаÑ\87еннÑ\8f (напÑ\80., skin=vector). Ð¯ÐºÑ\89о Ð·Ð½Ð°Ñ\87еннÑ\8f Ð½Ðµ Ð²ÐºÐ°Ð·Ð°Ð½Ðµ (навÑ\96Ñ\82Ñ\8c Ð½ÐµÐ¼Ð°Ñ\94 Ð·Ð½Ð°ÐºÐ° Ñ\80Ñ\96вноÑ\81Ñ\82Ñ\96) , Ð½Ð°Ð¿Ñ\80., optionname|otheroption|â\80¦, Ð¾Ð¿Ñ\86Ñ\96Ñ\8e Ð±Ñ\83де Ð¿ÐµÑ\80евÑ\81Ñ\82ановлено Ð´Ð¾ Ñ\97Ñ\97 Ð·Ð½Ð°Ñ\87еннÑ\8f Ð·Ð° Ð·Ð°Ð¼Ð¾Ð²Ñ\87Ñ\83ваннÑ\8fм. Ð¯ÐºÑ\89о Ð±Ñ\83дÑ\8c\8fке Ð·Ñ\96 Ð·Ð½Ð°Ñ\87енÑ\8c Ð¼Ñ\96Ñ\81Ñ\82иÑ\82Ñ\8c Ñ\81имвол Ð²ÐµÑ\80Ñ\82икалÑ\8cноÑ\97 Ñ\80иÑ\81ки (<kbd>|</kbd>), Ð²Ð¸ÐºÐ¾Ñ\80иÑ\81Ñ\82айÑ\82е [[Special:ApiHelp/main#main/datatypes|алÑ\8cÑ\82еÑ\80наÑ\82ивний Ñ\80оздÑ\96лÑ\8eваÑ\87 Ð·Ð½Ð°Ñ\87енÑ\8c]] Ð´Ð»Ñ\8f ÐºÐ¾Ñ\80екÑ\82ного Ð²Ð¸ÐºÐ¾Ð½Ð°Ð½Ð½Ñ\8f Ð¾Ð¿ÐµÑ\80аÑ\86Ñ\96Ñ\97.",
        "apihelp-options-param-optionname": "Назва опції, якій має бути присвоєне значення <var>$1optionvalue</var>.",
-       "apihelp-options-param-optionvalue": "Значення опції, вказане в <var>$1optionname</var>, може містити вертикальні риски.",
+       "apihelp-options-param-optionvalue": "Значення опції, вказане в <var>$1optionname</var>.",
        "apihelp-options-example-reset": "Скинути всі налаштування.",
        "apihelp-options-example-change": "Змінити налаштування <kbd>skin</kbd> та <kbd>hideminor</kbd>.",
        "apihelp-options-example-complex": "Скинути всі налаштування, потім встановити <kbd>skin</kbd> та <kbd>nickname</kbd>.",
        "apihelp-resetpassword-description-noroutes": "Немає доступних способів відновити пароль.\n\nУвімкніть способи у <var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>, щоб використовувати цей модуль.",
        "apihelp-resetpassword-param-user": "Користувача відновлено.",
        "apihelp-resetpassword-param-email": "Адреса електронної пошти користувача відновлено.",
-       "apihelp-resetpassword-param-capture": "Повернути тимчасові паролі, які були надіслані. Вимагає право користувача <code>passwordreset</code>.",
        "apihelp-resetpassword-example-user": "Надіслати лист для скидання пароля користувачу <kbd>Example</kbd>.",
        "apihelp-resetpassword-example-email": "Надіслати лист для скидання пароля усім користувачам з адресою електронної пошти <kbd>user@example.com</kbd>.",
        "apihelp-revisiondelete-description": "Вилучити або відновити версії.",
        "api-format-title": "Результат запиту до API MediaWiki",
        "api-format-prettyprint-header": "Це HTML-представлення формату $1. HTML є гарним для налагодження, однак не придатний для прикладного використання.\n\nУкажіть значення для параметра <var>format</var>, для того щоб змінити формат. Для перегляду не-HTML-представлення формату, $1, вкажіть <kbd>format=$2</kbd>.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
        "api-format-prettyprint-header-only-html": "Це HTML-представлення призначене для налагодження, однак не придатне для прикладного використання.\n\nДив. [[mw:API|повну документацію]], або [[Special:ApiHelp/main|довідку з API]] для детальнішої інформації.",
+       "api-format-prettyprint-status": "Відповідь повернеться із HTTP-статусом $1 $2.",
        "api-pageset-param-titles": "Список назв над якими працювати.",
        "api-pageset-param-pageids": "Список ідентифікаторів сторінок над якими працювати.",
        "api-pageset-param-revids": "Список ідентифікаторів версій над якими працювати.",
        "api-help-param-upload": "Повинно бути надіслано у формі надсилання файлу використовуючи multipart/form-data.",
        "api-help-param-multi-separate": "Розділіть значення з допомогою <kbd>|</kbd> або [[Special:ApiHelp/main#main/datatypes|альтернативу]].",
        "api-help-param-multi-max": "Максимальна кількість значень — {{PLURAL:$1|$1}} ({{PLURAL:$2|$2}} для ботів).",
+       "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-param-token": "Токен «$1» отримано з [[Special:ApiHelp/query+tokens|action=query&meta=tokens]]",
index 956a0df..60295aa 100644 (file)
        "apihelp-edit-param-sectiontitle": "新段落的标题。",
        "apihelp-edit-param-text": "页面内容。",
        "apihelp-edit-param-summary": "编辑摘要。当$1section=new且未设置$1sectiontitle时,还包括小节标题。",
-       "apihelp-edit-param-tags": "更改标签以应用修订。",
+       "apihelp-edit-param-tags": "应用到此修订的更改标签。",
        "apihelp-edit-param-minor": "小编辑。",
        "apihelp-edit-param-notminor": "不是小编辑。",
        "apihelp-edit-param-bot": "标记此编辑为机器人编辑。",
        "apihelp-query+recentchanges-paramvalue-prop-patrolled": "将可巡查编辑标记为已巡查或未巡查。",
        "apihelp-query+recentchanges-paramvalue-prop-loginfo": "添加日志信息(日志ID、日志类型等)至日志记录。",
        "apihelp-query+recentchanges-paramvalue-prop-tags": "列举条目的标签。",
-       "apihelp-query+recentchanges-paramvalue-prop-sha1": "Adds the content checksum for entries associated with a revision.",
+       "apihelp-query+recentchanges-paramvalue-prop-sha1": "为与某一修订版本有关的记录添加内容校验和。",
        "apihelp-query+recentchanges-param-token": "请改用<kbd>[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]</kbd>。",
        "apihelp-query+recentchanges-param-show": "只显示满足这些标准的项目。例如,要只查看由登录用户做出的小编辑,设置$1show=minor|!anon。",
        "apihelp-query+recentchanges-param-limit": "返回总计更新数。",
        "apihelp-query+revisions-example-first5-not-localhost": "获取<kbd>Main Page</kbd>的前5次不是由匿名用户<kbd>127.0.0.1</kbd>做出的修订。",
        "apihelp-query+revisions-example-first5-user": "获取<kbd>Main Page</kbd>的前5次由用户<kbd>MediaWiki default</kbd>做出的修订。",
        "apihelp-query+revisions+base-param-prop": "要为每个修订获取的属性:",
-       "apihelp-query+revisions+base-paramvalue-prop-ids": "修订ID。",
+       "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+userinfo-paramvalue-prop-groups": "列举当前用户隶属的所有群组。",
        "apihelp-query+userinfo-paramvalue-prop-implicitgroups": "列举当前用户的所有自动成为成员的用户组。",
        "apihelp-query+userinfo-paramvalue-prop-rights": "列举当前用户拥有的所有权限。",
-       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "Lists the groups the current user can add to and remove from.",
+       "apihelp-query+userinfo-paramvalue-prop-changeablegroups": "列举当前用户可以添加并移除的用户组。",
        "apihelp-query+userinfo-paramvalue-prop-options": "列举当前用户设置的所有参数设置。",
        "apihelp-query+userinfo-paramvalue-prop-preferencestoken": "<span class=\"apihelp-deprecated\">已弃用。</span>获取令牌以更改当前用户的参数设置。",
        "apihelp-query+userinfo-paramvalue-prop-editcount": "添加当前用户的编辑计数。",
        "apihelp-resetpassword-description-noroutes": "没有密码重置路由可用。\n\n在<var>[[mw:Manual:$wgPasswordResetRoutes|$wgPasswordResetRoutes]]</var>中启用路由以使用此模块。",
        "apihelp-resetpassword-param-user": "正在重置的用户。",
        "apihelp-resetpassword-param-email": "正在重置用户的电子邮件地址。",
-       "apihelp-resetpassword-param-capture": "返回已发送的临时密码。需要<code>passwordreset</code>用户权限。",
        "apihelp-resetpassword-example-user": "向用户<kbd>Example</kbd>发送密码重置邮件。",
        "apihelp-resetpassword-example-email": "向所有电子邮件地址为<kbd>user@example.com</kbd>的用户发送密码重置邮件。",
        "apihelp-revisiondelete-description": "删除和恢复修订版本。",
        "api-format-title": "MediaWiki API 结果",
        "api-format-prettyprint-header": "这是$1格式的HTML表示。HTML对调试很有用,但不适合应用程序使用。\n\n指定<var>format</var>参数以更改输出格式。要查看$1格式的非HTML表示,设置<kbd>format=$2</kbd>。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API 帮助]]以获取更多信息。",
        "api-format-prettyprint-header-only-html": "这是用来调试的HTML表现,不适合实际使用。\n\n参见[[mw:API|完整文档]],或[[Special:ApiHelp/main|API帮助]]以获取更多信息。",
+       "api-format-prettyprint-status": "此响应将会返回HTTP状态$1 $2。",
        "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|替代物]]隔开各值。",
        "api-help-param-multi-max": "值的最大数量是{{PLURAL:$1|$1}}(对于机器人则是{{PLURAL:$2|$2}})。",
+       "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-param-token": "从[[Special:ApiHelp/query+tokens|action=query&meta=tokens]]取回的“$1”令牌",
index d88a5b2..e9a6edc 100644 (file)
@@ -24,6 +24,7 @@
 namespace MediaWiki\Auth;
 
 use Config;
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Status;
@@ -146,7 +147,7 @@ class AuthManager implements LoggerAwareInterface {
                if ( self::$instance === null ) {
                        self::$instance = new self(
                                \RequestContext::getMain()->getRequest(),
-                               \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                               MediaWikiServices::getInstance()->getMainConfig()
                        );
                }
                return self::$instance;
index ff4569b..7fc362a 100644 (file)
@@ -108,6 +108,10 @@ abstract class AuthenticationRequest {
         *  - optional: (bool) If set and truthy, the field may be left empty
         *  - sensitive: (bool) If set and truthy, the field is considered sensitive. Code using the
         *      request should avoid exposing the value of the field.
+        *  - skippable: (bool) If set and truthy, the client is free to hide this
+        *      field from the user to streamline the workflow. If all fields are
+        *      skippable (except possibly a single button), no user interaction is
+        *      required at all.
         *
         * All AuthenticationRequests are populated from the same data, so most of the time you'll
         * want to prefix fields names with something unique to the extension/provider (although
index 88df68d..859fd0c 100644 (file)
@@ -104,7 +104,7 @@ class LocalPasswordPrimaryAuthenticationProvider
                // The old hash format was just an md5 hex hash, with no type information
                if ( preg_match( '/^[0-9a-f]{32}$/', $row->user_password ) ) {
                        if ( $this->config->get( 'PasswordSalt' ) ) {
-                               $row->user_password = ":A:{$row->user_id}:{$row->user_password}";
+                               $row->user_password = ":B:{$row->user_id}:{$row->user_password}";
                        } else {
                                $row->user_password = ":A:{$row->user_password}";
                        }
@@ -132,12 +132,12 @@ class LocalPasswordPrimaryAuthenticationProvider
 
                // @codeCoverageIgnoreStart
                if ( $this->getPasswordFactory()->needsUpdate( $pwhash ) ) {
-                       $pwhash = $this->getPasswordFactory()->newFromPlaintext( $req->password );
-                       \DeferredUpdates::addCallableUpdate( function () use ( $pwhash, $oldRow ) {
+                       $newHash = $this->getPasswordFactory()->newFromPlaintext( $req->password );
+                       \DeferredUpdates::addCallableUpdate( function () use ( $newHash, $oldRow ) {
                                $dbw = wfGetDB( DB_MASTER );
                                $dbw->update(
                                        'user',
-                                       [ 'user_password' => $pwhash->toString() ],
+                                       [ 'user_password' => $newHash->toString() ],
                                        [
                                                'user_id' => $oldRow->user_id,
                                                'user_password' => $oldRow->user_password
index d487e31..06060b1 100644 (file)
@@ -58,6 +58,7 @@ class RememberMeAuthenticationRequest extends AuthenticationRequest {
                                'label' => wfMessage( 'userlogin-remembermypassword' )->numParams( $expirationDays ),
                                'help' => wfMessage( 'authmanager-userlogin-remembermypassword-help' ),
                                'optional' => true,
+                               'skippable' => true,
                        ]
                ];
        }
index 42f0e70..bc7c779 100644 (file)
@@ -21,6 +21,8 @@
 
 namespace MediaWiki\Auth;
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * This represents the intention to set a temporary password for the user.
  * @ingroup Auth
@@ -33,12 +35,6 @@ class TemporaryPasswordAuthenticationRequest extends AuthenticationRequest {
        /** @var bool Email password to the user. */
        public $mailpassword = false;
 
-       /**
-        * @var bool Do not fail certain operations if the password cannot be mailed, there is a
-        *   backchannel present.
-        */
-       public $hasBackchannel = false;
-
        /** @var string Username or IP address of the caller */
        public $caller;
 
@@ -67,7 +63,7 @@ class TemporaryPasswordAuthenticationRequest extends AuthenticationRequest {
         * @return TemporaryPasswordAuthenticationRequest
         */
        public static function newRandom() {
-               $config = \ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               $config = MediaWikiServices::getInstance()->getMainConfig();
 
                // get the min password length
                $minLength = $config->get( 'MinimalPasswordLength' );
index 9962fa3..44c2824 100644 (file)
@@ -154,6 +154,16 @@ class TemporaryPasswordPrimaryAuthenticationProvider
                        return $this->failResponse( $req );
                }
 
+               // Add an extra log entry since a temporary password is
+               // an unusual way to log in, so its important to keep track
+               // of in case of abuse.
+               $this->logger->info( "{user} successfully logged in using temp password",
+                       [
+                               'user' => $username,
+                               'requestIP' => $this->manager->getRequest()->getIP()
+                       ]
+               );
+
                $this->setPasswordResetFlag( $username, $status );
 
                return AuthenticationResponse::newPass( $username );
@@ -236,7 +246,7 @@ class TemporaryPasswordPrimaryAuthenticationProvider
                        $sv->merge( $this->checkPasswordValidity( $username, $req->password ) );
 
                        if ( $req->mailpassword ) {
-                               if ( !$this->emailEnabled && !$req->hasBackchannel ) {
+                               if ( !$this->emailEnabled ) {
                                        return \StatusValue::newFatal( 'passwordreset-emaildisabled' );
                                }
 
@@ -326,7 +336,7 @@ class TemporaryPasswordPrimaryAuthenticationProvider
 
                $ret = \StatusValue::newGood();
                if ( $req ) {
-                       if ( $req->mailpassword && !$req->hasBackchannel ) {
+                       if ( $req->mailpassword ) {
                                if ( !$this->emailEnabled ) {
                                        $ret->merge( \StatusValue::newFatal( 'emaildisabled' ) );
                                } elseif ( !$user->getEmail() ) {
index f47c606..6d3b2f4 100644 (file)
@@ -23,6 +23,7 @@ namespace MediaWiki\Auth;
 
 use BagOStuff;
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\LogLevel;
@@ -68,7 +69,7 @@ class Throttler implements LoggerAwareInterface {
                }
 
                if ( $conditions === null ) {
-                       $config = \ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                        $conditions = $config->get( 'PasswordAttemptThrottle' );
                        $params += [
                                'type' => 'password',
@@ -135,7 +136,7 @@ class Throttler implements LoggerAwareInterface {
                                $this->cache->incr( $throttleKey );
                        } else { // throttled
                                $this->logRejection( [
-                                       'type' => $this->type,
+                                       'throttle' => $this->type,
                                        'index' => $index,
                                        'ip' => $ipKey,
                                        'username' => $username,
@@ -191,7 +192,7 @@ class Throttler implements LoggerAwareInterface {
        }
 
        protected function logRejection( array $context ) {
-               $logMsg = 'Throttle {type} hit, throttled for {expiry} seconds due to {count} attempts '
+               $logMsg = 'Throttle {throttle} hit, throttled for {expiry} seconds due to {count} attempts '
                        . 'from username {username} and IP {ip}';
 
                // If we are hitting a throttle for >= warningLimit attempts, it is much more likely to be
index ee77d7b..35d6652 100644 (file)
@@ -21,6 +21,7 @@
 
 namespace MediaWiki\Auth;
 
+use MediaWiki\MediaWikiServices;
 use StatusValue;
 use User;
 
@@ -38,7 +39,7 @@ class UserDataAuthenticationRequest extends AuthenticationRequest {
        public $realname;
 
        public function getFieldInfo() {
-               $config = \ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               $config = MediaWikiServices::getInstance()->getMainConfig();
                $ret = [
                        'email' => [
                                'type' => 'string',
index dc8c589..4e6b2fd 100644 (file)
@@ -144,13 +144,9 @@ class MessageCache {
         * @param bool $useDB
         * @param int $expiry Lifetime for cache. @see $mExpiry.
         */
-       function __construct( $memCached, $useDB, $expiry ) {
+       function __construct( BagOStuff $memCached, $useDB, $expiry ) {
                global $wgUseLocalMessageCache;
 
-               if ( !$memCached ) {
-                       $memCached = wfGetCache( CACHE_NONE );
-               }
-
                $this->mMemc = $memCached;
                $this->mDisable = !$useDB;
                $this->mExpiry = $expiry;
@@ -500,6 +496,7 @@ class MessageCache {
                        if ( $text === false ) {
                                // Failed to fetch data; possible ES errors?
                                // Store a marker to fetch on-demand as a workaround...
+                               // TODO Use a differnt marker
                                $entry = '!TOO BIG';
                                wfDebugLog(
                                        'MessageCache',
@@ -514,6 +511,10 @@ class MessageCache {
 
                $cache['VERSION'] = MSG_CACHE_VERSION;
                ksort( $cache );
+
+               # Hash for validating local cache (APC). No need to take into account
+               # messages larger than $wgMaxMsgCacheEntrySize, since those are only
+               # stored and fetched from memcache.
                $cache['HASH'] = md5( serialize( $cache ) );
                $cache['EXPIRY'] = wfTimestamp( TS_MW, time() + $this->mExpiry );
 
@@ -572,7 +573,8 @@ class MessageCache {
                }
 
                ScopedCallback::consume( $scopedLock );
-               // Relay the purge to APC and other DCs
+               // Relay the purge. Touching this check key expires cache contents
+               // and local cache (APC) validation hash across all datacenters.
                $this->wanCache->touchCheckKey( wfMemcKey( 'messages', $code ) );
 
                // Also delete cached sidebar... just in case it is affected
index 1262f2c..81f64a8 100644 (file)
@@ -762,6 +762,7 @@ class RecentChange {
                # # Get pageStatus for email notification
                switch ( $type . '-' . $action ) {
                        case 'delete-delete':
+                       case 'delete-delete_redir':
                                $pageStatus = 'deleted';
                                break;
                        case 'move-move':
index 993f0b7..bfabd51 100644 (file)
@@ -397,7 +397,7 @@ class ChangeTags {
                        if ( !$user->isAllowed( 'applychangetags' ) ) {
                                return Status::newFatal( 'tags-apply-no-permission' );
                        } elseif ( $user->isBlocked() ) {
-                               return Status::newFatal( 'tags-apply-blocked' );
+                               return Status::newFatal( 'tags-apply-blocked', $user->getName() );
                        }
                }
 
@@ -468,7 +468,7 @@ class ChangeTags {
                        if ( !$user->isAllowed( 'changetags' ) ) {
                                return Status::newFatal( 'tags-update-no-permission' );
                        } elseif ( $user->isBlocked() ) {
-                               return Status::newFatal( 'tags-update-blocked' );
+                               return Status::newFatal( 'tags-update-blocked', $user->getName() );
                        }
                }
 
@@ -668,12 +668,20 @@ class ChangeTags {
         * @param string $selected Tag to select by default
         * @param bool $ooui Use an OOUI TextInputWidget as selector instead of a non-OOUI input field
         *        You need to call OutputPage::enableOOUI() yourself.
+        * @param IContextSource|null $context
+        * @note Even though it takes null as a valid argument, an IContextSource is preferred
+        *       in a new code, as the null value can change in the future
         * @return array an array of (label, selector)
         */
-       public static function buildTagFilterSelector( $selected = '', $ooui = false ) {
-               global $wgUseTagFilter;
+       public static function buildTagFilterSelector(
+               $selected = '', $ooui = false, IContextSource $context = null
+       ) {
+               if ( !$context ) {
+                       $context = RequestContext::getMain();
+               }
 
-               if ( !$wgUseTagFilter || !count( self::listDefinedTags() ) ) {
+               $config = $context->getConfig();
+               if ( !$config->get( 'UseTagFilter' ) || !count( self::listDefinedTags() ) ) {
                        return [];
                }
 
@@ -681,7 +689,7 @@ class ChangeTags {
                        Html::rawElement(
                                'label',
                                [ 'for' => 'tagfilter' ],
-                               wfMessage( 'tag-filter' )->parse()
+                               $context->msg( 'tag-filter' )->parse()
                        )
                ];
 
@@ -790,7 +798,7 @@ class ChangeTags {
                        if ( !$user->isAllowed( 'managechangetags' ) ) {
                                return Status::newFatal( 'tags-manage-no-permission' );
                        } elseif ( $user->isBlocked() ) {
-                               return Status::newFatal( 'tags-manage-blocked' );
+                               return Status::newFatal( 'tags-manage-blocked', $user->getName() );
                        }
                }
 
@@ -858,7 +866,7 @@ class ChangeTags {
                        if ( !$user->isAllowed( 'managechangetags' ) ) {
                                return Status::newFatal( 'tags-manage-no-permission' );
                        } elseif ( $user->isBlocked() ) {
-                               return Status::newFatal( 'tags-manage-blocked' );
+                               return Status::newFatal( 'tags-manage-blocked', $user->getName() );
                        }
                }
 
@@ -917,7 +925,7 @@ class ChangeTags {
                        if ( !$user->isAllowed( 'managechangetags' ) ) {
                                return Status::newFatal( 'tags-manage-no-permission' );
                        } elseif ( $user->isBlocked() ) {
-                               return Status::newFatal( 'tags-manage-blocked' );
+                               return Status::newFatal( 'tags-manage-blocked', $user->getName() );
                        }
                }
 
@@ -1050,7 +1058,7 @@ class ChangeTags {
                        if ( !$user->isAllowed( 'deletechangetags' ) ) {
                                return Status::newFatal( 'tags-delete-no-permission' );
                        } elseif ( $user->isBlocked() ) {
-                               return Status::newFatal( 'tags-manage-blocked' );
+                               return Status::newFatal( 'tags-manage-blocked', $user->getName() );
                        }
                }
 
index 881c8c2..9950a11 100644 (file)
@@ -46,11 +46,13 @@ abstract class Collation {
         * @return Collation
         */
        public static function factory( $collationName ) {
+               global $wgContLang;
+
                switch ( $collationName ) {
                        case 'uppercase':
                                return new UppercaseCollation;
                        case 'numeric':
-                               return new NumericUppercaseCollation;
+                               return new NumericUppercaseCollation( $wgContLang );
                        case 'identity':
                                return new IdentityCollation;
                        case 'uca-default':
index e6b773c..7b4fce6 100644 (file)
@@ -100,6 +100,12 @@ class IcuCollation extends Collation {
                'be' => [ "Ё" ],
                'be-tarask' => [ "Ё" ],
                'bg' => [],
+               'bn' => [ 'ং', 'ঃ', 'ঁ' ],
+               'bn@collation=traditional' => [
+                       'ং', 'ঃ', 'ঁ', 'ক্', 'খ্', 'গ্', 'ঘ্', 'ঙ্', 'চ্', 'ছ্', 'জ্', 'ঝ্',
+                       'ঞ্', 'ট্', 'ঠ্', 'ড্', 'ঢ্', 'ণ্', 'ৎ', 'থ্', 'দ্', 'ধ্', 'ন্', 'প্',
+                       'ফ্', 'ব্', 'ভ্', 'ম্', 'য্', 'র্', 'ৰ্', 'ল্', 'ৱ্', 'শ্', 'ষ্', 'স্', 'হ্'
+               ],
                'bo' => [],
                'br' => [ "Ch", "C'h" ],
                'bs' => [ "Č", "Ć", "Dž", "Đ", "Lj", "Nj", "Š", "Ž" ],
index d15daec..2d2ca47 100644 (file)
  * Note that this only works in terms of sequences of digits, and the behavior for decimal fractions
  * or pretty-formatted numbers may be unexpected.
  *
+ * Digits will be based on the wiki's content language settings. If
+ * you change the content langauge of a wiki you will need to run
+ * updateCollation.php --force. Only English (ASCII 0-9) and the
+ * localized version will be counted. Localized digits from other languages
+ * or weird unicode digit equivalents (e.g. 4, 𝟜, ⓸ , ⁴, etc) will not count.
+ *
  * @since 1.28
  */
 class NumericUppercaseCollation extends UppercaseCollation {
+
+       /**
+        * @var $digitTransformLang Language How to convert digits (usually $wgContLang)
+        */
+       private $digitTransformLang;
+
+       /**
+        * Constructor
+        *
+        * @param $lang Language How to convert digits.
+        *  For example, if given language "my" than ၇ is treated like 7.
+        *
+        * It is expected that usually this is given $wgContLang.
+        */
+       public function __construct( Language $lang ) {
+               $this->digitTransformLang = $lang;
+               parent::__construct();
+       }
+
        public function getSortKey( $string ) {
                $sortkey = parent::getSortKey( $string );
-
+               $sortkey = $this->convertDigits( $sortkey );
                // For each sequence of digits, insert the digit '0' and then the length of the sequence
                // (encoded in two bytes) before it. That's all folks, it sorts correctly now! The '0' ensures
                // correct position (where digits would normally sort), then the length will be compared putting
@@ -48,11 +73,33 @@ class NumericUppercaseCollation extends UppercaseCollation {
                return $sortkey;
        }
 
+       /**
+        * Convert localized digits to english digits.
+        *
+        * based on Language::parseFormattedNumber but without commas.
+        *
+        * @param $string String sortkey to unlocalize digits of
+        * @return String Sortkey with all localized digits replaced with ASCII digits.
+        */
+       private function convertDigits( $string ) {
+               $table = $this->digitTransformLang->digitTransformTable();
+               if ( $table ) {
+                       $table = array_filter( $table );
+                       $flipped = array_flip( $table );
+                       // Some languages seem to also have commas in this table.
+                       $flipped = array_filter( $flipped, 'is_numeric' );
+                       $string = strtr( $string, $flipped );
+               }
+               return $string;
+       }
+
        public function getFirstLetter( $string ) {
-               if ( preg_match( '/^\d/', $string ) ) {
-                       // Note that we pass 0 and 9 as normal params, not numParams(). This only works for 0-9
-                       // and not localised digits, so we don't want them to be converted.
-                       return wfMessage( 'category-header-numerals' )->params( 0, 9 )->text();
+               $convertedString = $this->convertDigits( $string );
+
+               if ( preg_match( '/^\d/', $convertedString ) ) {
+                       return wfMessage( 'category-header-numerals' )
+                               ->numParams( 0, 9 )
+                               ->text();
                } else {
                        return parent::getFirstLetter( $string );
                }
index 20893bb..dfd46c8 100644 (file)
 abstract class CodeContentHandler extends TextContentHandler {
 
        /**
-        * Returns the english language, because code is english, and should be handled as such.
+        * Returns the English language, because code is English, and should be handled as such.
         *
         * @param Title $title
         * @param Content $content
         *
-        * @return Language Return of wfGetLangObj( 'en' )
+        * @return Language
         *
         * @see ContentHandler::getPageLanguage()
         */
        public function getPageLanguage( Title $title, Content $content = null ) {
-               return wfGetLangObj( 'en' );
+               return Language::factory( 'en' );
        }
 
        /**
-        * Returns the english language, because code is english, and should be handled as such.
+        * Returns the English language, because code is English, and should be handled as such.
         *
         * @param Title $title
         * @param Content $content
         *
-        * @return Language Return of wfGetLangObj( 'en' )
+        * @return Language
         *
         * @see ContentHandler::getPageViewLanguage()
         */
        public function getPageViewLanguage( Title $title, Content $content = null ) {
-               return wfGetLangObj( 'en' );
+               return Language::factory( 'en' );
        }
 
        /**
index ebedb7e..ecd274b 100644 (file)
@@ -99,7 +99,7 @@ class RequestContext implements IContextSource, MutableContext {
                if ( $this->config === null ) {
                        // @todo In the future, we could move this to WebStart.php so
                        // the Config object is ready for when initialization happens
-                       $this->config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $this->config = MediaWikiServices::getInstance()->getMainConfig();
                }
 
                return $this->config;
index bfdce39..40418fd 100644 (file)
@@ -37,6 +37,8 @@ abstract class MWLBFactory {
        public static function applyDefaultConfig( array $lbConf, Config $mainConfig ) {
                global $wgCommandLineMode;
 
+               static $typesWithSchema = [ 'postgres', 'msssql' ];
+
                $lbConf += [
                        'localDomain' => new DatabaseDomain(
                                $mainConfig->get( 'DBname' ),
@@ -64,15 +66,24 @@ abstract class MWLBFactory {
                                        if ( $server['type'] === 'sqlite' ) {
                                                $server += [ 'dbDirectory' => $mainConfig->get( 'SQLiteDataDir' ) ];
                                        } elseif ( $server['type'] === 'postgres' ) {
-                                               $server += [ 'port' => $mainConfig->get( 'DBport' ) ];
+                                               $server += [
+                                                       'port' => $mainConfig->get( 'DBport' ),
+                                                       // Work around the reserved word usage in MediaWiki schema
+                                                       'keywordTableMap' => [ 'user' => 'mwuser', 'text' => 'pagecontent' ]
+                                               ];
+                                       }
+                                       if ( in_array( $server['type'], $typesWithSchema, true ) ) {
+                                               $server += [ 'schema' => $mainConfig->get( 'DBmwschema' ) ];
                                        }
-                                       $lbConf['servers'][$i] = $server + [
-                                               'schema' => $mainConfig->get( 'DBmwschema' ),
+
+                                       $server += [
                                                'tablePrefix' => $mainConfig->get( 'DBprefix' ),
                                                'flags' => DBO_DEFAULT,
                                                'sqlMode' => $mainConfig->get( 'SQLMode' ),
                                                'utf8Mode' => $mainConfig->get( 'DBmysql5' )
                                        ];
+
+                                       $lbConf['servers'][$i] = $server;
                                }
                        } else {
                                $flags = DBO_DEFAULT;
@@ -84,7 +95,6 @@ abstract class MWLBFactory {
                                        'user' => $mainConfig->get( 'DBuser' ),
                                        'password' => $mainConfig->get( 'DBpassword' ),
                                        'dbname' => $mainConfig->get( 'DBname' ),
-                                       'schema' => $mainConfig->get( 'DBmwschema' ),
                                        'tablePrefix' => $mainConfig->get( 'DBprefix' ),
                                        'type' => $mainConfig->get( 'DBtype' ),
                                        'load' => 1,
@@ -92,10 +102,15 @@ abstract class MWLBFactory {
                                        'sqlMode' => $mainConfig->get( 'SQLMode' ),
                                        'utf8Mode' => $mainConfig->get( 'DBmysql5' )
                                ];
+                               if ( in_array( $server['type'], $typesWithSchema, true ) ) {
+                                       $server += [ 'schema' => $mainConfig->get( 'DBmwschema' ) ];
+                               }
                                if ( $server['type'] === 'sqlite' ) {
                                        $server[ 'dbDirectory'] = $mainConfig->get( 'SQLiteDataDir' );
                                } elseif ( $server['type'] === 'postgres' ) {
                                        $server['port'] = $mainConfig->get( 'DBport' );
+                                       // Work around the reserved word usage in MediaWiki schema
+                                       $server['keywordTableMap'] = [ 'user' => 'mwuser', 'text' => 'pagecontent' ];
                                }
                                $lbConf['servers'] = [ $server ];
                        }
@@ -104,7 +119,9 @@ abstract class MWLBFactory {
                        }
                } elseif ( $lbConf['class'] === 'LBFactoryMulti' ) {
                        if ( isset( $lbConf['serverTemplate'] ) ) {
-                               $lbConf['serverTemplate']['schema'] = $mainConfig->get( 'DBmwschema' );
+                               if ( in_array( $lbConf['serverTemplate']['type'], $typesWithSchema, true ) ) {
+                                       $lbConf['serverTemplate']['schema'] = $mainConfig->get( 'DBmwschema' );
+                               }
                                $lbConf['serverTemplate']['sqlMode'] = $mainConfig->get( 'SQLMode' );
                                $lbConf['serverTemplate']['utf8Mode'] = $mainConfig->get( 'DBmysql5' );
                        }
index 4d7c84d..4614c46 100644 (file)
@@ -327,7 +327,7 @@ class LegacyLogger extends AbstractLogger {
         * @param string $channel
         * @param string $message
         * @param array $context
-        * @return null
+        * @return string
         */
        protected static function formatAsWfDebugLog( $channel, $message, $context ) {
                $time = wfTimestamp( TS_DB );
diff --git a/includes/debug/logger/monolog/LogstashFormatter.php b/includes/debug/logger/monolog/LogstashFormatter.php
new file mode 100644 (file)
index 0000000..553cbf6
--- /dev/null
@@ -0,0 +1,83 @@
+<?php
+
+namespace MediaWiki\Logger\Monolog;
+
+/**
+ * LogstashFormatter squashes the base message array and the context and extras subarrays into one.
+ * This can result in unfortunately named context fields overwriting other data (T145133).
+ * This class modifies the standard LogstashFormatter to rename such fields and flag the message.
+ *
+ * Compatible with Monolog 1.x only.
+ *
+ * @since 1.29
+ */
+class LogstashFormatter extends \Monolog\Formatter\LogstashFormatter {
+       /** @var array Keys which should not be used in log context */
+       protected $reservedKeys = [
+               // from LogstashFormatter
+               'message', 'channel', 'level', 'type',
+               // from WebProcessor
+               'url', 'ip', 'http_method', 'server', 'referrer',
+               // from WikiProcessor
+               'host', 'wiki', 'reqId', 'mwversion',
+               // from config magic
+               'normalized_message',
+       ];
+
+       /**
+        * Prevent key conflicts
+        * @param array $record
+        * @return array
+        */
+       protected function formatV0( array $record ) {
+               if ( $this->contextPrefix ) {
+                       return parent::formatV0( $record );
+               }
+
+               $context = !empty( $record['context'] ) ? $record['context'] : [];
+               $record['context'] = [];
+               $formatted = parent::formatV0( $record );
+
+               $formatted['@fields'] = $this->fixKeyConflicts( $formatted['@fields'], $context );
+               return $formatted;
+       }
+
+       /**
+        * Prevent key conflicts
+        * @param array $record
+        * @return array
+        */
+       protected function formatV1( array $record ) {
+               if ( $this->contextPrefix ) {
+                       return parent::formatV1( $record );
+               }
+
+               $context = !empty( $record['context'] ) ? $record['context'] : [];
+               $record['context'] = [];
+               $formatted = parent::formatV1( $record );
+
+               $formatted = $this->fixKeyConflicts( $formatted, $context );
+               return $formatted;
+       }
+
+       /**
+        * Check whether some context field would overwrite another message key. If so, rename
+        * and flag.
+        * @param array $fields Fields to be sent to logstash
+        * @param array $context Copy of the original $record['context']
+        * @return array Updated version of $fields
+        */
+       protected function fixKeyConflicts( array $fields, array $context ) {
+               foreach ( $context as $key => $val ) {
+                       if (
+                               in_array( $key, $this->reservedKeys, true ) &&
+                               isset( $fields[$key] ) && $fields[$key] !== $val
+                       ) {
+                               $fields['logstash_formatter_key_conflict'][] = $key;
+                               $key = 'c_' . $key;
+                       }
+                       $fields[$key] = $val;
+               }
+               return $fields;
+       }
+}
index 8fdc417..b600f42 100644 (file)
@@ -60,9 +60,10 @@ class MWExceptionRenderer {
                                                        MWExceptionHandler::getLogMessage( $eNew ) .
                                                "\nBacktrace:\n" . MWExceptionHandler::getRedactedTraceAsString( $eNew );
                                } else {
-                                       $message .= "Exception caught inside exception handler.\n\n" .
-                                               "Set \$wgShowExceptionDetails = true; at the bottom of LocalSettings.php " .
-                                               "to show detailed debugging information.";
+                                       $message .= 'Original exception: ' .
+                                               MWExceptionHandler::getPublicLogMessage( $e );
+                                       $message .= "\n\nException caught inside exception handler.\n\n" .
+                                               self::getShowBacktraceError( $e );
                                }
                                $message .= "\n";
                        } else {
@@ -74,11 +75,7 @@ class MWExceptionRenderer {
                                        $message = MWExceptionHandler::getPublicLogMessage( $e );
                                }
                        }
-                       if ( self::isCommandLine() ) {
-                               self::printError( $message );
-                       } else {
-                               echo nl2br( htmlspecialchars( $message ) ) . "\n";
-                       }
+                       echo nl2br( htmlspecialchars( $message ) ) . "\n";
                }
        }
 
@@ -226,9 +223,7 @@ class MWExceptionRenderer {
                                        $logId,
                                        MWExceptionHandler::getURL()
                                ) . "</div>\n" .
-                       "<!-- Set \$wgShowExceptionDetails = true; " .
-                       "at the bottom of LocalSettings.php to show detailed " .
-                       "debugging information. -->";
+                               "<!-- " . wordwrap( self::getShowBacktraceError( $e ), 50 ) . " -->";
                }
 
                return $html;
@@ -262,8 +257,7 @@ class MWExceptionRenderer {
                                "\nBacktrace:\n" .
                                MWExceptionHandler::getRedactedTraceAsString( $e ) . "\n";
                } else {
-                       return "Set \$wgShowExceptionDetails = true; " .
-                               "in LocalSettings.php to show detailed debugging information.\n";
+                       return self::getShowBacktraceError( $e );
                }
        }
 
@@ -280,6 +274,23 @@ class MWExceptionRenderer {
                );
        }
 
+       /**
+        * @param Exception|Throwable $e
+        * @return string
+        */
+       private static function getShowBacktraceError( $e ) {
+               global $wgShowExceptionDetails, $wgShowDBErrorBacktrace;
+               $vars = [];
+               if ( !$wgShowExceptionDetails ) {
+                       $vars[] = '$wgShowExceptionDetails = true;';
+               }
+               if ( $e instanceof DBError && !$wgShowDBErrorBacktrace ) {
+                       $vars[] = '$wgShowDBErrorBacktrace = true;';
+               }
+               $vars = implode( ' and ', $vars );
+               return "Set $vars at the bottom of LocalSettings.php to show detailed debugging information";
+       }
+
        /**
         * @return bool
         */
index 7fb7a0e..f49ef88 100644 (file)
@@ -89,7 +89,7 @@ class ForeignDBRepo extends LocalRepo {
        /**
         * @return IDatabase
         */
-       function getSlaveDB() {
+       function getReplicaDB() {
                return $this->getMasterDB();
        }
 
index 129d55a..a9cd030 100644 (file)
@@ -65,7 +65,7 @@ class ForeignDBViaLBRepo extends LocalRepo {
        /**
         * @return IDatabase
         */
-       function getSlaveDB() {
+       function getReplicaDB() {
                return wfGetLB( $this->wiki )->getConnectionRef( DB_REPLICA, [], $this->wiki );
        }
 
index c4730d7..d49ae7b 100644 (file)
@@ -200,7 +200,7 @@ class LocalRepo extends FileRepo {
                        $memcKey,
                        $expiry,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $method, $title ) {
-                               $dbr = $this->getSlaveDB(); // possibly remote DB
+                               $dbr = $this->getReplicaDB(); // possibly remote DB
 
                                $setOpts += Database::getCacheSetOptions( $dbr );
 
@@ -298,7 +298,7 @@ class LocalRepo extends FileRepo {
                        }
                };
 
-               $dbr = $this->getSlaveDB();
+               $dbr = $this->getReplicaDB();
 
                // Query image table
                $imgNames = [];
@@ -368,7 +368,7 @@ class LocalRepo extends FileRepo {
         * @return File[]
         */
        function findBySha1( $hash ) {
-               $dbr = $this->getSlaveDB();
+               $dbr = $this->getReplicaDB();
                $res = $dbr->select(
                        'image',
                        LocalFile::selectFields(),
@@ -400,7 +400,7 @@ class LocalRepo extends FileRepo {
                        return []; // empty parameter
                }
 
-               $dbr = $this->getSlaveDB();
+               $dbr = $this->getReplicaDB();
                $res = $dbr->select(
                        'image',
                        LocalFile::selectFields(),
@@ -430,7 +430,7 @@ class LocalRepo extends FileRepo {
                $selectOptions = [ 'ORDER BY' => 'img_name', 'LIMIT' => intval( $limit ) ];
 
                // Query database
-               $dbr = $this->getSlaveDB();
+               $dbr = $this->getReplicaDB();
                $res = $dbr->select(
                        'image',
                        LocalFile::selectFields(),
@@ -452,10 +452,20 @@ class LocalRepo extends FileRepo {
         * Get a connection to the replica DB
         * @return IDatabase
         */
-       function getSlaveDB() {
+       function getReplicaDB() {
                return wfGetDB( DB_REPLICA );
        }
 
+       /**
+        * Alias for getReplicaDB()
+        *
+        * @return IDatabase
+        * @deprecated Since 1.29
+        */
+       function getSlaveDB() {
+               return $this->getReplicaDB();
+       }
+
        /**
         * Get a connection to the master DB
         * @return IDatabase
index c041dea..df50a67 100644 (file)
@@ -136,7 +136,7 @@ class ForeignDBFile extends LocalFile {
                        return false;
                }
 
-               $touched = $this->repo->getSlaveDB()->selectField(
+               $touched = $this->repo->getReplicaDB()->selectField(
                        'page',
                        'page_touched',
                        [
@@ -179,7 +179,7 @@ class ForeignDBFile extends LocalFile {
         * @since 1.27
         */
        public function getDescriptionShortUrl() {
-               $dbr = $this->repo->getSlaveDB();
+               $dbr = $this->repo->getReplicaDB();
                $pageId = $dbr->selectField(
                        'page',
                        'page_id',
index d3a14fa..011ba87 100644 (file)
@@ -174,7 +174,7 @@ class LocalFile extends File {
         * @return bool|LocalFile
         */
        static function newFromKey( $sha1, $repo, $timestamp = false ) {
-               $dbr = $repo->getSlaveDB();
+               $dbr = $repo->getReplicaDB();
 
                $conds = [ 'img_sha1' => $sha1 ];
                if ( $timestamp ) {
@@ -259,7 +259,7 @@ class LocalFile extends File {
                        $key,
                        $cache::TTL_WEEK,
                        function ( $oldValue, &$ttl, array &$setOpts ) use ( $cache ) {
-                               $setOpts += Database::getCacheSetOptions( $this->repo->getSlaveDB() );
+                               $setOpts += Database::getCacheSetOptions( $this->repo->getReplicaDB() );
 
                                $this->loadFromDB( self::READ_NORMAL );
 
@@ -390,7 +390,7 @@ class LocalFile extends File {
 
                $dbr = ( $flags & self::READ_LATEST )
                        ? $this->repo->getMasterDB()
-                       : $this->repo->getSlaveDB();
+                       : $this->repo->getReplicaDB();
 
                $row = $dbr->selectRow( 'image', $this->getCacheFields( 'img_' ),
                        [ 'img_name' => $this->getName() ], $fname );
@@ -412,7 +412,7 @@ class LocalFile extends File {
                # Unconditionally set loaded=true, we don't want the accessors constantly rechecking
                $this->extraDataLoaded = true;
 
-               $fieldMap = $this->loadFieldsWithTimestamp( $this->repo->getSlaveDB(), $fname );
+               $fieldMap = $this->loadFieldsWithTimestamp( $this->repo->getReplicaDB(), $fname );
                if ( !$fieldMap ) {
                        $fieldMap = $this->loadFieldsWithTimestamp( $this->repo->getMasterDB(), $fname );
                }
@@ -490,7 +490,7 @@ class LocalFile extends File {
 
                $decoded['timestamp'] = wfTimestamp( TS_MW, $decoded['timestamp'] );
 
-               $decoded['metadata'] = $this->repo->getSlaveDB()->decodeBlob( $decoded['metadata'] );
+               $decoded['metadata'] = $this->repo->getReplicaDB()->decodeBlob( $decoded['metadata'] );
 
                if ( empty( $decoded['major_mime'] ) ) {
                        $decoded['mime'] = 'unknown/unknown';
@@ -1037,7 +1037,7 @@ class LocalFile extends File {
         * @return OldLocalFile[]
         */
        function getHistory( $limit = null, $start = null, $end = null, $inc = true ) {
-               $dbr = $this->repo->getSlaveDB();
+               $dbr = $this->repo->getReplicaDB();
                $tables = [ 'oldimage' ];
                $fields = OldLocalFile::selectFields();
                $conds = $opts = $join_conds = [];
@@ -1091,7 +1091,7 @@ class LocalFile extends File {
                # Polymorphic function name to distinguish foreign and local fetches
                $fname = get_class( $this ) . '::' . __FUNCTION__;
 
-               $dbr = $this->repo->getSlaveDB();
+               $dbr = $this->repo->getReplicaDB();
 
                if ( $this->historyLine == 0 ) { // called for the first time, return line from cur
                        $this->historyRes = $dbr->select( 'image',
@@ -1917,7 +1917,7 @@ class LocalFile extends File {
                                'page_namespace' => $this->title->getNamespace(),
                                'page_title' => $this->title->getDBkey()
                        ];
-                       $touched = $this->repo->getSlaveDB()->selectField( 'page', 'page_touched', $cond, __METHOD__ );
+                       $touched = $this->repo->getReplicaDB()->selectField( 'page', 'page_touched', $cond, __METHOD__ );
                        $this->descriptionTouched = $touched ? wfTimestamp( TS_MW, $touched ) : false;
                }
 
index 06fef4f..dfaae73 100644 (file)
@@ -86,7 +86,7 @@ class OldLocalFile extends LocalFile {
         * @return bool|OldLocalFile
         */
        static function newFromKey( $sha1, $repo, $timestamp = false ) {
-               $dbr = $repo->getSlaveDB();
+               $dbr = $repo->getReplicaDB();
 
                $conds = [ 'oi_sha1' => $sha1 ];
                if ( $timestamp ) {
@@ -179,7 +179,7 @@ class OldLocalFile extends LocalFile {
 
                $dbr = ( $flags & self::READ_LATEST )
                        ? $this->repo->getMasterDB()
-                       : $this->repo->getSlaveDB();
+                       : $this->repo->getReplicaDB();
 
                $conds = [ 'oi_name' => $this->getName() ];
                if ( is_null( $this->requestedTime ) ) {
@@ -201,7 +201,7 @@ class OldLocalFile extends LocalFile {
         */
        protected function loadExtraFromDB() {
                $this->extraDataLoaded = true;
-               $dbr = $this->repo->getSlaveDB();
+               $dbr = $this->repo->getReplicaDB();
                $conds = [ 'oi_name' => $this->getName() ];
                if ( is_null( $this->requestedTime ) ) {
                        $conds['oi_archive_name'] = $this->archive_name;
index cadb502..71ccaa3 100644 (file)
@@ -604,10 +604,14 @@ class HTMLForm extends ContextSource {
         */
        public function trySubmit() {
                $valid = true;
-               $hoistedErrors = [];
-               $hoistedErrors[] = isset( $this->mValidationErrorMessage )
-                       ? $this->mValidationErrorMessage
-                       : [ 'htmlform-invalid-input' ];
+               $hoistedErrors = Status::newGood();
+               if ( $this->mValidationErrorMessage ) {
+                       foreach ( (array)$this->mValidationErrorMessage as $error ) {
+                               call_user_func_array( [ $hoistedErrors, 'fatal' ], $error );
+                       }
+               } else {
+                       $hoistedErrors->fatal( 'htmlform-invalid-input' );
+               }
 
                $this->mWasSubmitted = true;
 
@@ -634,15 +638,16 @@ class HTMLForm extends ContextSource {
                        if ( $res !== true ) {
                                $valid = false;
                                if ( $res !== false && !$field->canDisplayErrors() ) {
-                                       $hoistedErrors[] = [ 'rawmessage', $res ];
+                                       if ( is_string( $res ) ) {
+                                               $hoistedErrors->fatal( 'rawmessage', $res );
+                                       } else {
+                                               $hoistedErrors->fatal( $res );
+                                       }
                                }
                        }
                }
 
                if ( !$valid ) {
-                       if ( count( $hoistedErrors ) === 1 ) {
-                               $hoistedErrors = $hoistedErrors[0];
-                       }
                        return $hoistedErrors;
                }
 
index 8390a0b..71aa275 100644 (file)
@@ -296,7 +296,7 @@ abstract class HTMLFormField {
         * @param string|array $value The value the field was submitted with
         * @param array $alldata The data collected from the form
         *
-        * @return bool|string True on success, or String error to display, or
+        * @return bool|string|Message True on success, or String/Message error to display, or
         *   false to fail validation without displaying an error.
         */
        public function validate( $value, $alldata ) {
@@ -308,7 +308,7 @@ abstract class HTMLFormField {
                        && $this->mParams['required'] !== false
                        && $value === ''
                ) {
-                       return $this->msg( 'htmlform-required' )->parse();
+                       return $this->msg( 'htmlform-required' );
                }
 
                if ( isset( $this->mValidationCallback ) ) {
index 0f86ee8..63e77ce 100644 (file)
  *   options-messages - As for HTMLSelectField
  *   options - As for HTMLSelectField
  *   options-message - As for HTMLSelectField
- *   autocomplete - Associative array mapping display text to values.
- *   autocomplete-messages - Like autocomplete, but keys are message names.
+ *   autocomplete-data - Associative array mapping display text to values.
+ *   autocomplete-data-messages - Like autocomplete, but keys are message names.
  *   require-match - Boolean, if true the value must be in the options or the
  *     autocomplete.
  *   other-message - Message to use instead of htmlform-selectorother-other for
  *      the 'other' message.
  *   other - Raw text to use for the 'other' message
+ *
+ * The old name of autocomplete-data[-messages] was autocomplete[-messages] which is still
+ * recognized but deprecated since MediaWiki 1.29 since it conflicts with how autocomplete is
+ * used in HTMLTextField.
  */
 class HTMLAutoCompleteSelectField extends HTMLTextField {
-       protected $autocomplete = [];
+       protected $autocompleteData = [];
 
        public function __construct( $params ) {
                $params += [
                        'require-match' => false,
                ];
 
+               // FIXME B/C, remove in 1.30
+               if (
+                       array_key_exists( 'autocomplete', $params )
+                       && !array_key_exists( 'autocomplete-data', $params )
+               ) {
+                       $params['autocomplete-data'] = $params['autocomplete'];
+                       unset( $params['autocomplete'] );
+               }
+               if (
+                       array_key_exists( 'autocomplete-messages', $params )
+                       && !array_key_exists( 'autocomplete-data-messages', $params )
+               ) {
+                       $params['autocomplete-data-messages'] = $params['autocomplete-messages'];
+                       unset( $params['autocomplete-messages'] );
+               }
+
                parent::__construct( $params );
 
-               if ( array_key_exists( 'autocomplete-messages', $this->mParams ) ) {
-                       foreach ( $this->mParams['autocomplete-messages'] as $key => $value ) {
+               if ( array_key_exists( 'autocomplete-data-messages', $this->mParams ) ) {
+                       foreach ( $this->mParams['autocomplete-data-messages'] as $key => $value ) {
                                $key = $this->msg( $key )->plain();
-                               $this->autocomplete[$key] = strval( $value );
+                               $this->autocompleteData[$key] = strval( $value );
                        }
-               } elseif ( array_key_exists( 'autocomplete', $this->mParams ) ) {
-                       foreach ( $this->mParams['autocomplete'] as $key => $value ) {
-                               $this->autocomplete[$key] = strval( $value );
+               } elseif ( array_key_exists( 'autocomplete-data', $this->mParams ) ) {
+                       foreach ( $this->mParams['autocomplete-data'] as $key => $value ) {
+                               $this->autocompleteData[$key] = strval( $value );
                        }
                }
-               if ( !is_array( $this->autocomplete ) || !$this->autocomplete ) {
+               if ( !is_array( $this->autocompleteData ) || !$this->autocompleteData ) {
                        throw new MWException( 'HTMLAutoCompleteSelectField called without any autocompletions' );
                }
 
@@ -69,8 +89,8 @@ class HTMLAutoCompleteSelectField extends HTMLTextField {
 
                        if ( $val === 'other' ) {
                                $val = $request->getText( $this->mName );
-                               if ( isset( $this->autocomplete[$val] ) ) {
-                                       $val = $this->autocomplete[$val];
+                               if ( isset( $this->autocompleteData[$val] ) ) {
+                                       $val = $this->autocompleteData[$val];
                                }
                        }
 
@@ -87,14 +107,14 @@ class HTMLAutoCompleteSelectField extends HTMLTextField {
                        return $p;
                }
 
-               $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
+               $validOptions = HTMLFormField::flattenOptions( $this->getOptions() ?: [] );
 
                if ( in_array( strval( $value ), $validOptions, true ) ) {
                        return true;
-               } elseif ( in_array( strval( $value ), $this->autocomplete, true ) ) {
+               } elseif ( in_array( strval( $value ), $this->autocompleteData, true ) ) {
                        return true;
                } elseif ( $this->mParams['require-match'] ) {
-                       return $this->msg( 'htmlform-select-badoption' )->parse();
+                       return $this->msg( 'htmlform-select-badoption' );
                }
 
                return true;
@@ -104,7 +124,7 @@ class HTMLAutoCompleteSelectField extends HTMLTextField {
        public function getAttributes( array $list ) {
                $attribs = [
                        'type' => 'text',
-                       'data-autocomplete' => FormatJson::encode( array_keys( $this->autocomplete ) ),
+                       'data-autocomplete' => FormatJson::encode( array_keys( $this->autocompleteData ) ),
                ] + parent::getAttributes( $list );
 
                if ( $this->getOptions() ) {
@@ -152,7 +172,7 @@ class HTMLAutoCompleteSelectField extends HTMLTextField {
                if ( $valInSelect ) {
                        $value = '';
                } else {
-                       $key = array_search( strval( $value ), $this->autocomplete, true );
+                       $key = array_search( strval( $value ), $this->autocompleteData, true );
                        if ( $key !== false ) {
                                $value = $key;
                        }
index 64fe7ed..285490b 100644 (file)
@@ -113,7 +113,7 @@ class HTMLButtonField extends HTMLFormField {
         * @param string $value
         * @param array $alldata
         *
-        * @return bool
+        * @return bool|string|Message
         */
        public function validate( $value, $alldata ) {
                return true;
index 890cd7c..46172a5 100644 (file)
@@ -65,7 +65,7 @@ class HTMLCheckMatrix extends HTMLFormField implements HTMLNestedFilterable {
                if ( count( $validValues ) == count( $value ) ) {
                        return true;
                } else {
-                       return $this->msg( 'htmlform-select-badoption' )->parse();
+                       return $this->msg( 'htmlform-select-badoption' );
                }
        }
 
index 88dcd24..b43080c 100644 (file)
@@ -36,6 +36,11 @@ class HTMLDateTimeField extends HTMLTextField {
                        throw new InvalidArgumentException( "Invalid type '$this->mType'" );
                }
 
+               if ( $this->mPlaceholder === '' ) {
+                       // Messages: htmlform-date-placeholder htmlform-time-placeholder htmlform-datetime-placeholder
+                       $this->mPlaceholder = $this->msg( "htmlform-{$this->mType}-placeholder" )->text();
+               }
+
                $this->mClass .= ' mw-htmlform-datetime-field';
        }
 
@@ -43,11 +48,6 @@ class HTMLDateTimeField extends HTMLTextField {
                $parentList = array_diff( $list, [ 'min', 'max' ] );
                $ret = parent::getAttributes( $parentList );
 
-               if ( in_array( 'placeholder', $list ) && !isset( $ret['placeholder'] ) ) {
-                       // Messages: htmlform-date-placeholder htmlform-time-placeholder htmlform-datetime-placeholder
-                       $ret['placeholder'] = $this->msg( "htmlform-{$this->mType}-placeholder" )->text();
-               }
-
                if ( in_array( 'min', $list ) && isset( $this->mParams['min'] ) ) {
                        $min = $this->parseDate( $this->mParams['min'] );
                        if ( $min ) {
@@ -100,15 +100,14 @@ class HTMLDateTimeField extends HTMLTextField {
                $date = $this->parseDate( $value );
                if ( !$date ) {
                        // Messages: htmlform-date-invalid htmlform-time-invalid htmlform-datetime-invalid
-                       return $this->msg( "htmlform-{$this->mType}-invalid" )->parseAsBlock();
+                       return $this->msg( "htmlform-{$this->mType}-invalid" );
                }
 
                if ( isset( $this->mParams['min'] ) ) {
                        $min = $this->parseDate( $this->mParams['min'] );
                        if ( $min && $date < $min ) {
                                // Messages: htmlform-date-toolow htmlform-time-toolow htmlform-datetime-toolow
-                               return $this->msg( "htmlform-{$this->mType}-toolow", $this->formatDate( $min ) )
-                                       ->parseAsBlock();
+                               return $this->msg( "htmlform-{$this->mType}-toolow", $this->formatDate( $min ) );
                        }
                }
 
@@ -116,8 +115,7 @@ class HTMLDateTimeField extends HTMLTextField {
                        $max = $this->parseDate( $this->mParams['max'] );
                        if ( $max && $date > $max ) {
                                // Messages: htmlform-date-toohigh htmlform-time-toohigh htmlform-datetime-toohigh
-                               return $this->msg( "htmlform-{$this->mType}-toohigh", $this->formatDate( $max ) )
-                                       ->parseAsBlock();
+                               return $this->msg( "htmlform-{$this->mType}-toohigh", $this->formatDate( $max ) );
                        }
                }
 
index d1250c0..d2d54e2 100644 (file)
@@ -20,7 +20,7 @@ class HTMLFloatField extends HTMLTextField {
                # https://www.w3.org/TR/html5/infrastructure.html#floating-point-numbers
                # with the addition that a leading '+' sign is ok.
                if ( !preg_match( '/^((\+|\-)?\d+(\.\d+)?(E(\+|\-)?\d+)?)?$/i', $value ) ) {
-                       return $this->msg( 'htmlform-float-invalid' )->parseAsBlock();
+                       return $this->msg( 'htmlform-float-invalid' );
                }
 
                # The "int" part of these message names is rather confusing.
@@ -29,7 +29,7 @@ class HTMLFloatField extends HTMLTextField {
                        $min = $this->mParams['min'];
 
                        if ( $min > $value ) {
-                               return $this->msg( 'htmlform-int-toolow', $min )->parseAsBlock();
+                               return $this->msg( 'htmlform-int-toolow', $min );
                        }
                }
 
@@ -37,7 +37,7 @@ class HTMLFloatField extends HTMLTextField {
                        $max = $this->mParams['max'];
 
                        if ( $max < $value ) {
-                               return $this->msg( 'htmlform-int-toohigh', $max )->parseAsBlock();
+                               return $this->msg( 'htmlform-int-toohigh', $max );
                        }
                }
 
index 5d8f491..a871584 100644 (file)
@@ -224,7 +224,7 @@ class HTMLFormFieldCloner extends HTMLFormField {
                        && $this->mParams['required'] !== false
                        && !$values
                ) {
-                       return $this->msg( 'htmlform-cloner-required' )->parseAsBlock();
+                       return $this->msg( 'htmlform-cloner-required' );
                }
 
                if ( isset( $values['nonjs'] ) ) {
@@ -240,6 +240,9 @@ class HTMLFormFieldCloner extends HTMLFormField {
                                if ( !array_key_exists( $fieldname, $value ) ) {
                                        continue;
                                }
+                               if ( $field->isHidden( $alldata ) ) {
+                                       continue;
+                               }
                                $ok = $field->validate( $value[$fieldname], $alldata );
                                if ( $ok !== true ) {
                                        return false;
index c87a778..02af7de 100644 (file)
@@ -18,7 +18,7 @@ class HTMLIntField extends HTMLFloatField {
                # input does not require its value to be numeric).  If you want a tidier
                # value to, eg, save in the DB, clean it up with intval().
                if ( !preg_match( '/^((\+|\-)?\d+)?$/', trim( $value ) ) ) {
-                       return $this->msg( 'htmlform-int-invalid' )->parseAsBlock();
+                       return $this->msg( 'htmlform-int-invalid' );
                }
 
                return true;
index 58de763..05a2ba6 100644 (file)
@@ -46,7 +46,7 @@ class HTMLMultiSelectField extends HTMLFormField implements HTMLNestedFilterable
                if ( count( $validValues ) == count( $value ) ) {
                        return true;
                } else {
-                       return $this->msg( 'htmlform-select-badoption' )->parse();
+                       return $this->msg( 'htmlform-select-badoption' );
                }
        }
 
index 69dc617..06ec372 100644 (file)
@@ -27,7 +27,7 @@ class HTMLRadioField extends HTMLFormField {
                }
 
                if ( !is_string( $value ) && !is_int( $value ) ) {
-                       return $this->msg( 'htmlform-required' )->parse();
+                       return $this->msg( 'htmlform-required' );
                }
 
                $validOptions = HTMLFormField::flattenOptions( $this->getOptions() );
@@ -35,7 +35,7 @@ class HTMLRadioField extends HTMLFormField {
                if ( in_array( strval( $value ), $validOptions, true ) ) {
                        return true;
                } else {
-                       return $this->msg( 'htmlform-select-badoption' )->parse();
+                       return $this->msg( 'htmlform-select-badoption' );
                }
        }
 
index 5a18025..dbf2c8f 100644 (file)
@@ -61,7 +61,7 @@ class HTMLRestrictionsField extends HTMLTextAreaField {
         * @param string|MWRestrictions $value The value the field was submitted with
         * @param array $alldata The data collected from the form
         *
-        * @return bool|string True on success, or String error to display, or
+        * @return bool|string|Message True on success, or String/Message error to display, or
         *   false to fail validation without displaying an error.
         */
        public function validate( $value, $alldata ) {
@@ -73,7 +73,7 @@ class HTMLRestrictionsField extends HTMLTextAreaField {
                        isset( $this->mParams['required'] ) && $this->mParams['required'] !== false
                        && $value instanceof MWRestrictions && !$value->toArray()['IPAddresses']
                ) {
-                       return $this->msg( 'htmlform-required' )->parse();
+                       return $this->msg( 'htmlform-required' );
                }
 
                if ( is_string( $value ) ) {
@@ -87,7 +87,7 @@ class HTMLRestrictionsField extends HTMLTextAreaField {
                        if ( $status->isOK() ) {
                                $status->fatal( 'unknown-error' );
                        }
-                       return $status->getMessage()->parse();
+                       return $status->getMessage();
                }
 
                if ( isset( $this->mValidationCallback ) ) {
index 86e8e75..9af60e5 100644 (file)
@@ -125,7 +125,7 @@ class HTMLSelectAndOtherField extends HTMLSelectField {
                        && $this->mParams['required'] !== false
                        && $value[1] === ''
                ) {
-                       return $this->msg( 'htmlform-required' )->parse();
+                       return $this->msg( 'htmlform-required' );
                }
 
                return true;
index c1f8e42..18c741b 100644 (file)
@@ -16,7 +16,7 @@ class HTMLSelectField extends HTMLFormField {
                if ( in_array( strval( $value ), $validOptions, true ) ) {
                        return true;
                } else {
-                       return $this->msg( 'htmlform-select-badoption' )->parse();
+                       return $this->msg( 'htmlform-select-badoption' );
                }
        }
 
index 88f5ec5..c3da746 100644 (file)
@@ -1,8 +1,19 @@
 <?php
 
+/**
+ * <input> field.
+ *
+ * Besides the parameters recognized by HTMLFormField, the following are
+ * recognized:
+ *   autocomplete - HTML autocomplete value (a boolean for on/off or a string according to
+ *     https://html.spec.whatwg.org/multipage/forms.html#autofill )
+ */
 class HTMLTextField extends HTMLFormField {
        protected $mPlaceholder = '';
 
+       /** @var bool HTML autocomplete attribute */
+       protected $autocomplete;
+
        /**
         * @param array $params
         *   - type: HTML textfield type
@@ -13,6 +24,10 @@ class HTMLTextField extends HTMLFormField {
         *     for password fields)
         */
        public function __construct( $params ) {
+               if ( isset( $params['autocomplete'] ) && is_bool( $params['autocomplete'] ) ) {
+                       $params['autocomplete'] = $params['autocomplete'] ? 'on' : 'off';
+               }
+
                parent::__construct( $params );
 
                if ( isset( $params['placeholder-message'] ) ) {
@@ -80,7 +95,8 @@ class HTMLTextField extends HTMLFormField {
                        'required',
                        'autofocus',
                        'multiple',
-                       'readonly'
+                       'readonly',
+                       'autocomplete',
                ];
 
                $attribs += $this->getAttributes( $allowedParams );
@@ -146,12 +162,24 @@ class HTMLTextField extends HTMLFormField {
                        'required',
                        'tabindex',
                        'type',
+                       'autocomplete',
                ];
 
                $attribs += OOUI\Element::configFromHtmlAttributes(
                        $this->getAttributes( $allowedParams )
                );
 
+               // FIXME T150983 downgrade autocomplete
+               if ( isset( $attribs['autocomplete'] ) ) {
+                       if ( $attribs['autocomplete'] === 'on' ) {
+                               $attribs['autocomplete'] = true;
+                       } elseif ( $attribs['autocomplete'] === 'off' ) {
+                               $attribs['autocomplete'] = false;
+                       } else {
+                               unset( $attribs['autocomplete'] );
+                       }
+               }
+
                $type = $this->getType( $attribs );
 
                return $this->getInputWidget( [
index a15b90e..3eb3f5d 100644 (file)
@@ -51,22 +51,22 @@ class HTMLTitleTextField extends HTMLTextField {
                        if ( $params ) {
                                $msg->params( $params );
                        }
-                       return $msg->parse();
+                       return $msg;
                }
 
                $text = $title->getPrefixedText();
                if ( $this->mParams['namespace'] !== false &&
                        !$title->inNamespace( $this->mParams['namespace'] )
                ) {
-                       return $this->msg( 'htmlform-title-badnamespace', $this->mParams['namespace'], $text )->parse();
+                       return $this->msg( 'htmlform-title-badnamespace', $this->mParams['namespace'], $text );
                }
 
                if ( $this->mParams['creatable'] && !$title->canExist() ) {
-                       return $this->msg( 'htmlform-title-not-creatable', $text )->escaped();
+                       return $this->msg( 'htmlform-title-not-creatable', $text );
                }
 
                if ( $this->mParams['exists'] && !$title->exists() ) {
-                       return $this->msg( 'htmlform-title-not-exists', $text )->parse();
+                       return $this->msg( 'htmlform-title-not-exists', $text );
                }
 
                return parent::validate( $value, $alldata );
index 14b5e59..12c09c1 100644 (file)
@@ -28,12 +28,12 @@ class HTMLUserTextField extends HTMLTextField {
                $user = User::newFromName( $value, false );
 
                if ( !$user ) {
-                       return $this->msg( 'htmlform-user-not-valid', $value )->parse();
+                       return $this->msg( 'htmlform-user-not-valid', $value );
                } elseif (
                        ( $this->mParams['exists'] && $user->getId() === 0 ) &&
                        !( $this->mParams['ipallowed'] && User::isIP( $value ) )
                ) {
-                       return $this->msg( 'htmlform-user-not-exists', $user->getName() )->parse();
+                       return $this->msg( 'htmlform-user-not-exists', $user->getName() );
                }
 
                return parent::validate( $value, $alldata );
index d1a9bc5..328cdad 100644 (file)
@@ -23,6 +23,7 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * XML file reader for the page data importer.
@@ -59,7 +60,7 @@ class WikiImporter {
                $this->reader = new XMLReader();
                if ( !$config ) {
                        wfDeprecated( __METHOD__ . ' without a Config instance', '1.25' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                }
                $this->config = $config;
 
index b32f4b1..6fb8927 100644 (file)
@@ -9,7 +9,8 @@
                        "Kuwaity26",
                        "محمد أحمد عبد الفتاح",
                        "Maroen1990",
-                       "Super ninja2"
+                       "Super ninja2",
+                       "Zpizza"
                ]
        },
        "config-desc": "مثبت لميدياويكي",
@@ -48,8 +49,8 @@
        "config-page-existingwiki": "ويكي موجودة",
        "config-help-restart": "هل تريد إزالة البيانات المحفوظة التي قد قمت بإدخالها وإعادة تشغيل عملية التثبيت؟",
        "config-restart": "نعم، إعادة التشغيل",
-       "config-welcome": "سوف يتم الآن التحقق من أن البيئة مناسبة لتنصيب ميديا ويكي.\nتذكر تضمين هذه المعلومات اذا اردت طلب المساعدة عن كيفية إكمال التنصيب.",
-       "config-copyright": "$1\nهذا البرنامج هو برنامج حر؛ يمكنك إعادة توزيعه و/أو تعديله تحت شروط رخصة جنو العامة على أن هذا البرنامج قد نُشر من قِبل مؤسسة البرمجيات الحرة؛ إما النسخة 2 من الرخصة، أو أي نسخة أخرى بعدها (من إختيارك)\n\nتم توزيع هذا البرنامج على أمل ان يكون مفيدًا ولكن <strong> دون أية ضمانات</strong>؛ دون حتى أية ضمانات مفهومة ضمنيًا أو رواجات أو أية أسباب محددة.\nأنظر رخصة جنو العامة لمزيد من المعلومات.\n\nمن المفترض أنك إستملت <doclink href=Copying> نسخة عن رخصة جنو العامة </doclink> مع هذا البرنامج؛ اذا لم تقعل إكتب رسالة إلى مؤسسة البرمجيات الحرة المحدودة، شارع 51 فرانكلين الطابق الخامس، بوسطن  MA 02110-1301 الولايات المتخدة أو [http://www.gnu.org/copyleft/gpl.html read it online].",
+       "config-welcome": "=== التحقق من البيئة ===\nسوف يتم الآن التحقق من أن البيئة مناسبة لتنصيب ميديا ويكي.\nتذكر تضمين هذه المعلومات اذا اردت طلب المساعدة عن كيفية إكمال التنصيب.",
+       "config-copyright": "=== حقوق النسخ والشروط ===\n\n$1\n\nهذا البرنامج هو برنامج حر؛ يمكنك إعادة توزيعه و/أو تعديله تحت شروط رخصة جنو العامة على أن هذا البرنامج قد نُشر من قِبل مؤسسة البرمجيات الحرة؛ إما النسخة 2 من الرخصة، أو أي نسخة أخرى بعدها (من إختيارك)\n\nتم توزيع هذا البرنامج على أمل ان يكون مفيدًا ولكن <strong> دون أية ضمانات</strong>؛ دون حتى أية ضمانات مفهومة ضمنيًا أو رواجات أو أية أسباب محددة.\nأنظر رخصة جنو العامة لمزيد من المعلومات.\n\nمن المفترض أنك إستملت <doclink href=Copying> نسخة عن رخصة جنو العامة </doclink> مع هذا البرنامج؛ اذا لم تقعل إكتب رسالة إلى مؤسسة البرمجيات الحرة المحدودة، شارع 51 فرانكلين الطابق الخامس، بوسطن  MA 02110-1301 الولايات المتخدة أو [http://www.gnu.org/copyleft/gpl.html read it online].",
        "config-env-good": "جرى التحقق من البيئة. يمكنك تنصيب ميدياويكي.",
        "config-env-bad": "جرى التحقق من البيئة. لا يمكنك تنصيب ميدياويكي.",
        "config-env-php": "بي إتش بي $1 مثبت.",
index cd9574c..c591f1e 100644 (file)
@@ -62,6 +62,7 @@
        "config-memory-bad": "<strong>Alvertencia:</strong>: el parámetru <code>memory_limit</code> de PHP ye $1.\nProbablemente sía demasiáu baxu.\n¡La instalación puede fallar!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] ta instaláu",
        "config-apc": "[http://www.php.net/apc APC] ta instaláu",
+       "config-apcu": "[http://www.php.net/apcu APCu] ta instaláu",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] ta instaláu",
        "config-no-cache-apcu": "<strong>Warning:</strong> Non pudo atopase[http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nEl caxé d'oxetos nun ta activáu.",
        "config-mod-security": "<strong>Alvertencia:</strong> El to servidor web tien activáu [http://modsecurity.org/mod_security]/mod_security2 .Munches de les sos configuraciones comunes pueden causar problemes a MediaWiki o otru software que dexe a los usuarios publicar conteníu arbitrario. De ser posible, tendríes de desactivalo. Si non, consulta la  [http://modsecurity.org/documentation/ mod_security documentation] o contacta col alministrador del to servidor si atopes erros aleatorios.",
        "config-db-username": "Nome d'usuariu de base de datos:",
        "config-db-password": "Contraseña de base de datos:",
        "config-db-install-username": "Introduz un nome d'usuariu que s'usará pa coneutase cola base de datos nel procesu d'instalación. Esti nun ye'l nome d'usuariu de la cuenta MediaWiki, ye'l nome d'usuariu de la to base de datos.",
+       "config-db-install-password": "Escribe la contraseña que se va utilizar pa conectase a la base de datos mientres el procesu d'instalación.\nEsta nun ye la contraseña de la cuenta de MediaWiki, sinón la contraseña de la base de datos.",
+       "config-db-install-help": "Escribe'l nome d'usuariu y la contraseña que se van utilizar pa conectase a la base de datos mientres el procesu d'instalación.",
+       "config-db-account-lock": "Usar el mesmu nome d'usuariu y contraseña demientres la operación normal",
+       "config-db-wiki-account": "Cuenta d'usuariu pa operar normalmente",
+       "config-db-wiki-help": "Escribe'l nome d'usuariu y la contraseña que se van utilizar p'aportar a la base de datos mientres la operación normal de la wiki.\nSi esta cuenta nun esiste y la cuenta d'instalación tien permisos bastante, va crease esta cuenta d'usuariu colos mínimos permisos necesarios pa operar normalmente la wiki.",
+       "config-db-prefix": "Prefixu de tables de la base de datos:",
+       "config-db-prefix-help": "Si precises compartir una base de datos ente múltiples wikis, o ente MediaWiki y otra aplicación web, puedes optar por amestar un prefixu a tolos nomes de tabla pa evitar conflictos.\nNun utilices espacios.\n\nDe normal déxase esti campu vacío.",
        "config-type-mysql": "MySQL (o compatible)",
        "config-type-mssql": "Microsoft SQL Server",
        "config-invalid-db-type": "Triba non válida de base de datos.",
        "config-help": "Ayuda",
        "config-nofile": "Nun pudo atopase'l ficheru \"$1\". ¿Desaniciose?",
        "mainpagetext": "<strong>Instalóse MediaWiki.</strong>",
-       "mainpagedocfooter": "Consulta la [https://meta.wikimedia.org/wiki/Help:Contents Guía del usuariu] pa saber cómo usar el software wiki.\n\n== Primeros pasos ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de les opciones de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ EMF de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de llanzamientos de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Depriende como combatir la puxarra na to wiki]"
+       "mainpagedocfooter": "Consulta [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents] pa saber cómo usar el software wiki.\n\n== Primeros pasos ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Llista de les opciones de configuración]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ EMF de MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Llista de corréu de llanzamientos de MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Llocaliza MediaWiki na to llingua]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Depriende como combatir la puxarra na to wiki]"
 }
index b11734f..c17de3f 100644 (file)
        "config-nofile": "Файл «$1» ня знойдзены. Ці быў ён выдалены?",
        "config-extension-link": "Ці ведаеце вы, што вашая вікі падтрымлівае [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions пашырэньні]?\n\nВы можаце праглядзець [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category пашырэньні паводле катэгорыяў] або [https://www.mediawiki.org/wiki/Extension_Matrix матрыцу пашырэньняў], каб пабачыць поўны сьпіс.",
        "mainpagetext": "<strong>MediaWiki была ўсталяваная.</strong>",
-       "mainpagedocfooter": "Глядзіце [https://meta.wikimedia.org/wiki/Help:Contents дапаможнік карыстальніка] для атрыманьня інфармацыі па карыстаньні вікі-праграмамі.\n\n== З чаго пачаць ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Сьпіс парамэтраў канфігурацыі]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Даведайцеся, як змагацца з спамам у вашай вікі]"
+       "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 Частыя пытаньні MediaWiki]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Рассылка паведамленьняў пра зьяўленьне новых вэрсіяў MediaWiki]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Пераклад MediaWiki на вашую мову]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Даведайцеся, як змагацца з спамам у вашай вікі]"
 }
index 92c00b1..8e1442a 100644 (file)
@@ -1,7 +1,8 @@
 {
        "@metadata": {
                "authors": [
-                       "Чаховіч Уладзіслаў"
+                       "Чаховіч Уладзіслаў",
+                       "Mechanizatar"
                ]
        },
        "config-desc": "Інсталятар MediaWiki",
@@ -15,6 +16,6 @@
        "config-page-name": "Назва",
        "config-page-options": "Настройкі",
        "config-upload-settings": "Загрузка выяў і файлаў",
-       "mainpagetext": "'''MediaWiki паспяхова ўсталяваная.'''",
+       "mainpagetext": "<strong>MediaWiki паспяхова ўсталяваная.</strong>",
        "mainpagedocfooter": "Гл. [https://meta.wikimedia.org/wiki/Help:Contents Дапаможнік карыстальніка (англ.)] па далейшыя звесткі аб карыстанні вікі-праграмамі.\n\n== З чаго пачаць ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Пералік параметраў канфігурацыі (англ.)]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ ЧАПЫ MediaWiki (англ.)]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Ліставанне аб выпусках MediaWiki (англ.)]"
 }
index 43a39e0..82a2373 100644 (file)
@@ -87,7 +87,7 @@
        "config-apc": "[http://www.php.net/apc APC] est installé",
        "config-apcu": "[http://www.php.net/apcu APCu] est installé",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] est installé",
-       "config-no-cache-apcu": "'''Attention :''' Impossible de trouver [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nLa mise en cache d'objets n'est pas activée.",
+       "config-no-cache-apcu": "<strong>Attention :</strong> Impossible de trouver [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] ou [http://www.iis.net/download/WinCacheForPhp WinCache].\nLa mise en cache d'objets n'est pas activée.",
        "config-mod-security": "'''Attention''': Votre serveur web a [http://modsecurity.org/ mod_security] activé. S'il est mal configuré, cela peut poser des problèmes à MediaWiki ou à d'autres applications qui permettent aux utilisateurs de publier un contenu quelconque.\nReportez-vous à [http://modsecurity.org/documentation/ la documentation de mod_security] ou contactez le support de votre hébergeur si vous rencontrez des erreurs aléatoires.",
        "config-diff3-bad": "GNU diff3 introuvable.",
        "config-git": "Logiciel de contrôle de version Git trouvé : <code>$1</code>.",
        "config-mysql-engine": "Moteur de stockage :",
        "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
-       "config-mysql-myisam-dep": "''' Avertissement ''': vous avez sélectionné MyISAM comme moteur de stockage pour MySQL, ce qui n’est pas recommandé pour une utilisation avec MediaWiki, parce que :\n * il prend à peine en charge la simultanéité en raison de verrouillage de table\n * il est plus sujet à la corruption que les autres moteurs\n * le code de base MediaWiki ne gère pas toujours MyISAM comme il se doit\n\nSi votre installation MySQL prenden charge InnoDB, il est fortement recommandé que vous le choisissiez plutôt. \nSi votre installation MySQL ne prend pas en charge les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
-       "config-mysql-only-myisam-dep": "'''Attention :''' MyISAM est le seul moteur de stockage disponible pour MySQL sur cette machine, et cela n’est pas recommandé pour une utilisation avec MédiaWiki, car :\n* il prend très peu en charge les accès concurrents à cause du verrouillage des tables\n* il est plus sujet à corruption que les autres moteurs\n* le code de base de MédiaWiki ne gère pas toujours MyISAM comme il faudrait\n\nVotre installation MySQL ne prend pas en charge InnoDB ; il est peut-être temps de la mettre à jour.",
-       "config-mysql-engine-help": "'''InnoDB''' est presque toujours la meilleure option, car il prend bien en charge les accès concurrents.\n\n'''MyISAM''' peut être plus rapide dans les installations monoposte ou en lecture seule.\nLes bases de données MyISAM ont tendance à se corrompre plus souvent que les bases d’InnoDB.",
+       "config-mysql-myisam-dep": "<strong> Avertissement </strong>: vous avez sélectionné MyISAM comme moteur de stockage pour MySQL, ce qui n’est pas recommandé pour une utilisation avec MediaWiki, parce que :\n * il prend à peine en charge la simultanéité en raison de verrouillage de table\n * il est plus sujet à la corruption que les autres moteurs\n * le code de base MediaWiki ne gère pas toujours MyISAM comme il se doit\n\nSi votre installation MySQL prenden charge InnoDB, il est fortement recommandé que vous le choisissiez plutôt. \nSi votre installation MySQL ne prend pas en charge les tables InnoDB, il est peut-être temps de faire une mise à niveau.",
+       "config-mysql-only-myisam-dep": "<strong>Attention :</strong> MyISAM est le seul moteur de stockage disponible pour MySQL sur cette machine, et cela n’est pas recommandé pour une utilisation avec MédiaWiki, car :\n* il prend très peu en charge les accès concurrents à cause du verrouillage des tables\n* il est plus sujet à corruption que les autres moteurs\n* le code de base de MédiaWiki ne gère pas toujours MyISAM comme il faudrait\n\nVotre installation MySQL ne prend pas en charge InnoDB ; il est peut-être temps de la mettre à jour.",
+       "config-mysql-engine-help": "<strong>InnoDB</strong> est presque toujours la meilleure option, car il prend bien en charge les accès concurrents.\n\n<strong>MyISAM</strong> peut être plus rapide dans les installations monoposte ou en lecture seule.\nLes bases de données MyISAM ont tendance à se corrompre plus souvent que les bases d’InnoDB.",
        "config-mysql-charset": "Jeu de caractères de la base de données :",
        "config-mysql-binary": "Binaire",
        "config-mysql-utf8": "UTF-8",
-       "config-mysql-charset-help": "En ''mode binaire'', MediaWiki stocke le texte au format UTF-8 dans la base de données dans des champs binaires.\nC'est plus efficace que le ''UTF-8 mode'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\n\nEn ''mode UTF-8'', MySQL reconnaîtra le jeu de caractères dans lequel sont vos données et pourra les présenter et les convertir de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
+       "config-mysql-charset-help": "En <strong>mode binaire</strong>, MediaWiki stocke le texte au format UTF-8 dans la base de données dans des champs binaires.\nC'est plus efficace que le ''UTF-8 mode'' de MySQL, et vous permet d'utiliser toute la gamme des caractères Unicode.\n\nEn <strong>mode UTF-8</strong>, MySQL reconnaîtra le jeu de caractères dans lequel sont vos données et pourra les présenter et les convertir de manière appropriée, mais il ne vous laissera pas stocker les caractères au-dessus du [https://en.wikipedia.org/wiki/Mapping_of_Unicode_character_planes plan multilingue de base] (en anglais).",
        "config-mssql-auth": "Type d’authentification :",
        "config-mssql-install-auth": "Sélectionner le type d’authentification qui sera utilisé pour se connecter à la base de données pendant le processus d’installation.\nSi vous sélectionnez « {{int:config-mssql-windowsauth}} », les informations d’identification de l’utilisateur faisant tourner le serveur seront utilisées.",
        "config-mssql-web-auth": "Sélectionner le type d’authentification que le serveur web utilisera pour se connecter au serveur de base de données lors des opérations habituelles du wiki.\nSi vous sélectionnez « {{int:config-mssql-windowsauth}} », les informations d’identification de l’utilisateur sous lequel tourne le serveur web seront utilisées.",
index 4c68cf9..1d52273 100644 (file)
@@ -61,6 +61,7 @@
        "config-memory-bad": "'''Aviso:''' Le <code>memory_limit</code> de PHP es $1.\nIsto es probabilemente troppo basse.\nLe installation pote faller!",
        "config-xcache": "[http://xcache.lighttpd.net/ XCache] es installate",
        "config-apc": "[http://www.php.net/apc APC] es installate",
+       "config-apcu": "[http://www.php.net/apcu APCu] es installate",
        "config-wincache": "[http://www.iis.net/download/WinCacheForPhp WinCache] es installate",
        "config-no-cache-apcu": "<strong>Attention:</strong> Impossibile trovar [http://www.php.net/apcu APCu], [http://xcache.lighttpd.net/ XCache] o [http://www.iis.net/download/WinCacheForPhp WinCache].\nLe cache de objectos non es activate.",
        "config-mod-security": "'''Attention''': [http://modsecurity.org/ mod_security] es active in tu servitor web. Si mal configurate, isto pote causar problemas pro MediaWiki o altere software que permitte al usatores de publicar contento arbitrari.\nConsulta le [http://modsecurity.org/documentation/ documentation de mod_security] o contacta le servicio de adjuta de tu host si tu incontra estranie errores.",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki supporta le sequente systemas de base de datos:\n\n$1\n\nSi tu non vide hic infra le systema de base de datos que tu tenta usar, alora seque le instructiones ligate hic supra pro activar le supporto.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] es le systema primari pro MediaWiki e le melio supportate. MediaWiki functiona anque con [{{int:version-db-mariadb-url}} MariaDB] e con [{{int:version-db-percona-url}} Percona Server], le quales es compatibile con MySQL. ([http://www.php.net/manual/en/mysqli.installation.php Como compilar PHP con supporto de MySQL])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] es un systema de base de datos popular e open source, alternativa a MySQL. Es possibile que resta alcun minor defectos non resolvite, dunque illo non es recommendate pro uso in un ambiente de production. ([http://www.php.net/manual/en/pgsql.installation.php Como compilar PHP con supporto de PostgreSQL])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] es un systema de base de datos popular e open source, alternativa a MySQL. ([http://www.php.net/manual/en/pgsql.installation.php Como compilar PHP con supporto de PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] es un systema de base de datos legier que es multo ben supportate. ([http://www.php.net/manual/en/pdo.installation.php Como compilar PHP con supporto de SQLite], usa PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] es un banca de datos commercial pro interprisas. ([http://www.php.net/manual/en/oci8.installation.php Como compilar PHP con supporto de OCI8])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] es un base de datos de interprisa commercial pro Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Como compilar PHP con supporto de SQLSRV])",
        "config-cache-options": "Configuration del cache de objectos:",
        "config-cache-help": "Le cache de objectos es usate pro meliorar le rapiditate de MediaWiki per immagazinar le datos frequentemente usate.\nLe sitos medie o grande es multo incoragiate de activar isto, ma anque le sitos parve percipera le beneficios.",
        "config-cache-none": "Nulle cache (nulle functionalitate es removite, ma le rapiditate pote diminuer in grande sitos wiki)",
-       "config-cache-accel": "Cache de objectos de PHP (APC, XCache o WinCache)",
+       "config-cache-accel": "Cache de objectos PHP (APC, APCu, XCache o WinCache)",
        "config-cache-memcached": "Usar Memcached (require additional installation e configuration)",
        "config-memcached-servers": "Servitores Memcached:",
        "config-memcached-help": "Lista de adresses IP a usar pro Memcached.\nDebe specificar un per linea e specificar le porto a usar. Per exemplo:\n 127.0.0.1:11211\n 192.168.1.25:1234",
index e9e22a9..2a09893 100644 (file)
@@ -19,7 +19,8 @@
                        "2nd-player",
                        "Otokoume",
                        "Rxy",
-                       "Foresttttttt"
+                       "Foresttttttt",
+                       "ネイ"
                ]
        },
        "config-desc": "MediaWiki のインストーラー",
        "config-subscribe": "[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce リリース告知のメーリングリスト]を購読する。",
        "config-subscribe-help": "これは、リリースの告知 (重要なセキュリティに関する案内を含む) に使用される、流量が少ないメーリングリストです。\nこのメーリングリストを購読して、新しいバージョンが出た場合にMediaWikiを更新してください。",
        "config-subscribe-noemail": "メールアドレスなしでリリースアナウンスのメーリングリストを購読しようとしています。\nメーリングリストを購読する場合にはメールアドレスを入力してください。",
-       "config-pingback": "ã\81\93ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83¬ã\83¼ã\82·ã\83§ã\83³ã\81«é\96¢ã\81\99ã\82\8bã\83\87ã\83¼ã\82¿ã\82\92ã\83¡ã\83\87ã\82¤ã\82¢ã\82¦ã\82£ã\82­ã\81®é\96\8bç\99ºè\80\85ã\81«ã\82·ã\82§ã\82¢ã\81\97ã\81¦ã\81\8fã\81 ã\81\95ã\81\84。",
+       "config-pingback": "ã\81\93ã\81®ã\82¤ã\83³ã\82¹ã\83\88ã\83¼ã\83«ã\81«é\96¢ã\81\99ã\82\8bã\83\87ã\83¼ã\82¿ã\82\92MediaWikiã\81®é\96\8bç\99ºè\80\85ã\81¨å\85±æ\9c\89ã\81\99ã\82\8b。",
        "config-pingback-help": "もし君がこのオプションを選択したら、メデイアウィキは定期的にhttps://www.mediawiki.orgとメデイアウィキのインスタンスに関する基本的のデータをピンします。このデータはシステムのタイプ、PHPのバージョンと選択されたデータベースのバックエンドなどを含んでいます。メデイアウィキファンデーションは将来の",
        "config-almost-done": "これでほぼ終わりました!\n残りの設定を飛ばして、ウィキを今すぐインストールできます。",
        "config-optional-continue": "私にもっと質問してください。",
        "config-nofile": "ファイル「$1」が見つかりませんでした。削除された可能性があります。",
        "config-extension-link": "あなたのウィキは[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions 拡張機能]をサポートしていることをご存知ですか?\n\n[https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category カテゴリ別で拡張機能を見る]か[https://www.mediawiki.org/wiki/Extension_Matrix 拡張機能のマトリックス]で拡張機能すべてのリストをご覧になれます。",
        "mainpagetext": "<strong>MediaWiki はインストール済みです。</strong>",
-       "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[https://meta.wikimedia.org/wiki/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Learn how to combat spam on your wiki]"
+       "mainpagedocfooter": "ウィキソフトウェアの使い方に関する情報は[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents 利用者案内]を参照してください。\n\n== はじめましょう ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings/ja 設定の一覧]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ/ja MediaWiki よくある質問と回答]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki リリース情報メーリングリスト]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation/ja MediaWiki のあなたの言語へのローカライズ]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam あなたのウィキでスパムと戦う方法を学ぶ]"
 }
index 3f20c07..b68b9d8 100644 (file)
        "config-db-install-account": "Hesabê bikarhêner bo avakirinê",
        "config-db-username": "Navê bikarhêner bo danagehê:",
        "config-db-password": "Şîfreya danegehê:",
+       "config-type-mssql": "Microsoft SQL Server",
        "config-invalid-db-type": "Cureya danegehê ya nederbasdar",
+       "config-sqlite-readonly": "Dosyeya <code>$1</code> ne nivîsbar e.",
        "config-db-web-account": "Hesabê danegehê bô têgihiştina tora înternetê",
+       "config-mysql-innodb": "InnoDB",
        "config-mysql-myisam": "MyISAM",
        "config-mysql-utf8": "UTF-8",
        "config-site-name": "Navê wîkiyê:",
index 8e7d8c1..07e4c90 100644 (file)
        "config-help-tooltip": "spustelėkite išplėtimui",
        "config-nofile": "Failas \"$1\" nerastas. Ar jis buvo ištrintas?",
        "mainpagetext": "<strong>MediaWiki sėkmingai įdiegta.</strong>",
-       "mainpagedocfooter": "Informacijos apie wiki programinės įrangos naudojimą, ieškokite [https://meta.wikimedia.org/wiki/Help:Contents žinyne].\n\n== Pradžiai ==\n\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigūracijos nustatymų sąrašas]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MediaWiki DUK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki pranešimai paštu apie naujas versijas]"
+       "mainpagedocfooter": "Informacijos apie viki programinės įrangos naudojimą, ieškokite [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents].\n\n== Pradžia ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Konfigūracijos nustatymų sąrašas]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ MedijaViki DUK]\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MedijaViki pranešimai el. paštu apie naujas versijas]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Lokalizuoti MedijaViki savo kalbai]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Sužinokite kaip kovoti su šlamštu savo viki]"
 }
index a6b1508..1fcb1cb 100644 (file)
        "config-type-mssql": "Microsoft SQLServer",
        "config-support-info": "MediaWiki støtter følgende databasesystem:\n\n$1\n\nHvis du ikke ser databasesystemet du prøver å bruke i listen nedenfor, følg instruksjonene det er lenket til over for å aktivere støtte.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] er den prefererte databasen for MediaWiki og er derfor best støttet.  MediaWiki fungerer også med [{{int:version-db-mariadb-url}} MariaDB] og [{{int:version-db-percona-url}} Percona Server], som begge er MySQL-kompatible. ([http://www.php.net/manual/en/mysqli.installation.php Hvordan kompilere med PHP med MySQL-støtte])",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] er et populært åpen kildekode-databasesystem og et alternativ til MySQL. Det kan ha noen små utestående feil og det anbefales derfor ikke for bruk i et produksjonsmiljø. ([http://www.php.net/manual/en/pgsql.installation.php Hvordan kompilere PHP med PostgreSQL-støtte])",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] er et populært åpen kildekode-databasesystem og et alternativ til MySQL.  ([http://www.php.net/manual/en/pgsql.installation.php Hvordan kompilere PHP med PostgreSQL-støtte])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] er et lettvekts-databasesystem som har veldig god støtte. ([http://www.php.net/manual/en/pdo.installation.php Hvordan kompilere PHP med SQLite-støtte], bruker PDO)",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] er en kommersiell database for bedrifter. ([http://www.php.net/manual/en/oci8.installation.php Hvordan kompilere PHP med OCI8-støtte])",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQLServer] er en kommersiell enterprise-database for Windows. ([http://www.php.net/manual/en/sqlsrv.installation.php Hvordan kompilere PHP med SQLSRV-støtte])",
        "config-nofile": "Filen \"$1\" ble ikke funnet. Kan den være blitt slettet?",
        "config-extension-link": "Visste du at wikien din kan brukes sammen med en mengde [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions utvidelser]?\n\nDu kan sjekke gjennom [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category utvidelser per kategori] eller [https://www.mediawiki.org/wiki/Extension_Matrix utvidelsesmatrisen] for å se den komplette listen av utvidelser.",
        "mainpagetext": "<strong>MediaWiki har blitt installert.</strong>",
-       "mainpagedocfooter": "Sjekk [https://meta.wikimedia.org/wiki/Help:Contents brukerveiledningen] for å få informasjon om hvordan du bruker wiki-programvaren.\n\n==Hvordan komme igang==\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Innstillingsliste]\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ofte stilte spørsmål om MediaWiki]\n*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Tilpass MediaWiki for ditt språk]\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Lær deg å beskytte deg mot spam på wikien din]"
+       "mainpagedocfooter": "Sjekk [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents brukerveiledningen] for å få informasjon om hvordan du bruker wiki-programvaren.\n\n==Hvordan komme igang==\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Innstillingsliste]\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Ofte stilte spørsmål om MediaWiki]\n*[https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce MediaWiki e-postliste]\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Tilpass MediaWiki for ditt språk]\n*[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Lær deg å beskytte deg mot spam på wikien din]"
 }
index 0a77232..87a176c 100644 (file)
@@ -16,7 +16,8 @@
                        "Sjoerddebruin",
                        "Esketti",
                        "JaapDeKleine",
-                       "Macofe"
+                       "Macofe",
+                       "Hex"
                ]
        },
        "config-desc": "Het installatieprogramma voor MediaWiki",
        "config-type-mssql": "Microsoft SQL Server",
        "config-support-info": "MediaWiki ondersteunt de volgende databasesystemen:\n\n$1\n\nAls u het databasesysteem dat u wilt gebruiken niet in de lijst terugvindt, volg dan de handleiding waarnaar hierboven wordt verwezen om ondersteuning toe te voegen.",
        "config-dbsupport-mysql": "* [{{int:version-db-mysql-url}} MySQL] is de primaire database voor MediaWiki en wordt het best ondersteund. MediaWiki werkt ook met [{{int:version-db-mariadb-url}} MariaDB] en [{{int:version-db-percona-url}} Percona Server], die MySQL compatibel zijn ([http://www.php.net/manual/en/mysqli.installation.php hoe PHP te compileren met MySQL-ondersteuning]).",
-       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] is een populair open source databasesysteem als alternatief voor MySQL. Het is mogelijk dat er een aantal bekende kleinere problemen zijn met MediaWiki in combinatie met deze database en daarom wordt PostgreSQL niet aanbevolen voor een productieomgeving ([http://www.php.net/manual/en/pgsql.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor PostgreSQL]).",
+       "config-dbsupport-postgres": "* [{{int:version-db-postgres-url}} PostgreSQL] is een populair open source databasesysteem als alternatief voor MySQL.([http://www.php.net/manual/en/pgsql.installation.php Hoe u PHP kunt compileren met ondersteuning voor PostgreSQL])",
        "config-dbsupport-sqlite": "* [{{int:version-db-sqlite-url}} SQLite] is een zeer goed ondersteund lichtgewicht databasesysteem ([http://www.php.net/manual/en/pdo.installation.php hoe PHP gecompileerd moet zijn met ondersteuning voor SQLite]; gebruikt PDO).",
        "config-dbsupport-oracle": "* [{{int:version-db-oracle-url}} Oracle] is een commerciële database voor grote bedrijven ([http://www.php.net/manual/en/oci8.installation.php PHP compileren met ondersteuning voor OCI8]).",
        "config-dbsupport-mssql": "* [{{int:version-db-mssql-url}} Microsoft SQL Server] is een commerciële enterprisedatabase voor Windows ([http://www.php.net/manual/en/sqlsrv.installation.php PHP compileren met ondersteuning voor SQLSRV]).",
        "config-cache-options": "Instellingen voor het cachen van objecten:",
        "config-cache-help": "Het cachen van objecten wordt gebruikt om de snelheid van MediaWiki te verbeteren door vaak gebruikte gegevens te bewaren.\nMiddelgrote tot grote websites wordt geadviseerd dit in te schakelen en ook kleine sites merken de voordelen.",
        "config-cache-none": "Niets cachen.\nEr gaat geen functionaliteit verloren, maar dit kan invloed hebben op de prestaties.",
-       "config-cache-accel": "Cachen van objecten via PHP (APC, XCache of WinCache)",
+       "config-cache-accel": "Cachen van objecten via PHP (APC, APCu, XCache of WinCache)",
        "config-cache-memcached": "Memcached gebruiken (dit vereist aanvullende instellingen)",
        "config-memcached-servers": "Memcachedservers:",
        "config-memcached-help": "Lijst met IP-adressen te gebruiken voor Memcached.\nEén IP-adres per regel met een poortnummer.\nBijvoorbeeld:\n 127.0.0.1:11211\n 192.168.1.25:1234",
index 0fca08d..f9a1fef 100644 (file)
@@ -16,7 +16,8 @@
                        "Cainamarques",
                        "Vitorvicentevalente",
                        "Macofe",
-                       "Diniscoelho"
+                       "Diniscoelho",
+                       "Ruila"
                ]
        },
        "config-desc": "O instalador do MediaWiki",
        "config-db-host-oracle-help": "Introduza um [http://download.oracle.com/docs/cd/B28359_01/network.111/b28317/tnsnames.htm Nome Local de Ligação] válido; tem de estar visível para esta instalação um ficheiro tnsnames.ora.<br />Se está a usar bibliotecas cliente versão 10g ou posterior, também pode usar o método [http://download.oracle.com/docs/cd/E11882_01/network.112/e10836/naming.htm Ligação Fácil] de atribuição do nome.",
        "config-db-wiki-settings": "Identifique esta wiki",
        "config-db-name": "Nome da base de dados:",
-       "config-db-name-help": "Escolha um nome para identificar a sua wiki.\nO nome não deve conter espaços.\n\nSe estiver a usar um servidor partilhado, o fornecedor do alojamento deve poder fornecer-lhe o nome de uma base de dados que possa usar, ou permite-lhe criar bases de dados através de um painel de controle.",
+       "config-db-name-help": "Escolha um nome para identificar a sua wiki.\nO nome não deve conter espaços.\n\nSe estiver a usar um servidor partilhado, o fornecedor do alojamento deve poder fornecer-lhe o nome de uma base de dados que possa usar, ou permite-lhe criar bases de dados através de um painel de controlo.",
        "config-db-name-oracle": "Esquema ''(schema)'' da base de dados:",
        "config-db-account-oracle-warn": "Há três cenários suportados na instalação do servidor de base de dados Oracle:\n\nSe pretende criar a conta de acesso pela internet na base de dados durante o processo de instalação, forneça como conta para a instalação uma conta com o papel de SYSDBA na base de dados e especifique as credenciais desejadas para a conta de acesso pela internet. Se não pretende criar a conta de acesso pela internet durante a instalação, pode criá-la manualmente e fornecer só essa conta para a instalação (se ela tiver as permissões necessárias para criar os objetos do esquema ''(schema)''). A terceira alternativa é fornecer duas contas diferentes; uma com privilégios de criação e outra com privilégios limitados para o acesso pela internet.\n\nExiste um script para criação de uma conta com os privilégios necessários no diretório \"maintenance/oracle/\" desta instalação. Mantenha em mente que usar uma conta com privilégios limitados impossibilita todas as operações de manutenção com a conta padrão.",
        "config-db-install-account": "Conta do utilizador para a instalação",
        "config-admin-error-user": "Ocorreu um erro interno ao criar um administrador com o nome \"<nowiki>$1</nowiki>\".",
        "config-admin-error-password": "Ocorreu um erro interno ao definir uma palavra-passe para o administrador \"<nowiki>$1</nowiki>\": <pre>$2</pre>",
        "config-admin-error-bademail": "Introduziu um correio electrónico inválido",
-       "config-subscribe": "Subscreva a [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista de divulgação de anúncios de lançamento].",
+       "config-subscribe": "Subscrever a [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce lista de divulgação de anúncios de lançamento].",
        "config-subscribe-help": "Esta é uma lista de divulgação de baixo volume para anúncios de lançamento de versões novas, incluindo anúncios de segurança importantes.\nDeve subscrevê-la e atualizar a sua instalação MediaWiki quando são lançadas versões novas.",
        "config-subscribe-noemail": "Tentou subscrever a lista de divulgação dos anúncios de novas versões, sem fornecer um endereço de correio electrónico.\nPara subscrever esta lista de divulgação tem de fornecer um endereço de correio electrónico.",
        "config-pingback": "Partilhar dados sobre esta instalação com os programadores do MediaWiki.",
        "config-pingback-help": "Se selecionar esta opção, o MediaWiki fará periodicamente um <i>ping</i> a https://www.mediawiki.org com dados básicos acerca desta instância do MediaWiki. Estes dados incluem, por exemplo, o tipo de sistema, a versão do PHP e a base de dados que escolheu. A Wikimedia Foundation partilha estes dados com os programadores do MediaWiki, para ajudar a guiar o esforço de desenvolvimento futuro. Para o seu sistema, serão enviados os seguintes dados:\n<pre>$1</pre>",
-       "config-almost-done": "Está quase a terminar!\nAgora pode saltar as configurações restantes e instalar já a wiki.",
+       "config-almost-done": "Está quase a terminar!\nAgora pode ignorar as restantes configurações e instalar já a wiki.",
        "config-optional-continue": "Faz-me mais perguntas.",
        "config-optional-skip": "Já estou aborrecido, instala lá a wiki.",
        "config-profile": "Perfil de permissões:",
        "config-install-mainpage": "A criar a página principal com o conteúdo padrão.",
        "config-install-extension-tables": "A criar as tabelas das extensões ativadas",
        "config-install-mainpage-failed": "Não foi possível inserir a página principal: $1",
-       "config-install-done": "<strong>Parabéns!</strong>\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de fazer a descarga do ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Esta descarga deverá ter sido iniciada automaticamente.\n\nSe a descarga não foi iniciada, ou se o cancelou, pode recomeçá-la ao clicar na ligação abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode <strong>[$2 entrar na wiki]</strong>.",
-       "config-install-done-path": "<strong>Parabéns!</strong>\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de fazer a descarga do ficheiro e colocá-lo no diretório <code>$4</code>. Esta descarga deverá ter sido iniciada automaticamente.\n\nSe a descarga não foi iniciada, ou se o cancelou, pode recomeçá-la ao clicar na ligação abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer isto agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode <strong>[$2 entrar na wiki]</strong>.",
-       "config-download-localsettings": "Descarga do <code>LocalSettings.php</code>",
+       "config-install-done": "<strong>Parabéns!</strong>\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de descarregar o ficheiro e colocá-lo no diretório de raiz da sua instalação (o mesmo diretório onde está o ficheiro index.php). Este descarregamento deverá ter sido iniciado automaticamente.\n\nSe o descarregamento não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando na ligação abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não o descarregar agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode <strong>[$2 entrar na wiki]</strong>.",
+       "config-install-done-path": "<strong>Parabéns!</strong>\nTerminou a instalação do MediaWiki.\n\nO instalador gerou um ficheiro <code>LocalSettings.php</code>.\nEste ficheiro contém todas as configurações.\n\nPrecisa de descarregar o ficheiro e colocá-lo no diretório <code>$4</code>. Este descarregamento deverá ter sido iniciado automaticamente.\n\nSe o descarregamento não foi iniciado, ou se o cancelou, pode recomeçá-lo clicando na ligação abaixo:\n\n$3\n\n<strong>Nota</strong>: Se não fizer o descarregamento agora, o ficheiro que foi gerado deixará de estar disponível quando sair do processo de instalação.\n\nDepois de terminar o passo anterior, pode <strong>[$2 entrar na wiki]</strong>.",
+       "config-download-localsettings": "Descarregar <code>LocalSettings.php</code>",
        "config-help": "ajuda",
        "config-help-tooltip": "clique para expandir",
        "config-nofile": "Não foi possível encontrar o ficheiro \"$1\". Terá sido apagado?",
index 21a3297..5c4b1c3 100644 (file)
@@ -6,9 +6,14 @@
                        "Mehtab ahmed"
                ]
        },
+       "config-desc": "ميڊياوڪيءَ لاءِ تنصيبڪار",
+       "config-title": "ميڊياوڪي $1 تنصيب",
        "config-information": "معلومات",
+       "config-localsettings-key": "ڪنجي اپگريڊ ڪريو:",
        "config-localsettings-badkey": "توهان جي سنواري ڏنل ڪنجي غيردرست آهي.",
+       "config-session-error": "سيشن ھلائڻ ۾ خرابي:$1",
        "config-your-language": "توهان جي ٻولي:",
+       "config-your-language-help": "تنصيب جي عمل دوران استعمال ڪرڻ لاءِ ڪا ٻولي چونڊيو.",
        "config-wiki-language": "وڪِي ٻولي:",
        "config-back": "پوئتي ←",
        "config-continue": "اڳتي →",
@@ -24,7 +29,9 @@
        "config-page-restart": "تنصيبڪاري وري کان شروع ڪريو",
        "config-page-readme": "مون کي پڙهو",
        "config-page-copying": "پرت ڪندي",
+       "config-page-upgradedoc": "اپگريڊڪندي",
        "config-page-existingwiki": "موجوده وڪِي",
+       "config-help-restart": "ڇا توھان سڄي سانڍيل ڊيٽا ختم ڪرڻ چاھيو ٿا جيڪا توھان داخل ڪئي آھي ۽ تنصيبڪاريءَ جي عمل کي ٻيھر شروع ڪرڻ چاھيو ٿا؟",
        "config-restart": "ها، وري کان شروع ڪريو",
        "config-env-php": "PHP $1 تنصيب ٿي چڪو",
        "config-env-hhvm": "HHVM $1 تنصيب ٿي چڪو."
index bfd5ce6..5500097 100644 (file)
@@ -2,7 +2,8 @@
        "@metadata": {
                "authors": [
                        "Andrewboltachev",
-                       "AlnashPiyash2"
+                       "AlnashPiyash2",
+                       "Zpizza"
                ]
        },
        "config-title": "MediaWiki $1 пуктон",
@@ -18,5 +19,5 @@
        "config-page-copying": "Лицензия",
        "config-page-upgradedoc": "Выльдытон",
        "config-diff3-bad": "GNU diff3 шедьтэмын ӧвӧл.",
-       "mainpagetext": "'''MediaWiki движок азинлыко пуктэмын.'''"
+       "mainpagetext": "<strong>MediaWiki движок азинлыко пуктэмын.</strong>"
 }
index 556b182..7644f41 100644 (file)
        "config-nofile": "Файл \"$1\" не знайдено. Його видалено?",
        "config-extension-link": "Чи знаєте ви, що ваше вікі підтримує [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Extensions розширення]?\n\nВи можете переглядати [https://www.mediawiki.org/wiki/Special:MyLanguage/Category:Extensions_by_category розширення по категорії] або в [https://www.mediawiki.org/wiki/Extension_Matrix матрицю розширень] щоб побачити повний список розширень.",
        "mainpagetext": "<strong>Програмне забезпечення «MediaWiki» встановлено.</strong>",
-       "mainpagedocfooter": "Ð\86нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8e Ð¿Ñ\80о Ñ\80обоÑ\82Ñ\83 Ð· Ñ\86Ñ\96Ñ\94Ñ\8e Ð²Ñ\96кÑ\96 Ð¼Ð¾Ð¶Ð½Ð° Ð·Ð½Ð°Ð¹Ñ\82и Ð² [https://meta.wikimedia.org/wiki/Help:Contents Ð¿Ð¾Ñ\81Ñ\96бникÑ\83 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а].\n\n== Деякі корисні ресурси ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список налаштувань];\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Часті питання з приводу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розсилка повідомлень про появу нових версій MediaWiki];\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локалізувати MediaWiki своєю мовою]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Дізнатися, як боротися зі спамом у своїй вікі]"
+       "mainpagedocfooter": "Ð\86нÑ\84оÑ\80маÑ\86Ñ\96Ñ\8e Ð¿Ñ\80о Ñ\80обоÑ\82Ñ\83 Ð· Ñ\86Ñ\96Ñ\94Ñ\8e Ð²Ñ\96кÑ\96 Ð¼Ð¾Ð¶Ð½Ð° Ð·Ð½Ð°Ð¹Ñ\82и Ð½Ð° Ñ\81Ñ\82оÑ\80Ñ\96нÑ\86Ñ\96 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Contents Ð\94овÑ\96дка:Ð\92мÑ\96Ñ\81Ñ\82].\n\n== Деякі корисні ресурси ==\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Configuration_settings Список налаштувань];\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:FAQ Часті питання з приводу MediaWiki];\n* [https://lists.wikimedia.org/mailman/listinfo/mediawiki-announce Розсилка повідомлень про появу нових версій MediaWiki];\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation#Translation_resources Локалізувати MediaWiki своєю мовою]\n* [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Combating_spam Дізнатися, як боротися зі спамом у своїй вікі]"
 }
index 6d18c81..10088f2 100644 (file)
@@ -182,7 +182,7 @@ class CryptRand {
                $this->logger->debug( "Clock drift calculation " .
                        "(time-taken=" . ( $timeTaken * 1000 ) . "ms, " .
                        "iterations=$iterations, " .
-                       "time-per-iteration=" . ( $timeTaken / $iterations * 1e6 ) . "us)\n" );
+                       "time-per-iteration=" . ( $timeTaken / $iterations * 1e6 ) . "us)" );
 
                return $data;
        }
@@ -235,8 +235,6 @@ class CryptRand {
         */
        public function generate( $bytes, $forceStrong = false ) {
 
-               $this->logger->debug( "Generating cryptographic random bytes for\n" );
-
                $bytes = floor( $bytes );
                static $buffer = '';
                if ( is_null( $this->strong ) ) {
@@ -255,11 +253,11 @@ class CryptRand {
                                $rem = $bytes - strlen( $buffer );
                                $iv = mcrypt_create_iv( $rem, MCRYPT_DEV_URANDOM );
                                if ( $iv === false ) {
-                                       $this->logger->debug( "mcrypt_create_iv returned false.\n" );
+                                       $this->logger->debug( "mcrypt_create_iv returned false." );
                                } else {
                                        $buffer .= $iv;
                                        $this->logger->debug( "mcrypt_create_iv generated " . strlen( $iv ) .
-                                               " bytes of randomness.\n" );
+                                               " bytes of randomness." );
                                }
                        }
                }
@@ -269,12 +267,12 @@ class CryptRand {
                                $rem = $bytes - strlen( $buffer );
                                $openssl_bytes = openssl_random_pseudo_bytes( $rem, $openssl_strong );
                                if ( $openssl_bytes === false ) {
-                                       $this->logger->debug( "openssl_random_pseudo_bytes returned false.\n" );
+                                       $this->logger->debug( "openssl_random_pseudo_bytes returned false." );
                                } else {
                                        $buffer .= $openssl_bytes;
                                        $this->logger->debug( "openssl_random_pseudo_bytes generated " .
                                                strlen( $openssl_bytes ) . " bytes of " .
-                                               ( $openssl_strong ? "strong" : "weak" ) . " randomness.\n" );
+                                               ( $openssl_strong ? "strong" : "weak" ) . " randomness." );
                                }
                                if ( strlen( $buffer ) >= $bytes ) {
                                        // openssl tells us if the random source was strong, if some of our data was generated
@@ -291,7 +289,7 @@ class CryptRand {
                        $rem = $bytes - strlen( $buffer );
                        if ( !function_exists( 'stream_set_read_buffer' ) && $forceStrong ) {
                                $this->logger->debug( "Was forced to read from /dev/urandom " .
-                                       "without control over the buffer size.\n" );
+                                       "without control over the buffer size." );
                        }
                        // /dev/urandom is generally considered the best possible commonly
                        // available random source, and is available on most *nix systems.
@@ -317,14 +315,14 @@ class CryptRand {
                                $buffer .= $random_bytes;
                                fclose( $urandom );
                                $this->logger->debug( "/dev/urandom generated " . strlen( $random_bytes ) .
-                                       " bytes of randomness.\n" );
+                                       " bytes of randomness." );
 
                                if ( strlen( $buffer ) >= $bytes ) {
                                        // urandom is always strong, set to true if all our data was generated using it
                                        $this->strong = true;
                                }
                        } else {
-                               $this->logger->debug( "/dev/urandom could not be opened.\n" );
+                               $this->logger->debug( "/dev/urandom could not be opened." );
                        }
                }
 
@@ -336,7 +334,7 @@ class CryptRand {
                // out and being used to predict the /randomness/ that follows.
                if ( strlen( $buffer ) < $bytes ) {
                        $this->logger->debug( __METHOD__ .
-                               ": Falling back to using a pseudo random state to generate randomness.\n" );
+                               ": Falling back to using a pseudo random state to generate randomness." );
                }
                while ( strlen( $buffer ) < $bytes ) {
                        $buffer .= MWCryptHash::hmac( $this->randomState(), strval( mt_rand() ) );
@@ -352,7 +350,7 @@ class CryptRand {
                $buffer = substr( $buffer, $bytes );
 
                $this->logger->debug( strlen( $buffer ) .
-                       " bytes of randomness leftover in the buffer.\n" );
+                       " bytes of randomness leftover in the buffer." );
 
                return $generated;
        }
index 6996ce5..d84c959 100644 (file)
  */
 class WinCacheBagOStuff extends BagOStuff {
        protected function doGet( $key, $flags = 0 ) {
-               $casToken = null;
-
-               return $this->getWithToken( $key, $casToken, $flags );
-       }
-
-       protected function getWithToken( $key, &$casToken, $flags = 0 ) {
                $val = wincache_ucache_get( $key );
-
-               $casToken = $val;
-
                if ( is_string( $val ) ) {
                        $val = unserialize( $val );
                }
@@ -54,10 +45,6 @@ class WinCacheBagOStuff extends BagOStuff {
                return ( is_array( $result ) && $result === [] ) || $result;
        }
 
-       protected function cas( $casToken, $key, $value, $exptime = 0 ) {
-               return wincache_ucache_cas( $key, $casToken, serialize( $value ) );
-       }
-
        public function delete( $key ) {
                wincache_ucache_delete( $key );
 
index 41aa5e0..cd02177 100644 (file)
@@ -42,9 +42,20 @@ class DatabasePostgres extends Database {
        private $connectString;
        /** @var string */
        private $mCoreSchema;
+       /** @var string[] Map of (reserved table name => alternate table name) */
+       private $keywordTableMap = [];
 
+       /**
+        * @see Database::__construct()
+        * @param array $params Additional parameters include:
+        *   - keywordTableMap : Map of reserved table names to alternative table names to use
+        */
        public function __construct( array $params ) {
                $this->port = isset( $params['port'] ) ? $params['port'] : false;
+               $this->keywordTableMap = isset( $params['keywordTableMap'] )
+                       ? $params['keywordTableMap']
+                       : [];
+
                parent::__construct( $params );
        }
 
@@ -736,16 +747,9 @@ __INDEXATTR__;
        /**
         * @param string $name
         * @return string Value of $name or remapped name if $name is a reserved keyword
-        * @TODO: dependency inject these...
         */
        public function remappedTableName( $name ) {
-               if ( $name === 'user' ) {
-                       return 'mwuser';
-               } elseif ( $name === 'text' ) {
-                       return 'pagecontent';
-               }
-
-               return $name;
+               return isset( $this->keywordTableMap[$name] ) ? $this->keywordTableMap[$name] : $name;
        }
 
        /**
index c205626..dc9378f 100644 (file)
@@ -122,6 +122,7 @@ class DeleteLogFormatter extends LogFormatter {
 
                switch ( $this->entry->getSubtype() ) {
                        case 'delete': // Show undelete link
+                       case 'delete_redir':
                                if ( $user->isAllowed( 'undelete' ) ) {
                                        $message = 'undeletelink';
                                } else {
index b3a555a..46b9674 100644 (file)
@@ -476,6 +476,10 @@ class MediaTransformError extends MediaTransformOutput {
        function isError() {
                return true;
        }
+
+       function getHttpStatusCode() {
+               return 500;
+       }
 }
 
 /**
@@ -490,6 +494,10 @@ class TransformParameterError extends MediaTransformError {
                        max( isset( $params['height'] ) ? $params['height'] : 0, 120 ),
                        wfMessage( 'thumbnail_invalid_params' )->text() );
        }
+
+       function getHttpStatusCode() {
+               return 400;
+       }
 }
 
 /**
@@ -511,4 +519,8 @@ class TransformTooBigImageAreaError extends MediaTransformError {
                                )->text()
                        );
        }
+
+       function getHttpStatusCode() {
+               return 400;
+       }
 }
index 11c4d42..e33c27e 100644 (file)
@@ -511,21 +511,22 @@ abstract class TransformationalImageHandler extends ImageHandler {
         */
        protected function getMagickVersion() {
                $cache = MediaWikiServices::getInstance()->getLocalServerObjectCache();
+               $method = __METHOD__;
                return $cache->getWithSetCallback(
                        'imagemagick-version',
                        $cache::TTL_HOUR,
-                       function () {
+                       function () use ( $method ) {
                                global $wgImageMagickConvertCommand;
 
                                $cmd = wfEscapeShellArg( $wgImageMagickConvertCommand ) . ' -version';
-                               wfDebug( __METHOD__ . ": Running convert -version\n" );
+                               wfDebug( $method . ": Running convert -version\n" );
                                $retval = '';
                                $return = wfShellExec( $cmd, $retval );
                                $x = preg_match(
                                        '/Version: ImageMagick ([0-9]*\.[0-9]*\.[0-9]*)/', $return, $matches
                                );
                                if ( $x != 1 ) {
-                                       wfDebug( __METHOD__ . ": ImageMagick version check failed\n" );
+                                       wfDebug( $method . ": ImageMagick version check failed\n" );
                                        return false;
                                }
 
index c478550..74566cb 100644 (file)
@@ -205,7 +205,7 @@ class WikiFilePage extends WikiPage {
 
                /** @var LocalRepo $repo */
                $repo = $file->getRepo();
-               $dbr = $repo->getSlaveDB();
+               $dbr = $repo->getReplicaDB();
 
                $res = $dbr->select(
                        [ 'page', 'categorylinks' ],
index a5ac78f..f016494 100644 (file)
@@ -938,8 +938,8 @@ class WikiPage implements Page, IDBAccessObject {
                $dbw->startAtomic( __METHOD__ );
 
                if ( !$oldLatest || $oldLatest == $this->lockAndGetLatest() ) {
-                       $dbw->replace( 'redirect',
-                               [ 'rd_from' ],
+                       $dbw->upsert(
+                               'redirect',
                                [
                                        'rd_from' => $this->getId(),
                                        'rd_namespace' => $rt->getNamespace(),
@@ -947,6 +947,13 @@ class WikiPage implements Page, IDBAccessObject {
                                        'rd_fragment' => $rt->getFragment(),
                                        'rd_interwiki' => $rt->getInterwiki(),
                                ],
+                               [ 'rd_from' ],
+                               [
+                                       'rd_namespace' => $rt->getNamespace(),
+                                       'rd_title' => $rt->getDBkey(),
+                                       'rd_fragment' => $rt->getFragment(),
+                                       'rd_interwiki' => $rt->getInterwiki(),
+                               ],
                                __METHOD__
                        );
                }
@@ -2861,7 +2868,7 @@ class WikiPage implements Page, IDBAccessObject {
         */
        public function doDeleteArticleReal(
                $reason, $suppress = false, $u1 = null, $u2 = null, &$error = '', User $user = null,
-               $tags = []
+               $tags = [], $logsubtype = 'delete'
        ) {
                global $wgUser, $wgContentHandlerUseDB;
 
@@ -2992,7 +2999,7 @@ class WikiPage implements Page, IDBAccessObject {
                // Log the deletion, if the page was suppressed, put it in the suppression log instead
                $logtype = $suppress ? 'suppress' : 'delete';
 
-               $logEntry = new ManualLogEntry( $logtype, 'delete' );
+               $logEntry = new ManualLogEntry( $logtype, $logsubtype );
                $logEntry->setPerformer( $user );
                $logEntry->setTarget( $logTitle );
                $logEntry->setComment( $reason );
index 01cce02..4c82dda 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup Parser
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Various core parser functions, registered in Parser::firstCallInit()
@@ -346,10 +347,11 @@ class CoreParserFunctions {
 
                // check parameter, or use the ParserOptions if in interface message
                $user = User::newFromName( $username );
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                if ( $user ) {
-                       $gender = GenderCache::singleton()->getGenderOf( $user, __METHOD__ );
+                       $gender = $genderCache->getGenderOf( $user, __METHOD__ );
                } elseif ( $username === '' && $parser->getOptions()->getInterfaceMessage() ) {
-                       $gender = GenderCache::singleton()->getGenderOf( $parser->getOptions()->getUser(), __METHOD__ );
+                       $gender = $genderCache->getGenderOf( $parser->getOptions()->getUser(), __METHOD__ );
                }
                $ret = $parser->getFunctionLang()->gender( $gender, $forms );
                return $ret;
index c7db8a1..10dfd26 100644 (file)
@@ -3599,6 +3599,9 @@ class Parser {
                                $content = $rev->getContent();
                                $text = $content ? $content->getWikitextForTransclusion() : null;
 
+                               Hooks::run( 'ParserFetchTemplate',
+                                       [ $parser, $title, $rev, &$text, &$deps ] );
+
                                if ( $text === false || $text === null ) {
                                        $text = false;
                                        break;
index 7b3d9f9..0ea3c63 100644 (file)
@@ -41,20 +41,33 @@ class EncryptedPassword extends ParameterizedPassword {
        public function crypt( $password ) {
                $secret = $this->config['secrets'][$this->params['secret']];
 
+               // Clear error string
+               while ( openssl_error_string() !== false );
+
                if ( $this->hash ) {
-                       $underlyingPassword = $this->factory->newFromCiphertext( openssl_decrypt(
-                                       base64_decode( $this->hash ), $this->params['cipher'],
-                                       $secret, 0, base64_decode( $this->args[0] )
-                               ) );
+                       $decrypted = openssl_decrypt(
+                                       $this->hash, $this->params['cipher'],
+                                       $secret, 0, base64_decode( $this->args[0] ) );
+                       if ( $decrypted === false ) {
+                               throw new PasswordError( 'Error decrypting password: ' . openssl_error_string() );
+                       }
+                       $underlyingPassword = $this->factory->newFromCiphertext( $decrypted );
                } else {
                        $underlyingPassword = $this->factory->newFromType( $this->config['underlying'] );
                }
 
                $underlyingPassword->crypt( $password );
-               $iv = MWCryptRand::generate( openssl_cipher_iv_length( $this->params['cipher'] ), true );
+               if ( count( $this->args ) ) {
+                       $iv = base64_decode( $this->args[0] );
+               } else {
+                       $iv = MWCryptRand::generate( openssl_cipher_iv_length( $this->params['cipher'] ), true );
+               }
 
                $this->hash = openssl_encrypt(
                        $underlyingPassword->toString(), $this->params['cipher'], $secret, 0, $iv );
+               if ( $this->hash === false ) {
+                       throw new PasswordError( 'Error encrypting password: ' . openssl_error_string() );
+               }
                $this->args = [ base64_encode( $iv ) ];
        }
 
@@ -65,32 +78,42 @@ class EncryptedPassword extends ParameterizedPassword {
         * @return bool True if the password was updated
         */
        public function update() {
-               if ( count( $this->args ) != 2 || $this->params == $this->getDefaultParams() ) {
+               if ( count( $this->args ) != 1 || $this->params == $this->getDefaultParams() ) {
                        // Hash does not need updating
                        return false;
                }
 
+               // Clear error string
+               while ( openssl_error_string() !== false );
+
                // Decrypt the underlying hash
                $underlyingHash = openssl_decrypt(
-                       base64_decode( $this->args[1] ),
+                       $this->hash,
                        $this->params['cipher'],
                        $this->config['secrets'][$this->params['secret']],
                        0,
                        base64_decode( $this->args[0] )
                );
+               if ( $underlyingHash === false ) {
+                       throw new PasswordError( 'Error decrypting password: ' . openssl_error_string() );
+               }
 
                // Reset the params
                $this->params = $this->getDefaultParams();
 
                // Check the key size with the new params
                $iv = MWCryptRand::generate( openssl_cipher_iv_length( $this->params['cipher'] ), true );
-               $this->hash = base64_encode( openssl_encrypt(
+               $this->hash = openssl_encrypt(
                                $underlyingHash,
                                $this->params['cipher'],
                                $this->config['secrets'][$this->params['secret']],
                                0,
                                $iv
-                       ) );
+                       );
+               if ( $this->hash === false ) {
+                       throw new PasswordError( 'Error encrypting password: ' . openssl_error_string() );
+               }
+
                $this->args = [ base64_encode( $iv ) ];
 
                return true;
index 84675c1..c48b6e6 100644 (file)
@@ -36,9 +36,11 @@ class MWOldPassword extends ParameterizedPassword {
        }
 
        public function crypt( $plaintext ) {
-               global $wgPasswordSalt;
-
-               if ( $wgPasswordSalt && count( $this->args ) === 1 ) {
+               if ( count( $this->args ) === 1 ) {
+                       // Accept (but do not generate) salted passwords with :A: prefix.
+                       // These are actually B-type passwords, but an error in a previous
+                       // version of MediaWiki caused them to be written with an :A:
+                       // prefix.
                        $this->hash = md5( $this->args[0] . '-' . md5( $plaintext ) );
                } else {
                        $this->args = [];
index d613b2e..207f884 100644 (file)
@@ -8,50 +8,52 @@ class ExtensionProcessor implements Processor {
         * @var array
         */
        protected static $globalSettings = [
-               'ResourceLoaderSources',
-               'ResourceLoaderLESSVars',
-               'DefaultUserOptions',
-               'HiddenPrefs',
-               'GroupPermissions',
-               'RevokePermissions',
-               'GrantPermissions',
-               'GrantPermissionGroups',
-               'ImplicitGroups',
-               'GroupsAddToSelf',
-               'GroupsRemoveFromSelf',
+               'ActionFilteredLogs',
+               'Actions',
                'AddGroups',
-               'RemoveGroups',
-               'AvailableRights',
-               'ContentHandlers',
-               'ConfigRegistry',
-               'SessionProviders',
+               'APIFormatModules',
+               'APIListModules',
+               'APIMetaModules',
+               'APIModules',
+               'APIPropModules',
                'AuthManagerAutoConfig',
+               'AvailableRights',
                'CentralIdLookupProviders',
                'ChangeCredentialsBlacklist',
-               'RemoveCredentialsBlacklist',
-               'RateLimits',
-               'RecentChangesFlags',
-               'MediaHandlers',
-               'ExtensionFunctions',
+               'ConfigRegistry',
+               'ContentHandlers',
+               'DefaultUserOptions',
                'ExtensionEntryPointListFiles',
-               'SpecialPages',
-               'JobClasses',
-               'LogTypes',
-               'LogRestrictions',
+               'ExtensionFunctions',
+               'FeedClasses',
+               'FileExtensions',
                'FilterLogTypes',
-               'ActionFilteredLogs',
-               'LogNames',
-               'LogHeaders',
+               'GrantPermissionGroups',
+               'GrantPermissions',
+               'GroupPermissions',
+               'GroupsAddToSelf',
+               'GroupsRemoveFromSelf',
+               'HiddenPrefs',
+               'ImplicitGroups',
+               'JobClasses',
                'LogActions',
                'LogActionsHandlers',
-               'Actions',
-               'APIModules',
-               'APIFormatModules',
-               'APIMetaModules',
-               'APIPropModules',
-               'APIListModules',
+               'LogHeaders',
+               'LogNames',
+               'LogRestrictions',
+               'LogTypes',
+               'MediaHandlers',
+               'PasswordPolicy',
+               'RateLimits',
+               'RecentChangesFlags',
+               'RemoveCredentialsBlacklist',
+               'RemoveGroups',
+               'ResourceLoaderLESSVars',
+               'ResourceLoaderSources',
+               'RevokePermissions',
+               'SessionProviders',
+               'SpecialPages',
                'ValidSkinNames',
-               'FeedClasses',
        ];
 
        /**
@@ -62,18 +64,19 @@ class ExtensionProcessor implements Processor {
         * @var array
         */
        protected static $mergeStrategies = [
-               'wgGroupPermissions' => 'array_plus_2d',
-               'wgRevokePermissions' => 'array_plus_2d',
-               'wgGrantPermissions' => 'array_plus_2d',
-               'wgHooks' => 'array_merge_recursive',
+               'wgAuthManagerAutoConfig' => 'array_plus_2d',
+               'wgCapitalLinkOverrides' => 'array_plus',
                'wgExtensionCredits' => 'array_merge_recursive',
                'wgExtraGenderNamespaces' => 'array_plus',
-               'wgNamespacesWithSubpages' => 'array_plus',
+               'wgGrantPermissions' => 'array_plus_2d',
+               'wgGroupPermissions' => 'array_plus_2d',
+               'wgHooks' => 'array_merge_recursive',
                'wgNamespaceContentModels' => 'array_plus',
                'wgNamespaceProtection' => 'array_plus',
-               'wgCapitalLinkOverrides' => 'array_plus',
+               'wgNamespacesWithSubpages' => 'array_plus',
+               'wgPasswordPolicy' => 'array_merge_recursive',
                'wgRateLimits' => 'array_plus_2d',
-               'wgAuthManagerAutoConfig' => 'array_plus_2d',
+               'wgRevokePermissions' => 'array_plus_2d',
        ];
 
        /**
index 1073de0..d624c7c 100644 (file)
@@ -22,6 +22,7 @@
  * @author Trevor Parscal
  */
 
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
@@ -239,7 +240,7 @@ class ResourceLoader implements LoggerAwareInterface {
 
                if ( !$config ) {
                        $this->logger->debug( __METHOD__ . ' was called without providing a Config instance' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                }
                $this->config = $config;
 
index 5729218..91e0b02 100644 (file)
@@ -130,26 +130,15 @@ class ResourceLoaderClientHtml {
                        'states' => [
                                // moduleName => state
                        ],
-                       'general' => [
-                               // position => [ moduleName ]
-                               'top' => [],
-                               'bottom' => [],
-                       ],
+                       'general' => [],
                        'styles' => [
                                // moduleName
                        ],
-                       'scripts' => [
-                               // position => [ moduleName ]
-                               'top' => [],
-                               'bottom' => [],
-                       ],
+                       'scripts' => [],
                        // Embedding for private modules
                        'embed' => [
                                'styles' => [],
-                               'general' => [
-                                       'top' => [],
-                                       'bottom' => [],
-                               ],
+                               'general' => [],
                        ],
 
                ];
@@ -161,16 +150,15 @@ class ResourceLoaderClientHtml {
                        }
 
                        $group = $module->getGroup();
-                       $position = $module->getPosition();
 
                        if ( $group === 'private' ) {
                                // Embed via mw.loader.implement per T36907.
-                               $data['embed']['general'][$position][] = $name;
+                               $data['embed']['general'][] = $name;
                                // Avoid duplicate request from mw.loader
                                $data['states'][$name] = 'loading';
                        } else {
                                // Load via mw.loader.load()
-                               $data['general'][$position][] = $name;
+                               $data['general'][] = $name;
                        }
                }
 
@@ -216,14 +204,13 @@ class ResourceLoaderClientHtml {
                        }
 
                        $group = $module->getGroup();
-                       $position = $module->getPosition();
                        $context = $this->getContext( $group, ResourceLoaderModule::TYPE_SCRIPTS );
                        if ( $module->isKnownEmpty( $context ) ) {
                                // Avoid needless request for empty module
                                $data['states'][$name] = 'ready';
                        } else {
                                // Load from load.php?only=scripts via <script src></script>
-                               $data['scripts'][$position][] = $name;
+                               $data['scripts'][] = $name;
 
                                // Avoid duplicate request from mw.loader
                                $data['states'][$name] = 'loading';
@@ -282,24 +269,24 @@ class ResourceLoaderClientHtml {
                }
 
                // Inline RLQ: Embedded modules
-               if ( $data['embed']['general']['top'] ) {
+               if ( $data['embed']['general'] ) {
                        $chunks[] = $this->getLoad(
-                               $data['embed']['general']['top'],
+                               $data['embed']['general'],
                                ResourceLoaderModule::TYPE_COMBINED
                        );
                }
 
                // Inline RLQ: Load general modules
-               if ( $data['general']['top'] ) {
+               if ( $data['general'] ) {
                        $chunks[] = ResourceLoader::makeInlineScript(
-                               Xml::encodeJsCall( 'mw.loader.load', [ $data['general']['top'] ] )
+                               Xml::encodeJsCall( 'mw.loader.load', [ $data['general'] ] )
                        );
                }
 
                // Inline RLQ: Load only=scripts
-               if ( $data['scripts']['top'] ) {
+               if ( $data['scripts'] ) {
                        $chunks[] = $this->getLoad(
-                               $data['scripts']['top'],
+                               $data['scripts'],
                                ResourceLoaderModule::TYPE_SCRIPTS
                        );
                }
@@ -336,33 +323,7 @@ class ResourceLoaderClientHtml {
         * @return string|WrappedStringList HTML
         */
        public function getBodyHtml() {
-               $data = $this->getData();
-               $chunks = [];
-
-               // Inline RLQ: Embedded modules
-               if ( $data['embed']['general']['bottom'] ) {
-                       $chunks[] = $this->getLoad(
-                               $data['embed']['general']['bottom'],
-                               ResourceLoaderModule::TYPE_COMBINED
-                       );
-               }
-
-               // Inline RLQ: Load only=scripts
-               if ( $data['scripts']['bottom'] ) {
-                       $chunks[] = $this->getLoad(
-                               $data['scripts']['bottom'],
-                               ResourceLoaderModule::TYPE_SCRIPTS
-                       );
-               }
-
-               // Inline RLQ: Load general modules
-               if ( $data['general']['bottom'] ) {
-                       $chunks[] = ResourceLoader::makeInlineScript(
-                               Xml::encodeJsCall( 'mw.loader.load', [ $data['general']['bottom'] ] )
-                       );
-               }
-
-               return WrappedStringList::join( "\n", $chunks );
+               return '';
        }
 
        private function getContext( $group, $type ) {
index b17200f..a1a89cb 100644 (file)
@@ -23,6 +23,7 @@
  */
 
 use MediaWiki\Logger\LoggerFactory;
+use MediaWiki\MediaWikiServices;
 
 /**
  * Object passed around to modules which contains information about the state
@@ -137,7 +138,7 @@ class ResourceLoaderContext {
         */
        public static function newDummyContext() {
                return new self( new ResourceLoader(
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' ),
+                       MediaWikiServices::getInstance()->getMainConfig(),
                        LoggerFactory::getInstance( 'resourceloader' )
                ), new FauxRequest( [] ) );
        }
index 07649e3..725bc6a 100644 (file)
@@ -117,9 +117,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
        /** @var string Name of group to load this module in */
        protected $group;
 
-       /** @var string Position on the page to load this module at */
-       protected $position = 'bottom';
-
        /** @var bool Link to raw files in debug mode */
        protected $debugRaw = true;
 
@@ -204,8 +201,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
         *         'messages' => [array of message key strings],
         *         // Group which this module should be loaded together with
         *         'group' => [group name string],
-        *         // Position on the page to load this module at
-        *         'position' => ['bottom' (default) or 'top']
         *         // Function that, if it returns true, makes the loader skip this module.
         *         // The file must contain valid JavaScript for execution in a private function.
         *         // The file must not contain the "function () {" and "}" wrapper though.
@@ -272,7 +267,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                                        $this->{$member} = $option;
                                        break;
                                // Single strings
-                               case 'position':
                                case 'group':
                                case 'skipFunction':
                                        $this->{$member} = (string)$option;
@@ -445,13 +439,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                return $this->group;
        }
 
-       /**
-        * @return string
-        */
-       public function getPosition() {
-               return $this->position;
-       }
-
        /**
         * Gets list of names of modules this module depends on.
         * @param ResourceLoaderContext|null $context
@@ -573,7 +560,6 @@ class ResourceLoaderFileModule extends ResourceLoaderModule {
                        // - dependencies (provided via startup module)
                        // - targets
                        // - group (provided via startup module)
-                       // - position (only used by OutputPage)
                        'scripts',
                        'debugScripts',
                        'styles',
index 6a8957e..ff1b7b1 100644 (file)
@@ -45,9 +45,6 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
        protected $selectorWithVariant = '.{prefix}-{name}-{variant}';
        protected $targets = [ 'desktop', 'mobile' ];
 
-       /** @var string Position on the page to load this module at */
-       protected $position = 'bottom';
-
        /**
         * Constructs a new module from an options array.
         *
@@ -183,7 +180,6 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                                        $this->{$member} = $option;
                                        break;
 
-                               case 'position':
                                case 'prefix':
                                case 'selectorWithoutVariant':
                                case 'selectorWithVariant':
@@ -448,14 +444,6 @@ class ResourceLoaderImageModule extends ResourceLoaderModule {
                return $localBasePath;
        }
 
-       /**
-        * @return string
-        */
-       public function getPosition() {
-               $this->loadFromDefinition();
-               return $this->position;
-       }
-
        /**
         * @return string
         */
index 796c575..8124f33 100644 (file)
@@ -22,6 +22,7 @@
  * @author Roan Kattouw
  */
 
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerAwareInterface;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
@@ -187,7 +188,7 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
        public function getConfig() {
                if ( $this->config === null ) {
                        // Ugh, fall back to default
-                       $this->config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $this->config = MediaWikiServices::getInstance()->getMainConfig();
                }
 
                return $this->config;
@@ -330,14 +331,13 @@ abstract class ResourceLoaderModule implements LoggerAwareInterface {
        }
 
        /**
-        * Where on the HTML page should this module's JS be loaded?
-        *  - 'top': in the "<head>"
-        *  - 'bottom': at the bottom of the "<body>"
+        * From where in the page HTML should this module be loaded?
         *
+        * @deprecated since 1.29 Obsolete. All modules load async from `<head>`.
         * @return string
         */
        public function getPosition() {
-               return 'bottom';
+               return 'top';
        }
 
        /**
index c1b47bf..b3b3f16 100644 (file)
@@ -64,13 +64,6 @@ class ResourceLoaderUserOptionsModule extends ResourceLoaderModule {
                return false;
        }
 
-       /**
-        * @return string
-        */
-       public function getPosition() {
-               return 'top';
-       }
-
        /**
         * @return string
         */
index c8a0ff1..cea1f39 100644 (file)
@@ -74,13 +74,6 @@ class ResourceLoaderUserTokensModule extends ResourceLoaderModule {
                return false;
        }
 
-       /**
-        * @return string
-        */
-       public function getPosition() {
-               return 'top';
-       }
-
        /**
         * @return string
         */
index 3deeb84..14d6e05 100644 (file)
@@ -36,7 +36,6 @@
  * Safe for calls on local wikis are:
  * - Option getters:
  *   - getGroup()
- *   - getPosition()
  *   - getPages()
  * - Basic methods that strictly involve the foreign database
  *   - getDB()
@@ -44,8 +43,6 @@
  *   - getTitleInfo()
  */
 class ResourceLoaderWikiModule extends ResourceLoaderModule {
-       /** @var string Position on the page to load this module at */
-       protected $position = 'bottom';
 
        // Origin defaults to users with sitewide authority
        protected $origin = self::ORIGIN_USER_SITEWIDE;
@@ -72,7 +69,6 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
 
                foreach ( $options as $member => $option ) {
                        switch ( $member ) {
-                               case 'position':
                                case 'styles':
                                case 'scripts':
                                case 'group':
@@ -162,11 +158,12 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                        return null;
                }
 
-               $revision = Revision::newFromTitle( $title, false, Revision::READ_NORMAL );
+               $revision = Revision::newKnownCurrent( wfGetDB( DB_REPLICA ), $title->getArticleID(),
+                       $title->getLatestRevID() );
                if ( !$revision ) {
                        return null;
                }
-
+               $revision->setTitle( $title );
                $content = $revision->getContent( Revision::RAW );
 
                if ( !$content ) {
@@ -434,13 +431,6 @@ class ResourceLoaderWikiModule extends ResourceLoaderModule {
                }
        }
 
-       /**
-        * @return string
-        */
-       public function getPosition() {
-               return $this->position;
-       }
-
        /**
         * @since 1.28
         * @return string
index b8e480f..0041450 100644 (file)
@@ -23,6 +23,7 @@
 
 namespace MediaWiki\Session;
 
+use MediaWiki\MediaWikiServices;
 use MWException;
 use Psr\Log\LoggerInterface;
 use BagOStuff;
@@ -152,7 +153,7 @@ final class SessionManager implements SessionManagerInterface {
                                );
                        }
                } else {
-                       $this->config = \ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $this->config = MediaWikiServices::getInstance()->getMainConfig();
                }
 
                if ( isset( $options['logger'] ) ) {
index e5d272c..6686ae6 100644 (file)
@@ -17,6 +17,7 @@
  *
  * @file
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Generic wrapper for template functions, with interface
@@ -36,7 +37,7 @@ abstract class QuickTemplate {
                $this->translator = new MediaWikiI18N();
                if ( $config === null ) {
                        wfDebug( __METHOD__ . ' was called with no Config instance passed to it' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                }
                $this->config = $config;
        }
index b60aa10..96812ea 100644 (file)
@@ -217,6 +217,17 @@ abstract class Skin extends ContextSource {
                        }
                }
 
+               // Footer links (used by SkinTemplate::prepareQuickTemplate)
+               foreach ( [
+                       $this->footerLinkTitle( 'privacy', 'privacypage' ),
+                       $this->footerLinkTitle( 'aboutsite', 'aboutpage' ),
+                       $this->footerLinkTitle( 'disclaimers', 'disclaimerpage' ),
+               ] as $title ) {
+                       if ( $title ) {
+                               $titles[] = $title;
+                       }
+               }
+
                Hooks::run( 'SkinPreloadExistence', [ &$titles, $this ] );
 
                if ( $titles ) {
@@ -921,25 +932,34 @@ abstract class Skin extends ContextSource {
         * @return string HTML anchor
         */
        public function footerLink( $desc, $page ) {
-               // if the link description has been set to "-" in the default language,
-               if ( $this->msg( $desc )->inContentLanguage()->isDisabled() ) {
-                       // then it is disabled, for all languages.
+               $title = $this->footerLinkTitle( $desc, $page );
+               if ( !$title ) {
                        return '';
-               } else {
-                       // Otherwise, we display the link for the user, described in their
-                       // language (which may or may not be the same as the default language),
-                       // but we make the link target be the one site-wide page.
-                       $title = Title::newFromText( $this->msg( $page )->inContentLanguage()->text() );
+               }
 
-                       if ( !$title ) {
-                               return '';
-                       }
+               return Linker::linkKnown(
+                       $title,
+                       $this->msg( $desc )->escaped()
+               );
+       }
 
-                       return Linker::linkKnown(
-                               $title,
-                               $this->msg( $desc )->escaped()
-                       );
+       /**
+        * @param string $desc
+        * @param string $page
+        * @return Title|null
+        */
+       private function footerLinkTitle( $desc, $page ) {
+               // If the link description has been set to "-" in the default language,
+               if ( $this->msg( $desc )->inContentLanguage()->isDisabled() ) {
+                       // then it is disabled, for all languages.
+                       return null;
                }
+               // Otherwise, we display the link for the user, described in their
+               // language (which may or may not be the same as the default language),
+               // but we make the link target be the one site-wide page.
+               $title = Title::newFromText( $this->msg( $page )->inContentLanguage()->text() );
+
+               return $title ?: null;
        }
 
        /**
index 9c5600d..e6763ca 100644 (file)
@@ -1309,12 +1309,14 @@ class SkinTemplate extends Skin {
                        if ( !$user->isAnon() ) {
                                $sur = new UserrightsPage;
                                $sur->setContext( $this->getContext() );
-                               if ( $sur->userCanExecute( $this->getUser() ) ) {
-                                       $nav_urls['userrights'] = [
-                                               'text' => $this->msg( 'tool-link-userrights', $this->getUser()->getName() )->text(),
-                                               'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
-                                       ];
-                               }
+                               $canChange = $sur->userCanChangeRights( $this->getUser(), false );
+                               $nav_urls['userrights'] = [
+                                       'text' => $this->msg(
+                                               $canChange ? 'tool-link-userrights' : 'tool-link-userrights-readonly',
+                                               $this->getUser()->getName()
+                                       )->text(),
+                                       'href' => self::makeSpecialUrlSubpage( 'Userrights', $rootUser )
+                               ];
                        }
                }
 
index 01782f3..cb13840 100644 (file)
@@ -145,6 +145,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                $opts->add( 'hideliu', false );
                $opts->add( 'hidepatrolled', false );
                $opts->add( 'hidemyself', false );
+               $opts->add( 'hidebyothers', false );
 
                if ( $config->get( 'RCWatchCategoryMembership' ) ) {
                        $opts->add( 'hidecategorization', false );
@@ -247,6 +248,7 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                $conds[] = 'rc_user != 0';
                        }
                }
+
                if ( $opts['hidemyself'] ) {
                        if ( $user->getId() ) {
                                $conds[] = 'rc_user != ' . $dbr->addQuotes( $user->getId() );
@@ -254,6 +256,14 @@ abstract class ChangesListSpecialPage extends SpecialPage {
                                $conds[] = 'rc_user_text != ' . $dbr->addQuotes( $user->getName() );
                        }
                }
+               if ( $opts['hidebyothers'] ) {
+                       if ( $user->getId() ) {
+                               $conds[] = 'rc_user = ' . $dbr->addQuotes( $user->getId() );
+                       } else {
+                               $conds[] = 'rc_user_text = ' . $dbr->addQuotes( $user->getName() );
+                       }
+               }
+
                if ( $this->getConfig()->get( 'RCWatchCategoryMembership' )
                        && $opts['hidecategorization'] === true
                ) {
index 1e03774..73a1bdd 100644 (file)
@@ -294,6 +294,14 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                        return;
                }
 
+               if ( $this->canBypassForm( $button_name ) ) {
+                       $this->setRequest( [], true );
+                       $this->getRequest()->setVal( $this->getTokenName(), $this->getToken() );
+                       if ( $button_name ) {
+                               $this->getRequest()->setVal( $button_name, true );
+                       }
+               }
+
                $status = $this->trySubmit();
 
                if ( !$status || !$status->isGood() ) {
@@ -366,6 +374,46 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                }
        }
 
+       /**
+        * Determine if the login form can be bypassed. This will be the case when no more than one
+        * button is present and no other user input fields that are not marked as 'skippable' are
+        * present. If the login form were not bypassed, the user would be presented with a
+        * superfluous page on which they must press the single button to proceed with login.
+        * Not only does this cause an additional mouse click and page load, it confuses users,
+        * especially since there are a help link and forgotten password link that are
+        * provided on the login page that do not apply to this situation.
+        *
+        * @param string|null &$button_name if the form has a single button, returns
+        *   the name of the button; otherwise, returns null
+        * @return bool
+        */
+       private function canBypassForm( &$button_name ) {
+               $button_name = null;
+               if ( $this->isContinued() ) {
+                       return false;
+               }
+               $fields = AuthenticationRequest::mergeFieldInfo( $this->authRequests );
+               foreach ( $fields as $fieldname => $field ) {
+                       if ( !isset( $field['type'] ) ) {
+                               return false;
+                       }
+                       if ( !empty( $field['skippable'] ) ) {
+                               continue;
+                       }
+                       if ( $field['type'] === 'button' ) {
+                               if ( $button_name !== null ) {
+                                       $button_name = null;
+                                       return false;
+                               } else {
+                                       $button_name = $fieldname;
+                               }
+                       } elseif ( $field['type'] !== 'null' ) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+
        /**
         * Show the success page.
         *
@@ -593,7 +641,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
         * @return HTMLForm
         */
        protected function getAuthForm( array $requests, $action, $msg = '', $msgType = 'error' ) {
-               global $wgSecureLogin, $wgLoginLanguageSelector;
+               global $wgSecureLogin;
                // FIXME merge this with parent
 
                if ( isset( $this->authForm ) ) {
@@ -619,7 +667,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                $form = HTMLForm::factory( 'vform', $formDescriptor, $context );
 
                $form->addHiddenField( 'authAction', $this->authAction );
-               if ( $wgLoginLanguageSelector && $this->mLanguage ) {
+               if ( $this->mLanguage ) {
                        $form->addHiddenField( 'uselang', $this->mLanguage );
                }
                $form->addHiddenField( 'force', $this->securityLevel );
@@ -654,7 +702,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
         */
        protected function getFakeTemplate( $msg, $msgType ) {
                global $wgAuth, $wgEnableEmail, $wgHiddenPrefs, $wgEmailConfirmToEdit, $wgEnableUserEmail,
-                          $wgSecureLogin, $wgLoginLanguageSelector, $wgPasswordResetRoutes;
+                          $wgSecureLogin, $wgPasswordResetRoutes;
 
                // make a best effort to get the value of fields which used to be fixed in the old login
                // template but now might or might not exist depending on what providers are used
@@ -712,7 +760,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                # Don't show a "create account" link if the user can't.
                if ( $this->showCreateAccountLink() ) {
                        # Pass any language selection on to the mode switch link
-                       if ( $wgLoginLanguageSelector && $this->mLanguage ) {
+                       if ( $this->mLanguage ) {
                                $linkq .= '&uselang=' . $this->mLanguage;
                        }
                        // Supply URL, login template creates the button.
@@ -844,7 +892,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
         * @return array
         */
        protected function getFieldDefinitions( $template ) {
-               global $wgEmailConfirmToEdit, $wgLoginLanguageSelector;
+               global $wgEmailConfirmToEdit;
 
                $isLoggedIn = $this->getUser()->isLoggedIn();
                $continuePart = $this->isContinued() ? 'continue-' : '';
@@ -1100,7 +1148,7 @@ abstract class LoginSignupSpecialPage extends AuthManagerSpecialPage {
                                $linkTitle = $this->getTitleFor( $this->isSignup() ? 'Userlogin' :'CreateAccount' );
                                $linkq = $this->getReturnToQueryStringFragment();
                                // Pass any language selection on to the mode switch link
-                               if ( $wgLoginLanguageSelector && $this->mLanguage ) {
+                               if ( $this->mLanguage ) {
                                        $linkq .= '&uselang=' . $this->mLanguage;
                                }
                                $loggedIn = $this->getUser()->isLoggedIn();
index 4356bc5..daabded 100644 (file)
@@ -188,7 +188,6 @@ class SpecialPageFactory {
 
        private static $list;
        private static $aliases;
-       private static $pageObjectCache = [];
 
        /**
         * Reset the internal list of special pages. Useful when changing $wgSpecialPages after
@@ -197,7 +196,6 @@ class SpecialPageFactory {
        public static function resetList() {
                self::$list = null;
                self::$aliases = null;
-               self::$pageObjectCache = [];
        }
 
        /**
@@ -379,10 +377,6 @@ class SpecialPageFactory {
        public static function getPage( $name ) {
                list( $realName, /*...*/ ) = self::resolveAlias( $name );
 
-               if ( isset( self::$pageObjectCache[$realName] ) ) {
-                       return self::$pageObjectCache[$realName];
-               }
-
                $specialPageList = self::getPageList();
 
                if ( isset( $specialPageList[$realName] ) ) {
@@ -410,7 +404,6 @@ class SpecialPageFactory {
                                $page = null;
                        }
 
-                       self::$pageObjectCache[$realName] = $page;
                        if ( $page instanceof SpecialPage ) {
                                return $page;
                        } else {
index 531c330..7e29be0 100644 (file)
@@ -52,6 +52,10 @@ class SpecialActiveUsers extends SpecialPage {
 
                $opts->add( 'username', '' );
                $opts->add( 'groups', [] );
+               $opts->add( 'excludegroups', [] );
+               // Backwards-compatibility with old URLs
+               $opts->add( 'hidebots', false, FormOptions::BOOL );
+               $opts->add( 'hidesysops', false, FormOptions::BOOL );
 
                $opts->fetchValuesFromRequest( $this->getRequest() );
 
@@ -86,13 +90,22 @@ class SpecialActiveUsers extends SpecialPage {
                        $options[$msg] = $group;
                }
 
+               // Backwards-compatibility with old URLs
+               $req = $this->getRequest();
+               $excludeDefault = [];
+               if ( $req->getCheck( 'hidebots' ) ) {
+                       $excludeDefault[] = 'bot';
+               }
+               if ( $req->getCheck( 'hidesysops' ) ) {
+                       $excludeDefault[] = 'sysop';
+               }
+
                $formDescriptor = [
                        'username' => [
                                'type' => 'user',
                                'name' => 'username',
                                'label-message' => 'activeusers-from',
                        ],
-
                        'groups' => [
                                'type' => 'multiselect',
                                'dropdown' => true,
@@ -101,6 +114,15 @@ class SpecialActiveUsers extends SpecialPage {
                                'label-message' => 'activeusers-groups',
                                'options' => $options,
                        ],
+                       'excludegroups' => [
+                               'type' => 'multiselect',
+                               'dropdown' => true,
+                               'flatlist' => true,
+                               'name' => 'excludegroups',
+                               'label-message' => 'activeusers-excludegroups',
+                               'options' => $options,
+                               'default' => $excludeDefault,
+                       ],
                ];
 
                HTMLForm::factory( 'ooui', $formDescriptor, $this->getContext() )
index 4a2a619..4b8446a 100644 (file)
@@ -204,6 +204,7 @@ class SpecialAllPages extends IncludableSpecialPage {
                                ]
                        );
 
+                       $linkRenderer = $this->getLinkRenderer();
                        if ( $res->numRows() > 0 ) {
                                $out = Html::openElement( 'ul', [ 'class' => 'mw-allpages-chunk' ] );
 
@@ -213,7 +214,7 @@ class SpecialAllPages extends IncludableSpecialPage {
                                                $out .= '<li' .
                                                        ( $s->page_is_redirect ? ' class="allpagesredirect"' : '' ) .
                                                        '>' .
-                                                       Linker::link( $t ) .
+                                                       $linkRenderer->makeLink( $t ) .
                                                        "</li>\n";
                                        } else {
                                                $out .= '<li>[[' . htmlspecialchars( $s->page_title ) . "]]</li>\n";
@@ -269,6 +270,7 @@ class SpecialAllPages extends IncludableSpecialPage {
                $navLinks = [];
                $self = $this->getPageTitle();
 
+               $linkRenderer = $this->getLinkRenderer();
                // Generate a "previous page" link if needed
                if ( $prevTitle ) {
                        $query = [ 'from' => $prevTitle->getText() ];
@@ -281,9 +283,9 @@ class SpecialAllPages extends IncludableSpecialPage {
                                $query['hideredirects'] = $hideredirects;
                        }
 
-                       $navLinks[] = Linker::linkKnown(
+                       $navLinks[] = $linkRenderer->makeKnownLink(
                                $self,
-                               $this->msg( 'prevpage', $prevTitle->getText() )->escaped(),
+                               $this->msg( 'prevpage', $prevTitle->getText() )->text(),
                                [],
                                $query
                        );
@@ -304,9 +306,9 @@ class SpecialAllPages extends IncludableSpecialPage {
                                $query['hideredirects'] = $hideredirects;
                        }
 
-                       $navLinks[] = Linker::linkKnown(
+                       $navLinks[] = $linkRenderer->makeKnownLink(
                                $self,
-                               $this->msg( 'nextpage', $t->getText() )->escaped(),
+                               $this->msg( 'nextpage', $t->getText() )->text(),
                                [],
                                $query
                        );
index 9ee1b75..ecc030e 100644 (file)
@@ -78,9 +78,10 @@ class AncientPagesPage extends QueryPage {
 
                $d = $this->getLanguage()->userTimeAndDate( $result->value, $this->getUser() );
                $title = Title::makeTitle( $result->namespace, $result->title );
-               $link = Linker::linkKnown(
+               $linkRenderer = $this->getLinkRenderer();
+               $link = $linkRenderer->makeKnownLink(
                        $title,
-                       htmlspecialchars( $wgContLang->convert( $title->getPrefixedText() ) )
+                       $wgContLang->convert( $title->getPrefixedText() )
                );
 
                return $this->getLanguage()->specialList( $link, htmlspecialchars( $d ) );
index ce7d24e..585f70b 100644 (file)
@@ -372,12 +372,13 @@ class SpecialBlock extends FormSpecialPage {
 
                $this->getOutput()->addModuleStyles( 'mediawiki.special' );
 
+               $linkRenderer = $this->getLinkRenderer();
                # Link to the user's contributions, if applicable
                if ( $this->target instanceof User ) {
                        $contribsPage = SpecialPage::getTitleFor( 'Contributions', $this->target->getName() );
-                       $links[] = Linker::link(
+                       $links[] = $linkRenderer->makeLink(
                                $contribsPage,
-                               $this->msg( 'ipb-blocklist-contribs', $this->target->getName() )->escaped()
+                               $this->msg( 'ipb-blocklist-contribs', $this->target->getName() )->text()
                        );
                }
 
@@ -392,21 +393,24 @@ class SpecialBlock extends FormSpecialPage {
                        $message = $this->msg( 'ipb-unblock' )->parse();
                        $list = SpecialPage::getTitleFor( 'Unblock' );
                }
-               $links[] = Linker::linkKnown( $list, $message, [] );
+               $links[] = $linkRenderer->makeKnownLink(
+                       $list,
+                       new HtmlArmor( $message )
+               );
 
                # Link to the block list
-               $links[] = Linker::linkKnown(
+               $links[] = $linkRenderer->makeKnownLink(
                        SpecialPage::getTitleFor( 'BlockList' ),
-                       $this->msg( 'ipb-blocklist' )->escaped()
+                       $this->msg( 'ipb-blocklist' )->text()
                );
 
                $user = $this->getUser();
 
                # Link to edit the block dropdown reasons, if applicable
                if ( $user->isAllowed( 'editinterface' ) ) {
-                       $links[] = Linker::linkKnown(
+                       $links[] = $linkRenderer->makeKnownLink(
                                $this->msg( 'ipbreason-dropdown' )->inContentLanguage()->getTitle(),
-                               $this->msg( 'ipb-edit-dropdown' )->escaped(),
+                               $this->msg( 'ipb-edit-dropdown' )->text(),
                                [],
                                [ 'action' => 'edit' ]
                        );
index 1753396..8927fbf 100644 (file)
@@ -109,12 +109,13 @@ class BrokenRedirectsPage extends QueryPage {
                        }
                }
 
+               $linkRenderer = $this->getLinkRenderer();
                // $toObj may very easily be false if the $result list is cached
                if ( !is_object( $toObj ) ) {
-                       return '<del>' . Linker::link( $fromObj ) . '</del>';
+                       return '<del>' . $linkRenderer->makeLink( $fromObj ) . '</del>';
                }
 
-               $from = Linker::linkKnown(
+               $from = $linkRenderer->makeKnownLink(
                        $fromObj,
                        null,
                        [],
@@ -128,14 +129,14 @@ class BrokenRedirectsPage extends QueryPage {
                        // check, if the content model is editable through action=edit
                        ContentHandler::getForTitle( $fromObj )->supportsDirectEditing()
                ) {
-                       $links[] = Linker::linkKnown(
+                       $links[] = $linkRenderer->makeKnownLink(
                                $fromObj,
-                               $this->msg( 'brokenredirects-edit' )->escaped(),
+                               $this->msg( 'brokenredirects-edit' )->text(),
                                [],
                                [ 'action' => 'edit' ]
                        );
                }
-               $to = Linker::link(
+               $to = $linkRenderer->makeLink(
                        $toObj,
                        null,
                        [],
@@ -147,9 +148,9 @@ class BrokenRedirectsPage extends QueryPage {
                $out = $from . $this->msg( 'word-separator' )->escaped();
 
                if ( $this->getUser()->isAllowed( 'delete' ) ) {
-                       $links[] = Linker::linkKnown(
+                       $links[] = $linkRenderer->makeKnownLink(
                                $fromObj,
-                               $this->msg( 'brokenredirects-delete' )->escaped(),
+                               $this->msg( 'brokenredirects-delete' )->text(),
                                [],
                                [ 'action' => 'delete' ]
                        );
index 0cec9d0..9140bf1 100644 (file)
@@ -137,14 +137,15 @@ class DoubleRedirectsPage extends QueryPage {
                                $result = $dbr->fetchObject( $res );
                        }
                }
+               $linkRenderer = $this->getLinkRenderer();
                if ( !$result ) {
-                       return '<del>' . Linker::link( $titleA, null, [], [ 'redirect' => 'no' ] ) . '</del>';
+                       return '<del>' . $linkRenderer->makeLink( $titleA, null, [], [ 'redirect' => 'no' ] ) . '</del>';
                }
 
                $titleB = Title::makeTitle( $result->nsb, $result->tb );
                $titleC = Title::makeTitle( $result->nsc, $result->tc, '', $result->iwc );
 
-               $linkA = Linker::linkKnown(
+               $linkA = $linkRenderer->makeKnownLink(
                        $titleA,
                        null,
                        [],
@@ -158,26 +159,24 @@ class DoubleRedirectsPage extends QueryPage {
                        // check, if the content model is editable through action=edit
                        ContentHandler::getForTitle( $titleA )->supportsDirectEditing()
                ) {
-                       $edit = Linker::linkKnown(
+                       $edit = $linkRenderer->makeKnownLink(
                                $titleA,
-                               $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
+                               $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->text(),
                                [],
-                               [
-                                       'action' => 'edit'
-                               ]
+                               [ 'action' => 'edit' ]
                        );
                } else {
                        $edit = '';
                }
 
-               $linkB = Linker::linkKnown(
+               $linkB = $linkRenderer->makeKnownLink(
                        $titleB,
                        null,
                        [],
                        [ 'redirect' => 'no' ]
                );
 
-               $linkC = Linker::linkKnown( $titleC );
+               $linkC = $linkRenderer->makeKnownLink( $titleC );
 
                $lang = $this->getLanguage();
                $arr = $lang->getArrow() . $lang->getDirMark();
index 06be7bc..a550e88 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * A special page that allows users to send e-mails to other users
@@ -223,7 +224,7 @@ class SpecialEmailUser extends UnlistedSpecialPage {
        public static function getPermissionsError( $user, $editToken, Config $config = null ) {
                if ( $config === null ) {
                        wfDebug( __METHOD__ . ' called without a Config instance passed to it' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                }
                if ( !$config->get( 'EnableEmail' ) || !$config->get( 'EnableUserEmail' ) ) {
                        return 'usermaildisabled';
index 39c8ae8..2c92410 100644 (file)
@@ -71,8 +71,14 @@ class SpecialListGrants extends SpecialPage {
 
                        $id = \Sanitizer::escapeId( $grant );
                        $out->addHTML( \Html::rawElement( 'tr', [ 'id' => $id ],
-                               "<td>" . $this->msg( "grant-$grant" )->escaped() . "</td>" .
-                               "<td>" . $grantCellHtml . '</td>'
+                               "<td>" .
+                               $this->msg(
+                                       "listgrants-grant-display",
+                                       \User::getGrantName( $grant ),
+                                       "<span class='mw-listgrants-grant-name'>" . $id . "</span>"
+                               )->parse() .
+                               "</td>" .
+                               "<td>" . $grantCellHtml . "</td>"
                        ) );
                }
 
index 82abccf..a4f16bd 100644 (file)
@@ -100,14 +100,6 @@ class SpecialPasswordReset extends FormSpecialPage {
                        ];
                }
 
-               if ( $this->getUser()->isAllowed( 'passwordreset' ) ) {
-                       $a['Capture'] = [
-                               'type' => 'check',
-                               'label-message' => 'passwordreset-capture',
-                               'help-message' => 'passwordreset-capture-help',
-                       ];
-               }
-
                return $a;
        }
 
@@ -144,22 +136,12 @@ class SpecialPasswordReset extends FormSpecialPage {
         * @return Status
         */
        public function onSubmit( array $data ) {
-               if ( isset( $data['Capture'] ) && !$this->getUser()->isAllowed( 'passwordreset' ) ) {
-                       // The user knows they don't have the passwordreset permission,
-                       // but they tried to spoof the form. That's naughty
-                       throw new PermissionsError( 'passwordreset' );
-               }
-
                $username = isset( $data['Username'] ) ? $data['Username'] : null;
                $email = isset( $data['Email'] ) ? $data['Email'] : null;
-               $capture = !empty( $data['Capture'] );
 
                $this->method = $username ? 'username' : 'email';
                $this->result = Status::wrap(
-                       $this->getPasswordReset()->execute( $this->getUser(), $username, $email, $capture ) );
-               if ( $capture && $this->result->isOK() ) {
-                       $this->passwords = $this->result->getValue();
-               }
+                       $this->getPasswordReset()->execute( $this->getUser(), $username, $email ) );
 
                if ( $this->result->hasMessage( 'actionthrottledtext' ) ) {
                        throw new ThrottledError;
@@ -169,28 +151,6 @@ class SpecialPasswordReset extends FormSpecialPage {
        }
 
        public function onSuccess() {
-               if ( $this->getUser()->isAllowed( 'passwordreset' ) && $this->passwords ) {
-                       // @todo Logging
-
-                       if ( $this->result->isGood() ) {
-                               $this->getOutput()->addWikiMsg( 'passwordreset-emailsent-capture2',
-                                       count( $this->passwords ) );
-                       } else {
-                               $this->getOutput()->addWikiMsg( 'passwordreset-emailerror-capture2',
-                                       $this->result->getMessage(), key( $this->passwords ), count( $this->passwords ) );
-                       }
-
-                       $this->getOutput()->addHTML( Html::openElement( 'ul' ) );
-                       foreach ( $this->passwords as $username => $pwd ) {
-                               $this->getOutput()->addHTML( Html::rawElement( 'li', [],
-                                       htmlspecialchars( $username, ENT_QUOTES )
-                                       . $this->msg( 'colon-separator' )->text()
-                                       . htmlspecialchars( $pwd, ENT_QUOTES )
-                               ) );
-                       }
-                       $this->getOutput()->addHTML( Html::closeElement( 'ul' ) );
-               }
-
                if ( $this->method === 'email' ) {
                        $this->getOutput()->addWikiMsg( 'passwordreset-emailsentemail' );
                } else {
index 3b502f8..4c6a345 100644 (file)
@@ -87,6 +87,8 @@ class SpecialTrackingCategories extends SpecialPage {
                }
                $batch->execute();
 
+               Hooks::run( 'SpecialTrackingCategories::preprocess', [ $this, $trackingCategories ] );
+
                foreach ( $trackingCategories as $catMsg => $data ) {
                        $allMsgs = [];
                        $catDesc = $catMsg . '-desc';
@@ -97,11 +99,15 @@ class SpecialTrackingCategories extends SpecialPage {
                        );
 
                        foreach ( $data['cats'] as $catTitle ) {
-                               $catTitleText = Linker::link(
+                               $html = Linker::link(
                                        $catTitle,
                                        htmlspecialchars( $catTitle->getText() )
                                );
-                               $allMsgs[] = $catTitleText;
+
+                               Hooks::run( 'SpecialTrackingCategories::generateCatLink',
+                                       [ $this, $catTitle, &$html ] );
+
+                               $allMsgs[] = $html;
                        }
 
                        # Extra message, when no category was found
index 91753a9..efac615 100644 (file)
@@ -20,6 +20,7 @@
  * @file
  * @ingroup SpecialPage
  */
+use MediaWiki\MediaWikiServices;
 
 /**
  * Used to show archived pages and eventually restore them.
@@ -46,7 +47,7 @@ class PageArchive {
                $this->title = $title;
                if ( $config === null ) {
                        wfDebug( __METHOD__ . ' did not have a Config object passed to it' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                }
                $this->config = $config;
        }
index 4583305..f7e46cb 100644 (file)
@@ -588,7 +588,7 @@ class SpecialUpload extends SpecialPage {
        ) {
                if ( $config === null ) {
                        wfDebug( __METHOD__ . ' called without a Config instance passed to it' );
-                       $config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $config = MediaWikiServices::getInstance()->getMainConfig();
                }
 
                $msg = [];
index 433dcab..6ded6d9 100644 (file)
@@ -48,14 +48,6 @@ class UserrightsPage extends SpecialPage {
                return true;
        }
 
-       public function isRestricted() {
-               return true;
-       }
-
-       public function userCanExecute( User $user ) {
-               return $this->userCanChangeRights( $user, false );
-       }
-
        /**
         * @param User $user
         * @param bool $checkIfSelf
@@ -82,22 +74,10 @@ class UserrightsPage extends SpecialPage {
         * @throws UserBlockedError|PermissionsError
         */
        public function execute( $par ) {
-               // If the visitor doesn't have permissions to assign or remove
-               // any groups, it's a bit silly to give them the user search prompt.
-
                $user = $this->getUser();
                $request = $this->getRequest();
                $out = $this->getOutput();
 
-               /*
-                * If the user is blocked and they only have "partial" access
-                * (e.g. they don't have the userrights permission), then don't
-                * allow them to use Special:UserRights.
-                */
-               if ( $user->isBlocked() && !$user->isAllowed( 'userrights' ) ) {
-                       throw new UserBlockedError( $user->getBlock() );
-               }
-
                if ( $par !== null ) {
                        $this->mTarget = $par;
                } else {
@@ -108,24 +88,7 @@ class UserrightsPage extends SpecialPage {
                        $this->mTarget = trim( $this->mTarget );
                }
 
-               $available = $this->changeableGroups();
-
-               if ( $this->mTarget === null ) {
-                       /*
-                        * If the user specified no target, and they can only
-                        * edit their own groups, automatically set them as the
-                        * target.
-                        */
-                       if ( !count( $available['add'] ) && !count( $available['remove'] ) ) {
-                               $this->mTarget = $user->getName();
-                       }
-               }
-
-               if ( $this->mTarget !== null && User::getCanonicalName( $this->mTarget ) === $user->getName() ) {
-                       $this->isself = true;
-               }
-
-               $fetchedStatus = $this->fetchUser( $this->mTarget );
+               $fetchedStatus = $this->fetchUser( $this->mTarget, true );
                if ( $fetchedStatus->isOK() ) {
                        $this->mFetchedUser = $fetchedStatus->value;
                        if ( $this->mFetchedUser instanceof User ) {
@@ -135,23 +98,6 @@ class UserrightsPage extends SpecialPage {
                        }
                }
 
-               if ( !$this->userCanChangeRights( $user, true ) ) {
-                       if ( $this->isself && $request->getCheck( 'success' ) ) {
-                               // bug 48609: if the user just removed its own rights, this would
-                               // leads it in a "permissions error" page. In that case, show a
-                               // message that it can't anymore use this page instead of an error
-                               $this->setHeaders();
-                               $out->wrapWikiMsg( "<div class=\"successbox\">\n$1\n</div>", 'userrights-removed-self' );
-                               $out->returnToMain();
-
-                               return;
-                       }
-
-                       // @todo FIXME: There may be intermediate groups we can mention.
-                       $msg = $user->isAnon() ? 'userrights-nologin' : 'userrights-notallowed';
-                       throw new PermissionsError( null, [ [ $msg ] ] );
-               }
-
                // show a successbox, if the user rights was saved successfully
                if ( $request->getCheck( 'success' ) && $this->mFetchedUser !== null ) {
                        $out->addModules( [ 'mediawiki.special.userrights' ] );
@@ -173,18 +119,13 @@ class UserrightsPage extends SpecialPage {
                        );
                }
 
-               $this->checkReadOnly();
-
                $this->setHeaders();
                $this->outputHeader();
 
                $out->addModuleStyles( 'mediawiki.special' );
                $this->addHelpLink( 'Help:Assigning permissions' );
 
-               // show the general form
-               if ( count( $available['add'] ) || count( $available['remove'] ) ) {
-                       $this->switchForm();
-               }
+               $this->switchForm();
 
                if (
                        $request->wasPosted() &&
@@ -192,6 +133,17 @@ class UserrightsPage extends SpecialPage {
                        $this->mTarget !== null &&
                        $user->matchEditToken( $request->getVal( 'wpEditToken' ), $this->mTarget )
                ) {
+                       /*
+                       * If the user is blocked and they only have "partial" access
+                       * (e.g. they don't have the userrights permission), then don't
+                       * allow them to change any user rights.
+                       */
+                       if ( $user->isBlocked() && !$user->isAllowed( 'userrights' ) ) {
+                               throw new UserBlockedError( $user->getBlock() );
+                       }
+
+                       $this->checkReadOnly();
+
                        // save settings
                        if ( !$fetchedStatus->isOK() ) {
                                $this->getOutput()->addWikiText( $fetchedStatus->getWikiText() );
@@ -352,7 +304,7 @@ class UserrightsPage extends SpecialPage {
         * @param string $username Name of the user.
         */
        function editUserGroupsForm( $username ) {
-               $status = $this->fetchUser( $username );
+               $status = $this->fetchUser( $username, true );
                if ( !$status->isOK() ) {
                        $this->getOutput()->addWikiText( $status->getWikiText() );
 
@@ -376,9 +328,10 @@ class UserrightsPage extends SpecialPage {
         *
         * Side effects: error output for invalid access
         * @param string $username
+        * @param bool $writing
         * @return Status
         */
-       public function fetchUser( $username ) {
+       public function fetchUser( $username, $writing ) {
                $parts = explode( $this->getConfig()->get( 'UserrightsInterwikiDelimiter' ), $username );
                if ( count( $parts ) < 2 ) {
                        $name = trim( $username );
@@ -389,7 +342,7 @@ class UserrightsPage extends SpecialPage {
                        if ( $database == wfWikiID() ) {
                                $database = '';
                        } else {
-                               if ( !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
+                               if ( $writing && !$this->getUser()->isAllowed( 'userrights-interwiki' ) ) {
                                        return Status::newFatal( 'userrights-no-interwiki' );
                                }
                                if ( !UserRightsProxy::validDatabase( $database ) ) {
@@ -484,10 +437,7 @@ class UserrightsPage extends SpecialPage {
                                )
                        ) . ' ' .
                        Xml::submitButton(
-                               $this->msg(
-                                       'editusergroup',
-                                       $this->mFetchedUser === null ? '[]' : $this->mFetchedUser->getName()
-                               )->text()
+                               $this->msg( 'editusergroup' )->text()
                        ) .
                        Html::closeElement( 'fieldset' ) .
                        Html::closeElement( 'form' ) . "\n"
@@ -578,6 +528,7 @@ class UserrightsPage extends SpecialPage {
                        Linker::TOOL_LINKS_EMAIL /* Add "send e-mail" link */
                );
 
+               list( $groupCheckboxes, $canChangeAny ) = $this->groupCheckboxes( $groups, $user );
                $this->getOutput()->addHTML(
                        Xml::openElement(
                                'form',
@@ -601,30 +552,38 @@ class UserrightsPage extends SpecialPage {
                                $this->msg( 'userrights-editusergroup', $user->getName() )->text()
                        ) .
                        $this->msg( 'editinguser' )->params( wfEscapeWikiText( $user->getName() ) )
-                               ->rawParams( $userToolLinks )->parse() .
-                       $this->msg( 'userrights-groups-help', $user->getName() )->parse() .
-                       $grouplist .
-                       $this->groupCheckboxes( $groups, $user ) .
-                       Xml::openElement( 'table', [ 'id' => 'mw-userrights-table-outer' ] ) .
-                               "<tr>
-                                       <td class='mw-label'>" .
-                                               Xml::label( $this->msg( 'userrights-reason' )->text(), 'wpReason' ) .
-                                       "</td>
-                                       <td class='mw-input'>" .
-                                               Xml::input( 'user-reason', 60, $this->getRequest()->getVal( 'user-reason', false ),
-                                                       [ 'id' => 'wpReason', 'maxlength' => 255 ] ) .
-                                       "</td>
-                               </tr>
-                               <tr>
-                                       <td></td>
-                                       <td class='mw-submit'>" .
-                                               Xml::submitButton( $this->msg( 'saveusergroups', $user->getName() )->text(),
-                                                       [ 'name' => 'saveusergroups' ] +
-                                                               Linker::tooltipAndAccesskeyAttribs( 'userrights-set' )
-                                               ) .
-                                       "</td>
-                               </tr>" .
-                       Xml::closeElement( 'table' ) . "\n" .
+                               ->rawParams( $userToolLinks )->parse()
+               );
+               if ( $canChangeAny ) {
+                       $this->getOutput()->addHTML(
+                               $this->msg( 'userrights-groups-help', $user->getName() )->parse() .
+                               $grouplist .
+                               $groupCheckboxes .
+                               Xml::openElement( 'table', [ 'id' => 'mw-userrights-table-outer' ] ) .
+                                       "<tr>
+                                               <td class='mw-label'>" .
+                                                       Xml::label( $this->msg( 'userrights-reason' )->text(), 'wpReason' ) .
+                                               "</td>
+                                               <td class='mw-input'>" .
+                                                       Xml::input( 'user-reason', 60, $this->getRequest()->getVal( 'user-reason', false ),
+                                                               [ 'id' => 'wpReason', 'maxlength' => 255 ] ) .
+                                               "</td>
+                                       </tr>
+                                       <tr>
+                                               <td></td>
+                                               <td class='mw-submit'>" .
+                                                       Xml::submitButton( $this->msg( 'saveusergroups', $user->getName() )->text(),
+                                                               [ 'name' => 'saveusergroups' ] +
+                                                                       Linker::tooltipAndAccesskeyAttribs( 'userrights-set' )
+                                                       ) .
+                                               "</td>
+                                       </tr>" .
+                               Xml::closeElement( 'table' ) . "\n"
+                       );
+               } else {
+                       $this->getOutput()->addHTML( $grouplist );
+               }
+               $this->getOutput()->addHTML(
                        Xml::closeElement( 'fieldset' ) .
                        Xml::closeElement( 'form' ) . "\n"
                );
@@ -664,7 +623,8 @@ class UserrightsPage extends SpecialPage {
         * @todo Just pass the username string?
         * @param array $usergroups Groups the user belongs to
         * @param User $user
-        * @return string XHTML table element with checkboxes
+        * @return Array with 2 elements: the XHTML table element with checkxboes, and
+        * whether any groups are changeable
         */
        private function groupCheckboxes( $usergroups, $user ) {
                $allgroups = $this->getAllGroups();
@@ -739,7 +699,7 @@ class UserrightsPage extends SpecialPage {
                }
                $ret .= Xml::closeElement( 'tr' ) . Xml::closeElement( 'table' );
 
-               return $ret;
+               return [ $ret, (bool)$columns['changeable'] ];
        }
 
        /**
@@ -747,7 +707,6 @@ class UserrightsPage extends SpecialPage {
         * @return bool Can we remove the group?
         */
        private function canRemove( $group ) {
-               // $this->changeableGroups()['remove'] doesn't work, of course. Thanks, PHP.
                $groups = $this->changeableGroups();
 
                return in_array(
@@ -817,3 +776,4 @@ class UserrightsPage extends SpecialPage {
                return 'users';
        }
 }
+
index ea906b7..645a115 100644 (file)
@@ -64,6 +64,14 @@ class ActiveUsersPager extends UsersPager {
                }
 
                $this->groups = $opts->getValue( 'groups' );
+               $this->excludegroups = $opts->getValue( 'excludegroups' );
+               // Backwards-compatibility with old URLs
+               if ( $opts->getValue( 'hidebots' ) ) {
+                       $this->excludegroups[] = 'bot';
+               }
+               if ( $opts->getValue( 'hidesysops' ) ) {
+                       $this->excludegroups[] = 'sysop';
+               }
        }
 
        function getIndexField() {
@@ -94,6 +102,13 @@ class ActiveUsersPager extends UsersPager {
                        $conds[] = 'ug_user = user_id';
                        $conds['ug_group'] = $this->groups;
                }
+               if ( $this->excludegroups !== [] ) {
+                       foreach ( $this->excludegroups as $group ) {
+                               $conds[] = 'NOT EXISTS (' . $dbr->selectSQLText(
+                                               'user_groups', '1', [ 'ug_user = user_id', 'ug_group' => $group ]
+                                       ) . ')';
+                       }
+               }
                if ( !$this->getUser()->isAllowed( 'hideuser' ) ) {
                        $conds[] = 'NOT EXISTS (' . $dbr->selectSQLText(
                                        'ipblocks', '1', [ 'ipb_user=user_id', 'ipb_deleted' => 1 ]
index b7160b3..48477f8 100644 (file)
@@ -432,7 +432,7 @@ class UploadStash {
                                . ' No user is logged in, files must belong to users' );
                }
 
-               $dbr = $this->repo->getSlaveDB();
+               $dbr = $this->repo->getReplicaDB();
                $res = $dbr->select(
                        'uploadstash',
                        'us_key',
@@ -511,7 +511,7 @@ class UploadStash {
                        // sometimes reading from the master is necessary, if there's replication lag.
                        $dbr = $this->repo->getMasterDB();
                } else {
-                       $dbr = $this->repo->getSlaveDB();
+                       $dbr = $this->repo->getReplicaDB();
                }
 
                $row = $dbr->selectRow(
index 889ec92..c1aef22 100644 (file)
@@ -22,6 +22,9 @@
 
 use MediaWiki\Auth\AuthManager;
 use MediaWiki\Auth\TemporaryPasswordAuthenticationRequest;
+use Psr\Log\LoggerAwareInterface;
+use Psr\Log\LoggerInterface;
+use MediaWiki\Logger\LoggerFactory;
 
 /**
  * Helper class for the password reset functionality shared by the web UI and the API.
@@ -30,16 +33,19 @@ use MediaWiki\Auth\TemporaryPasswordAuthenticationRequest;
  * EmailNotificationSecondaryAuthenticationProvider (or something providing equivalent
  * functionality) to be enabled.
  */
-class PasswordReset {
+class PasswordReset implements LoggerAwareInterface {
        /** @var Config */
        protected $config;
 
        /** @var AuthManager */
        protected $authManager;
 
+       /** @var LoggerInterface */
+       protected $logger;
+
        /**
-        * In-process cache for isAllowed lookups, by username. Contains pairs of StatusValue objects
-        * (for false and true value of $displayPassword, respectively).
+        * In-process cache for isAllowed lookups, by username.
+        * Contains a StatusValue object
         * @var HashBagOStuff
         */
        private $permissionCache;
@@ -48,6 +54,17 @@ class PasswordReset {
                $this->config = $config;
                $this->authManager = $authManager;
                $this->permissionCache = new HashBagOStuff( [ 'maxKeys' => 1 ] );
+               $this->logger = LoggerFactory::getInstance( 'authentication' );
+       }
+
+       /**
+        * Set the logger instance to use.
+        *
+        * @param LoggerInterface $logger
+        * @since 1.29
+        */
+       public function setLogger( LoggerInterface $logger ) {
+               $this->logger = $logger;
        }
 
        /**
@@ -55,13 +72,12 @@ class PasswordReset {
         * @param User $user
         * @param bool $displayPassword If set, also check whether the user is allowed to reset the
         *   password of another user and see the temporary password.
+        * @since 1.29 Second argument for displayPassword removed.
         * @return StatusValue
         */
-       public function isAllowed( User $user, $displayPassword = false ) {
-               $statuses = $this->permissionCache->get( $user->getName() );
-               if ( $statuses ) {
-                       list ( $status, $status2 ) = $statuses;
-               } else {
+       public function isAllowed( User $user ) {
+               $status = $this->permissionCache->get( $user->getName() );
+               if ( !$status ) {
                        $resetRoutes = $this->config->get( 'PasswordResetRoutes' );
                        $status = StatusValue::newGood();
 
@@ -90,19 +106,10 @@ class PasswordReset {
                                $status = StatusValue::newFatal( 'blocked-mailpassword' );
                        }
 
-                       $status2 = StatusValue::newGood();
-                       if ( !$user->isAllowed( 'passwordreset' ) ) {
-                               $status2 = StatusValue::newFatal( 'badaccess' );
-                       }
-
-                       $this->permissionCache->set( $user->getName(), [ $status, $status2 ] );
+                       $this->permissionCache->set( $user->getName(), $status );
                }
 
-               if ( !$displayPassword || !$status->isGood() ) {
-                       return $status;
-               } else {
-                       return $status2;
-               }
+               return $status;
        }
 
        /**
@@ -111,22 +118,22 @@ class PasswordReset {
         * Process the form.  At this point we know that the user passes all the criteria in
         * userCanExecute(), and if the data array contains 'Username', etc, then Username
         * resets are allowed.
+        *
+        * @since 1.29 Fourth argument for displayPassword removed.
         * @param User $performingUser The user that does the password reset
         * @param string $username The user whose password is reset
         * @param string $email Alternative way to specify the user
-        * @param bool $displayPassword Whether to display the password
         * @return StatusValue Will contain the passwords as a username => password array if the
         *   $displayPassword flag was set
         * @throws LogicException When the user is not allowed to perform the action
         * @throws MWException On unexpected DB errors
         */
        public function execute(
-               User $performingUser, $username = null, $email = null, $displayPassword = false
+               User $performingUser, $username = null, $email = null
        ) {
-               if ( !$this->isAllowed( $performingUser, $displayPassword )->isGood() ) {
-                       $action = $this->isAllowed( $performingUser )->isGood() ? 'display' : 'reset';
+               if ( !$this->isAllowed( $performingUser )->isGood() ) {
                        throw new LogicException( 'User ' . $performingUser->getName()
-                               . ' is not allowed to ' . $action . ' passwords' );
+                               . ' is not allowed to reset passwords' );
                }
 
                $resetRoutes = $this->config->get( 'PasswordResetRoutes' )
@@ -134,12 +141,14 @@ class PasswordReset {
                if ( $resetRoutes['username'] && $username ) {
                        $method = 'username';
                        $users = [ User::newFromName( $username ) ];
+                       $email = null;
                } elseif ( $resetRoutes['email'] && $email ) {
                        if ( !Sanitizer::validateEmail( $email ) ) {
                                return StatusValue::newFatal( 'passwordreset-invalidemail' );
                        }
                        $method = 'email';
                        $users = $this->getUsersByEmail( $email );
+                       $username = null;
                } else {
                        // The user didn't supply any data
                        return StatusValue::newFatal( 'passwordreset-nodata' );
@@ -150,7 +159,6 @@ class PasswordReset {
                $data = [
                        'Username' => $username,
                        'Email' => $email,
-                       'Capture' => $displayPassword ? '1' : null,
                ];
                if ( !Hooks::run( 'SpecialPasswordResetOnSubmit', [ &$users, $data, &$error ] ) ) {
                        return StatusValue::newFatal( Message::newFromSpecifier( $error ) );
@@ -199,7 +207,6 @@ class PasswordReset {
                        $req = TemporaryPasswordAuthenticationRequest::newRandom();
                        $req->username = $user->getName();
                        $req->mailpassword = true;
-                       $req->hasBackchannel = $displayPassword;
                        $req->caller = $performingUser->getName();
                        $status = $this->authManager->allowsAuthenticationDataChange( $req, true );
                        if ( $status->isGood() && $status->getValue() !== 'ignored' ) {
@@ -214,19 +221,32 @@ class PasswordReset {
                        }
                }
 
+               $logContext = [
+                       'requestingIp' => $ip,
+                       'requestingUser' => $performingUser->getName(),
+                       'targetUsername' => $username,
+                       'targetEmail' => $email,
+                       'actualUser' => $firstUser->getName(),
+               ];
+
                if ( !$result->isGood() ) {
+                       $this->logger->info(
+                               "{requestingUser} attempted password reset of {actualUser} but failed",
+                               $logContext + [ 'errors' => $result->getErrors() ]
+                       );
                        return $result;
                }
 
                $passwords = [];
                foreach ( $reqs as $req ) {
                        $this->authManager->changeAuthenticationData( $req );
-                       // TODO record mail sending errors
-                       if ( $displayPassword ) {
-                               $passwords[$req->username] = $req->password;
-                       }
                }
 
+               $this->logger->info(
+                       "{requestingUser} did password reset of {actualUser}",
+                       $logContext
+               );
+
                return StatusValue::newGood( $passwords );
        }
 
index 273d555..f07db0e 100644 (file)
@@ -166,7 +166,6 @@ class User implements IDBAccessObject {
                'noratelimit',
                'override-export-depth',
                'pagelang',
-               'passwordreset',
                'patrol',
                'patrolmarks',
                'protect',
@@ -301,6 +300,11 @@ class User implements IDBAccessObject {
        /** @var integer User::READ_* constant bitfield used to load data */
        protected $queryFlagsUsed = self::READ_NORMAL;
 
+       /** @var string Indicates type of block (used for eventlogging)
+        * Permitted values: 'cookie-block', 'proxy-block', 'openproxy-block', 'xff-block'
+        */
+       public $blockTrigger = false;
+
        public static $idCacheByName = [];
 
        /**
@@ -1200,13 +1204,29 @@ class User implements IDBAccessObject {
                $user = $session->getUser();
                if ( $user->isLoggedIn() ) {
                        $this->loadFromUserObject( $user );
+
+                       // If this user is autoblocked, set a cookie to track the Block. This has to be done on
+                       // every session load, because an autoblocked editor might not edit again from the same
+                       // IP address after being blocked.
+                       $config = RequestContext::getMain()->getConfig();
+                       if ( $config->get( 'CookieSetOnAutoblock' ) === true ) {
+                               $block = $this->getBlock();
+                               $shouldSetCookie = $this->getRequest()->getCookie( 'BlockID' ) === null
+                                       && $block
+                                       && $block->getType() === Block::TYPE_USER
+                                       && $block->isAutoblocking();
+                               if ( $shouldSetCookie ) {
+                                       wfDebug( __METHOD__ . ': User is autoblocked, setting cookie to track' );
+                                       $block->setCookie( $this->getRequest()->response() );
+                               }
+                       }
+
                        // Other code expects these to be set in the session, so set them.
                        $session->set( 'wsUserID', $this->getId() );
                        $session->set( 'wsUserName', $this->getName() );
                        $session->set( 'wsToken', $this->getToken() );
                        return true;
                }
-
                return false;
        }
 
@@ -1609,6 +1629,31 @@ class User implements IDBAccessObject {
                // User/IP blocking
                $block = Block::newFromTarget( $this, $ip, !$bFromSlave );
 
+               // If no block has been found, check for a cookie indicating that the user is blocked.
+               $blockCookieVal = (int)$this->getRequest()->getCookie( 'BlockID' );
+               if ( !$block instanceof Block && $blockCookieVal > 0 ) {
+                       // Load the Block from the ID in the cookie.
+                       $tmpBlock = Block::newFromID( $blockCookieVal );
+                       if ( $tmpBlock instanceof Block ) {
+                               // Check the validity of the block.
+                               $blockIsValid = $tmpBlock->getType() == Block::TYPE_USER
+                                       && !$tmpBlock->isExpired()
+                                       && $tmpBlock->isAutoblocking();
+                               $config = RequestContext::getMain()->getConfig();
+                               $useBlockCookie = ( $config->get( 'CookieSetOnAutoblock' ) === true );
+                               if ( $blockIsValid && $useBlockCookie ) {
+                                       // Use the block.
+                                       $block = $tmpBlock;
+                                       $this->blockTrigger = 'cookie-block';
+                               } else {
+                                       // If the block is not valid, clear the block cookie (but don't delete it,
+                                       // because it needs to be cleared from LocalStorage as well and an empty string
+                                       // value is checked for in the mediawiki.user.blockcookie module).
+                                       $tmpBlock->setCookie( $this->getRequest()->response(), true );
+                               }
+                       }
+               }
+
                // Proxy blocking
                if ( !$block instanceof Block && $ip !== null && !in_array( $ip, $wgProxyWhitelist ) ) {
                        // Local list
@@ -1617,11 +1662,13 @@ class User implements IDBAccessObject {
                                $block->setBlocker( wfMessage( 'proxyblocker' )->text() );
                                $block->mReason = wfMessage( 'proxyblockreason' )->text();
                                $block->setTarget( $ip );
+                               $this->blockTrigger = 'proxy-block';
                        } elseif ( $this->isAnon() && $this->isDnsBlacklisted( $ip ) ) {
                                $block = new Block;
                                $block->setBlocker( wfMessage( 'sorbs' )->text() );
                                $block->mReason = wfMessage( 'sorbsreason' )->text();
                                $block->setTarget( $ip );
+                               $this->blockTrigger = 'openproxy-block';
                        }
                }
 
@@ -1640,6 +1687,7 @@ class User implements IDBAccessObject {
                                # Mangle the reason to alert the user that the block
                                # originated from matching the X-Forwarded-For header.
                                $block->mReason = wfMessage( 'xffblockreason', $block->mReason )->text();
+                               $this->blockTrigger = 'xff-block';
                        }
                }
 
@@ -1654,6 +1702,7 @@ class User implements IDBAccessObject {
                        $this->mBlockedby = '';
                        $this->mHideName = 0;
                        $this->mAllowUsertalk = false;
+                       $this->blockTrigger = false;
                }
 
                // Extensions
@@ -5017,13 +5066,27 @@ class User implements IDBAccessObject {
        /**
         * Get the description of a given right
         *
+        * @since 1.29
         * @param string $right Right to query
         * @return string Localized description of the right
         */
        public static function getRightDescription( $right ) {
                $key = "right-$right";
                $msg = wfMessage( $key );
-               return $msg->isBlank() ? $right : $msg->text();
+               return $msg->isDisabled() ? $right : $msg->text();
+       }
+
+       /**
+        * Get the name of a given grant
+        *
+        * @since 1.29
+        * @param string $grant Grant to query
+        * @return string Localized name of the grant
+        */
+       public static function getGrantName( $grant ) {
+               $key = "grant-$grant";
+               $msg = wfMessage( $key );
+               return $msg->isDisabled() ? $grant : $msg->text();
        }
 
        /**
index 5b18365..228c5c4 100644 (file)
@@ -9,6 +9,7 @@
        "--warnings-exit-nonzero": true,
        "--external": "Blob,File,HTMLDocument,HTMLElement,HTMLIframeElement,HTMLInputElement,KeyboardEvent,MouseEvent,Node,Window,XMLDocument",
        "--output": "docs/js",
+       "--exclude": "resources/src/mediawiki/mediawiki.Title.phpCharToUpper.js",
        "--": [
                "maintenance/jsduck/external.js",
                "resources/src/mediawiki",
index 1ed9a44..0557455 100644 (file)
@@ -174,6 +174,7 @@ class Names {
                'gom' => 'गोंयची कोंकणी / Gõychi Konknni', # Goan Konkani
                'gom-deva' => 'गोंयची कोंकणी', # Goan Konkani (Devanagari script)
                'gom-latn' => 'Gõychi Konknni', # Goan Konkani (Latin script)
+               'gor' => 'Bahasa Hulontalo', # Gorontalo
                'got' => '𐌲𐌿𐍄𐌹𐍃𐌺', # Gothic
                'grc' => 'Ἀρχαία ἑλληνικὴ', # Ancient Greek
                'gsw' => 'Alemannisch', # Alemannic
@@ -241,6 +242,7 @@ class Names {
                'krc' => 'къарачай-малкъар', # Karachay-Balkar
                'kri' => 'Krio', # Krio
                'krj' => 'Kinaray-a', # Kinaray-a
+               'krl' => 'karjal', # Karelian
                'ks' => 'कॉशुर / کٲشُر', # Kashmiri (multiple scripts - defaults to Perso-Arabic)
                'ks-arab' => 'کٲشُر', # Kashmiri (Perso-Arabic script)
                'ks-deva' => 'कॉशुर', # Kashmiri (Devanagari script)
index 5ad5bd3..4f0b535 100644 (file)
        "activeusers-intro": "Nyoë nakeuh dapeuta ureuëng ngui nyang na geuteumuléh lam $1 {{PLURAL:$1|uroë}} nyoë.",
        "activeusers-count": "$1 {{PLURAL:$1|buet}} lam {{PLURAL:$3|uroë|$3 uroë}} nyoë",
        "activeusers-from": "Peuleumah ureueng ngui nyang neuawai ngön:",
-       "activeusers-hidebots": "Peusom bot",
-       "activeusers-hidesysops": "Peusom ureueng urôh",
        "activeusers-noresult": "Hana ureueng ngui nyang meutumèe.",
        "listgrouprights": "Dapeuta khut ureueng ngui",
        "listgrouprights-key": "Teuneurang:\n* <span class=\"listgrouprights-granted\">Khut nyang geubri</span>\n* <span class=\"listgrouprights-revoked\">Khut nyang hana geubri</span>",
index eb15a0e..a5c7dd0 100644 (file)
        "passwordreset-emailtitle": "Аккаунт и гъэпсыкIэхэр, мий щыI {{SITENAME}}",
        "passwordreset-emailelement": "НэбгырацIэ: \n$1\n\nTemporary password: \n$2",
        "passwordreset-emailsentemail": "Мыр регистрыгъэ емэйлэу щытмэ уи аккаунтым пае, шъэфгущыIэм и зэтедз емэйл къыпфагъэхьыщт.",
-       "passwordreset-emailsent-capture": "ШъэфгущыIэм изэтедз фэгъэхьыгъэ емэйлыр гъахьыгъэ, ычIэгъкIэ ар олъэгъу.",
        "changeemail": "Зэблэхъу е тегъэкI емэйл адресыр",
        "changeemail-no-info": "Мы нэкIубгъом занкIэу укIонэу уфаемэ, системэм ухэхьэгъэн фае.",
        "changeemail-oldemail": "Джырэ емэйл адрес:",
        "content-model-javascript": "JavaScript",
        "content-json-empty-object": "Объект нэкI",
        "content-json-empty-array": "Массив нэкI",
-       "cantcreateaccounttitle": "Аккаунт ублэн лъэкIыгъэп",
        "viewpagelogs": "Мы нэкӏубгъом и логхэр къэгъэлъагъу",
        "nohistory": "Мы нэкIубгъом и еIэзэнмэ я тарихъ щыIэп.",
        "currentrev": "Ыужрэ версие",
        "linksearch-ok": "Лъыхъу",
        "listusers-submit": "Къэгъэлъагъу",
        "listusers-noresult": "Нэбгырэ пари гъотыгъэп.",
-       "activeusers-hidebots": "Ботхэр гъэбылъ",
-       "activeusers-hidesysops": "Администраторхэр гъэбылъ",
        "activeusers-noresult": "Нэбгырэ пари гъотыгъэп.",
        "listgrouprights": "Нэбгырэмэ якупмэ яфитыныгъэхэр",
        "listgrouprights-group": "Куп",
index cb869d0..794eae2 100644 (file)
        "yourname": "اسم المستخدم:",
        "yourpassword": "كلمة السر:",
        "yourpasswordagain": "أعد كتابة كلمة السر:",
-       "remembermypassword": "تذكر دخولي على هذا الحاسوب (إلى {{PLURAL:$1||يوم واحد|يومين|$1 أيام|$1 يومًا|$1 يوم}} كحد أقصى)",
        "yourdomainname": "نطاقك:",
        "externaldberror": "هناك إما خطأ في دخول قاعدة البيانات الخارجية أو أنه غير مسموح لك بتحديث حسابك الخارجي.",
        "login": "ادخل",
index d6534b6..d435dbb 100644 (file)
        "yourpasswordagain": "Herhaal wagwoord",
        "createacct-yourpasswordagain": "Bevestig wagwoord",
        "createacct-yourpasswordagain-ph": "Sleutel weer u wagwoord in",
-       "remembermypassword": "Onthou dat ek op hierdie rekenaar ingeteken het (vir 'n maksimum van $1 {{PLURAL:$1|dag|dae}})",
        "userlogin-remembermypassword": "Hou my aangemeld",
        "userlogin-signwithsecure": "Gebruik veilige verbinding",
        "yourdomainname": "U domein:",
        "passwordreset-emaildisabled": "E-posfunksies is afgeskakel op hierdie wiki.",
        "passwordreset-username": "Gebruiker:",
        "passwordreset-domain": "Domein:",
-       "passwordreset-capture": "Wys resulterende e-pos?",
-       "passwordreset-capture-help": "As u die boks merk, word die e-pos (met die tydelike wagwoord) aan u getoon en aan die gebruiker gestuur.",
        "passwordreset-email": "E-posadres:",
        "passwordreset-emailtitle": "Gebruiker se details op {{site name}}",
        "passwordreset-emailtext-ip": "Iemand, waarskynlik u vanaf die IP-adres $1, het u gebruikersgegewens vir {{SITENAME}} ($4) opgevra.\nDie volgende {{PLURAL:$3|gebruiker is|gebruikers is}} aan die e-posadres gekoppel:\n\n$2\n\n{{PLURAL:$3|Die tydelike wagwoord verval|Hierdie tydelike wagwoorde verval}} oor {{PLURAL:$5|een dag|$5 dae}}.\nMeld asseblief nou aan en wysig u wagwoord. As u dit nie versoek het nie, of as u die oorspronklike wagwoord nog ken en dit nie wil verander nie, ignoreer die berig en hou aan om u ou wagwoord te gebruik.",
        "userrights-reason": "Rede:",
        "userrights-no-interwiki": "U het nie toestemming om gebruikersregte op ander wiki's te verander nie.",
        "userrights-nodatabase": "Databasis $1 bestaan nie of is nie hier beskikbaar nie.",
-       "userrights-nologin": "U moet as 'n administrateur [[Special:UserLogin|aanmeld]] om gebruikersregte te kan toeken.",
-       "userrights-notallowed": "U het nie magtiging om gebruikersregte by te sit of weg te neem nie.",
        "userrights-changeable-col": "Groepe wat u kan verander",
        "userrights-unchangeable-col": "Groepe wat u nie kan verander nie",
        "userrights-conflict": "Konflik met gebruikersregte! Pas asseblief weer u wysigings toe.",
-       "userrights-removed-self": "U het u eie regte suksesvol verwyder. Gevolglik het u nie meer toegang tot hierdie bladsy nie.",
        "group": "Groep:",
        "group-user": "Gebruikers",
        "group-autoconfirmed": "Bevestigde gebruikers",
        "right-siteadmin": "Sluit en ontsluit die datbasis",
        "right-override-export-depth": "Eksporteer bladsye insluitend geskakelde bladsye tot 'n diepte van 5",
        "right-sendemail": "Stuur e-pos aan ander gebruikers",
-       "right-passwordreset": "Wys e-posse vir herstel van wagwoord",
        "newuserlogpage": "Logboek van nuwe gebruikers",
        "newuserlogpagetext": "Dit is 'n logboek van gebruikers wat onlangs ingeteken het.",
        "rightslog": "Gebruikersregtelogboek",
        "upload-copy-upload-invalid-domain": "Gekopieerde oplaaie word nie vanuit die domein toegelaat nie.",
        "upload-dialog-title": "Laai lêer op",
        "upload-dialog-button-cancel": "Kanselleer",
+       "upload-dialog-button-back": "Terug",
        "upload-dialog-button-done": "Gedoen",
        "upload-dialog-button-save": "Stoor",
        "upload-dialog-button-upload": "Oplaai",
        "usereditcount": "$1 {{PLURAL:$1|wysiging|wysigings}}",
        "usercreated": "{{GENDER:$3|Geregistreer}} op $1 om $2",
        "newpages": "Nuwe bladsye",
+       "newpages-submit": "Wys",
        "newpages-username": "Gebruikersnaam:",
        "ancientpages": "Oudste bladsye",
        "move": "Skuif",
        "activeusers-intro": "Hierdie is 'n lys van gebruikers wat die laaste {{PLURAL:$1|dag|$1 dae}} enige aktiwiteit getoon het.",
        "activeusers-count": "$1 onlangse {{PLURAL:$1|wysiging|wysigings}} in die {{PLURAL:$3|afgelope dag|laaste $3 dae}}",
        "activeusers-from": "Wys gebruikers, beginnende by:",
-       "activeusers-hidebots": "Versteek bots",
-       "activeusers-hidesysops": "Versteek administrateurs",
        "activeusers-noresult": "Geen gebruikers gevind nie.",
        "activeusers-submit": "Wys",
        "listgrouprights": "Gebruikersgroepregte",
        "trackingcategories-disabled": "Kategorie is gedeaktiveer",
        "mailnologin": "Geen versendadres beskikbaar",
        "mailnologintext": "U moet [[Special:UserLogin|ingeteken]] wees en 'n geldige e-posadres in u [[Special:Preferences|voorkeure]] hê om e-pos aan ander gebruikers te kan stuur.",
-       "emailuser": "Stuur e-pos na hierdie gebruiker",
+       "emailuser": "Stuur e-pos na dié gebruiker",
        "emailuser-title-target": "E-pos die {{GENDER:$1|gebruiker}}",
        "emailuser-title-notarget": "E-pos gebruiker",
        "emailpagetext": "As {{GENDER:$1|dié gebruiker}} 'n geldige e-posadres in sy/haar gebruikersvoorkeure het, sal hierdie vorm 'n enkele boodskap stuur. Die e-posadres in u [[Special:Preferences|gebruikersvoorkeure]] sal verskyn as die \"Van\"-adres van die pos. Dus sal die ontvanger kan terug antwoord.",
        "namespace_association": "Gekoppelde naamruimte",
        "tooltip-namespace_association": "Merk die boks om die besprekings- en onderwerpnaamruimte die by die geselekteerde naamruimte in te sluit",
        "blanknamespace": "(Hoof)",
-       "contributions": "{{GENDER:$1|Gebruikersbydraes}}",
+       "contributions": "{{GENDER:$1|Gebruikers­bydraes}}",
        "contributions-title": "$1 se bydraes",
        "mycontris": "Bydraes",
        "anoncontribs": "Bydraes",
        "pageinfo-length": "Bladsylengte (in grepe)",
        "pageinfo-article-id": "Bladsy-ID",
        "pageinfo-language": "Taal vir die bladsy",
+       "pageinfo-content-model-change": "wysig",
        "pageinfo-robot-policy": "Status vir soekenjins",
        "pageinfo-robot-index": "Toegestaan",
        "pageinfo-robot-noindex": "Nie toegestaan",
        "patrol-log-page": "Kontroleringslogboek",
        "patrol-log-header": "Die logboek wys weergawes wat as gekontroleer gemerk is.",
        "log-show-hide-patrol": "Nasienlogboek $1",
+       "confirm-markpatrolled-button": "OK",
        "deletedrevision": "Ou weergawe $1 geskrap",
        "filedeleteerror-short": "Fout met verwydering van lêer: $1",
        "filedeleteerror-long": "Foute het voorgekom by die skraping van die lêer:\n\n$1",
        "htmlform-cloner-create": "Meer meer by",
        "htmlform-cloner-delete": "Verwyder",
        "htmlform-cloner-required": "Ten minste één waarde verwag.",
+       "htmlform-date-placeholder": "JJJJ-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "JJJJ-MM-DD HH:MM:SS",
        "htmlform-title-badnamespace": "[[:$1]] is nie in die \"{{ns:$2}}\" naamspasie nie.",
        "htmlform-title-not-creatable": "\"$1\" is nie 'n aanvaarbare blad titel nie",
        "htmlform-title-not-exists": "$1 bestaan nie.",
-       "sqlite-has-fts": "Weergawe $1 met ondersteuning vir vol-teks soektogte (\"full-text search\")",
-       "sqlite-no-fts": "Weergawe $1 sonder ondersteuning vir vol-teks soektogte (\"full-text search\")",
+       "htmlform-user-not-exists": "<strong>$1</strong> bestaan nie.",
+       "htmlform-user-not-valid": "<strong>$1</strong> is nie 'n geldige gebruikersnaam nie.",
        "logentry-delete-delete": "$1 {{GENDER:$2|het}} bladsy $3 verwyder",
        "logentry-delete-restore": "$1 {{GENDER:$2|het}} bladsy $3 teruggeplaas",
        "logentry-delete-event": "$1 {{GENDER:$2|het}} die sigbaarheid van {{PLURAL:$5|'n logboekreël|$5 logboekreëls}} van $3 gewysig: $4",
        "feedback-bugornote": "As u reg is om 'n tegniese probleem in detail te beskryf, [$1 rapporteer 'n fout].\nAnders kan u die eenvoudige vorm hieronder gebruik. U kommentaar sal by die bladsy \"[$3 $2]\", saam met u gebruikersnaam en die webblaaier wat u gebruik gevoeg word.",
        "feedback-cancel": "Kanselleer",
        "feedback-close": "Gedoen",
-       "feedback-error-title": "Fout",
        "feedback-error1": "Fout: onbekende resultaat van die API",
        "feedback-error2": "Fout: Wysiging het gefaal",
        "feedback-error3": "Fout: Geen reaksie van API",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "bladsy bestaan nog nie",
        "mw-widgets-titleinput-description-redirect": "aanstuur na $1",
+       "sessionprovider-generic": "$1-sessies",
        "log-action-filter-all": "Alle",
-       "authprovider-resetpass-skip-label": "Slaan oor"
+       "authmanager-email-label": "E-pos",
+       "authmanager-email-help": "E-posadres",
+       "authmanager-realname-label": "Regte naam",
+       "authmanager-realname-help": "Die gebruiker se regte naam",
+       "authprovider-resetpass-skip-label": "Slaan oor",
+       "specialpage-securitylevel-not-allowed-title": "Nie toegestaan",
+       "cannotauth-not-allowed-title": "Geen toegang",
+       "cannotauth-not-allowed": "U word nie toegelaat om die bladsy te gebruik nie",
+       "credentialsform-account": "Gebruikersnaam:"
 }
index 23da0fa..5f9ab04 100644 (file)
        "yourname": "Nofka:",
        "yourpassword": "Fjalëkalimi:",
        "yourpasswordagain": "Fjalëkalimi përsëdyti:",
-       "remembermypassword": "Mbaj mend fjalëkalimin tem në këtë shfletues (për $1 {{PLURAL:$1|ditë|ditë}})",
        "yourdomainname": "Domena juej:",
        "externaldberror": "Ose pat gabim në databazën e autentifikimit, ose nuk lejoheni me ndryshue llogarinë tuej të jashtme.",
        "login": "Kyçu",
        "undo-failure": "Redaktimi nuk mund të kthehej për shkak të përplasjeve të ndërmjetshme.",
        "undo-norev": "S'mund të zhbëja këtë redaktim pasi nuk ekziston ose është grisur.",
        "undo-summary": "U kthye versioni $1 i bërë nga [[Special:Contributions/$2]] ([[User talk:$2]])",
-       "cantcreateaccounttitle": "Nuk mundet të krijohet llogaria",
        "cantcreateaccount-text": "Hapja e llogarive nga kjo adresë IP ('''$1''') është bllokuar nga [[User:$3|$3]].\n\nArsyeja e dhënë nga $3 është ''$2''.",
        "viewpagelogs": "Shih regjistrat për këtë faqe",
        "nohistory": "Nuk ka histori redaktimesh për këtë faqe.",
index 712dc1f..0033e3e 100644 (file)
        "yourpasswordagain": "መግቢያ ቃልዎን ዳግመኛ ይስጡ",
        "createacct-yourpasswordagain": "የመግቢያ ቃሉን ይድገሙ",
        "createacct-yourpasswordagain-ph": "የመግቢያ ቃሉን ይድገሙ",
-       "remembermypassword": "ለሚቀጥለው ጊዜ በዚ ኮምፒውተር ላይ በአባልነት ስሜ መግባቴን ( ቢባዛ ለ $1 {{PLURAL:$1|ቀን|ቀናት}}) አስታውስ።",
        "yourdomainname": "የእርስዎ ከባቢ (domain)፦",
        "password-change-forbidden": "በዚሁ ዊኪ መግቢያ ቃልን መቀይር አልተፈቀደም።",
        "externaldberror": "ወይም አፍአዊ የማረጋገጫ መረጃ-ቤት ስኅተት ነበረ፣ ወይም አፍአዊ አባልነትዎን ማሳደስ አልተፈቀዱም።",
        "passwordreset-email": "የኢ-ሜል አድራሻ:",
        "passwordreset-emailelement": "የአባል ስም፦ \n$1\n\nጊዜያዊ መግቢያ ቃል፦ \n$2",
        "passwordreset-emailsentemail": "የማስታወሻ ኢ-ሜል ተልኳል።",
-       "passwordreset-emailsent-capture": "የማስታወሻ ኢ-ሜል ተልኳል፤ ከዚህም ታች ይታያል።",
-       "passwordreset-emailerror-capture": "የማስታወሻ ኢ-ሜል ተልኳል፤ ከዚህም ታች ይታያል፤ ነገር ግን ወደ ተጠቃሚው ለመላክ ስንል አልተከናወነም፡",
        "changeemail": "ኢ-ሜል አድራሻዎን ለመቀይር",
        "changeemail-header": "የአባልነትዎን ኢ-ሜል አድራሻ ለመቀይር",
        "changeemail-no-info": "ይህንን ገጽ በቀጥታ ለማግኘት አስቀድሞ መግባት ያስፈልጋል።",
        "undo-failure": "ከዚሁ ለውጥ በኋላ ቅራኔ ለውጦች ስለ ገቡ ሊገለበጥ አይቻልም።",
        "undo-norev": "ለውጡ አይኖርም ወይም ጠፍቷልና ሊገለበጥ አልተቻለም።",
        "undo-summary": "አንድ ለውጥ $1 ከ[[Special:Contributions/$2|$2]] ([[User talk:$2|ውይይት]]) ገለበጠ",
-       "cantcreateaccounttitle": "ብዕር ስም ለመፍጠር አይቻልም",
        "cantcreateaccount-text": "ከዚሁ የቁጥር አድራሻ ('''$1''') የብዕር ስም መፍጠር በ[[User:$3|$3]] ታግዷል።\n\nበ$3 የተሰጠው ምክንያት ''$2'' ነው።",
        "viewpagelogs": "መዝገቦች ለዚሁ ገጽ",
        "nohistory": "ለዚሁ ገጽ የዕትሞች ታሪክ የለም።",
        "activeusers": "ተግባራዊ አባላት ዝርዝር",
        "activeusers-intro": "እነዚህ አባላት ባለፈው $1 ቀን ውስጥ ማናቸውንም አይነት ተግባር ፈጸሙ።",
        "activeusers-count": "$1 {{PLURAL:$1|ለውጥ|ለውጦች}} ባለፈው $3 ቀን ውስጥ",
-       "activeusers-hidebots": "ሎሌዎች ይደበቁ",
-       "activeusers-hidesysops": "መጋቢዎች ይደበቁ",
        "activeusers-noresult": "ማንም ተጠቃሚ አልተገኘም።",
        "listgrouprights": "የተጠቃሚ ስብስባ መብቶች",
        "listgrouprights-group": "ስብስባ",
index 75e8de8..f3d19ec 100644 (file)
        "passwordreset-disabled": "S'ha desactivau o restablimiento de claus en ista wiki.",
        "passwordreset-username": "Nombre d'usuario:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-capture": "Veyer o mensache resultant?",
-       "passwordreset-capture-help": "Si marca ista caixeta, se li amostrará o correu electronico (con a clau temporal) amás de ninviar-lo ta l'usuario.",
        "passwordreset-email": "Adreza de correu electronico:",
        "passwordreset-emailtitle": "Detalles d'a cuenta en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Belún (probablement vusté, dende l'adreza IP $1) ha demandau un recordatorio d'a información d'a suya cuenta en  {{SITENAME}} ($4). {{PLURAL:$3|A cuenta d'usuario siguient ye asociata|As cuentas d'usuario siguients son asociatas}} a ista adreza de correu-e:\n\n$2\n\n{{PLURAL:$3|Ista clau temporal circumducirá|Istas claus temporals circumducirán}} en {{PLURAL:$5|un día|$5 días}}. Habría de connectar-se agora y trigar una nueva clau. Si ista demanda no dimana de vusté, u ya se'n ha acordau d'a suya clau inicial y ya no deseya modificar-la, puet ignorar iste mensache y continar emplegando a suya viella clau.",
        "userrights-reason": "Razón:",
        "userrights-no-interwiki": "No tiene premiso ta editar os dreitos d'usuario en atras wikis.",
        "userrights-nodatabase": "A base de datos $1 no existe u no ye local.",
-       "userrights-nologin": "Ha d'[[Special:UserLogin|encetar una sesión]] con una cuenta d'almenistrador ta poder dar dreitos d'usuario.",
-       "userrights-notallowed": "A suya cuenta no tien permisos ta asignar u desasignar permisos d'usuario.",
        "userrights-changeable-col": "Grupos que puede cambiar",
        "userrights-unchangeable-col": "Collas que no puede cambiar",
        "group": "Colla:",
        "right-siteadmin": "Trancar y destrancar a base de datos",
        "right-override-export-depth": "Exporta pachinas que incluigan as enlazadas dica un fundaria de 5",
        "right-sendemail": "Ninviar un correu electronico a atros usuarios",
-       "right-passwordreset": "Veyer os correus electronicos de restabimiento de claus",
        "newuserlogpage": "Rechistro de nuevos usuarios",
        "newuserlogpagetext": "Isto ye un rechistro de creyación d'usuarios.",
        "rightslog": "Rechistro de cambios en os dreitos d'os usuarios",
        "booksources-search": "Mirar",
        "booksources-text": "Contino ye una lista de vinclos ta atros puestos an que venden libros nuevos y usatos, talment bi haiga más información sobre os libros que ye mirando.",
        "booksources-invalid-isbn": "O numero d'ISBN dato pareix que no ye conforme; comprebe si no bi ha garra error en copiar d'a fuent orichinal.",
+       "magiclink-tracking-rfc": "Pachinas que fan servir vinclos machicos RFC",
+       "magiclink-tracking-rfc-desc": "Ista pachina fa servir vinclos machicos de RFC. Se veiga [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sobre cómo migrar.",
+       "magiclink-tracking-pmid": "Pachinas que fan servir vinclos machicos PMID",
+       "magiclink-tracking-pmid-desc": "Ista pachina fa servir vinclos machicos de PMID. Se veiga [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sobre cómo migrar.",
+       "magiclink-tracking-isbn": "Pachinas que fan servir vinclos machicos d'ISBN",
+       "magiclink-tracking-isbn-desc": "Ista pachina fa servir vinclos machicos d'ISBN. Se veiga [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sobre cómo migrar.",
        "specialloguserlabel": "Fedor:",
        "speciallogtitlelabel": "Obchectivo (titol u usuario):",
        "log": "Rechistros",
        "activeusers-intro": "Ista ye una lista d'usuarios que han teniu bella actividat en os zaguers $1 {{PLURAL:$1|diya|diyas}}.",
        "activeusers-count": "$1 {{PLURAL:$1|edición|edicions}} en os zaguers {{PLURAL:$3|diya|$3 diyas}}",
        "activeusers-from": "Amostrar nombres d'usuario que prencipien por:",
-       "activeusers-hidebots": "Amagar robots",
-       "activeusers-hidesysops": "Amagar administradors",
        "activeusers-noresult": "No s'han trobato usuarios.",
        "listgrouprights": "Dreitos d'a colla d'usuarios",
        "listgrouprights-summary": "Contino trobará a lista de collas d'usuario definitas en iste wiki, con os suyos dreitos d'acceso asociatos. Tamién puet trobar aquí [[{{MediaWiki:Listgrouprights-helppage}}|información adicional]] sobre os dreitos individuals.",
index 5a3781b..56bbdfe 100644 (file)
        "createacct-yourpassword-ph": "कूटशब्द दर्ज करऽ",
        "createacct-yourpasswordagain": "कूटशब्द केरऽ पुष्टि करऽ",
        "createacct-yourpasswordagain-ph": "कूटशब्द पुनः लिखऽ",
-       "remembermypassword": "इ कंप्यूटर पर हमरॊ लॉग-इन सूचना याद रखॊ (अधिकतम $1 {{PLURAL:$1|दिन|दिन}} लेली)",
        "userlogin-remembermypassword": "हमरा लॉगिन रखऽ",
        "login": "लॉग इन",
        "nav-login-createaccount": "सत्रारंभ / खाता खोलॊ",
index 9c3698b..5e03d50 100644 (file)
        "views": "معاينة",
        "toolbox": "أدوات",
        "tool-link-userrights": "تغيير مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
+       "tool-link-userrights-readonly": "عرض مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
        "tool-link-emailuser": "أرسل رسالة {{GENDER:$1|لهذا المستخدم|لهذه المستخدمة}}",
        "userpage": "طالع صفحة المستخدم",
        "projectpage": "طالع صفحة المشروع",
        "passwordreset-emaildisabled": "تم تعطيل ميزات البريد الإلكتروني على هذه الويكي.",
        "passwordreset-username": "اسم المستخدم:",
        "passwordreset-domain": "النطاق:",
-       "passwordreset-capture": "أأعرض البريد الإلكتروني الناتج؟",
-       "passwordreset-capture-help": "إذا علّمت هذا الصندوق فسيعرض لك البريد الإلكتروني (الذي يحتوي كلمة سر مؤقتة) وسيرسل أيضا للمستخدم.",
        "passwordreset-email": "عنوان البريد الإلكتروني:",
        "passwordreset-emailtitle": "تفاصيل حساب {{SITENAME}}",
        "passwordreset-emailtext-ip": "أحد ما (قد يكون أنت، من العنوان $1)  طلب إعادة ضبط كلمة سر حسابك على {{SITENAME}} ($4). {{PLURAL:$3||الحساب|الحسابان| الحسابات}} أدناه قد اقترنت ببريدك الإلكتروني :\n\n$2\n\n{{PLURAL:$3||كلمة السر المؤقتة|كلمات السر المؤقتة}} ستنتهي صلاحيتها في {{PLURAL:$5||يوم واحد|يومين|$5 أيام|$5 يوما|$5 يوم}}\nيمكنك تسجيل الدخول واختيار كلمة سر جديدة. إذا كان هذا الطلب تم بواسطة شخص أخر، أو إذا تذكرت كلمة السر الأصلية الخاصة بك، ولم تعد ترغب في تغييرها، يمكنك تجاهل هذه الرسالة ومتابعة استخدام كلمة السر القديمة.",
        "passwordreset-emailelement": "اسم {{GENDER:$1\n|المستخدم|المستخدمة}}: \n$1\n\nكلمة السر المؤقتة: \n$2",
        "passwordreset-emailsentemail": "إذا كان هذا العنوان البريد مرتبط بحسابك، من ثم سيتم إرسال بريد إلكتروني لإعادة تعيين كلمة السر.",
        "passwordreset-emailsentusername": "إذا كان هناك عنوان بريد إلكتروني مرتبط بهذا المستخدم، ثم سيتم إرسال بريد إلكتروني لإعادة تعيين كلمة السر.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|رسالة|رسائل}} البريد الإلكتروني لضبط كلمة السر تم إرسالها. {{PLURAL:$1|اسم المستخدم وكلمة السر معروضان|قائمة أسماء المستخدمين وكلمات السر معروضة}} هنا.",
-       "passwordreset-emailerror-capture2": "إرسال بريد إلى {{GENDER:$2|المستخدم|المستخدمة}} فشل: $1 {{PLURAL:$3|اسم المستخدم وكلمة السر معروضان|قائمة أسماء المستخدمين وكلمات السر معروضة}} هنا.",
        "passwordreset-nocaller": "يجب أن يتم توفير مستدعي",
        "passwordreset-nosuchcaller": "المستدعي غير موجود: $1",
        "passwordreset-ignored": "إعادة ضبط كلمة السر لم تتم التعامل معها. ربما لا موفر تم ضبطه؟",
-       "passwordreset-invalideamil": "عنوان بريد إلكتروني غير صالح",
+       "passwordreset-invalidemail": "عنوان بريد إلكتروني غير صالح",
        "passwordreset-nodata": "لا اسم مستخدم ولا عنوان بريد الإلكتروي تم توفيره",
        "changeemail": "تغيير أو إزالة عنوان البريد الإلكتروني",
        "changeemail-header": "إكمال هذا النموذج لتغيير عنوان البريد الإلكتروني الخاص بك. إذا كنت ترغب في إزالة جمعية أي عنوان البريد الإلكتروني من حسابك، وترك الفراغ عنوان البريد الإلكتروني الجديد عند تقديم النموذج",
        "prefs-help-recentchangescount": "بما في ذلك أحدث التغييرات وتاريخ الصفحات والسجلات.",
        "prefs-help-watchlist-token2": "هذا هو المفتاح السري لتغذية الويب لقائمة مراقبتك.\nيمكن لأي شخص يعرفه أن يقرأ قائمة مراقبتك، ولذا لا تتشاركه مع أحد. [[Special:ResetTokens|انقر هنا إذا أردت إعادة ضبطه]].",
        "savedprefs": "تم حفظ تفضيلاتك.",
-       "savedrights": "حُفظت الصلاحيات الجديدة {{GENDER:$1|للمستخدم|للمستخدمة}} $1.",
+       "savedrights": "حُفظت المجموعات الجديدة {{GENDER:$1|للمستخدم|للمستخدمة}} $1.",
        "timezonelegend": "المنطقة الزمنية:",
        "localtime": "الوقت المحلي:",
        "timezoneuseserverdefault": "استخدام الويكي الافتراضي ($1)",
        "prefswarning-warning": "لقد أجريت تعديلات على تفضيلاتك، ولم تُحفَظ بعد.\nإذا غادرت هذه الصفحة دون أن تنقر على «$1» لن يتم تحديث تفضيلاتك.",
        "prefs-tabs-navigation-hint": "تلميح: يمكنك استخدام مفتاحي السهمين الأيمن والأيسر للتنقل بين الألسنة في قائمة الألسنة.",
        "userrights": "صلاحيات المستخدم",
-       "userrights-lookup-user": "أدÙ\90ر Ù\85جÙ\85Ù\88عات المستخدم",
+       "userrights-lookup-user": "اختÙ\8aار المستخدم",
        "userrights-user-editname": "أدخل اسم مستخدم:",
-       "editusergroup": "عدÙ\84 Ù\85جÙ\85Ù\88عات {{GENDER:$1|اÙ\84Ù\85ستخدÙ\85|اÙ\84Ù\85ستخدÙ\85Ø©}}",
+       "editusergroup": "تحÙ\85Ù\8aÙ\84 Ù\85جÙ\85Ù\88عات Ø§Ù\84Ù\85ستخدÙ\85",
        "editinguser": "تغيير صلاحيات {{GENDER:$1|المستخدم|المستخدمة}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "تعديل مجموعات المستخدم",
        "saveusergroups": "احفظ مجموعات {{GENDER:$1|المستخدم|المستخدمة}}",
        "userrights-reason": "السبب:",
        "userrights-no-interwiki": "أنت لا تمتلك الصلاحية لتعديل صلاحيات المستخدمين على الويكيات الأخرى.",
        "userrights-nodatabase": "قاعدة البيانات $1 غير موجودة أو ليست محلية.",
-       "userrights-nologin": "يجب عليك [[Special:UserLogin|تسجيل الدخول]] بحساب إداري لتعديل صلاحيات المستخدم.",
-       "userrights-notallowed": "ليس لديك إذن لإضافة أو إزالة صلاحيات المستخدمين.",
        "userrights-changeable-col": "المجموعات التي يمكنك تغييرها",
        "userrights-unchangeable-col": "المجموعات التي لا يمكنك تغييرها",
        "userrights-conflict": "تضارب في تغيير صلاحيات المستخدم! الرجاء مراجعة تغييراتك مجدّدا وتأكيدها.",
-       "userrights-removed-self": "أزلت بنجاح صلاحياتك، ولن تتمكن من الوصول لهذه الصفحة مجددا.",
        "group": "المجموعة:",
        "group-user": "مستخدمون",
        "group-autoconfirmed": "مستخدمون مؤكدون تلقائيا",
        "right-siteadmin": "غلق ورفع غلق قاعدة البيانات",
        "right-override-export-depth": "تصدير الصفحات متضمنة الصفحات الموصولة حتى عمق 5",
        "right-sendemail": "إرسال رسائل بريد إلكتروني إلى مستخدمين آخرين",
-       "right-passwordreset": "عرض رسائل إعادة ضبط كلمات السر",
        "right-managechangetags": "إنشاء وتعطيل [[Special:Tags|الوسوم]]",
        "right-applychangetags": "تطبيق [[Special:Tags|الوسوم]]  مع التغييرات التي أجريتها.",
        "right-changetags": "إضافة وإزالة [[Special:Tags|وسوم]] في مراجعات ومدخلات سجل فردية",
        "apisandbox-continue": "استمرار",
        "apisandbox-continue-clear": "إفراغ",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} س [https://www.mediawiki.org/wiki/API:Query#Continuing_queries يستمر] في الطلب الأخير؛ {{int:apisandbox-continue-clear}} سيفرغ المعاملات المرتبطة بالاستمرار.",
+       "apisandbox-param-limit": "أدخل <kbd>max</kbd> لاستخدام الحد الأقصى.",
+       "apisandbox-multivalue-all-namespaces": "$1 (كل النطاقات)",
+       "apisandbox-multivalue-all-values": "$1 (كل القيم)",
        "booksources": "مصادر كتاب",
        "booksources-search-legend": "البحث عن مصادر الكتب",
        "booksources-isbn": "ردمك:",
        "booksources-search": "بحث",
        "booksources-text": "توجد أدناه قائمة بوصلات لمواقع أخرى تبيع الكتب الجديدة والمستعملة، أيضا يمكنك أن تحصل على معلومات إضافية عن الكتب التي تبحث عنها من هناك:",
        "booksources-invalid-isbn": "رقم ISBN المعطى لا يبدو صحيحا؛ تحقق من أخطاء النسخ من المصدر الأصلي.",
+       "magiclink-tracking-rfc": "الصفحات التي تستخدم الوصلات السحرية لRFC",
+       "magiclink-tracking-rfc-desc": "هذه الصفحة تستخدم الوصلات السحرية لRFC. انظر [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] حول كيفية التغيير.",
+       "magiclink-tracking-pmid": "الصفحات التي تستخدم الوصلات السحرية لPMID",
+       "magiclink-tracking-pmid-desc": "هذه الصفحة تستخدم الوصلات السحرية لPMID. انظر [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] حول كيفية التغيير.",
+       "magiclink-tracking-isbn": "الصفحات التي تستخدم الوصلات السحرية لISBN",
+       "magiclink-tracking-isbn-desc": "هذه الصفحة تستخدم الوصلات السحرية لISBN. انظر [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] حول كيفية التغيير.",
        "specialloguserlabel": "المؤدي:",
        "speciallogtitlelabel": "الهدف (عنوان أو {{ns:user}}:اسم المستخدم للمستخدم):",
        "log": "سجلات",
        "activeusers-count": "{{PLURAL:$1|لا أفعال|فعل واحد|فعلان اثنان|$1 أفعال|$1 فعلا|$1 فعل}} منذ {{PLURAL:$3||يوم|يومين|$3 أيام|$3 يوما|$1 يوم}}",
        "activeusers-from": "اعرض المستخدمين ابتداء من:",
        "activeusers-groups": "عرض المستخدمين المنتمين للمجموعات:",
+       "activeusers-excludegroups": "استثن المستخدمين المنتمين للمجموعات:",
        "activeusers-noresult": "لم يعثر على أي مستخدمين",
        "activeusers-submit": "عرض المستخدمين النشطين",
        "listgrouprights": "صلاحيات مجموعات المستخدمين",
        "modifiedarticleprotection": "غير مستوى حماية \"[[$1]]\"",
        "unprotectedarticle": "أزال الحماية من \"[[$1]]\"",
        "movedarticleprotection": "نقل إعدادات الحماية من \"[[$2]]\" إلى \"[[$1]]\"",
-       "protectedarticle-comment": "{{الجنس:$2|محمي}} [[$1]]",
+       "protectedarticle-comment": "{{GENDER:$2|محمي}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|غير مستوى الحماية|غيرت مستوى الحماية}} ل\"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|أزال الحماية|أزالت الحماية}} من \"[[$1]]\"",
        "protect-title": "ضبط حماية \"$1\"",
        "protect-title-notallowed": "عرض مستوى حماية \"$1\"",
        "prot_1movedto2": "نُقلت [[$1]] إلى [[$2]]",
        "patrol-log-header": "هذا سجل بالمراجعات المراجعة.",
        "log-show-hide-patrol": "$1 سجل الخفر",
        "log-show-hide-tag": "$1 سجل الوسوم",
+       "confirm-markpatrolled-button": "موافق",
+       "confirm-markpatrolled-top": "علم على المراجعة $3 من $2 كمراجعة؟",
        "deletedrevision": "حذف المراجعة القديمة $1",
        "filedeleteerror-short": "خطأ حذف الملف: $1",
        "filedeleteerror-long": "حدثت أخطاء أثناء حذف الملف:\n\n$1",
        "tags-deactivate": "تعطيل",
        "tags-hitcount": "{{PLURAL:$1|لا تغييرات|تغيير واحد|تغييران|$1 تغييرات|$1 تغييرا|$1 تغيير}}",
        "tags-manage-no-permission": "ليس لديك صلاحية إدارة وسوم التغيير.",
-       "tags-manage-blocked": "لا يمكنك إدارة علامات التغيير في حين منعت.",
+       "tags-manage-blocked": "لا يمكنك إدارة وسوم التغيير أثناء {{GENDER:$1|منعك}}.",
        "tags-create-heading": "إنشاء وسم جديد",
        "tags-create-explanation": "في الوضع الافتراضي، الوسوم الجديدة المنشأة سيتاح استخدامها للبوتات والمستخدمين.",
        "tags-create-tag-name": "اسم الوسم:",
        "tags-deactivate-not-allowed": "من غير الممكن تعطيل الوسم \"$1\".",
        "tags-deactivate-submit": "عطل",
        "tags-apply-no-permission": "ليس لديك إذن لتطبيق علامات التغيير جنبا إلى جنب مع التغييرات.",
-       "tags-apply-blocked": "لا يمكنك تطبيق علامات التغيير جنبا إلى جنب مع التغييرات في حين منعت.",
+       "tags-apply-blocked": "لا يمكنك تطبيق وسوم التغيير جنبا إلى جنب مع تغييراتك أثناء {{GENDER:$1|منعك}}.",
        "tags-apply-not-allowed-one": "الوسم \"$1\" غير مسموح أن يتم تطبيقه يدويا.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|الوسم|الوسوم}} التالية غير مسموح أن يتم تطبيقها يدويا: $1",
        "tags-update-no-permission": "أنت لا تمتلك السماح لإضافة أو إزالة وسوم التغيير من المراجعات أو مدخلات السجل الفردية.",
-       "tags-update-blocked": "لا يمكنك إضافة أو إزالة العلامات التغيير بينماهي محظورة.",
+       "tags-update-blocked": "لا يمكنك إضافة أو إزالة وسوم التغيير أثناء {{GENDER:$1|منعك}}.",
        "tags-update-add-not-allowed-one": "الوسم \"$1\" غير مسموح أن تتم إضافته يدويا.",
        "tags-update-add-not-allowed-multi": "The following {{PLURAL:$2|الوسم|الوسوم}} التالية غير مسموح أن تتم إضافتها يدويا: $1",
        "tags-update-remove-not-allowed-one": "من غير المسموح بإزالة وسم \"$1\".",
        "htmlform-user-not-exists": "<strong>$1</strong> غير موجود",
        "htmlform-user-not-valid": "اسم المستخدم <strong>$1</strong> غير صالح.",
        "logentry-delete-delete": "{{GENDER:$2|حذف|حذفت}} $1 صفحة $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|حذف|حذفت}} التحويلة $3 بواسطة إعادة الكتابة",
        "logentry-delete-restore": "{{GENDER:$2|استرجع|استرجعت}} $1 صفحة $3",
        "logentry-delete-event": "{{GENDER:$2|غيّر|غيّرت}} $1 إمكانية مشاهدة {{PLURAL:$5||حدث|حدثين|$5 أحداث|$5 حدثًا|$5 حدث}} في سجل $3: $4",
        "logentry-delete-revision": "غيّر{{GENDER:$2||ت}} $1 إمكانية مشاهدة {{PLURAL:$5||مراجعة واحدة|مراجعتين|$5 مراجعات|$5 مراجعة}} في صفحة $3: $4",
        "mw-widgets-dateinput-no-date": "لا تاريخ تم اختياره",
        "mw-widgets-titleinput-description-new-page": "الصفحة غير موجودة بعد",
        "mw-widgets-titleinput-description-redirect": "تحويل إلى $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "أضف تصنيفا...",
        "sessionmanager-tie": "لا يمكن جمع أنواع استيثاق متعددة: $1.",
        "sessionprovider-generic": "جلسات $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "جلسات قائمة على ملفات تعريف الارتباط (كوكيز)",
        "log-action-filter-contentmodel-change": "تغيير موديل المحتوى",
        "log-action-filter-contentmodel-new": "إنشاء صفحة بموديل محتوى غير قياسي",
        "log-action-filter-delete-delete": "حذف الصفحات",
+       "log-action-filter-delete-delete_redir": "إعادة الكتابة فوق التحويلة",
        "log-action-filter-delete-restore": "استرجاع الصفحات",
        "log-action-filter-delete-event": "حذف السجلات",
        "log-action-filter-delete-revision": "حذف المراجعات",
        "usercssispublic": "من فضل لاحظ: صفحات الCSS الفرعية لا ينبغي أن تحتوي على بيانات سرية بما أنها يمكن رؤيتها بواسطة المستخدمين الآخرين.",
        "restrictionsfield-badip": "عنوان أيبي أو نطاق غير صحيح: $1",
        "restrictionsfield-label": "نطاقات الأيبي المسموح بها:",
-       "restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "خطأ: $1",
-       "edit-error-long": "الأخطاء:\n\n$1"
+       "restrictionsfield-help": "عنوان أيبي أو نطاق CIDR واحد لكل سطر. لتفعيل كل شيء، استخدم<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 3907c46..8d20e95 100644 (file)
        "yourpasswordagain": "ܟܬܘܒ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢܬܐ ܐܚܪܬܐ:",
        "createacct-yourpasswordagain": "ܫܪܪ ܡܠܬܐ ܕܥܠܠܐ",
        "createacct-yourpasswordagain-ph": "ܐܥܠ ܡܠܬܐ ܕܥܠܠܐ ܙܒܢ ܐܚܪܝܢ",
-       "remembermypassword": "ܕܟܘܪ ܥܠܠܬܝ ܥܠ ܡܦܐܬܢܐ ܗܢܐ (ܠܡܬܚܐ ܥܠܝܐ ܕ $1 {{PLURAL:$1|ܝܘܡܐ|ܝܘܡܬ̈ܐ}})",
        "userlogin-remembermypassword": "ܫܒܘܩ ܠܝ ܥܠܝܠܐ ܒܚܘܫܒܢܝ",
        "userlogin-signwithsecure": "ܐܚܫܚ ܕܒܝܩܘܬܐ ܡܫܝܢܢܬܐ",
        "login": "ܥܘܠ",
        "edit-already-exists": "ܒܪܝܐ ܕܦܐܬܐ ܚܕܬܐ ܠܐ ܡܬܡܨܝܢܐ.\nܗܕܐ ܦܐܬܐ ܐܝܬ ܡܢ ܟܕܘ.",
        "editwarning-warning": "ܐܢ ܫܒܩܬ ܦܐܬܐ ܗܕܐ ܡܬܡܨܝܢܬܐ ܐܝܬܝܗ ܕܚܣܪܬ ܟܠ ܫܘܚܠܦ̈ܐ ܕܥܒܝܕܬ ܗܪܟܐ.\nܡܨܬ ܕܬܒܛܠ ܙܘܗܪܐ ܗܢܐ ܐܢ ܥܠܝܠܐ ܐܝܬܝܟ ܒܡܢܬܐ ܕ\"ܫܚܠܦܬܐ\" ܒܨܒܝܢܝܘܬ̈ܐ.",
        "undo-summary": "ܠܐ ܬܥܒܕ $1 ܒܝܕ [[Special:Contributions/$2|$2]] ([[User talk:$2|ܡܡܠܠܐ]])",
-       "cantcreateaccounttitle": "ܒܪܝܐ ܕܚܘܫܒܢܐ ܠܐ ܡܬܡܨܝܢܐ",
        "viewpagelogs": "ܚܙܝ ܣܓܠ̈ܐ ܕܦܐܬܐ ܗܕܐ",
        "nohistory": "ܠܝܬ ܬܫܥܝܬܐ ܕܫܘܚܠܦ̈ܐ ܠܦܐܬܐ ܗܕܐ",
        "currentrev": "ܬܢܝܬܐ ܗܫܝܬܐ",
        "activeusers": "ܡܟܬܒܘܬܐ ܕܗܕ̈ܡܐ ܙܪ̄ܝܙܐ",
        "activeusers-count": "$1 {{PLURAL:$1|ܥܒܕܐ|ܥܒܕ̈ܐ}} ܒ {{PLURAL:$3|ܝܘܡܐ ܐܚܪܝܐ|$3 ܝܘܡܬ̈ܐ ܐܚܪ̈ܝܐ}}",
        "activeusers-from": "ܚܘܝ ܡܦܠܚܢ̈ܐ ܕܫܪܐ ܥܡ:",
-       "activeusers-hidebots": "ܛܫܝ ܒܘܬ̈ܐ (bots)",
-       "activeusers-hidesysops": "ܛܫܝ ܡܕܒܪ̈ܢܐ",
        "activeusers-noresult": "ܠܐ ܐܫܬܟܚ ܡܦܠܚܢ̈ܐ ܐܢܫ̈ܝܢ.",
        "listgrouprights": "ܙܕ̈ܩܐ ܕܟܢܘܫܬܐ ܕܡܦܠܚܢ̈ܐ",
        "listgrouprights-group": "ܟܢܘܫܬܐ",
index 3dfb6ab..79fc096 100644 (file)
        "yourpasswordagain": "عاود كتبت كلمت السر:",
        "createacct-yourpasswordagain": "أكّد كلمت` السرّ",
        "createacct-yourpasswordagain-ph": "عاود دخّل كلمت` السرّ",
-       "remembermypassword": "اتفكر الدخول تاعي ب هاذ النافيكاتور (ب مدّة حدها{{PLURAL:$1||يوم واحد|يومين|$1 إيّام|$1 يوم}})",
        "userlogin-remembermypassword": "خلّيني مسجّل داخل",
        "userlogin-signwithsecure": "استعمل التوصال المأمون.",
        "yourdomainname": "الدومان تاعك:",
        "passwordreset-emailtext-user": "المستعملي $1 ف {{SITENAME}} راه طلب تبدال ف كلمت` السرّ تاعك ف {{SITENAME}}\n($4). {{PLURAL:$3|الحساب|الحسايات}} تاع المستعملي {{PLURAL:$3|راه مربوط|راهم مربوطين}} ب لادريسة تاع ليمال هادي:\n\n$2\n\n{{PLURAL:$3|هاد كلمت` السرّ المأقّتة|هادي كلمات` السرّ المأقّتة}} غادي يكمل صلوحها منّا على {{PLURAL:$5|نهار واحد|$5 إيّام}}.\nمادابيك تسجّل داخل ضركا و تختار كلمت` سرّ جديدة. يلا كان وحداخُر دار هاد المطلب، ولا راك ضركا تفكّرت كلمت` السرّ تاعك القديمة و ما بقيتش باغي تبدّلها، تنجم برك تتنسّا هاد الميساج و تدخُل ب كلمت` السرّ تاعك تاع مضاري.",
        "passwordreset-emailelement": "سميّت` المستعملي: \n$1\n\nكلمت` السرّ المأقّتة: \n$2",
        "passwordreset-emailsentemail": "راه نبعَت إيمال تاع تبدال كلمت` السرّ.",
-       "passwordreset-emailsent-capture": "راه اترسل إيمال تاع تبدال كلمت` السرّ، و راه محطوط هنا لتحت.",
-       "passwordreset-emailerror-capture": "راه اترسل الإيمال تاع تبدال كلمت` السرّ، الّي راح محطوط هنا لتحت، بصّح البعيت تاعهُ لل {{GENDER:$2|مستعملي}} ما نجحش: $1",
        "changeemail": "بدّل لادريسة تاع الإيمال",
        "changeemail-header": "كمّل الكتبة ف` الجدوال هادا باش تبدّل لادريسة تاع الإيمال تاعك. يلزم لك تدخّل كلمت` السرّ تاعك باش تأكّد هاد التبدال.",
        "changeemail-no-info": "لازم لك تكون مسجّل داخل باش توصَل ل هاد الپاجة بسّراح.",
index 74c6dec..dcab5ec 100644 (file)
        "yourname": "smiṫ l-mosṫĥdim:",
        "yourpassword": "Saroṫ:",
        "yourpasswordagain": "aaawd ktb lmot de passe dyalk",
-       "remembermypassword": "Ĝqel ĝla smiyṫ l-ḫsab dyali fe had l-ordinaṫør (ġir limoddaṫ {{PLURAL:$1|yom waḫed|$1 iyyam}})",
        "yourdomainname": "domain dyalk",
        "externaldberror": "kayn imma ċi ĥata' f-doĥol qaĝidaṫ l-bayanaṫ wlla rah ma msmoḫ-likċ baċ ṫḫddṫ l-ḫisab l-ĥariji taĝk.",
        "login": "Dĥel",
        "undo-failure": "ma ṣlaḫ-ċ ṫredd ṫ-ṫĝdil ḫiṫ tra ċi ṫĝdil mn morah.",
        "undo-norev": "ma ṣlaḫ-ċ ṫredd ṫ-ṫĝdil ḫiṫ ma kayn-ċ wlla ṫhyyed.",
        "undo-summary": "reḍḍ l-morajaĝa $1 d-[[Special:Contributions/$2|$2]] ([[User talk:$2|niqaċ]])",
-       "cantcreateaccounttitle": "lcont maymknch tnchaa",
        "viewpagelogs": "Ċof l-ĝamaliyaṫ dyal had ṣ-ṣefḫa",
        "nohistory": "ma kayn ḫṫṫa istorik d-ṫĝdilaṫ l-had ṣfḫa.",
        "currentrev": "Ċof l-versyon l-leĥĥra",
        "listusers-blocked": "(mbloki)",
        "activeusers": "lista dyal lmostkhdimin nachtin",
        "activeusers-from": "wrri l-mosṫĥdimin lli badyin mn:",
-       "activeusers-hidebots": "khbbi lbotat",
-       "activeusers-hidesysops": "Khbbi lidariyin",
        "activeusers-noresult": "ta mostakhdim matlgach.",
        "listgrouprights": "salahiyat mjmoat lmostkhdimin",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">ḫoqoq mĝtiyya</span>\n* <span class=\"listgrouprights-revoked\">ḫoqoq mḫeyyda</span>",
        "htmlform-submit": "ṣift",
        "htmlform-reset": "rojoa an taadilat",
        "htmlform-selectorother-other": "okhra",
-       "sqlite-has-fts": "$1 maa imkaniyat lbaht f nass kaml",
-       "sqlite-no-fts": "$1 imkaniyat lbaht f nass kaml",
        "revdelete-restricted": "tḅḅq ḍ-ḍawaḅit ll-idariyyin",
        "revdelete-unrestricted": "ḫyyd ḍ-ḍawaḅit ll-idariyyin",
        "rightsnone": "(walo)",
index 0e51642..947d17d 100644 (file)
        "userlogin-yourpassword": "الباسورد:",
        "yourpasswordagain": "اكتب الباسورد تاني:",
        "createacct-yourpasswordagain": "أكد كلمه السر",
-       "remembermypassword": " (لمدة   $1 {{PLURAL:$1|يوم|يوم}})خليك فاكر دخولى على الكمبيوتر دا",
        "yourdomainname": "النطاق بتاعك:",
        "externaldberror": "يا إما فى حاجة غلط فى الدخول على قاعدة البيانات الخارجية أو انت مش مسموح لك تعمل تحديث لحسابك الخارجي.",
        "login": "دخول",
        "activeusers-intro": "دى قايمه اليوزرات اللى عملوا نشاط فى آخر $1 {{PLURAL:$1|يوم|يوم}}.",
        "activeusers-count": "$1 {{PLURAL:$1|تعديل|تعديل}} فى آخر {{PLURAL:$3|يوم|$3 يوم}}",
        "activeusers-from": "عرض اليوزرات بداية من:",
-       "activeusers-hidebots": "خبى البوتات",
-       "activeusers-hidesysops": "خبى السيسوبات",
        "activeusers-noresult": "مالقيناش اى يوزر",
        "listgrouprights": "حقوق مجموعات اليوزرز",
        "listgrouprights-summary": "دى لستة بمجموعات اليوزرز المتعرفة فى الويكى دا، بالحقوق اللى معاهم.\nممكن تلاقى معلومات زيادة عن الحقوق بتاعة كل واحد  [[{{MediaWiki:Listgrouprights-helppage}}|هنا]].",
index 8a8a45a..70a1442 100644 (file)
        "activeusers-intro": "যোৱা  {{PLURAL:$1|দিন|দিন}}ৰ ভিতৰত অৱদান আগবঢ়োৱা ব্যৱহাৰকাৰীৰ তালিকা",
        "activeusers-count": "যোৱা {{PLURAL:$3|দিনত|$3 দিনত}} সৰ্বমুঠ $1 {{PLURAL:$1|টা কাম}}",
        "activeusers-from": "ইয়াৰে আৰম্ভ হোৱা ব্যৱহাৰকাৰী সকল দেখুৱাওক:",
-       "activeusers-hidebots": "বট নেদেখুৱাব",
-       "activeusers-hidesysops": "প্ৰশাসক নেদেখুৱাব",
        "activeusers-noresult": "কোনো সদস্য পোৱা নগ'ল।",
        "listgrouprights": "ব্যৱহাৰকাৰী গোটৰ অধিকাৰ",
        "listgrouprights-summary": "এই ৱিকিত থকা গোটসমূহৰ তালিকা সেইবোৰৰ প্ৰৱেশাধিকাৰসহ তলত দিয়া হ’ল ।\nসুকীয়া অধিকাৰ সম্পৰ্কে [[{{MediaWiki:Listgrouprights-helppage}}|অধিক তথ্য]] থাকিব পাৰে ।",
index dde90d0..48ab3ee 100644 (file)
        "yourpasswordagain": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485 M528x514S15a39472x487S28802506x486S18250481x499 S38a00464x490",
        "createacct-yourpasswordagain": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485 M528x514S15a39472x487S28802506x486S18250481x499",
        "createacct-yourpasswordagain-ph": "M535x523S14c50508x492S14c58469x492S22520503x477S22520465x477 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485 M528x514S15a39472x487S28802506x486S18250481x499",
-       "remembermypassword": "M538x567S1f548504x543S1f520513x534S1f520513x481S22b04522x499S2ff00482x483 M514x514S15a01491x487S20500487x503 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 M536x521S2ff00482x483S10011515x491S28108515x461 M508x525S10004493x475S22a04494x510 M523x528S14011492x504S15a00477x495S2b800483x473 S38b00470x493 M536x521S2ff00482x483S10011515x491S28108515x461 M519x530S18210496x475S18218482x471S20b00496x483S22b00495x500 $1 {{PLURAL:$1|M526x534S15a1a499x522S10010507x467S28903478x486S37706474x522S37700520x495}} S38b04470x493",
        "userlogin-remembermypassword": "M521x526S1f750501x511S1f758480x511S26620493x474 M521x517S10043491x483S20500479x506 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
        "password-change-forbidden": "M518x584S10004492x534S22a04493x569S30a00482x483 M518x633S19220493x614S14020479x583S19220493x561S18620491x530S30a00482x483 S38700463x496 M508x523S10040493x493S26500493x477 M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M518x531S33b00482x483S1f711482x509 M516x515S10018484x485S1f010487x485 S38800464x496",
        "login": "M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493",
        "permissionserrorstext": "M508x523S10040493x493S26500493x477 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 {{PLURAL:$1|M547x518S30a00482x483S22124511x473S1c517522x483}} S38900464x493",
        "permissionserrorstext-withaction": "M508x523S10040493x493S26500493x477 M534x542S2ff00482x483S26500520x505S20e00521x526S1f540493x518 M531x528S15a40511x472S15a48478x472S2d200505x505S2d211470x505 $2 {{PLURAL:$1|M547x518S30a00482x483S22124511x473S1c517522x483}} S38900464x493",
        "log-fulllog": "M525x524S2ff00482x483S10e00507x494S26500511x474 M520x529S20e00493x504S20348493x486S15a51497x471S26503480x516 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
-       "cantcreateaccounttitle": "M527x521S10059473x479S10051497x479S20e00494x491S22a04493x506 M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495",
        "viewpagelogs": "M525x524S2ff00482x483S10e00507x494S26500511x474 M531x512S15a37501x488S1f550507x495S20e00487x499S26502469x498 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
        "currentrev-asof": "M521x524S1f740501x509S1f748479x498S20e00503x494S22a00502x476 M536x534S35610482x483S10601513x506S21600525x501 M521x532S10609498x496S10621487x512S21100500x483S2df20479x468 M557x536S36d00479x503S10001536x498S10009510x506S2b711518x476S2b700531x465 $1",
        "revisionasof": "M513x542S1ce50491x458S22a00492x492S14c50487x511 M519x539S14402488x485S1440a481x461S22b04503x509 M536x521S2ff00482x483S10011515x491S28108515x461 $1",
        "logentry-newusers-autocreate": "M526x522S15a56499x510S11520503x479S20e00489x496S26a02474x489 M518x517S15a30482x489S1f750484x484S20500496x506S22a04505x495 $1 M531x531S14c30506x469S2a204508x503S2a21c470x503S14c38470x469 {{GENDER:$2|M532x519S20302493x485S2030a489x502S21100509x504S26900516x482S26910468x501}} M520x525S15a18480x490S10a02483x476S23100494x508S20e00500x494",
        "log-name-managetags": "M519x514S15a28482x487S11502489x498 M530x529S10640507x503S10648479x489S26c08503x484S26c18470x471 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
        "log-name-tag": "M519x514S15a28482x487S11502489x498 M518x536S15a37483x465S18550493x476S15a37483x509S15a51486x513",
-       "feedback-error-title": "M518x526S2ff00482x483S19a00487x506",
        "searchsuggest-search": "M546x525S2ff00482x483S16d10492x505S2e502519x502",
        "api-error-mustbeloggedin": "M539x579S10e27506x534S10e09480x534S22a07495x565S22a17469x564S21b00531x528S21b00504x528S30a00482x483 M520x576S14c19480x549S15a01497x550S20710483x530S30a00482x483 S38700463x496 M516x519S10651485x482S22a04493x504 M538x521S2a200497x480S20b00462x508S11530523x482S15a37462x483S11551470x493 S38800464x496",
        "api-error-unclassified": "M536x518S2ff00482x483S15a11513x486S28108513x453 M518x526S2ff00482x483S19a00487x506 M528x529S10030509x499S10038477x499S2a200505x472S2a218473x472",
index 1ccee8e..621aea0 100644 (file)
        "botpasswords-label-delete": "Desaniciar",
        "botpasswords-label-resetpassword": "Reestablecer la contraseña",
        "botpasswords-label-grants": "Permisos aplicables:",
-       "botpasswords-help-grants": "Cada permisu da accesu a los permisos de usuario llistaos que yá tenga la cuenta. Mira la [[Special:ListGrants|tabla de permisos]] pa más información.",
+       "botpasswords-help-grants": "Los permisos dan accesu a los permisos d'usuariu que yá tenga la cuenta. Activar un permisu equí nun da accesu a nengún permisu que la to cuenta nun tenga d'otra miente. Mira la [[Special:ListGrants|tabla de permisos]] pa más información.",
        "botpasswords-label-grants-column": "Permitío",
        "botpasswords-bad-appid": "El nome del bot \"$1\" nun ye válidu.",
        "botpasswords-insert-failed": "Nun pudo amestase'l nome de bot «$1». ¿Taba añadíu yá?",
        "passwordreset-emaildisabled": "Les funciones de corréu electrónicu tan desactivaes nesta wiki.",
        "passwordreset-username": "Nome d'usuariu:",
        "passwordreset-domain": "Dominiu:",
-       "passwordreset-capture": "¿Ver el corréu electrónicu resultante?",
-       "passwordreset-capture-help": "Si marques esta caxella, podrás ver el corréu (cola contraseña temporal) amás d'unvialu al usuariu.",
        "passwordreset-email": "Direición de corréu electrónicu:",
        "passwordreset-emailtitle": "Detalles de la cuenta en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Dalguién (seique vusté, dende la direición IP $1)solicitó'l reaniciu de la so contraseña de {{SITENAME}} ($4).\n{{PLURAL:$3|La cuenta d'usuariu siguiente ta asociada|Les cuentes d'usuariu siguientes tán asociaes}}\na esta direición de corréu electrónicu:\n\n$2\n\n{{PLURAL:$3|Esta contraseña provisional caduca|Estes contraseñes provisionales caduquen}} {{PLURAL:$5|nun día|en $5 díes}}.\nTendría d'aniciar sesión y escoyer una contraseña nueva agora. Si esta solicitú la fizo otra persona,\no si recordó la clave orixinal y yá nun quier camudala, pue escaecer esti mensaxe y siguir\nusando la contraseña antigua.",
        "passwordreset-emailelement": "Nome d'usuariu: \n$1\n\nContraseña temporal: \n$2",
        "passwordreset-emailsentemail": "Si esta direición de corréu electrónicu ta asociada cola to cuenta, unviaráse un corréu pa reaniciar la contraseña.",
        "passwordreset-emailsentusername": "Si hai una direición de corréu electrónicu asociada con esti nome d'usuariu, unviaráse un corréu electrónicu pa reaniciar la contraseña.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Unvióse'l corréu|Unviáronse los correos}} de reaniciu de contraseña. {{PLURAL:$1|El nome d'usuariu y la contraseña|La llista de nomes d'usuarios y contraseñes}} amuésase equí.",
-       "passwordreset-emailerror-capture2": "Nun pudo unviase un corréu electrónicu {{GENDER:$2|al usuariu|a la usuaria}}: $1 {{PLURAL:$3|El nome d'usuariu y la contraseña|La llista de nomes d'usuarios y contraseñes}} amuésase equí.",
        "passwordreset-nocaller": "Tien d'apurrise un llamador",
        "passwordreset-nosuchcaller": "El llamador nun esiste: $1",
        "passwordreset-ignored": "Nun se llogró'l reaniciu de la contraseña. ¿Seique nun se configuró un proveedor?",
-       "passwordreset-invalideamil": "Direición de corréu inválida",
+       "passwordreset-invalidemail": "Direición de corréu inválida",
        "passwordreset-nodata": "Nun s'apurrió nin un nome d'usuariu nin una dirección de corréu electrónicu",
        "changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
        "changeemail-header": "Completa esti formulariu pa camudar la dirección de corréu electrónicu. Si quies desaniciar l'asociación de cualquier dirección de corréu electrónicu de la to cuenta, dexa en blancu la nueva dirección de corréu electrónicu cuando unvies el formulariu.",
        "prefs-watchlist-edits-max": "Númberu máximu: 1000",
        "prefs-watchlist-token": "Pase de la llista de siguimientu:",
        "prefs-misc": "Varios",
-       "prefs-resetpass": "Camudar la conseña",
+       "prefs-resetpass": "Camudar la contraseña",
        "prefs-changeemail": "Camudar o desaniciar la dirección de corréu electrónicu",
        "prefs-setemail": "Conseñar una direición de corréu electrónicu",
        "prefs-email": "Opciones de corréu",
        "prefs-help-gender": "Configurar esta preferencia ye opcional. El software usa esti valor pa dirixise a ti y pa mentate a terceros col xéneru gramatical correchu.\nEsta información sedrá pública.",
        "email": "Corréu",
        "prefs-help-realname": "El nome real ye opcional.\nSi se da, pue usase pa date reconocimientu pol to trabayu.",
-       "prefs-help-email": "La direición de corréu ye opcional, pero ye necesaria pa unviate una conseña nueva si escaeces la tuya.",
+       "prefs-help-email": "La direición de corréu ye opcional, pero ye necesaria pa unviate una contraseña nueva si escaeces la tuya.",
        "prefs-help-email-others": "Tamién pues escoyer permitir qu'otres persones contauten contigo pela to páxina d'usuariu o la d'alderique ensin necesidá de revelar la to identidá.",
        "prefs-help-email-required": "Necesítase una direición de corréu electrónicu.",
        "prefs-info": "Información básica",
        "userrights-reason": "Motivu:",
        "userrights-no-interwiki": "Nun tienes permisu pa editar los derechos d'usuariu n'otres wikis.",
        "userrights-nodatabase": "La base de datos $1 nun esiste o nun ye llocal.",
-       "userrights-nologin": "Tien d'[[Special:UserLogin|aniciar sesión]] con una cuenta d'alministrador pa dar permisos d'usuariu.",
-       "userrights-notallowed": "Nun tien autorización p'amestar o desaniciar permisos d'usuariu.",
        "userrights-changeable-col": "Grupos que pues camudar",
        "userrights-unchangeable-col": "Grupos que nun pues camudar",
        "userrights-conflict": "¡Conflictu de cambiu de permisos d'usuariu! Por favor, revise y confirme los cambios.",
-       "userrights-removed-self": "Desaniciasti los tos propios permisos. Poro, yá nun tienes accesu a esta páxina.",
        "group": "Grupu:",
        "group-user": "Usuarios",
        "group-autoconfirmed": "Usuarios autoconfirmaos",
        "right-siteadmin": "Candar y descandar la base de datos",
        "right-override-export-depth": "Esportar páxines, incluyendo páxines enllazaes fasta una fondura de 5",
        "right-sendemail": "Unviar corréu a otros usuarios",
-       "right-passwordreset": "Ver los correos de reestablecimientu de conseña",
        "right-managechangetags": "Crear y (des)activar [[Special:Tags|etiquetes]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetes]] xunto colos cambios propios",
        "right-changetags": "Amestar y desaniciar [[Special:Tags|etiquetes]] arbitraries en revisiones individuales y entraes del rexistru",
        "apisandbox-continue": "Siguir",
        "apisandbox-continue-clear": "Llimpiar",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries siguirá] cola última solicitú; {{int:apisandbox-continue-clear}} llimpiará los parámetros rellacionaos con siguir.",
+       "apisandbox-param-limit": "Escribe <kbd>max</kbd> pa usar la llende máxima.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Tolos espacios de nomes)",
+       "apisandbox-multivalue-all-values": "$1 (Tolos valores)",
        "booksources": "Fontes de llibros",
        "booksources-search-legend": "Busca de fontes de llibros",
        "booksources-search": "Buscar",
        "activeusers-count": "$1 {{PLURAL:$1|edición|ediciones}} {{PLURAL:$3|nel caberu día|nos caberos $3 díes}}",
        "activeusers-from": "Amosar usuarios principiando dende:",
        "activeusers-groups": "Amosar los usuarios que pertenecen a los grupos:",
+       "activeusers-excludegroups": "Excluir a los usuarios que pertenezan a los grupos:",
        "activeusers-noresult": "Nun s'alcontraron usuarios.",
        "activeusers-submit": "Amosar los usuarios activos",
        "listgrouprights": "Drechos de los grupos d'usuariu",
        "pageinfo-few-visiting-watchers": "Puede haber, o non, un usuariu que vixila páxines que visita les ediciones recientes",
        "pageinfo-redirects-name": "Númberu de redireiciones a esta páxina",
        "pageinfo-subpages-name": "Subpáxines d'esta páxina",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redireición|redireiciones}}; $3 {{PLURAL:$3|non-redireición|non-redireiciones}})",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redireición|redireiciones}}; $3 {{PLURAL:$3|non redireición|non redireiciones}})",
        "pageinfo-firstuser": "Creador de la páxina",
        "pageinfo-firsttime": "Data de creación de la páxina",
        "pageinfo-lastuser": "Caberu editor",
        "patrol-log-header": "Esti ye un rexistru de les revisiones supervisaes.",
        "log-show-hide-patrol": "$1 rexistru de supervisión",
        "log-show-hide-tag": "$1 rexistru d'etiquetes",
+       "confirm-markpatrolled-button": "Aceutar",
+       "confirm-markpatrolled-top": "¿Marcar la revisión $3 de $2 como patrullada?",
        "deletedrevision": "Esborrada la reversión vieya $1",
        "filedeleteerror-short": "Error al esborrar l'archivu: $1",
        "filedeleteerror-long": "Atopáronse errores al esborrar l'archivu:\n\n$1",
        "tags-deactivate": "desactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|cambiu|cambios}}",
        "tags-manage-no-permission": "Nun tienes permisu p'alministrar etiquetes de cambiu.",
-       "tags-manage-blocked": "Nun puedes xestionar etiquetes de cambiu mentanto teas bloquiáu.",
+       "tags-manage-blocked": "Nun puedes xestionar etiquetes de cambiu mentanto teas {{GENDER:$1|bloquiáu|bloquiada}}.",
        "tags-create-heading": "Crear una etiqueta nueva",
        "tags-create-explanation": "De mou predetermináu, les etiquetes nueves que se creen tarán disponibles pa que les usen los usuarios y bots.",
        "tags-create-tag-name": "Nome de la etiqueta:",
        "tags-deactivate-not-allowed": "Nun ye posible desactivar la etiqueta «$1».",
        "tags-deactivate-submit": "Desactivar",
        "tags-apply-no-permission": "Nun tienes permisu p'aplicar etiquetes de cambios xunto colos cambios.",
-       "tags-apply-blocked": "Nun puedes aplicar etiquetes de cambiu xunto colos cambios mentanto teas bloquiáu.",
+       "tags-apply-blocked": "Nun puedes aplicar etiquetes de cambiu xunto colos cambios mentanto teas {{GENDER:$1|bloquiáu|bloquiada}}.",
        "tags-apply-not-allowed-one": "Nun se permite aplicar manualmente la etiqueta «$1».",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta nun pue|Les siguientes etiquetes nun puen}} aplicase manualmente: $1",
        "tags-update-no-permission": "Nun tienes permisu p'amestar o desaniciar etiquetes de cambiu nes revisiones individuales o entraes del rexistru.",
-       "tags-update-blocked": "Nun puedes amestar o desaniciar etiquetes de cambiu mentanto teas bloquiáu.",
+       "tags-update-blocked": "Nun puedes amestar o desaniciar etiquetes de cambiu mentanto teas {{GENDER:$1|bloquiáu|bloquiada}}.",
        "tags-update-add-not-allowed-one": "Nun se permite amestar manualmente la etiqueta «$1».",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta nun pue|Les siguientes etiquetes nun puen}} amestase manualmente: $1",
        "tags-update-remove-not-allowed-one": "Nun se permite desaniciar la etiqueta «$1».",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la páxina inda nun esiste",
        "mw-widgets-titleinput-description-redirect": "redirixir a $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Amestar una categoría...",
        "sessionmanager-tie": "Nun puen combinase dellos tipos de solicitú d'identificación: $1.",
        "sessionprovider-generic": "sesiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesiones basaes en cookies",
        "authmanager-authn-autocreate-failed": "Falló la creación automática d'una cuenta local: $1",
        "authmanager-change-not-supported": "Les credenciales apurríes nun pueden camudase porque nun hai nada que les use.",
        "authmanager-create-disabled": "Ta desactivada la creación de cuentes.",
-       "authmanager-create-from-login": "Pa crear la cuenta, rellena los campos de más abaxo.",
+       "authmanager-create-from-login": "Pa crear la cuenta, rellena los campos.",
        "authmanager-create-not-in-progress": "La creación de la cuenta nun ta progresando, o perdiéronse los datos de la sesión. Por favor, vuelve de nueves al principiu.",
        "authmanager-create-no-primary": "Les credenciales apurríes nun pueden usase pa crear cuentes.",
        "authmanager-link-no-primary": "Les credenciales apurríes nun pueden usase pa enllazar cuentes.",
        "usercssispublic": "Atención: les subpáxines CSS nun tendríen de contener datos acutaos porque son visibles pa otros usuarios.",
        "restrictionsfield-badip": "Direición o rangu IP inválidu: $1",
        "restrictionsfield-label": "Rangos d'IP permitíos:",
-       "restrictionsfield-help": "Una única direición IP o rangu CIDR per llinia. P'activar toos, utiliza<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Error: $1",
-       "edit-error-long": "Errores:\n\n$1"
+       "restrictionsfield-help": "Una única direición IP o rangu CIDR per llinia. P'activar toos, utiliza<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index dca9dfe..e2ea9aa 100644 (file)
        "yourpasswordagain": "Пароль такрар гьабе:",
        "createacct-yourpasswordagain": "Пароль ритIухъ гьабе",
        "createacct-yourpasswordagain-ph": "Пароль цоги нухалъ хъвай",
-       "remembermypassword": "Дир цIарги парольги гьаб компьютералда цIунизе (гIицIго $1 {{PLURAL:$1|къоялъ}})",
        "userlogin-remembermypassword": "Системаялда чӀезе",
        "yourdomainname": "Дур домен:",
        "password-change-forbidden": "Гьаб викиялда пароль хисизабун бажаруларо дуда.",
index 0081c7e..b8ca12d 100644 (file)
        "yourname": "Rinaf favesikyolt",
        "yourpassword": "Rinaf remravlem",
        "yourpasswordagain": "Va rinaf remravlem tolon bazel",
-       "remembermypassword": "Setikera va jinaf remravlem koe bati nedisiki (kali cugon $1 {{PLURAL:$1|viel|viel}})",
        "yourdomainname": "Rinaf ind",
        "externaldberror": "Ont divefa origakrokla va pilkomodara ont va rinafa divefa pata me ronuskel.",
        "login": "Pilkomodá",
        "undo-failure": "Betaks me zo rodimaskir golde kobodas walif betaks yo.",
        "undo-norev": "Dimbetara tir merotisa golde metira ok sulara.",
        "undo-summary": "Dimaskira va $1 betaks ke [[Special:Contributions/$2|$2]] ([[User talk:$2|Prilara]])",
-       "cantcreateaccounttitle": "Pataredura me tir",
        "cantcreateaccount-text": "Pataredura male bate IP ('''$1''') mane gan [[User:$3|$3]] zo elekayar.\n\nBazeyena lazava ke $3 tir ''$2''.",
        "viewpagelogs": "Wira va \"logs\" ke batu bu",
        "nohistory": "Nedoy izvot va batu bu.",
index 1a6b71d..96529ac 100644 (file)
        "yourpasswordagain": "गुप्त कुंजी एक दाँइ अउर लिखो:",
        "createacct-yourpasswordagain": "गुप्त कुंजी कय पुष्टि करो",
        "createacct-yourpasswordagain-ph": "गुप्त कुंजी फिर से लिखो",
-       "remembermypassword": "इ ब्राउज़र पे हमार लॉगिन याद रखो (अधिकतम $1 {{PLURAL:$1|दिन|दिन}} कय लिए)",
        "userlogin-remembermypassword": "हम्मै लॉग्ड इन रखो",
        "userlogin-signwithsecure": "सुरक्षित कनेक्शन कय प्रयोग करो",
        "yourdomainname": "आप कय डोमेन:",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4) पे सदस्य $1 आपकय {{PLURAL:$3|खाता}} कय गुप्तकुंजी कय रीसेट करेक अनुरोध करे हैं। इ ई-मेल ठहर से इ {{PLURAL:$3|खाता जोडान है}}:\n\n$2\n\n{{PLURAL:$3|ई}} अस्थायी गुप्तकुंजी {{PLURAL:$5|दिन}} कय बाद काम नाइ करि।\nआप लॉग इन कइकै एकठु नँवा गुप्त कुंजी अभीन लै लेक चाहि। यदि इ अनुरोध केहु दुसर करे है, या फिर आप कय आपन गुप्त कुंजी याद आई गा है, अव आप {{PLURAL:$3|आपन}} गुप्तकुंजी नाई बदलेक चाहा जात है, आप इ संदेश कय अनदेखा कई कय आपन पुरान गुप्तकुंजी कय प्रयोग कइ सका जात है।",
        "passwordreset-emailelement": "सदस्यनाँव: \n$1\n\nअस्थायी गुप्तकुंजी: \n$2",
        "passwordreset-emailsentemail": "एक गुप्तकुंजी रीसेट ई-मेल भेज दिहा गा है।",
-       "passwordreset-emailsent-capture": "नीचे जवन देखावा है ओकर गुप्तकुंजी रीसेट ई-मेल भेज दिहा गा है।",
-       "passwordreset-emailerror-capture": "नीचे दिहा गुप्त कुंजी रीसेट ई-मेल पैदा भा रहा, लेकिन ओका {{GENDER:$2|सदस्य}} कय भेजब असफल रहा।\nत्रुटि: $1",
        "changeemail": "ईमेल ठाँव बदला जाय",
        "changeemail-header": "अपना ई-मेल पता परिवर्तित करने के लिए इस फ़ॉर्म को पूरा करें। इस बदलाव की पुष्टि करने के लिये आपको अपना कूटशब्द पुनः लिखना पड़ेगा।",
        "changeemail-no-info": "इ पन्ना कय सीधय प्रयोग करेक लिए आप कय लॉग इन करेक परि।",
        "undo-nochange": "अईसन लागत है की ई सम्पादन कय पहिलवे पहिले जैसन कई दीहा है ।",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|बातचीत]]) कय करल बदलाव $1 कय पहिले जईसन कई गय",
        "undo-summary-username-hidden": "लुकुआवल सदस्यन् कय करल बदलाव $1 कय पहिले जईसन कई गय",
-       "cantcreateaccounttitle": "खाता नाई खोली सका जात है",
        "cantcreateaccount-text": "इ आइ॰पी ठहर ('''$1''') कय खाता बनावे कय [[User:$3|$3]] रोक लगाए हैँ।\n\nएकरे लिये $3 ''$2'' कारण दिहे हैं।",
        "cantcreateaccount-range-text": "<strong>$1</strong> कय श्रेणी में आवे वाला आई॰पी ठहर से, जवनेमें आप कय आई॰पी ठहर (<strong>$4</strong>) शामिल है, नँवा खाता बनावे कय लिए [[User:$3|$3]] अवरोधित कई गा है। \n\n$3 द्वारा दिया गया कारण है: \"$2\"",
        "viewpagelogs": "इस पन्ना कय लॉग देखा जाय",
        "activeusers-intro": "इ सक्रिय सदस्यन् कय सूची होय जे पिछला $1 {{PLURAL:$1|दिन}} में कुछ काम करें है।",
        "activeusers-count": "$1 {{PLURAL:$1|काम}} पिछला $3 {{PLURAL:$3|दिन}} में",
        "activeusers-from": "इ अक्षर से शुरु होय वाले सदस्य देखावा जाय:",
-       "activeusers-hidebots": "बॉट लुकुआवा जाय",
-       "activeusers-hidesysops": "प्रबंधक लुकुआवा जाय",
        "activeusers-noresult": "कवनो सदस्य नाइ मिलें ।",
        "listgrouprights": "सदस्य समूह अधिकार",
        "listgrouprights-summary": "नीचे इ विकि खर्तीन परिभाषित सदस्य समूहन् कय सूची होय, सथवे में हर समूह से जोड़ान अधिकारो है।\nहर अधिकार कय बारे में [[{{MediaWiki:Listgrouprights-helppage}}|ढेर जानकरीओ]] उपलब्ध है।",
        "htmlform-chosen-placeholder": "एक्ठु विकल्प चुना जाय",
        "htmlform-cloner-create": "अउर जोडा जाय",
        "htmlform-cloner-delete": "हटावा जाय",
-       "sqlite-has-fts": "$1 पूर्ण पाठ खोज समर्थन कय साथ",
-       "sqlite-no-fts": "$1पूर्ण-पाठ खोज समर्थन कय बिना",
        "logentry-delete-delete": "$1 ने पृष्ठ $3 {{GENDER:$2|हटा}} दिहा गय",
        "logentry-delete-restore": "$1 ने पृष्ठ $3 कय {{GENDER:$2|पुनर्स्थापित}} कै गय",
        "logentry-delete-event": "$1 ने $3 पृष्ठ की लॉग {{PLURAL:$5|प्रविष्टि|प्रविष्टियों}} की दृश्यता {{GENDER:$2|बदली}}: $4",
        "feedback-cancel": "रद्द करा जाय",
        "feedback-close": "होइ गवा",
        "feedback-dialog-title": "प्रतिक्रिया भेजा जाय",
-       "feedback-error-title": "त्रुटि",
        "feedback-error1": "त्रुटि: न पहचाना गया परिणाम एपीआई से",
        "feedback-error2": "त्रुटि: संपादन विफल रहा है",
        "feedback-error3": "त्रुटि: एपीआई से कोई प्रतिक्रिया नहीं",
index 428dafc..b48c450 100644 (file)
        "aboutpage": "Project:İzah",
        "copyright": "Bu məzmun $1 əhatəsindədir.",
        "copyrightpage": "{{ns:project}}:Müəllif",
-       "currentevents": "Güncəl hadisələr",
-       "currentevents-url": "Project:Güncəl hadisələr",
+       "currentevents": "Aktual hadisələr",
+       "currentevents-url": "Project:Aktual hadisələr",
        "disclaimers": "Məsuliyyətdən imtina",
        "disclaimerpage": "Project:Məsuliyyətdən imtina",
        "edithelp": "Redaktə kömək",
        "userrights-reason": "Səbəb:",
        "userrights-no-interwiki": "Sizə başqa vikilayihələrdəki istifadəçilərin statusunu dəyişməyə icazə verilməyib",
        "userrights-nodatabase": "$1 verilənlər bazası ya mövcud deyil, ya da lokal deyil.",
-       "userrights-nologin": "Siz istifadəçilərin hüquqlarını dəyişmək üçün sistemə idarəçi olaraq [[Special:UserLogin|daxil olmalısınız]].",
-       "userrights-notallowed": "Sizin digər istifadəçilərə hüquqlar vermək və ya almaq icazəniz yoxdur.",
        "userrights-changeable-col": "Dəyişdirə bildiyiniz qruplar",
        "userrights-unchangeable-col": "Dəyişdirə bilmədiyiniz qruplar",
        "userrights-irreversible-marker": "$1*",
        "booksources-isbn": "ISBN:",
        "booksources-search": "Axtar",
        "booksources-text": "Aşağıda yeni və işlənmiş kitablar satan xarici keçidlərdə siz axtardığınız kitab haqqında əlavə məlumat ala bilərsiz:",
+       "magiclink-tracking-isbn": "ISBN sehrli keçidlərinin istifadə olunduğu səhifələr",
        "specialloguserlabel": "İcraçı:",
        "speciallogtitlelabel": "Məqsəd (başlıq və ya istifadəçi):",
        "log": "Qeydlər",
        "listusers-blocked": "(bloklanıb)",
        "activeusers": "Aktiv istifadəçilərin siyahısı",
        "activeusers-count": "Son {{PLURAL:$3|gündə|$3 gündə}} $1 {{PLURAL:$1|redaktə|redaktə}}",
-       "activeusers-hidebots": "Botları gizlə",
-       "activeusers-hidesysops": "İdarəçiləri gizlə",
        "activeusers-noresult": "İstifadəçi tapılmadı.",
        "listgrouprights": "İstifadəçi qruplarının hüquqları",
        "listgrouprights-summary": "Bu vikidə olan istifadəçi siyahıları və onların hüquqları aşağıda göstərilmişdir.\nFərdi hüquqlar haqqında əlavə məlumatı [[{{MediaWiki:Listgrouprights-helppage}}]] səhifəsində tapa bilərsiniz",
index 0f353de..f146905 100644 (file)
        "hidden-category-category": "گیزلی بؤلمه‌لر",
        "category-subcat-count": "{{PLURAL:$2|بۇ بؤلمه‌ده تکجه آشاغیداکی آلت‌بؤلمه واردیر.|بۇ بؤلمه‌ده، جمعی $2-دن، آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.}}",
        "category-subcat-count-limited": "بۇ بؤلمه‌ده آشاغیداکی {{PLURAL:$1|آلت‌بؤلمه|$1 آلت‌بؤلمه}} واردیر.",
-       "category-article-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی صحیفه واردیر.|بۇ بؤلمه‌ده توْپلام $2 صحیفه‌دن، آشاغیداکی {{PLURAL:$1|صحیفه|$1 صحیفه}} واردیر.}}",
-       "category-article-count-limited": "بۇ بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|صحیفه|$1 صحیفه}} واردیر.",
+       "category-article-count": "{{PLURAL:$2|بۇ بؤلمه‌ده تکجه آشاغیداکی صفحه واردیر.|بۇ بؤلمه‌ده جمعی $2 صفحه‌دن، آشاغیداکی {{PLURAL:$1|صفحه|$1 صفحه}} واردیر.}}",
+       "category-article-count-limited": "بۇ بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|صفحه|$1 صفحه}} واردیر.",
        "category-file-count": "{{PLURAL:$2|بۇ بؤلمه‌ده یالنیز آشاغیداکی فایل واردیر.|بۇ بؤلمه‌ده توْپلام $1-دن، آشاغیداکی {{PLURAL:$1|فایل|$1 فایل}} واردیر.}}",
        "category-file-count-limited": "بۇ بؤلمه‌ده، آشاغیداکی {{PLURAL:$1|فایل|$1 فایل}} واردیر.",
        "listingcontinuesabbrev": "(قالانی)",
        "virus-badscanner": "پیس تنظیملر: تانینمامیش ویروس یوخلایان: ''$1''",
        "virus-scanfailed": "یوخلاماق باشا چاتمادی (کود $1)",
        "virus-unknownscanner": "تانینمامیش آنتی‌ویروس:",
-       "logouttext": "<strong>سÛ\8cز Ø§Û\8cÙ\86دÛ\8c Ø³Û\8cستÙ\90Ù\85â\80\8cدÙ\86 Ú\86Û\8cخدÛ\8cÙ\86Û\8cز.</strong>\n\nبÙ\88Ù\86ا Ø¯Û\8cÙ\82ت Ø§Ø¦Ø¯Û\8cÙ\86 Ú©Û\8c Ù\88ب Ø­Ø§Ù\81Û\8cظÙ\87 Ù\86Û\8cزÛ\8c Ø³Û\8cÙ\84Ù\85Ù\87 Û\8cÙ\86Ø\8cبعضÛ\8c ØµØ­Û\8cÙ\81Ù\87â\80\8cÙ\84ر Ú©Ù\8eØ´-Û\8cÙ\86Û\8cزÛ\8c Ø³Û\8cÙ\84Ù\85Ù\87â\80\8cÙ\85Û\8cØ´ Ú©Û\8cÙ\85Û\8cØ\8c Ù\87Ù\84Ù\87 Ø¯Ù\87 Ø³Û\8cزÛ\8cÙ\86 Ú¯Û\8cرÛ\8cØ´ Ø§Ø¦ØªØ¯Û\8cÚ¯Û\8cÙ\86Û\8cز Ú©Û\8cÙ\85Û\8c Ú¯Ø¤Ø³ØªØ±Û\8cÙ\84Ù\87â\80\8cجکلر.",
+       "logouttext": "<strong>سÛ\8cز Ø§Û\8cÙ\86دÛ\8c Ø³Û\8cستÙ\90Ù\85â\80\8cدÙ\86 Ú\86Û\8cخدÛ\8cÙ\86Û\8cز.</strong>\n\nدÛ\8cÙ\82تï¼\9aÙ\88ب Ø­Ø§Ù\81Û\8cظÙ\87 Ù\86Û\8cزÛ\8c Ø³Û\8cÙ\84Ù\85Ù\87 Û\8cÙ\86Ù\87 Ù\82درØ\8cبعضÛ\8c ØµÙ\81Ø­Ù\87â\80\8cÙ\84ر Ù\87Ù\84Ù\87 Ø¯Ù\87 Ø³Û\8cستÙ\85دÛ\8cÙ\85Û\8cشسÛ\8cÙ\86ز Ú©Û\8cÙ\85Û\8c Ú¯Ø¤Ø±Ù\88Ù\86Ù\87 Ø¨Û\8cلر.",
        "cannotlogoutnow-title": "ایندی چیخیش اوْلونمازدیر",
        "cannotlogoutnow-text": "$1-ی ایشلدرکن چیخیش اوْلونمازدیر.",
        "welcomeuser": "خوش گلمیسینیز، $1!",
        "userlogin-yourpassword-ph": "رمزینیزی یازین",
        "createacct-yourpassword-ph": "رمزی یازین",
        "yourpasswordagain": "رمزی یئنی‌دن یازین:",
-       "createacct-yourpasswordagain": "رÙ\85زÛ\8c Ø¯Ù\88غرÙ\88Ù\84اÛ\8cین",
+       "createacct-yourpasswordagain": "رÙ\85زÛ\8c ØªØ£Û\8cÛ\8cد Ø§Ø¦Ø¯ین",
        "createacct-yourpasswordagain-ph": "رمزی یئنی‌دن یازین",
        "userlogin-remembermypassword": "منی ایچری‌ده ساخلا",
        "userlogin-signwithsecure": "آرخایین باغلانتی ایشلدین",
        "passwordreset-emaildisabled": "ایمیل اؤزل‌لیکلری بو ویکی‌ده باغلانیب‌دیر.",
        "passwordreset-username": "ایشلدن آدی:",
        "passwordreset-domain": "دامنه:",
-       "passwordreset-capture": "سون نتیجه ایمیل گؤستریلسین؟",
-       "passwordreset-capture-help": "بو قوطویا علامت قویساز، (گئچیجی رمزی اولان) ایمیل ایستیفاده‌چی‌یه گؤندریلن کیمی بوردا سیزه گؤستریله‌جکدیر.",
        "passwordreset-email": "ایمیل آدرسی:",
        "passwordreset-emailtitle": "{{SITENAME}}-ده حساب بیلگیلری",
        "passwordreset-emailtext-ip": "بیر کس (احتیمالاً سیز، $1 آی‌پی آدرسی‌له)، {{SITENAME}} ($4) سایتینداکی حسابینیز اوچون رمزی یئنیله‌مک ایسته‌ییب‌دیر. آشاغیداکی ایستیفاده‌چی {{PLURAL:$3|حسابی|حسابلاری}} بو ایمیل ایله ایلگی‌لی‌دیرلر:\n\n$2\n\nبو گئچیجی {{PLURAL:$3|رمز|رمزلر}}، {{PLURAL:$5|بیر گون|$5 گون}}‌ده {{PLURAL:$3|واختی|واختلاری}} قورتاراجاق‌دیر.\nسیز گرک ایندی سایتا گیریب و یئنی بیر رمز سئچه‌سینیز. باشقا آدام بو ایستَگی وئرمیش‌سه، یوخسا سیز اسکی رمزینیزی یادا گتیرمیشسینیزسه، و داها اونو چئویرمک ایسته‌میرسینیزسه، بو مئساژی سایماییب و اسکی رمزینیزی ایشلدمگه داوام ائده بیلرسینیز.",
        "userinvalidcssjstitle": "خاتیرلادیرق:' '\"$1\" آدییلا بیر پوشه یوخ‌دور. پوشه-آدی.css و. js فایل‌لارینین آدلاری کیچیک حرف ایله یازماسی لازیم‌دیر، یعنی {{ns:user}}: تمل / vector.css دئییل، {{ns:user}}: تمل / Vector.css.",
        "updated": "(گونجل‌لندی)",
        "note": "'''دیقت:'''",
-       "previewnote": "'''بونون ساده‌جه بیر سیناق گؤستریشی اولدوغونو نظرده آلین.'''\nسیزین دییشیکلرینیز هله قئید اولونماییب!",
+       "previewnote": "<strong>بونون تکجه بیر سیناق گؤستریشی اولدوغونو نظرده آلین.</strong>\nسیزین دییشیکلرینیز هله ذخیره اولونماییب!",
        "continue-editing": "دَییشدیرمه یئرینه گئت",
        "previewconflict": "بو سیناق گؤستریشی‌دیر و یادداشدا ساخلایاجاغینیز تق‌دیرده متنین دییشدیر صحیفه‌سی‌نین یوخاری حیسه‌سینده نتیجه‌نین نئجه اولاجاغینی گؤستریر.",
        "session_fail_preview": "'''عۆذر ایسته‌ییریک! سیزین دییشدیرمه‌نیز یازدیریلمادی. \nسیستمدن چیخمیش اوْلدوغونوز مؤحتمل‌دیر. لۆطفاً سیستمه گیرمیش اوْلدوغونوزدان آرخایین اوْلوب بیر داها تکرار ائدین. \nمۆشکول حل اوْلونماسا حسابینیزدان [[Special:UserLogout|چیخیب]] یئنی‌دن گیریش ائدین٬ براوزرینیزین بۇ سایتا کوکی وئرمه ایجازه‌سینی وئردیگیندن ده آرخایین اوْلون.'''",
        "longpageerror": "خطا: داخیل متنین اوزون‌لوغو قبول ائدیله بیلر ان چوخ اوزونلوق اولان {{PLURAL:$2 | بیر کیلوبایت | $2 کیلوبایت}} دان چوخ‌دور و {{PLURAL:$1 | بیر کیلوبایت | $1 کیلوبایت}} بؤیوکلوگونده‌دیر.'\nدییشیک‌لیگی‌نین کایدئدیلئمئز.",
        "readonlywarning": "'''دیقت: باخیم سببی ایله دیتابیس بو آندا قیفیللی‌دیر. بو سببله دییشیک‌لیکلری‌نین بو آندا قئید ائدیل میه‌جکدیر. یازدیقلارینیزی باشقا بیر فایل‌دا آلیب ساخلایا و داها سونرا یئنی‌دن بورا گتیریب یازا بیلرسینیز.\n\nاونو قیفیل‌لایان ایداره‌چی، بو شرحی وئریب‌دیر: $1",
        "protectedpagewarning": "' 'خاطیرلیریق: بو ​​صحیفه باغلانیب دیر و یالنیز مودیر اولان‌لار طرفین‌دن دییش‌دیریله بیلر.'\nسون گونده‌لیک گیردی‌سی ایستیناد مقصدلی آشاغیدا وئریلمیش‌دیر:",
-       "semiprotectedpagewarning": "'قئید:' بو صحیفه محافظه‌لی اولدوغو اوچون یالنیز قئیدیات‌دان کئچمیش ایستیفاده‌چی‌لر دییشدیر ائده بیلرلر.",
+       "semiprotectedpagewarning": "<strong>دیقت:</strong> بو صفحه نی قوروندوغو اوچون تکجه تایید اولونموش ایشلدنلر دییشدیره بیلر.\n\nسون قورومالار ژورنالی آشاغیدا گلیبدیر:",
        "cascadeprotectedwarning": "<strong>خاطیرلایریق:</strong> بو صحیفه بو یئرده {{PLURAL:$1|صحیفهٔ|صحیفه‌لر}} یئرلشمگه گوره آبشاری حفظ اولونوب آلتیندا باغلانیب بونجه مودیر فقط ائلیه بیله‌لر دییشدیر ائده بیلسینلر",
        "titleprotectedwarning": "'دیققت! بو صحیفه محافظه‌لی‌دیر، یالنیز [[Special:ListGroupRights|ایجازه سی اولان]] ایستیفاده‌چی‌لر اونو دییشدیر ائده بیلرلر.'",
        "templatesused": "{{PLURAL:$1|شابلون}} بو صفحه‌ده ایشلنیب‌دیر:",
        "content-failed-to-parse": "تجزیه محتوای $2  مدل اوچون $1: $3 موفقیت اله گلمه دی",
        "invalid-content-data": "اعتبارسیز مضمون معلوماتی",
        "content-not-allowed-here": "\"$1\" مقاله‌سینه، [[$2]] صحیفه‌سینده ایجازه وئریلممیش دیر.",
-       "editwarning-warning": "بو صحیفه‌نی ترک ائتمک، دَییشدیرمه‌لرینیزی الدن وئرمگه سبب اولا بیلر. اگر گیریش ائتمیسینیز بو ایخطاری، ترجیحلرینیزین «دَییشدیرمک» بؤلوموندن، \"{{int:prefs-editing}}\"ایشدن سالا بیلرسینیز.",
+       "editwarning-warning": "بو صفحه‌دن چیخماق، دَییشدیرمه‌لرینیزی الدن وئرمگه سبب اولا بیلر. اگر گیریش ائتمیسینیز بو ایخطاری، ترجیحلرینیزین «دَییشدیرمک» بؤلوموندن، \"{{int:prefs-editing}}\"ایشدن سالا بیلرسینیز.",
        "editpage-notsupportedcontentformat-title": "فایلین فرمتی دستکلنمیر.",
        "editpage-notsupportedcontentformat-text": "$1 فایلین فرمتی  $2 فایل مدلی ایله دستکلنمیر.",
        "content-model-wikitext": "ویکی‌یازی",
        "currentrev-asof": "$1 تاریخینه کیمی سون حال",
        "revisionasof": "$1 نوسخه‌سی",
        "revision-info": "$1- یارادیلمیش نوسخه{{GENDER:$6|$2}}$7 الیله",
-       "previousrevision": "قاباق‌کی سۆروم",
+       "previousrevision": "قاباقکی نوسخه",
        "nextrevision": "داها یئنی نوسخه ←",
        "currentrevisionlink": "سون نوسخه",
        "cur": "ایندی",
        "page_last": "سون",
        "histlegend": "فرقلری سئچمه: موقاییسه ائتمک ایسته‌دیگینیز دییشیک‌لیکلرین یانینداکی گیرده دۆیمه‌لره علامت قویون و سوْنرا Enter-ی وۇروب یوْخسا آشاغیداکی دۆیمه‌نی وورون.<br />\nآچیقلاما:'''({{int:cur}})''' =سون نوسخه ایله فرقلر ، '''({{int:last}})''' = قاباقکی نوسخه ایله فرقلر، '''{{int:minoreditletter}}''' = کیچیک دییشیک‌لیک.",
        "history-fieldset-title": "گئچمیشی آختار",
-       "history-show-deleted": "یالنیز سیلینَنلر",
+       "history-show-deleted": "تکجه سیلینَنلر",
        "histfirst": "ان اسکی",
        "histlast": "ان یئنی",
        "historysize": "({{PLURAL:$1|بیر|$1}} بایت)",
        "difference-title-multipage": "«$1» و «$2» صحیفه‌لرین آراسینداکی فرقلر",
        "difference-multipage": "(صفحه‌لر آراسینداکی فرق‌لر)",
        "lineno": "خط $1:",
-       "compareselectedversions": "سئÚ\86Û\8cÙ\84Ù\85Û\8cØ´ Ù\86Ù\88سخÙ\87â\80\8cÙ\84رÛ\8c Ù\82ارشÛ\8cÙ\84اشدÛ\8cر",
+       "compareselectedversions": "سئÚ\86Û\8cÙ\84Ù\85Û\8cØ´ Ù\86Ù\88سخÙ\87â\80\8cÙ\84رÛ\8c Ù\85Ù\88Ù\82اÛ\8cسÙ\87 Ø§Ø¦Øª",
        "showhideselectedversions": "سئچیلمیش نوسخه‌لری گؤستر/گیزلد",
        "editundo": "قایتار",
        "diff-empty": "فرقیسیز",
        "searchprofile-advanced-tooltip": "تاپشیریلان آدفضالاریندا آختار",
        "search-result-size": "$1 ({{PLURAL:$2|۱ سؤزجوک|$2 سؤزجوک}})",
        "search-result-category-size": "{{PLURAL:$1|بیر|$1}} عوضو ({{PLURAL:$2|بیر|$}} آلت‌بؤلمه، {{PLURAL:$3|بیر|$3}} فایل)",
-       "search-redirect": "یول‌لاندیرما $1",
+       "search-redirect": "($1-دن يوْل‌لاندیریلمیش)",
        "search-section": "(بؤلوم $1)",
        "search-category": "(رده  $1)",
        "search-file-match": "(فایلین ایچری اوخشاری)",
        "userrights-reason": "ندن:",
        "userrights-no-interwiki": "سیزه باشقا ویکی لايیهه‌لرده‌کی ایستیفاده‌چیلرین ائستاتوسونو ديَیشمه‌يه ایزین وئریلمه‌يیب",
        "userrights-nodatabase": "$1 وئریلنلر بازاسی يا مؤوجود دئيیل، يا دا لوکال دئيیل.",
-       "userrights-nologin": "سیز ایستیفاده‌چی‌لرین حقوق‌لارینی دییشمک اوچون سیستئمه ایداره‌چی اولا‌راق [[Special:UserLogin|daxil olmalısınız]].",
-       "userrights-notallowed": "سیزین ایستیفاده‌چی حسابینیزا دیگر ایستیفاده‌چی‌لره حقوق‌لار وئرمک و یا آلماغا ایجازه وئریلمه‌ییب.",
        "userrights-changeable-col": "ديَیشدیره بیلدیگینیز قروپلار",
        "userrights-unchangeable-col": "ديَیشدیره بیلمه‌دیگینیز قروپلار",
        "userrights-conflict": "ایستیفاده‌چی حاقلاری توققوشماسی! لوطفاً گوزله ین و دَییشدیرمه‌لرینیزی یئنی‌دن ائدین.",
-       "userrights-removed-self": "سیز باشاریلیق‌لا اؤز حاق‌لارینیزی قالدیردینیز. اونا گؤره داها بو صحیفه‌یه یول تاپماغا قادیر دئییل‌سینیز.",
        "group": "گروه:",
        "group-user": "ایستفاده‌چیلر",
        "group-autoconfirmed": "اوتوماتیک دوغرولانمیش ایستیفاده‌چیلر",
        "right-siteadmin": "دیتابیسی قیفیل‌لا و قیفیلینی آچ",
        "right-override-export-depth": "ایچری باغلانتیلاری اولان صحیفه‌لری، چوخو ۵ درجه درینلیگی ایله، ایخراج ائت",
        "right-sendemail": "باشقا ایستیفاده‌چیلره ایمیل گؤندر",
-       "right-passwordreset": "رمز یئنی‌له‌مه ایمیل‌لرینه باخ",
        "grant-group-email": "ایمئیل گؤندر",
        "newuserlogpage": "ایشلدن یارادیلما ژورنالی",
        "newuserlogpagetext": "بۇ ایشلدن یارادماق لیستی‌دیر.",
        "action-edit": "بو صحیفه‌نی دَییشدیر",
        "action-createpage": "صفحه یارات",
        "action-createtalk": "دانیشیق صفحه‌سی یارات",
-       "action-createaccount": "بÙ\88 Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c Ø­Ø³Ø§Ø¨Û\8cÙ\86Û\8c Û\8cاراد",
+       "action-createaccount": "بÙ\88 Ø§Û\8cØ´Ù\84دÙ\86 Ø­Ø³Ø§Ø¨Û\8cÙ\86Û\8c Û\8cارات",
        "action-history": "بو صفحه نین گئچمیشین گور",
        "action-minoredit": "بو دَییشیکلیگی، کیچیک اولاراق نیشانلا",
        "action-move": "بو صحیفه‌‌نین آدینی ديَیشدیر",
        "longpages": "اۇزون صفحه‌‌لر",
        "deadendpages": "کئچید وئرمه‌ين صحیفه‌‌لر",
        "deadendpagestext": "آشاغیداکی صحیفه‌‌لردن بو ویکیپئدیياداکی دیگر صحیفه‌‌لره هئچ بیر کئچید يوخدور.",
-       "protectedpages": "Ù\85حاÙ\81ظÙ\87â\80\8câ\80\8cÙ\84Û\8c ØµØ­Û\8cÙ\81ه‌‌لر",
+       "protectedpages": "Ù\82Ù\88Ù\92رÙ\88Ù\86اÙ\86 ØµÙ\81Ø­ه‌‌لر",
        "protectedpages-indef": "يالنیز مدتسیز محافظه‌‌لر",
        "protectedpages-summary": "بۇ صحیفه، ایندیکی قوْرونان موْجود اوْلان صحیفه‌لری لیست ائدیر. یارانماق‌دان قوْرونان باشلیقلارین لیستینی گؤرمک اۆچون [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]]-ه باخین.",
        "protectedpages-cascade": "یالنیز کاسکاد محافظه‌لر",
        "protectedpages-noredirect": "یوْل‌لاندیرمالاری گیزلت",
        "protectedpagesempty": "حال-حاضردا بو پارامئتره اویغون هئچ بیر محافظه‌لی صحیفه یوخ‌دور",
-       "protectedpages-timestamp": "واخت دامغاسی",
+       "protectedpages-timestamp": "چاغ اتیکتی",
        "protectedpages-page": "صفحه",
-       "protectedpages-expiry": "بیتمک تاریخی",
-       "protectedpages-performer": "Ù\82Ù\88Ù\92رÙ\88Û\8cاÙ\86 Ø§Û\8cستÛ\8cÙ\81ادÙ\87â\80\8cÚ\86Û\8c",
+       "protectedpages-expiry": "قورتارماق تاریخی",
+       "protectedpages-performer": "Ù\82Ù\88Ù\92رÙ\88Û\8cاÙ\86 Ø§Û\8cØ´Ù\84دÙ\86",
        "protectedpages-params": "قوْروماق پارامئترلری",
        "protectedpages-reason": "نَدَن‌لیگی",
        "protectedpages-unknown-timestamp": "بیلینمه‌ین",
        "rollbacklinkcount-morethan": "$1-دن چوْخ دییشدیرمه‌نی قایتار",
        "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}}]] ).",
+       "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|دانیشیق]] {{int:pipe-separator}} [[Special:Contributions/$2| {{int:contribslink}}]]) طرفین‌دن [[:$1]] صفحه‌سینده ائدیلمیش سون دییشیک‌لیک قایتاریلمیر؛\nآیری بیری صفحه‌ده دییشیک‌لیک ائتدی یوخسا صفحه‌نی قایتاردی.\n\nسون دییشیک‌لیگی ائدن: [[User:$3|$3]] ([[User talk:$3|دانیشیق]] {{int:pipe-separator}} [[Special:Contributions/$3| {{int:contribslink}}]] ).",
        "editcomment": "دییشیک‌لیک خلاصه‌سی: ''\" $1''\" ایدی.",
        "revertpage": "[[Special:Contributions/$2|$2]] ([[User talk:$2|دانیشیق]]) طرفین‌دن ائدیلمیش دییشیک‌لیک‌لر [[User:$1|$1]] طرفین‌دن ائدیلمیش دییشیک‌لیک‌لره قایتاریلدی.",
        "revertpage-nouser": "{{GENDER:$1|[[User:$1|$1]]}} ایله ائدیلمیش سون نوسخه‌یه، بیر گیزلی ایشلدن طرفین‌دن قایتاریلان دییشیکلیک‌لر",
-       "rollback-success": "$1 Ø·Ø±Ù\81Û\8cÙ\86â\80\8cدÙ\86 Ø§Ø¦Ø¯Û\8cÙ\84Ù\85Û\8cØ´ Ø¯Û\8cÛ\8cشدÛ\8cرâ\80\8cÙ\84ر Ú¯Ø¦Ø±Û\8c Ù\82اÛ\8cتارÛ\8cÙ\84دÛ\8cØ\9b $2 Ø·Ø±Ù\81Û\8cÙ\86â\80\8cدÙ\86 Û\8cارادÛ\8cÙ\84Ù\85Û\8cØ´ Ø³Ù\88Ù\86 Ù\88ئرسÛ\8cا Ø¨Ø±Ù¾Ø§ Ø§Ù\88Ù\84Ù\88Ù\86دو.",
+       "rollback-success": "$1 Ø·Ø±Ù\81Û\8cÙ\86â\80\8cدÙ\86 Ø§Ø¦Ø¯Û\8cÙ\84Ù\85Û\8cØ´ Ø¯Û\8cÛ\8cشدÛ\8cرâ\80\8cÙ\85Ù\87 Ù\84ر Ù\82اÛ\8cتارÛ\8cÙ\84دÛ\8cØ\9b $2 Ø·Ø±Ù\81Û\8cÙ\86â\80\8cدÙ\86 Û\8cارادÛ\8cÙ\84Ù\85Û\8cØ´ Ø³Ù\88Ù\86 Ù\86Ù\88سخÙ\87 Ù\82Ù\88رÙ\88Ù\84دو.",
        "sessionfailure-title": "گیریش خطاسی",
        "sessionfailure": "گیریش اوتورومونوزلا ایلگی‌لی بیر سورون وار گیبی گؤرونویور؛\nبو ائیلئم، اوتوروم گاسپینا کارشی اؤنلئم اولاراک ایپتال ائدیلدی.\nلوتفن \"گئری\" گیدین و گئلدیغینیز سایفایی یئنی‌دئن یوکلئیین، سونرا تئکرار دئنئیین.",
        "changecontentmodel-title-label": "صحیفه باشلیقی",
        "sp-contributions-suppresslog": "باسدیریلمیش ایشلدن فعالیت‌لری",
        "sp-contributions-deleted": "سیلینمیش ایشلدن چالیشمالاری",
        "sp-contributions-uploads": "یوکله‌نَنلر",
-       "sp-contributions-logs": "قئیدلر",
+       "sp-contributions-logs": "ژورناللار",
        "sp-contributions-talk": "دانیشیق",
        "sp-contributions-userrights": "ایستیفاده‌چی حاقلارین ایداره‌ ائتمه‌سی",
        "sp-contributions-blocked-notice": "بو ایستیفاده‌چی حال-حاضردا بلوکلانمیش‌دیر.\nبلوکلاما قئیدلری‌نین سونونجوسو آشاغیدا گؤستریلمیش‌دیر:",
        "markedaspatrollederrornotify": "دولانماق برچسبی مووفقیت سیز اولدو",
        "patrol-log-page": "دولانما ژورنالی",
        "patrol-log-header": "بو یوخلانمیش دییشیک‌لیک‌لرین ژورنالی‌دیر.",
-       "log-show-hide-patrol": "$1 پاترول گونده‌لیگی",
+       "log-show-hide-patrol": "$1 دولانما ژورنالی",
        "log-show-hide-tag": "اِتیکت ژورنالی $1",
        "deletedrevision": "کؤهنه نوسخه لری سیلیندی $1.",
        "filedeleteerror-short": "فایل سیلینرکن ختا: $1",
        "version-ext-license": "لیسانس",
        "version-ext-colheader-name": "اوزانتی",
        "version-skin-colheader-name": "قابیق",
-       "version-ext-colheader-version": "سۆروم",
+       "version-ext-colheader-version": "نوسخه",
        "version-ext-colheader-license": "لیسانس",
        "version-ext-colheader-description": "آچیقلاما",
        "version-ext-colheader-credits": "یازیچی‌لار",
        "intentionallyblankpage": "بو صحیفه خصوصیله بوش‌دور.",
        "external_image_whitelist": " #بو سطری اولدوغو کیمی بوراخین <pre>\n#دوزگون ایفاده (رِقولار اِکسپرِشِن) پارچالارینی (یالنیز // آراسیندا اولان قیسمی) آشاغی‌يا قویون\n#بونلار ائشیک‌ده‌کی عکسلرین آدرسلریله تطبیق اولاجاقلار\n#تطبیق اولانلار، عکس کیمی گؤستریله‌جکلر، اولمایانلارا یالنیز بیر باغلانتی گؤستریله‌جکدیر\n#بو # نیشانی ایله باشلایان سطرلر، شرح کیمی نظرده توتولاجاقلار\n#بو حرفلرین کیچیک/بؤیوک اولماغینا حساس دئییل\n\n#بوتون دوزگون ایفاده پارچالارینی، بو سطرین اوستونه قویون. بو سطری اولدوغو کیمی بوراخین</pre>",
        "tags": "مومکون دییشیک‌لیک ائتیکئت‌لری",
-       "tag-filter": "[[Special:Tags|اِتیکِت]] سۆزگُجی:",
+       "tag-filter": "[[Special:Tags|اِتیکِت]] فیلتری:",
        "tag-filter-submit": "سۆزگَج",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|اِتیکِت|اِتیکِتلر}}]]: $2)",
        "tags-title": "اِتیکتلر",
        "feedback-submit": "گؤندر",
        "feedback-thanks": "تشکورلر! سیزین گئری-بیلدیریمینیز «[$2 $1]» صحیفه‌سینه گؤندریلدی.",
        "feedback-thanks-title": "تشکورلر!",
-       "searchsuggest-search": "آختار",
+       "searchsuggest-search": "{{SITENAME}}-دا آختار",
        "searchsuggest-containing": "ساخلانیلیر...",
        "api-error-badaccess-groups": "سیزین بو ویکی‌یه فایل یوکله‌مک ایجازه‌نیز یوخدور.",
        "api-error-badtoken": "ایچری خطاسی: پیس کود.",
index b7466f7..e21ef13 100644 (file)
@@ -27,7 +27,8 @@
                        "Кутлубаева Кунсулу Закиевна",
                        "Вильданова Гюзель",
                        "Ilmira",
-                       "Irus"
+                       "Irus",
+                       "Khanmarat"
                ]
        },
        "tog-underline": "Һылтанмалар аҫтына һыҙыу:",
        "passwordreset-emaildisabled": "Был викиҙа электрон почта функцияһы һүндерелгән.",
        "passwordreset-username": "Ҡулланыусы исеме:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Хәбәрҙең һуңғы хәлен ҡарарғамы?",
-       "passwordreset-capture-help": "Әгәр был билдәне ҡуйһағыҙ, ҡулланыусыға ебәрелгән ваҡытлыса серһүҙ һеҙгә күрһәтеләсәк.",
        "passwordreset-email": "Электрон почта адресы:",
        "passwordreset-emailtitle": "{{SITENAME}} иҫәп яҙыуы мәғлүмәттәре",
        "passwordreset-emailtext-ip": "Берәү (бәлки һәҙ, $1 IP-адресынан ) {{SITENAME}} ($4) проектындағы иҫәп яҙыуығыҙҙы хәтерләтеүҙе һоратты.\nКиләһе ҡулланыусы {{PLURAL:$3|1=иҫәп яҙыуы|иҫәп яҙыуҙары}} был электрон почта адресы менән бәйле:\n\n$2\n\nБыл ваҡытлыса {{PLURAL:$3|1=серһүҙ|серһүҙҙәр}} {{PLURAL:$5|$5 көн}} ғәмәлдә буласаҡ.\nҺеҙ системала танылырға һәм яңы серһүҙ һайларға тейешһегеҙ.\nӘгәр, һеҙ быны һоратмаған булһағыҙ йәки элекке серһүҙегеҙҙе киренән иҫләһәгеҙ һәм уны үҙгәртергә теләмәһәгеҙ, был хатҡа иғтибар итмәгеҙ һәм элекке серһүҙегеҙҙе ҡулланыуҙы дауам итегеҙ.",
        "passwordreset-emailelement": "Ҡулланыусы исеме: \n$1\n\nВаҡытлыса серһүҙ: \n$2",
        "passwordreset-emailsentemail": "Серһүҙҙе ташлау тураһындағы мәғлүмәт менән электрон почта аша хат ебәрелде.",
        "passwordreset-emailsentusername": "Әгәр был ҡатнашыусының исеменә бәйле  электрон почтаһының адресы булһа, ул саҡта  серһүҙҙе тергеҙеү өсөн  хат ебәреләсәк.",
-       "passwordreset-invalideamil": "Электрон почта адресы ҡабул ителмәй",
+       "passwordreset-invalidemail": "Электрон почта адресы ҡабул ителмәй",
        "changeemail": "Электрон почта адресын үҙгәртергә",
        "changeemail-header": "Электрон почта адресын үҙгәртеү",
        "changeemail-no-info": "Был биткә туранан ирешеү өсөн һеҙгә системала танылыу кәрәк.",
        "searchprofile-advanced-tooltip": "Махсус исем арауыҡтарында эҙләргә",
        "search-result-size": "$1 ({{PLURAL:$2|1=$2 һүҙ|$2 һүҙ}})",
        "search-result-category-size": "{{PLURAL:$1|1=$1 ағза}} ({{PLURAL:$2|$2 эске категория}}, {{PLURAL:$3|$3 файл}})",
-       "search-redirect": "(йүнәлтеү $1)",
+       "search-redirect": "($1 битенән йүнәлтеү)",
        "search-section": "($1 бүлеге)",
        "search-category": "(категория $1)",
        "search-file-match": "(файл эстәлеге менән тура килә)",
        "userrights-reason": "Сәбәп:",
        "userrights-no-interwiki": "Һеҙҙең башҡа вики-проекттарҙа ҡатнашыусыларҙың хоҡуҡтарын үҙгәртергә хоҡуҡтарығыҙ юҡ.",
        "userrights-nodatabase": "$1 базаһы юҡ йәки урындағы (локаль) база түгел.",
-       "userrights-nologin": "Ҡатнашыусыларҙың хоҡуҡтарын билдәләр өсөн, һеҙ хаким хоҡуҡтары менән [[Special:UserLogin|танылырға]] тейешһегеҙ.",
-       "userrights-notallowed": "Һеҙгә ҡатнашыусыларҙың хоҡуҡтарын өҫтәргә йәки юҡ итергә рөхсәт ителмәгән.",
        "userrights-changeable-col": "Һеҙ үҙгәртә алған төркөмдәр",
        "userrights-unchangeable-col": "Һеҙ үҙгәртә алмаған төркөмдәр",
        "userrights-conflict": "Ҡатнашыусының хоҡуҡтарын үҙгәртеү яраманы! Зинһар, үҙгәрештәрҙе тикшерегеҙ һәм яңынан индерегеҙ.",
-       "userrights-removed-self": "Һеҙ үҙ хоҡуҡтарығыҙҙы уңышлы юҡ иттегеҙ. Шулай итеп, был биткә башҡаса инә алмаясаҡһығыҙ.",
        "group": "Төркөм:",
        "group-user": "Ҡулланыусылар",
        "group-autoconfirmed": "Автоматик раҫланған ҡулланыусылар",
        "right-siteadmin": "Мәғлүмәттәр базаһын асыу һәм ябыу",
        "right-override-export-depth": "5-се тәрәнлеккә тиклем бәйле биттәре менән бергә биттәрҙе сығарыу",
        "right-sendemail": "Башҡа ҡатнашыусыларға электрон почта аша хат ебәреү",
-       "right-passwordreset": "Серһүҙҙе яңыртыу осраҡтарын ҡарау",
        "right-managechangetags": "[[Special:Tags|Билдәләрҙе]] төҙөү һәм (де)активация",
        "right-applychangetags": " [[Special:Tags|тамғаһын]] үҙегеҙҙең төҙөтеү менән ҡулланырға",
        "right-changetags": "Айырым үҙгәртеүҙәрҙә һәм журнал яҙмаланыда[[Special:Tags|тамғаһын]] өҫтәү һәм юйыу",
        "activeusers-intro": "Был — һуңғы $1 {{PLURAL:$1|көн}} эсендә ниҙер башҡарған ҡатнашыусылар исемлеге.",
        "activeusers-count": "һуңғы $3 {{PLURAL:$3|1=көн}} эсендәге һуңғы көндә $1 {{PLURAL:$1|үҙгәртеү}}",
        "activeusers-from": "Ошондай хәрефтәрҙән башланған ҡатнашыусыларҙы күрһәтергә:",
-       "activeusers-hidebots": "Боттарҙы йәшерергә",
-       "activeusers-hidesysops": "Хакимдәрҙе йәшерергә",
        "activeusers-noresult": "Ҡатнашыусылар табылманы",
        "activeusers-submit": "Әүҙем ҡулланыусыларҙы күрһәтергә",
        "listgrouprights": "Ҡатнашыусылар төркөмө хоҡуҡтары",
        "tags-deactivate-not-allowed": "«$1» тамғаһын һүндереп булмай.",
        "tags-deactivate-submit": "һүндерергә",
        "tags-apply-no-permission": "Һеҙҙең үҙгәртеү тамғаһы ҡуйыу хоҡуғы юҡ.",
-       "tags-apply-blocked": "Үҙгәртеүҙәргә тамға ҡуфырға һеҙҙең хоҡуҡ юҡ, һеҙ бикләнгән.",
+       "tags-apply-blocked": "Бикле булғансы, үҙгәртеүҙәргә тамға ҡуйырға хоҡуғығыҙ юҡ.",
        "tags-apply-not-allowed-one": " «$1» тамғаһын ҡулдан файҙаланып булмай",
        "tags-apply-not-allowed-multi": "Ҡулдан {{PLURAL:$2|түбәндәге тамғаны өҫтәп булмай}}: $1",
        "tags-update-no-permission": "Һеҙҙең айырым өлгөләрҙә һәм журнал яҙмаларында тамға йәки үҙгәртеү тамғаһы ҡуйырға хоҡуғығыҙ юҡ.",
-       "tags-update-blocked": "Һеҙгә блок ҡуйылған, үҙһәртеү тамғалары менән идара итә алмайһығыҙ.",
+       "tags-update-blocked": "Блок алынғансы, үҙгәртеү тамғалары менән идара итә алмайһығыҙ.",
        "tags-update-add-not-allowed-one": " «$1» тамғаһын ҡулдан файҙаланып булмай",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|түбәндәге тег}} ҡулдан өҫтәлмәй: $1",
        "tags-update-remove-not-allowed-one": " «$1» тамғаһын юйып булмай",
        "feedback-thanks": "Рәхмәт! Һеҙҙең фекерегеҙ «[$2 $1]» битенә өҫтәлде.",
        "feedback-thanks-title": "Рәхмәт!",
        "feedback-useragent": "Браузер:",
-       "searchsuggest-search": "Эҙләү",
+       "searchsuggest-search": "{{SITENAME}} эсендә эҙләү",
        "searchsuggest-containing": "эстәлегендә...",
        "api-error-badaccess-groups": "Һеҙгә был викиға файлдар күсереү рөхсәт ителмәй",
        "api-error-badtoken": "Эске хата: дөрөҫ булмаған токен",
        "changecredentials-submit": "Иҫәп мәғлүмәттәрен үҙгәртеү",
        "removecredentials": "Иҫәп мәғлүмәттәрен юйырға",
        "removecredentials-submit": "Иҫәп мәғлүмәттәрен юйырға",
-       "credentialsform-account": "Иҫәп яҙмаһы исеме:",
-       "edit-error-short": "Хата: $1"
+       "credentialsform-account": "Иҫәп яҙмаһы исеме:"
 }
index 76dcb87..585cb1e 100644 (file)
        "yourname": "pesengan penganggen",
        "yourpassword": "kruna sandi",
        "yourpasswordagain": "jumunin kruna sandi",
-       "remembermypassword": "elingang kruna sandi padewekan ring computer niki ( suwennyane $1{{PLURAL:$1|dina}})",
        "login": "malebu ring log",
        "nav-login-createaccount": "malebu log / ngawe pepalihan",
        "userlogin": "malebu log / ngawe pepalihan",
index fceddbc..3808477 100644 (file)
        "yourname": "Nutzanama:",
        "yourpassword": "Passwort:",
        "yourpasswordagain": "Es Passwort no amoi eigebm",
-       "remembermypassword": "Mitm Brausa dauahoft ogmejd bleibm (maximoi $1 {{PLURAL:$1|Dog|Dog}})",
        "yourdomainname": "Dei Domain:",
        "externaldberror": "Entweder es ligt a Feeler bai da externen Authentifiziarung vur oder du derfst dai externs Benytzerkonto ned aktualisirn.",
        "login": "Eilogga",
index c54c9eb..23b877e 100644 (file)
        "yourpasswordagain": "کلمه رمز دگه نویس",
        "createacct-yourpasswordagain": "چه دوبارگ پسوردء بلک ات",
        "createacct-yourpasswordagain-ph": "چه دوبارگ پسوردء بلک ات",
-       "remembermypassword": "می ورودءَ ته ای کامپیوتر بدار (په $1 {{PLURAL:$1|روچ|روچ}})",
        "userlogin-remembermypassword": "منء همک وهد برجاه بدار",
        "userlogin-signwithsecure": "چه ایمنین کنکشنء کارمرز بکن ات",
        "yourdomainname": "شمی دامین",
        "passwordreset-emailtext-user": "کاربر $1 چه {{SITENAME}} شمئی پسوردء واترء لوٹ مان {{SITENAME}} ($4) کتگ انت. {{PLURAL:$3|اکانت|اکانتان}} چیریگین کاربر گون ائ ایمیل ادرس همگرنچ انت:\n\n$2\n\n{{PLURAL:$3|ائ موکتین پسورد|ائ موکتین پسوردان}} رند چه {{PLURAL:$5|یک روچ|$5 روچ}} باطل بیت انت.\nشما ضرور انت انیگء لاگین کن ات ءُ نوکین پسوردء بزیر ات. اگان ادگر شهسء ائ لوٹء راهیگ کتگ انت، یانکه وتی اصلیگین پسوردء هیال کت ات ءُ رندء نلوٹ ات آئرا ٹگل دئیت، بیت که ائ پیگامء نگند بزان ات ءُ وتی پیسریگین پسوردء کارمرز کن ات.",
        "passwordreset-emailelement": "یوزرنام: \n$1\n\nموکتین پسورد: \n$2",
        "passwordreset-emailsentemail": "یک ایمیلء گون پسوردء واترء راهیگ بوت.",
-       "passwordreset-emailsent-capture": "یک ایمیلء پر پسورد واترء واسته که جهلیگء پیش دارگ بیت، راهیگ بیتگ انت.",
-       "passwordreset-emailerror-capture": "واترین ایمیل، که جهلیگء پیش دارگ بیت، اڈ بوت، بلئی آئی راهیگ پر {{GENDER:$2|کاربر}} پکا نبوت: $1",
        "changeemail": "ایمیل ادرسء ٹگل بدئ",
        "changeemail-header": "وتی اکانتء ایمیل ادرسء ٹگل بدئ",
        "changeemail-no-info": "پر یکپارگین دزرسی مان ائ تاکء پیکن لاگین کن ات.",
        "undo-nochange": "چوش که پیداگ انت ویرایش مان انیگء باطل بوتگ انت.",
        "undo-summary": "بازبینی برگردین $1 گون [[Special:مشارکتان/$2|$2]] ([[User talk:$2|گپ]] | [[Special:Contributions/$2|{{MediaWiki:Contribslink}}]])",
        "undo-summary-username-hidden": "بی اثر کتن نسخهٔ $1 گون یک نامالومین کاربرء واسته",
-       "cantcreateaccounttitle": "نه نونیت حساب شرکنت",
        "cantcreateaccount-text": "شرکتن حساب چی ای آدرس آی پی ('''$1''') محدود بوتت توسط [[User:$3|$3]].\n\nدلیلی داتگین توسط $3  شی انت ''$2''",
        "cantcreateaccount-range-text": "اکانتء اڈ کتن چه آی پی ادرسء مان ائ هوار <strong>$1</strong>، که شمئی آی پی (<strong>$4</strong>) مان آئی توکاانت، گون [[User:$3|$3]] متوقف بیتگ انت.\nدرشان کتگین دلیل گون $3، $2 انت.",
        "viewpagelogs": "آمار ای صفحه بچار",
index abacb5a..2fc4b3c 100644 (file)
        "yourpasswordagain": "Pakilaog giraray kan sekretong panlaog:",
        "createacct-yourpasswordagain": "Kumpirmaron an sekretong panlaog",
        "createacct-yourpasswordagain-ph": "Pakikaag otro an sekretong panlaog",
-       "remembermypassword": "Giromdoma an sakong paglaog sa kilyaw (browser) na ini (para sa maksimum na $1 {{PLURAL:$1|aldaw|mga aldaw}})",
        "userlogin-remembermypassword": "Dagos mo akong giromdomon na nakalaog",
        "userlogin-signwithsecure": "Gamiton an seguradong koneksyon",
        "yourdomainname": "An saimong kasakupan:",
        "activeusers-intro": "Iyo in an listahan kan mga paragamit na nagkaigwa nin mga ginibo sa laog kan nakaaging $1 {{PLURAL:$1|aldaw|mga aldaw}}.",
        "activeusers-count": "$1 {{PLURAL:$1|aksyon|mga aksyon}} sa nakaaging {{PLURAL:$3|aldaw|$3 mga aldaw}}",
        "activeusers-from": "Ipahiling an mga paragamit magpoon sa:",
-       "activeusers-hidebots": "Itago an mga panalnga",
-       "activeusers-hidesysops": "Itago an mga administrador",
        "activeusers-noresult": "Mayong mga paragamit na nanagboan.",
        "listgrouprights": "Mga karapatan kan grupo nin paragamit",
        "listgrouprights-summary": "An minasunod iyo an listahan kan mga grupo nin paragamit na pinaghunsay kaining wiki, kaiba an saindang asosyadong mga karapatan nin paggamit.\nPuwedeng magkakaigwa nin [[{{MediaWiki:Listgrouprights-helppage}}|kadagdagang impormasyon]] mapanungod sa indibidwal na mga karapatan.",
        "htmlform-chosen-placeholder": "Magpili nin sarong opsyon",
        "htmlform-title-not-creatable": "\"$1\" bako sarong maimumuknang titulo kan pahina",
        "htmlform-title-not-exists": "$1 bakong eksistido.",
-       "sqlite-has-fts": "$1 na igwang suporta sa kabilogang-teksto nin paghahanap",
-       "sqlite-no-fts": "$1 na mayong suporta sa kabilogang-teksto nin paghahanap",
        "logentry-delete-delete": "$1 {{GENDER:$2|pinagpura na}} pahina $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|pinagbalik}} na pahina $3",
        "logentry-delete-event": "$1 {{GENDER:$2|pinagliwat}}an bisibilidad kan {{PLURAL:$5|sarong talaan nin pangyayari|$5 talaan nin mga pangyayari}} kan $3: $4",
index 91eb57d..73e2397 100644 (file)
@@ -15,7 +15,8 @@
                        "Тест",
                        "아라",
                        "Liashko",
-                       "Macofe"
+                       "Macofe",
+                       "Kareyac"
                ]
        },
        "tog-underline": "Падкрэсьліваць спасылкі:",
        "views": "Рэжымы",
        "toolbox": "Інструмэнты",
        "tool-link-userrights": "Зьмяніць групы {{GENDER:$1|ўдзельніка|ўдзельніцы}}",
+       "tool-link-userrights-readonly": "Паказаць групы {{GENDER:$1|ўдзельніка|ўдзельніцы}}",
        "tool-link-emailuser": "Даслаць {{GENDER:$1|удзельніку|удзельніцы}} ліст электроннай поштай",
        "userpage": "Паказаць старонку ўдзельніка",
        "projectpage": "Паказаць старонку праекту",
        "botpasswords-label-delete": "Выдаліць",
        "botpasswords-label-resetpassword": "Скінуць пароль",
        "botpasswords-label-grants": "Прыдатныя дазволы:",
-       "botpasswords-help-grants": "Ð\9aожнÑ\8b Ð´Ð°Ð·Ð²Ð¾Ð» Ð´Ð°Ðµ Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð° Ð¿Ñ\80авоÑ\9e Ñ\83дзелÑ\8cнÑ\96ка, Ñ\8fкÑ\96Ñ\8f Ñ\9eжо Ð¼Ð°Ðµ Ñ\80аÑ\85Ñ\83нак Ñ\83дзелÑ\8cнÑ\96ка. Глядзіце [[Special:ListGrants|табліцу дазволаў]] дзеля дадатковых зьвестак.",
+       "botpasswords-help-grants": "Ð\94азволÑ\8b Ð´Ð°Ñ\8eÑ\86Ñ\8c Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð° Ð¿Ñ\80авоÑ\9e Ñ\83дзелÑ\8cнÑ\96ка, Ñ\8fкÑ\96Ñ\8f Ñ\9eжо Ð¼Ð°Ðµ Ð²Ð°Ñ\88 Ñ\80аÑ\85Ñ\83нак Ñ\83дзелÑ\8cнÑ\96ка. Ð\9dаданÑ\8cне Ð´Ð°Ð·Ð²Ð¾Ð»Ñ\83 Ñ\82Ñ\83Ñ\82 Ð½Ðµ Ð´Ð°Ðµ Ð´Ð¾Ñ\81Ñ\82Ñ\83пÑ\83 Ð´Ð° Ð¿Ñ\80авоÑ\9e, Ñ\8fкÑ\96Ñ\85 Ð½Ñ\8fма Ñ\9e Ð²Ð°Ñ\88ага Ñ\80аÑ\85Ñ\83нкÑ\83. Глядзіце [[Special:ListGrants|табліцу дазволаў]] дзеля дадатковых зьвестак.",
        "botpasswords-label-grants-column": "Дазволена",
        "botpasswords-bad-appid": "Назва робата «$1» зьяўляецца няслушнай.",
        "botpasswords-insert-failed": "Не атрымалася дадаць робата зь імем «$1». Магчыма, ён ужо быў дададзены?",
        "passwordreset-emaildisabled": "Функцыі электроннай пошты ў гэтай вікі былі адключаныя.",
        "passwordreset-username": "Імя ўдзельніка:",
        "passwordreset-domain": "Дамэн:",
-       "passwordreset-capture": "Паказаць выніковы электронны ліст?",
-       "passwordreset-capture-help": "Калі Вы пазначыце гэтае поле, электронны ліст (з часовым паролем) будзе паказаны Вам, як толькі ён будзе дасланы ўдзельніку.",
        "passwordreset-email": "Адрас электроннай пошты:",
        "passwordreset-emailtitle": "Падрабязнасьці рахунку ў {{GRAMMAR:месны|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Нехта (магчыма Вы, з IP-адрасу $1) зрабіў запыт на скіданьне вашага паролю ў {{GRAMMAR:месны|{{SITENAME}}}} ($4). {{PLURAL:$3|1=Наступны рахунак удзельніка зьвязаны|Наступныя рахункі ўдзельнікаў зьвязаныя}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|1=Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць $5 {{PLURAL:$5|дзень|дні|дзён}}.\nЦяпер Вам неабходна ўвайсьці і выбраць новы пароль. Калі нехта іншы зрабіў гэты запыт, ці Вы ўспомнілі Ваш пачатковы пароль, які ня хочаце мяняць, Вы можаце праігнараваць гэтае паведамленьне, і працягваць выкарыстоўваць стары пароль.",
        "passwordreset-emailelement": "Імя ўдзельніка: \n$1\n\nЧасовы пароль: \n$2",
        "passwordreset-emailsentemail": "Калі гэты адрас электроннай пошты далучаны да вашага рахунку, тады будзе дасланы ліст пра скідваньне паролю.",
        "passwordreset-emailsentusername": "Калі ёсьць адрас электроннай пошты, злучаны з гэтым імем удзельніка, тады будзе дасланы ліст пра скідваньне паролю.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|1=Электронны ліст|Электронныя лісты}} скіданьня паролю {{PLURAL:$1|1=быў дасланы|былі дасланыя}}. {{PLURAL:$1|1=Імя ўдзельніка і пароль|Сьпіс імёнаў удзельнікаў і паролі}} паказаныя тут.",
-       "passwordreset-emailerror-capture2": "Не атрымалася даслаць {{GENDER:$2|удзельніку|удзельніцы}} ліст электроннай поштай: $1 {{PLURAL:$3|1=Імя ўдзельніка і пароль|Сьпіс імёнаў удзельнікаў і паролі}} паказаныя тут.",
        "passwordreset-nocaller": "Мусіць быць пададзены той, хто робіць выклік",
        "passwordreset-nosuchcaller": "Аўтар выкліку не існуе: $1",
        "passwordreset-ignored": "Скіданьне паролю не адбылося. Магчыма, ня быў наладжаны пастаўшчык?",
-       "passwordreset-invalideamil": "Няслушны адрас электроннай пошты",
+       "passwordreset-invalidemail": "Няслушны адрас электроннай пошты",
        "passwordreset-nodata": "Не былі пададзеныя ні імя ўдзельніка, ні адрас электроннай пошты",
        "changeemail": "Зьмяніць або выдаліць адрас электроннай пошты",
        "changeemail-header": "Запоўніце гэтую форму, каб зьмяніць ваш адрас электроннай пошты. Калі вы жадаеце выдаліць адрас электроннай пошты, далучаны да вашага рахунку, пакіньце поле новага адрасу электроннай пошты пустым пры запаўненьні формы.",
        "userpage-userdoesnotexist-view": "Рахунак «$1» ня створаны.",
        "blocked-notice-logextract": "Гэты ўдзельнік у цяперашні момант заблякаваны.\nАпошні запіс з журналу блякаваньняў пададзены ніжэй для даведкі:",
        "clearyourcache": "<strong>Заўвага:</strong> каб пабачыць зьмены пасьля захаваньня, Вам можа спатрэбіцца ачысьціць кэш Вашага браўзэра. \n* <strong>Firefox / Safari:</strong> трымайце <em>Shift</em> і націсьніце <em>Reload</em>, ці націсьніце <em>Ctrl-F5</em> ці <em>Ctrl-R</em> (<em>⌘-R</em> на Mac)\n* <strong>Google Chrome:</strong> націсьніце <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer:</strong> трымайце <em>Ctrl</em> і націсьніце <em>Refresh</em>, ці націсьніце <em>Ctrl-F5</em>\n* <strong>Opera:</strong> перайдзіце ў <em>Menu → Settings</em> (<em>Opera → Preferences</em> на Mac), а потым у <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
-       "usercssyoucanpreview": "'''Падказка:''' выкарыстоўвайце кнопку «{{int:showpreview}}», каб паспрабаваць новы код CSS перад тым як яго запісаць.",
-       "userjsyoucanpreview": "'''Падказка:''' выкарыстоўвайце кнопку «{{int:showpreview}}», каб паспрабаваць новы код JavaScript перад тым, як яго запісаць.",
-       "usercsspreview": "'''Памятайце, што гэта толькі папярэдні прагляд Вашага CSS. Ён яшчэ не запісаны!'''",
-       "userjspreview": "'''Памятайце, што гэта толькі папярэдні прагляд Вашага JavaScript, ён яшчэ не запісаны!'''",
-       "sitecsspreview": "'''Памятайце, што гэта толькі папярэдні прагляд гэтага CSS.'''\n'''Ён яшчэ не захаваны!'''",
-       "sitejspreview": "'''Памятайце, што гэта толькі папярэдні прагляд гэтага коду JavaScript.'''\n'''Ён яшчэ не захаваны!'''",
-       "userinvalidcssjstitle": "'''Папярэджаньне:''' няма тэмы афармленьня «$1».\nПамятайце, што ўласныя старонкі .css і .js павінны мець назву, якая складаецца з малых літараў, напрыклад, {{ns:user}}:Хтосьці/vector.css, а не {{ns:user}}:Хтосьці/Vector.css.",
+       "usercssyoucanpreview": "<strong>Падказка:</strong> выкарыстоўвайце кнопку «{{int:showpreview}}», каб паспрабаваць новы CSS-код перад яго захаваньнем.",
+       "userjsyoucanpreview": "<strong>Падказка:</strong> выкарыстоўвайце кнопку «{{int:showpreview}}», каб паспрабаваць новы код JavaScript перад тым, як яго захаваць.",
+       "usercsspreview": "<strong>Памятайце, што гэта толькі папярэдні прагляд вашага CSS. Ён яшчэ не запісаны!</strong>",
+       "userjspreview": "<strong>Памятайце, што гэта толькі папярэдні прагляд Вашага JavaScript. Ён яшчэ не запісаны!</strong>",
+       "sitecsspreview": "<strong>Памятайце, што гэта толькі папярэдні прагляд гэтага CSS.\nЁн яшчэ не захаваны!</strong>",
+       "sitejspreview": "<strong>Памятайце, што гэта толькі папярэдні прагляд гэтага коду JavaScript.\nЁн яшчэ не захаваны!</strong>",
+       "userinvalidcssjstitle": "<strong>Папярэджаньне:</strong> няма тэмы афармленьня «$1».\nПамятайце, што ўласныя старонкі .css і .js павінны мець назву, якая складаецца з малых літараў, напрыклад, {{ns:user}}:Хтосьці/vector.css, а не {{ns:user}}:Хтосьці/Vector.css.",
        "updated": "(Абноўлена)",
-       "note": "'''Заўвага: '''",
-       "previewnote": "'''Гэта толькі папярэдні прагляд.'''\nВашыя зьмены яшчэ не былі захаваныя!",
+       "note": "<strong>Заўвага:</strong>",
+       "previewnote": "<strong>Гэта толькі папярэдні прагляд.</strong>\nВашыя зьмены яшчэ не былі захаваныя!",
        "continue-editing": "Перайсьці да рэдагаваньня",
        "previewconflict": "Гэта папярэдні прагляд тэксту зь верхняга вакна рэдагаваньня, так ён будзе выглядаць, калі Вы вырашыце яго захаваць.",
        "session_fail_preview": "Выбачайце! Мы не змаглі апрацаваць вашую праўку праз страту зьвестак сэсіі.\n\nМагчыма, вы выйшлі з сыстэмы. <strong>Калі ласка, праверце, што вы знаходзіцеся ў сыстэме і паспрабуйце яшчэ раз<strong>. Калі не спрацуе, паспрабуйце [[Special:UserLogout|выйсьці]] і ўвайсьці яшчэ раз, а таксама праверце, што ваш браўзэр дазваляе файлы-кукі з гэтага сайту.",
        "session_fail_preview_html": "Выбачайце! Мы не змаглі апрацаваць вашую праўку праз страту зьвестак сэсіі.\n\n<em>Таму што ў {{GRAMMAR:месны|{{SITENAME}}}} дазволена выкарыстоўваць чысты HTML, папярэдні прагляд быў адключаны для засьцярогі ад атакаў праз JavaScript.</em>\n\n<strong>Калі гэта сапраўдная спроба рэдагаваньня, калі ласка, паспрабуйце яшчэ раз.</strong>\nКалі гэта не дапамагае, паспрабуйце [[Special:UserLogout|выйсьці з сыстэмы]] і ўвайсьці ізноў, а таксама праверце, што ваш браўзер дазваляе кукі-файлы з гэтага сайту.",
-       "token_suffix_mismatch": "'''Вашае рэдагаваньне было адхіленае, таму што Ваш кліент ня можа апрацоўваць знакі пунктуацыі ў акне рэдагаваньня.\nРэдагаваньне было скасаванае для таго, каб пазьбегнуць зьнішчэньня тэксту старонкі.\nТакія памылкі здараюцца, калі Вы выкарыстоўваеце ананімны проксі-сэрвэр, які ўтрымлівае памылкі.'''",
-       "edit_form_incomplete": "'''Некаторыя часткі формы рэдагаваньня не дасягнулі сэрвэра. Упэўніцеся, што Вашыя рэдагаваньні не пашкоджаныя і паспрабуйце зноў.'''",
+       "token_suffix_mismatch": "<strong>Вашае рэдагаваньне было адхіленае, таму што Ваш кліент псуе знакі пунктуацыі ў жэтоне рэдагаваньня.</strong>\nРэдагаваньне было скасаванае для таго, каб пазьбегнуць зьнішчэньня тэксту старонкі.\nТакія памылкі здараюцца, калі Вы выкарыстоўваеце ананімны проксі-сэрвэр, які ўтрымлівае памылкі.",
+       "edit_form_incomplete": "<strong>Некаторыя часткі формы рэдагаваньня не дасягнулі сэрвэра. Упэўніцеся, што Вашыя рэдагаваньні не пашкоджаныя і паспрабуйце зноў.</strong>",
        "editing": "Рэдагаваньне: $1",
        "creating": "Стварэньне «$1»",
        "editingsection": "Рэдагаваньне $1 (разьдзел)",
-       "editingcomment": "Рэдагаваньне: $1 (новая сэкцыя)",
+       "editingcomment": "Рэдагаваньне $1 (новы разьдзел)",
        "editconflict": "Канфлікт рэдагаваньняў: $1",
-       "explainconflict": "Ð\9dеÑ\85Ñ\82а Ð·Ñ\8cмÑ\8fнÑ\96Ñ\9e Ñ\81Ñ\82аÑ\80онкÑ\83 Ð¿Ð°Ð´Ñ\87аÑ\81 Ð\92аÑ\88ага Ñ\80Ñ\8dдагаванÑ\8cнÑ\8f.\nУ Ð²ÐµÑ\80Ñ\85нÑ\96м Ñ\82Ñ\8dкÑ\81Ñ\82авÑ\8bм Ð°ÐºÐ½Ðµ Ð·Ð½Ð°Ñ\85одзÑ\96Ñ\86Ñ\86а Ñ\86Ñ\8fпеÑ\80аÑ\88нÑ\96 Ð·Ñ\8cмеÑ\81Ñ\82 Ñ\81Ñ\82аÑ\80онкÑ\96.\nÐ\92аÑ\88Ñ\8bÑ\8f Ð·Ñ\8cменÑ\8b Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ\8bÑ\8f Ñ\9e Ð½Ñ\96жнÑ\96м Ð°ÐºÐ½Ðµ.\nÐ\92ам Ñ\82Ñ\80Ñ\8dба Ð¿ÐµÑ\80анеÑ\81Ñ\8cÑ\86Ñ\96 Ð\92аÑ\88Ñ\8bÑ\8f Ð·Ñ\8cменÑ\8b Ñ\9e Ñ\86Ñ\8fпеÑ\80аÑ\88нÑ\96 Ñ\82Ñ\8dкÑ\81Ñ\82.\nÐ\9aалÑ\96 Ð\92Ñ\8b Ð½Ð°Ñ\86Ñ\96Ñ\81Ñ\8cнÑ\96Ñ\86е Â«{{int:savearticle}}», Ð±Ñ\83дзе Ð·Ð°Ñ\85аванÑ\8b '''Ñ\82олÑ\8cкÑ\96''' тэкст верхняга вакна.",
+       "explainconflict": "Ð\9dеÑ\85Ñ\82а Ð·Ñ\8cмÑ\8fнÑ\96Ñ\9e Ñ\81Ñ\82аÑ\80онкÑ\83 Ð¿Ð°Ð´Ñ\87аÑ\81 Ð²Ð°Ñ\88ага Ñ\80Ñ\8dдагаванÑ\8cнÑ\8f.\nУ Ð²ÐµÑ\80Ñ\85нÑ\96м Ñ\82Ñ\8dкÑ\81Ñ\82авÑ\8bм Ð°ÐºÐ½Ðµ Ð·Ð½Ð°Ñ\85одзÑ\96Ñ\86Ñ\86а Ñ\86Ñ\8fпеÑ\80аÑ\88нÑ\96 Ð·Ñ\8cмеÑ\81Ñ\82 Ñ\81Ñ\82аÑ\80онкÑ\96.\nÐ\92аÑ\88Ñ\8bÑ\8f Ð·Ñ\8cменÑ\8b Ð¿Ð°ÐºÐ°Ð·Ð°Ð½Ñ\8bÑ\8f Ñ\9e Ð½Ñ\96жнÑ\96м Ð°ÐºÐ½Ðµ.\nÐ\92ам Ñ\82Ñ\80Ñ\8dба Ð¿ÐµÑ\80анеÑ\81Ñ\8cÑ\86Ñ\96 Ð²Ð°Ñ\88Ñ\8bÑ\8f Ð·Ñ\8cменÑ\8b Ñ\9e Ñ\86Ñ\8fпеÑ\80аÑ\88нÑ\96 Ñ\82Ñ\8dкÑ\81Ñ\82.\nÐ\9aалÑ\96 Ð²Ñ\8b Ð½Ð°Ñ\86Ñ\96Ñ\81Ñ\8cнÑ\96Ñ\86е Â«{{int:savearticle}}», Ð±Ñ\83дзе Ð·Ð°Ñ\85аванÑ\8b <strong>Ñ\82олÑ\8cкÑ\96</strong> тэкст верхняга вакна.",
        "yourtext": "Ваш тэкст",
        "storedversion": "Захаваная вэрсія",
        "nonunicodebrowser": "'''ПАПЯРЭДЖАНЬНЕ: Ваш браўзэр не працуе з кадаваньнем UTF-8 (Unicode).\nУ выніку гэтага ўсе сымбалі ня ўключаныя ў ASCII будуць замененыя на іх шаснаццаткавыя коды.'''",
        "prefs-help-recentchangescount": "Гэта датычыцца апошніх зьменах, гісторый старонак і журналаў.",
        "prefs-help-watchlist-token2": "Гэта сакрэтны ключ да стужкі вашага сьпісу назіраньня.\nКожны, хто ведае яго, можа набыць доступ да вашага сьпісу назіраньня, таму не дзяліцеся ім.\n[[Special:ResetTokens|Пстрыкніце тут, калі вам трэба скінуць яго]].",
        "savedprefs": "Вашыя налады былі захаваныя.",
-       "savedrights": "Ð\9fÑ\80авы {{GENDER:$1|ўдзельніка|ўдзельніцы}} $1 былі захаваныя.",
+       "savedrights": "Ð\93Ñ\80Ñ\83пы {{GENDER:$1|ўдзельніка|ўдзельніцы}} $1 былі захаваныя.",
        "timezonelegend": "Часавы пояс:",
        "localtime": "Мясцовы час:",
        "timezoneuseserverdefault": "Выкарыстоўваць стандартныя налады {{GRAMMAR:родны|{{SITENAME}}}} ($1)",
        "prefswarning-warning": "Вы зрабілі зьмены ў вашых наладах, якія яшчэ не былі захаваныя.\nКалі вы закрыеце гэтую старонку і не націсьніце «$1», вашыя налады ня будуць абноўленыя.",
        "prefs-tabs-navigation-hint": "Падказка: вы можаце пераходзіць паміж укладкамі ў сьпісе ўкладак з дапамогай клявішаў налева і направа.",
        "userrights": "Кіраваньне правамі ўдзельнікаў і ўдзельніц",
-       "userrights-lookup-user": "Ð\9aÑ\96Ñ\80аванÑ\8cне Ð³Ñ\80Ñ\83памÑ\96 Ñ\9eдзелÑ\8cнÑ\96каÑ\9e Ñ\96 Ñ\9eдзелÑ\8cнÑ\96Ñ\86",
+       "userrights-lookup-user": "Ð\92Ñ\8bбаÑ\80 Ñ\83дзелÑ\8cнÑ\96ка",
        "userrights-user-editname": "Увядзіце імя ўдзельніка:",
-       "editusergroup": "РÑ\8dдагаваÑ\86Ñ\8c Ð³Ñ\80Ñ\83пÑ\8b {{GENDER:$1|Ñ\9eдзелÑ\8cнÑ\96каÑ\9e Ñ\96 Ñ\9eдзелÑ\8cнÑ\96Ñ\86}}",
+       "editusergroup": "Ð\97агÑ\80Ñ\83зÑ\96Ñ\86Ñ\8c Ð³Ñ\80Ñ\83пÑ\8b Ñ\9eдзелÑ\8cнÑ\96ка",
        "editinguser": "Зьмена правоў {{GENDER:$1|удзельніка|удзельніцы}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Рэдагаваць групы ўдзельнікаў і ўдзельніц",
        "saveusergroups": "Захаваць групы {{GENDER:$1|ўдзельнікаў і ўдзельніц}}",
        "userrights-reason": "Прычына:",
        "userrights-no-interwiki": "Вы ня маеце дазволу зьмяняць правы ўдзельнікаў іншых вікаў.",
        "userrights-nodatabase": "Базы зьвестак $1 не існуе альбо яна не зьяўляецца лякальнай.",
-       "userrights-nologin": "Вы павінны [[Special:UserLogin|ўвайсьці ў сыстэму]] як адміністратар, каб прызначаць правы ўдзельнікам.",
-       "userrights-notallowed": "Вы ня маеце права прызначаць ці выдаляць правы ўдзельнікам.",
        "userrights-changeable-col": "Групы, якія Вы можаце мяняць",
        "userrights-unchangeable-col": "Групы, якія Вы ня можаце мяняць",
        "userrights-conflict": "Канфлікт пры зьмене правоў удзельнікаў! Калі ласка, праверце і захавайце вашыя зьмены.",
-       "userrights-removed-self": "Вы пазбавілі сябе ўласных правоў. З гэтай прычыны вы больш ня маеце доступу да гэтай старонкі.",
        "group": "Група:",
        "group-user": "Удзельнікі",
        "group-autoconfirmed": "Аўтаматычна пацьверджаныя ўдзельнікі",
        "right-siteadmin": "блякаваньне і разблякаваньне базы зьвестак",
        "right-override-export-depth": "экспартаваньне старонак, уключаючы зьвязаныя старонкі з глыбінёй да 5",
        "right-sendemail": "адпраўка электронных лістоў іншым удзельнікам",
-       "right-passwordreset": "прагляд электронных лістоў з ачысткай паролю",
        "right-managechangetags": "стварэньне і (дэ)актывацыя [[Special:Tags|метак]]",
        "right-applychangetags": "дадаваць [[Special:Tags|меткі]] пры рэдагаваньні",
        "right-changetags": "дадаваць і выдаляць адвольныя [[Special:Tags|меткі]] да асобных вэрсіяў і запісаў у журнале падзеяў",
        "apisandbox-continue": "Працягнуць",
        "apisandbox-continue-clear": "Ачысьціць",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries працягне] апошні запыт; {{int:apisandbox-continue-clear}} ачысьціць парамэтры, зьвязаныя з працягам.",
+       "apisandbox-param-limit": "Увядзіце <kbd>max</kbd>, каб выкарыстаць максымальны ліміт.",
+       "apisandbox-multivalue-all-namespaces": "$1 (усе прасторы назваў)",
+       "apisandbox-multivalue-all-values": "$1 (усе значэньні)",
        "booksources": "Крыніцы кніг",
        "booksources-search-legend": "Пошук кніг",
        "booksources-isbn": "ISBN:",
        "booksources-search": "Шукаць",
        "booksources-text": "Ніжэй знаходзіцца сьпіс спасылак на іншыя сайты, якія прадаюць новыя і патрыманыя кнігі, і могуць таксама мець інфармацыю пра кнігі, якія Вы шукаеце:",
        "booksources-invalid-isbn": "Пададзены няслушны ISBN; праверце, магчыма ўзьніклі памылкі пры пераносе нумару з арыгінальнай крыніцы.",
+       "magiclink-tracking-rfc": "Старонкі, на якіх ужытыя магічныя спасылкі RFC",
+       "magiclink-tracking-rfc-desc": "На гэтай старонцы ўжываюцца магічныя спасылкі RFC. Глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] пра тое, як зладзіць міграцыю.",
+       "magiclink-tracking-pmid": "Старонкі, на якіх ужытыя магічныя спасылкі PMID",
+       "magiclink-tracking-pmid-desc": "На гэтай старонцы ўжываюцца магічныя спасылкі PMID. Глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] пра тое, як зладзіць міграцыю.",
+       "magiclink-tracking-isbn": "Старонкі, на якіх ужытыя магічныя спасылкі ISBN",
+       "magiclink-tracking-isbn-desc": "На гэтай старонцы ўжываюцца магічныя спасылкі ISBN. Глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] пра тое, як зладзіць міграцыю.",
        "specialloguserlabel": "Выканаўца:",
        "speciallogtitlelabel": "Мэта (назва ці {{ns:user}}:імя_ўдзельніка для ўдзельніка):",
        "log": "Журналы падзеяў",
        "activeusers-intro": "Гэта сьпіс удзельнікаў, якія былі актыўнымі на працягу $1 {{PLURAL:$1|апошняга дня|апошніх дзён|апошніх дзён}}.",
        "activeusers-count": "$1 {{PLURAL:$1|дзеяньне|дзеяньні|дзеяньняў}} за $3 {{PLURAL:$3|апошні дзень|апошнія дні|апошніх дзён}}",
        "activeusers-from": "Паказваць ўдзельнікаў, пачынаючы з:",
+       "activeusers-groups": "Паказаць удзельнікаў, якія належаць да групаў:",
+       "activeusers-excludegroups": "Выключыць удзельнікаў, якія належаць да групаў:",
        "activeusers-noresult": "Удзельнікі ня знойдзеныя.",
        "activeusers-submit": "Паказаць актыўных удзельнікаў",
        "listgrouprights": "Правы групаў удзельнікаў",
        "modifiedarticleprotection": "зьменены ўзровень абароны старонкі «[[$1]]»",
        "unprotectedarticle": "зьнятая абарона з «[[$1]]»",
        "movedarticleprotection": "перанесеныя налады абароны з «[[$2]]» на «[[$1]]»",
+       "protectedarticle-comment": "{{GENDER:$2|Абараніў|Абараніла}} «[[$1]]»",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Зьмяніў узровень|Зьмяніла ўзровень}} абароны для «[[$1]]»",
+       "unprotectedarticle-comment": "{{GENDER:$2|Зьняў|Зьняла}} абарону з «[[$1]]»",
        "protect-title": "Абарона «$1»",
        "protect-title-notallowed": "Прагляд узроўню абароны «$1»",
        "prot_1movedto2": "[[$1]] перанесеная ў [[$2]]",
        "movelogpagetext": "Ніжэй пададзены сьпіс перанесеных старонак.",
        "movesubpage": "{{PLURAL:$1|1=Падстаронка|Падстаронкі}}",
        "movesubpagetext": "Гэтая старонка мае $1 {{PLURAL:$1|падстаронку|падстаронкі|падстаронак}}, {{PLURAL:$1|1=якая паказаная ніжэй|якія паказаныя ніжэй}}.",
+       "movesubpagetalktext": "Адпаведная старонка абмеркаваньня мае $1 {{PLURAL:$1|падстаронку, паказаную|падстаронкі, паказаныя|падстаронак, паказаныя}} ніжэй.",
        "movenosubpage": "Гэтая старонка ня мае падстаронак.",
        "movereason": "Прычына:",
        "revertmove": "адкат",
        "patrol-log-header": "Гэта журнал патруляваных вэрсіяў.",
        "log-show-hide-patrol": "$1 журнал патруляваньняў",
        "log-show-hide-tag": "$1 журнал метак",
+       "confirm-markpatrolled-button": "Добра",
        "deletedrevision": "Выдаленая старая вэрсія $1",
        "filedeleteerror-short": "Памылка выдаленьня файла: $1",
        "filedeleteerror-long": "У часе выдаленьня файла ўзьніклі наступныя памылкі:\n\n$1",
        "tags-deactivate": "адключыць",
        "tags-hitcount": "$1 {{PLURAL:$1|зьмена|зьмены|зьменаў}}",
        "tags-manage-no-permission": "Вы ня маеце правоў на зьмену метак.",
-       "tags-manage-blocked": "Вы ня можаце мяняць меткі, калі заблякаваныя.",
+       "tags-manage-blocked": "Вы ня можаце мяняць меткі, калі {{GENDER:$1|вы}} заблякаваныя.",
        "tags-create-heading": "Стварэньне новай меткі",
        "tags-create-explanation": "Па змоўчаньні, наваствораныя меткі будуць даступныя для выкарыстаньня ўдзельнікамі і робатамі.",
        "tags-create-tag-name": "Назва меткі:",
        "tags-deactivate-not-allowed": "Немагчыма дэактываваць метку «$1».",
        "tags-deactivate-submit": "Адключыць",
        "tags-apply-no-permission": "Вы ня маеце права прымяняць меткі да вашых рэдагаваньняў.",
-       "tags-apply-blocked": "Вы ня можаце мяняць меткі да вашых зьменаў, калі заблякаваныя.",
+       "tags-apply-blocked": "Вы ня можаце мяняць меткі да вашых зьменаў, калі {{GENDER:$1|вы}} заблякаваныя.",
        "tags-apply-not-allowed-one": "Метка «$1» ня можа быць прызначаная ўручную.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Наступную метку|Наступныя меткі}} нельга дадаваць уручную: $1",
        "tags-update-no-permission": "Вы ня маеце права на дадаваньне ці выдаленьне метак зьменаў для асобных вэрсіяў ці запісаў журналаў.",
-       "tags-update-blocked": "Ð\9fакÑ\83лÑ\8c Ð\92Ñ\8b Ð·Ð°Ð±Ð»Ñ\8fкаванÑ\8bÑ\8f, Ð\92Ñ\8b Ð½Ñ\8f Ð¼Ð¾Ð¶Ð°Ñ\86е Ð´Ð°Ð´Ð°Ð²Ð°Ñ\86Ñ\8c Ñ\96 Ð²Ñ\8bдалÑ\8fÑ\86Ñ\8c Ð¼ÐµÑ\82кÑ\96 Ð·Ñ\8cменаÑ\9e.",
+       "tags-update-blocked": "Ð\92Ñ\8b Ð½Ñ\8f Ð¼Ð¾Ð¶Ð°Ñ\86е Ð´Ð°Ð´Ð°Ð²Ð°Ñ\86Ñ\8c Ñ\96 Ð²Ñ\8bдалÑ\8fÑ\86Ñ\8c Ð¼ÐµÑ\82кÑ\96 Ð·Ñ\8cменаÑ\9e, Ð¿Ð°ÐºÑ\83лÑ\8c {{GENDER:$1|вÑ\8b}} Ð·Ð°Ð±Ð»Ñ\8fкаванÑ\8bÑ\8f.",
        "tags-update-add-not-allowed-one": "Метка «$1» ня можа быць дададзеная ўручную.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|1=Наступную метку|Наступныя меткі}} нельга дадаваць уручную: $1",
        "tags-update-remove-not-allowed-one": "Метка «$1» ня можа быць выдаленая.",
index 32e2e8a..734d773 100644 (file)
        "views": "Віды",
        "toolbox": "Прылады",
        "tool-link-userrights": "Змяніць групы {{GENDER:$1|ўдзельніка|ўдзельніцы}}",
+       "tool-link-userrights-readonly": "Паказаць групы {{GENDER:$1|ўдзельніка|ўдзельніцы}}",
        "tool-link-emailuser": "Напісаць ліст {{GENDER:$1|удзельніку|удзельніцы}}",
        "userpage": "Паказаць старонку ўдзельніка",
        "projectpage": "Паказаць старонку праекта",
        "botpasswords-label-delete": "Сцерці",
        "botpasswords-label-resetpassword": "Скінуць пароль",
        "botpasswords-label-grants": "Прыдатныя дазволы:",
-       "botpasswords-help-grants": "Ð\9aожнÑ\8b Ð´Ð°Ð·Ð²Ð¾Ð» Ð´Ð°Ðµ Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð° Ð¿Ñ\80авоÑ\9e Ñ\83дзелÑ\8cнÑ\96ка, Ñ\8fкÑ\96Ñ\8f Ñ\9eжо Ð¿Ñ\80Ñ\8bзнаÑ\87анÑ\8b Ñ\9eлÑ\96ковамÑ\83 Ð·Ð°Ð¿Ñ\96Ñ\81Ñ\83 Ñ\83дзелÑ\8cнÑ\96ка. Ð\93лÑ\8fдзÑ\96Ñ\86е [[Special:ListGrants|Ñ\82аблÑ\96Ñ\86Ñ\83 Ð´Ð°Ð·Ð²Ð¾Ð»Ð°Ñ\9e]] Ð´Ð»Ñ\8f Ð°Ñ\82Ñ\80Ñ\8bманнÑ\8f Ð´Ð°Ð´Ð°Ñ\82ковÑ\8bÑ\85 Ð·Ñ\8cвестак.",
+       "botpasswords-help-grants": "Ð\94азволÑ\8b Ð´Ð°Ñ\8eÑ\86Ñ\8c Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð° Ð¿Ñ\80авоÑ\9e, Ñ\8fкÑ\96Ñ\8f Ñ\9eжо Ð¼Ð°Ðµ Ð\92аÑ\88 Ñ\83лÑ\96ковÑ\8b Ð·Ð°Ð¿Ñ\96Ñ\81. Ð\9dаданне Ð´Ð°Ð·Ð²Ð¾Ð»Ñ\83 Ñ\82Ñ\83Ñ\82 Ð½Ðµ Ð´Ð°Ðµ Ð´Ð¾Ñ\81Ñ\82Ñ\83пÑ\83 Ð´Ð° Ð¿Ñ\80авоÑ\9e, Ñ\8fкÑ\96Ñ\85 Ð½Ñ\8fма Ñ\9e Ð\92аÑ\88ага Ñ\9eлÑ\96ковага Ð·Ð°Ð¿Ñ\96Ñ\81Ñ\83. Ð\93лÑ\8fдзÑ\96Ñ\86е [[Special:ListGrants|Ñ\82аблÑ\96Ñ\86Ñ\83 Ð´Ð°Ð·Ð²Ð¾Ð»Ð°Ñ\9e]] Ð´Ð»Ñ\8f Ð°Ñ\82Ñ\80Ñ\8bманнÑ\8f Ð´Ð°Ð´Ð°Ñ\82ковÑ\8bÑ\85 Ð·вестак.",
        "botpasswords-label-grants-column": "Дазволена",
        "botpasswords-bad-appid": "Назва робата \"$1\" недапушчальная.",
        "botpasswords-insert-failed": "Не ўдалося дадаць робату назву \"$1\". Магчыма, яна ўжо дададзена?",
        "passwordreset-emaildisabled": "Функцыі эл.пошты адключаны на гэтай Вікі.",
        "passwordreset-username": "Імя ўдзельніка:",
        "passwordreset-domain": "Дамен:",
-       "passwordreset-capture": "Праглядзець напісаны ліст?",
-       "passwordreset-capture-help": "Калі вы паставіце адзнаку, то вам будзе паказаны ліст з часовым паролем, які адпраўляецца ўдзельніку.",
        "passwordreset-email": "Адрас электроннай пошты:",
        "passwordreset-emailtitle": "Інфармацыя пра рахунак на сайце {{SITENAME}}",
        "passwordreset-emailtext-ip": "Нехта (магчыма вы, з IP-адрасу $1) запытаў скід  вашага пароля ў праекце {{SITENAME}} ($4).\n{{PLURAL:$3|Наступны ўліковы запіс звязаны|Наступныя ўліковыя запісы звязаны}} з гэтым адрасам электроннай пошты:\n\n$2\n\n{{PLURAL:$3|Гэты часовы пароль будзе|Гэтыя часовыя паролі будуць}} дзейнічаць {{PLURAL:$5|адзін дзень|$5 дні|$5 дзён}}.\nВы павінны зараз увайсці ў сістэму і абраць новы пароль. Калі вы не рабілі гэтага запыту, ці ўспомнілі свой зыходны пароль і не жадаеце яго мяняць, вы можаце праігнараваць гэтае паведамленне і працягнуць выкарыстоўваць свой стары пароль.",
        "passwordreset-emailelement": "Імя ўдзельніка: \n$1\n\nЧасовы пароль: \n$2",
        "passwordreset-emailsentemail": "Калі гэты адрас электроннай пошты злучаны з вашым уліковым запісам, будзе адпраўлены ліст пра скід пароля.",
        "passwordreset-emailsentusername": "Калі ёсць адрас электроннай пошты, злучаны з гэтым імем удзельніка, то будзе дасланы ліст пра скід пароля.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Электронны ліст|электронныя лісты}} скіду пароля адпраўлены. {{PLURAL:$1|Імя ўдзельніка і пароль|Спіс імён удзельнікаў і паролі}} паказаны ніжэй.",
-       "passwordreset-emailerror-capture2": "Не ўдалося даслаць {{GENDER:$2|удзельніку|удзельніцы}} ліст электроннай поштай: $1 {{PLURAL:$3|Імя ўдзельніка і пароль|Спіс імён удзельнікаў і паролі}} паказаны ніжэй.",
        "passwordreset-nocaller": "Мусіць быць указана, хто выклікае",
        "passwordreset-nosuchcaller": "Аўтар выкліку не існуе: $1",
        "passwordreset-ignored": "Скід пароля не быў апрацаваны. Магчыма, не настроены пастаўшчык?",
-       "passwordreset-invalideamil": "Няслушны адрас электроннай пошты",
+       "passwordreset-invalidemail": "Няслушны адрас электроннай пошты",
        "passwordreset-nodata": "Не былі пададзены ні імя ўдзельніка, ні адрас электроннай пошты",
        "changeemail": "Змяніць або выдаліць адрас электроннай пошты",
        "changeemail-header": "Запоўніце гэтую форму, каб змяніць свой адрас электроннай пошты. Калі хочаце выдаліць адрас электроннай пошты, злучаны з вашым уліковым запісам, пакіньце поле новага адраса электроннай пошты пустым пры адпраўцы формы.",
        "userpage-userdoesnotexist-view": "Уліковы запіс удзельніка \" $1 \"не зарэгістраваны.",
        "blocked-notice-logextract": "Гэты карыстальнік у дадзены момант заблакаваны. \nАпошні запіс журнала блакіровак прыводзіцца ніжэй для даведкі:",
        "clearyourcache": "<strong>Заўвага:</strong> Пасля замацоўвання, вам можа спатрэбіцца ачыстка кэшу браўзера, каб убачыць унесеныя змяненні. \n*<strong>Firefox / Safari:</strong> націсніце <em>Reload</em>, утрымліваючы <em>Shift</em>, або націсніце <em>Ctrl-F5</em> ці <em>Ctrl-R</em> (<em>⌘-R</em> на Макінтошах)\n* <strong>Google Chrome</strong>: Націсніце <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> на Mac)\n* <strong>Internet Explorer</strong>: націсніце <em>Refresh</em>, утрымліваючы <em>Ctrl</em>, або націсніце <em>Ctrl-F5</em>\n* <strong>Opera:</strong> Увайдзіце <em>Menu → Settings</em> (<em>Opera → Preferences</em> на Mac), далей <em>Privacy & security → Clear browsing data → Cached images and files</em>.",
-       "usercssyoucanpreview": "'''Парада:''' Карыстайцеся кнопкай \"''{{int:showpreview}}''\" для выпрабоўвання новага коду CSS ''перад тым'', як яго запісваць.",
-       "userjsyoucanpreview": "'''Парада:''' Карыстайцеся кнопкай \"''{{int:showpreview}}''\" для выпрабоўвання новага коду JS ''перад тым'', як яго запісваць.",
+       "usercssyoucanpreview": "<strong>Парада:</strong> Карыстайцеся кнопкай \"''{{int:showpreview}}''\", каб паспрабаваць новы код CSS перад тым, як яго запісваць.",
+       "userjsyoucanpreview": "<strong>Парада:</strong> Карыстайцеся кнопкай \"''{{int:showpreview}}''\", каб паспрабаваць новы код JavaScript перад тым, як яго запісваць.",
        "usercsspreview": "'''Памятайце, што гэта толькі папярэдні паказ вашага ўласнага CSS. Праўкі яшчэ не замацаваныя!'''",
-       "userjspreview": "'''Памятайце, што гэта выпрабаванне/папярэдні паказ вашага ўласнага Яваскрыпту, які яшчэ не быў замацаваны!'''",
-       "sitecsspreview": "'''Памятайце, што гэта толькі папярэдні паказ вашага CSS.'''\n'''Праўкі яшчэ не замацаваныя!'''",
-       "sitejspreview": "'''Памятайце, што гэта толькі папярэдні паказ вашага JavaScript.'''\n'''Праўкі яшчэ не замацаваныя!'''",
-       "userinvalidcssjstitle": "'''Увага:''' Няма вокладкі з назвай \"$1\". Памятайце, што свае старонкі .css і .js называюцца толькі малымі літарамі, такім чынам, напр., {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
+       "userjspreview": "<strong>Памятайце, што гэта толькі выпрабаванне/папярэдні паказ вашага JavaScript. Праўкі яшчэ не замацаваныя!</strong>",
+       "sitecsspreview": "<strong>Памятайце, што гэта толькі папярэдні паказ вашага CSS.\nПраўкі яшчэ не замацаваныя!</strong>",
+       "sitejspreview": "<strong>Памятайце, што гэта толькі папярэдні паказ вашага JavaScript.\nПраўкі яшчэ не замацаваныя!</strong>",
+       "userinvalidcssjstitle": "<strong>Увага:</strong> Няма вокладкі з назвай \"$1\". Памятайце, што свае старонкі .css і .js называюцца толькі малымі літарамі, такім чынам, напр., {{ns:user}}:Foo/vector.css, а не {{ns:user}}:Foo/Vector.css.",
        "updated": "(Абноўлена)",
        "note": "<strong>Заўвага:</strong>",
        "previewnote": "<strong>Памятайце, гэта толькі папярэдні паказ.</strong> Праўкі яшчэ не замацаваныя!",
        "session_fail_preview": "Не ўдалося апрацаваць вашу праўку, таму што сервер згубіў звесткі аб вашым сеансе.\n\nМагчыма, вы выйшлі з сістэмы. <strong>Калі ласка, праверце, што вы ўвайшлі ў сістэму і паспрабуйце яшчэ раз.</strong>\nКалі і тады не атрымаецца, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і зайсці ізноў, таксама праверце, што ваш браўзер дазваляе кукі з гэтага сайта.",
        "session_fail_preview_html": "Не ўдалося апрацаваць вашу праўку з-за таго, што згубіліся даныя аб сеансе.\n\n<em>Перадпаказ не зроблены, бо на пляцоўцы {{SITENAME}} дазволены сыры код HTML, што робіць магчымымі атакі праз Яваскрыпт.</em>\n\n<strong>Калі гэта нармальная спроба праўкі, паспрабуйце паўтарыць запісванне.</strong>\nКалі і гэта не дапаможа, паспрабуйце [[Special:UserLogout|выйсці з сістэмы]] і ўвайсці ізноў, таксама праверце, што ваш браўзер дазваляе кукі з гэтага сайта.",
        "token_suffix_mismatch": "'''Ваша праўка была адхілена, каб пазбегнуць сапсавання тэксту старонкі, таму што ваш браўзер папсаваў знакі прыпынку ў квітку праўкі.\nМагчыма, прычына ў выкарыстанні вамі ананімнага проксі-сервера, праграмы якога працуюць некарэктна.'''",
-       "edit_form_incomplete": "'''Некаторыя часткі формы рэдагавання не дасягнулі сервера. Упэўніцеся, што Вашыя рэдагаванні не пашкоджаныя і паспрабуйце зноў.'''",
+       "edit_form_incomplete": "<strong>Некаторыя часткі формы рэдагавання не дасягнулі сервера. Упэўніцеся, што Вашыя рэдагаванні не пашкоджаныя і паспрабуйце зноў.</strong>",
        "editing": "Правім $1",
        "creating": "Стварэнне старонкі «$1»",
        "editingsection": "Правім $1 (раздзел)",
        "userrights-reason": "Прычына:",
        "userrights-no-interwiki": "Вам не дазволена мяняць дазволаў карыстальнікам на іншых Вікі-ах.",
        "userrights-nodatabase": "Не знойдзена тут, або не існуе база даных $1.",
-       "userrights-nologin": "Належыць [[Special:UserLogin|увайсці ў сістэму]] на рахунак адміністратара, каб прызначаць дазволы ўдзельнікам.",
-       "userrights-notallowed": "Вам не дазволена дадаваць ці выдаляць правы ўдзельнікаў.",
        "userrights-changeable-col": "Групы, якія вам дазволена мяняць",
        "userrights-unchangeable-col": "Групы, якія вам не дазволена мяняць",
        "userrights-conflict": "Канфлікт змянення ўдзельніцкіх дазволаў! Калі ласка, праверце і пацвердзіце змены.",
-       "userrights-removed-self": "Вы выдалілі свае ўласныя правы. Такім чынам, Вы больш не зможаце атрымаць доступ да гэтай старонкі.",
        "group": "Група:",
        "group-user": "Удзельнікі",
        "group-autoconfirmed": "Аўта-пацверджаныя ўдзельнікі",
        "right-siteadmin": "Замыкаць і адмыкаць базу даных",
        "right-override-export-depth": "Экспартаваць старонкі, у тым ліку звязаныя, да глыбіні спасылак 5.",
        "right-sendemail": "Адпраўляць электронныя лісты іншым удзельнікам",
-       "right-passwordreset": "Бачыць электронныя лісты аб змяненні пароля",
        "right-managechangetags": "Ствараць і (дэ)актываваць [[Special:Tags|біркі]]",
        "right-applychangetags": "Прымяняць [[Special:Tags|біркі]] са сваімі праўкамі",
        "right-changetags": "Дадаваць і выдаляць адвольныя [[Special:Tags|біркі]] да асобных версій і запісаў у журнале падзей",
        "apisandbox-results-fixtoken": "Папраўце токен і паўтарыце адпраўку",
        "apisandbox-alert-page": "Палі на гэтай старонцы недапушчальныя.",
        "apisandbox-alert-field": "Значэнне гэтага поля недапушчальнае.",
+       "apisandbox-continue": "Працягнуць",
+       "apisandbox-continue-clear": "Ачысціць",
+       "apisandbox-param-limit": "Увядзіце <kbd>max</kbd>, каб выкарыстаць максімальны ліміт.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Усе прасторы назваў)",
+       "apisandbox-multivalue-all-values": "$1 (Усе значэнні)",
        "booksources": "Кнігі",
        "booksources-search-legend": "Знайсці, дзе купіць кнігі",
        "booksources-search": "Пошук",
        "booksources-text": "Ніжэй паказаны пералік спасылак на іншыя сеціўныя пляцоўкі, якія прадаюць новыя і б/у кнігі, і, магчыма, маюць больш звестак пра кнігі, якіх вы шукаеце:",
        "booksources-invalid-isbn": "Гэты ISBN не выглядае правільным; праверце правільнасць капіравання з арыгіналу.",
+       "magiclink-tracking-rfc": "Старонкі, на якіх ужытыя чароўныя спасылкі RFC",
+       "magiclink-tracking-rfc-desc": "На гэтай старонцы ўжываюцца чароўныя спасылкі RFC. Глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] аб тым, як перанесці.",
+       "magiclink-tracking-pmid": "Старонкі, на якіх ужытыя чароўныя спасылкі PMID",
+       "magiclink-tracking-pmid-desc": "На гэтай старонцы ўжываюцца чароўныя спасылкі PMID. Глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] пра тое, як перанесці.",
+       "magiclink-tracking-isbn": "Старонкі, на якіх ужытыя чароўныя спасылкі ISBN",
+       "magiclink-tracking-isbn-desc": "На гэтай старонцы ўжываюцца чароўныя спасылкі ISBN. Глядзіце [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] пра тое, як перанесці.",
        "specialloguserlabel": "Выканаўца:",
        "speciallogtitlelabel": "Мэта (назва ці {{ns:user}}:імя_ўдзельніка для ўдзельніка):",
        "log": "Журналы",
        "activeusers-intro": "Гэта пералік удзельнікаў, якія нешта рабілі за апошнія $1 {{PLURAL:$1|дзень|дзён}}.",
        "activeusers-count": "$1 {{PLURAL:$1|дзеянне|дзеянні|дзеянняў}} за апошні{{PLURAL:$3| дзень|я $3 дні|я $3 дзён}}",
        "activeusers-from": "Паказ, пачынаючы з:",
+       "activeusers-groups": "Паказаць удзельнікаў, якія належаць да групаў:",
        "activeusers-noresult": "Няма такіх удзельнікаў.",
        "activeusers-submit": "Паказаць актыўных удзельнікаў",
        "listgrouprights": "Дазволы для груп удзельнікаў",
        "modifiedarticleprotection": "зменены ўзровень аховы \"[[$1]]\"",
        "unprotectedarticle": "знятая ахова з \"[[$1]]\"",
        "movedarticleprotection": "настройкі аховы перанесеныя з \"[[$2]]\" у \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Абараніў|Абараніла}} «[[$1]]»",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Змяніў узровень|Змяніла ўзровень}} абароны для «[[$1]]»",
+       "unprotectedarticle-comment": "{{GENDER:$2|Зняў|Зняла}} абарону з «[[$1]]»",
        "protect-title": "Ахова «$1»",
        "protect-title-notallowed": "Прагляд узроўня аховы «$1»",
        "prot_1movedto2": "[[$1]] перанесена ў [[$2]]",
        "patrol-log-header": "Журнал ухваленых версій",
        "log-show-hide-patrol": "$1 журнал ухваленняў",
        "log-show-hide-tag": "$1 журнал бірак",
+       "confirm-markpatrolled-button": "Добра",
        "deletedrevision": "Сцёрта старая версія $1",
        "filedeleteerror-short": "Памылка пры сціранні файла: $1",
        "filedeleteerror-long": "Памылкі пры спробе сцірання файла:\n\n$1",
        "confirm-watch-top": "Дабавіць старонку ў спіс назірання",
        "confirm-unwatch-button": "ОК",
        "confirm-unwatch-top": "Выняць гэту старонку з вашага спіса назірання?",
+       "confirm-rollback-button": "Добра",
        "confirm-rollback-top": "Адкаціць праўкі гэтай старонкі?",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← папярэдняя старонка",
        "tags-actions-header": "Дзеянні",
        "tags-active-yes": "Да",
        "tags-active-no": "Не",
-       "tags-source-extension": "Ð\92Ñ\8bзнаÑ\87аеÑ\86Ñ\86а ÐºÐ°Ð½Ñ\87аÑ\82кам Ð½Ð°Ð·Ð²Ñ\8b",
+       "tags-source-extension": "Ð\92Ñ\8bзнаÑ\87аеÑ\86Ñ\86а Ð¿Ñ\80агÑ\80амнÑ\8bм Ð·Ð°Ð±ÐµÑ\81пÑ\8fÑ\87Ñ\8dннем",
        "tags-source-manual": "Ставіцца ўручную ўдзельнікамі і робатамі",
        "tags-source-none": "Больш не выкарыстоўваецца",
        "tags-edit": "правіць",
        "tags-activate": "актываваць",
        "tags-deactivate": "адключыць",
        "tags-hitcount": "$1 {{PLURAL:$1|змена|змены|змен}}",
+       "tags-manage-no-permission": "У вас няма дазволу на кіраванне біркамі змен.",
+       "tags-manage-blocked": "Вы не можаце мяняць меткі, калі {{GENDER:$1|Вы}} заблакаваныя.",
        "tags-create-heading": "Стварыць новую бірку",
        "tags-create-explanation": "Калі не ўказана іншае, новыя біркі будуць даступны для выкарыстання ўдзельнікам і робатам.",
        "tags-create-tag-name": "Назва біркі:",
        "tags-create-invalid-chars": "Назвы бірак не павінны ўтрымліваць коскі (<code>,</code>) або касыя рысы (<code>/</code>).",
        "tags-create-invalid-title-chars": "Назвы бірак не павінны ўтрымліваць сімвалы, якія нельга выкарыстоўваць у назвах старонак.",
        "tags-create-already-exists": "Бірка \"$1\" ужо ёсць.",
+       "tags-create-warnings-above": "Пры спробе стварыць бірку \"$1\" {{PLURAL:$2|выяўлена наступнае папярэджанне|выяўлены наступныя папярэджанні}}:",
        "tags-create-warnings-below": "Вы хочаце прадоўжыць стварэнне біркі?",
        "tags-delete-title": "Сцерці бірку",
        "tags-delete-explanation-initial": "Вы збіраецеся выдаліць бірку \"$1\" з базы звестак.",
        "tags-delete-not-found": "Бірка \"$1\" не існуе.",
        "tags-delete-too-many-uses": "Бірка \"$1\" прыменена ў больш чым $2 {{PLURAL:$2|версіі|версіях}}, а значыць, яна не можа быць сцёрта.",
        "tags-delete-warnings-after-delete": "Бірка \"$1\" была сцёрта, але {{PLURAL:$2|1=атрымана наступнае папярэджанне|атрыманы наступныя папярэджанні}}:",
+       "tags-delete-no-permission": "У вас няма дазволу на выдаленне бірак змен.",
        "tags-activate-title": "Актываваць бірку",
        "tags-activate-question": "Вы збіраецеся актываваць бірку \"$1\".",
        "tags-activate-reason": "Прычына:",
        "tags-deactivate-reason": "Прычына:",
        "tags-deactivate-not-allowed": "Немагчыма дэактываваць бірку \"$1\".",
        "tags-deactivate-submit": "Дэактываваць",
+       "tags-apply-no-permission": "У вас няма дазволу на прымяненне бірак змен разам а вашымі зменамі.",
+       "tags-apply-blocked": "Вы не можаце мяняць меткі да вашых зменаў, калі {{GENDER:$1|вы}}  заблакаваныя.",
+       "tags-apply-not-allowed-one": "Бірку \"$1\" нельга прызначаць уручную.",
+       "tags-apply-not-allowed-multi": "{{PLURAL:$2|Наступную бірку|Наступныя біркі}} нельга прызначаць уручную: $1",
+       "tags-update-no-permission": "У вас няма дазволу на дадаванне ці выдаленне бірак змен з асобных версій ці запісаў журнала.",
+       "tags-update-blocked": "Вы не можаце дадаваць або выдаляць біркі змен, калі {{GENDER:$1|Вы}} заблакаваныя.",
        "tags-update-add-not-allowed-one": "Бірку \"$1\" нельга дадаваць уручную.",
+       "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Наступную бірку|Наступныя біркі}} нельга дадаць уручную: $1",
        "tags-update-remove-not-allowed-one": "Бірку \"$1\" нельга выдаляць.",
        "tags-update-remove-not-allowed-multi": "{{PLURAL:$2|Наступную бірку|Наступныя біркі}} нельга выдаляць уручную: $1",
        "tags-edit-title": "Правіць біркі",
        "feedback-submit": "Даслаць",
        "feedback-thanks": "Дзякуй! Ваш водгук размешчаны на старонцы «[$2 $1]».",
        "feedback-thanks-title": "Дзякуем!",
-       "searchsuggest-search": "Шукаць у {{SITENAME}}",
+       "searchsuggest-search": "Шукаць у {{GRAMMAR:месны|{{SITENAME}}}}",
        "searchsuggest-containing": "змяшчае...",
        "api-error-badaccess-groups": "У Вас няма дазволу загружаць файлы ў гэтую вікі.",
        "api-error-badtoken": "Унутраная памылка: няслушны ключ.",
index e6b5d68..75266e8 100644 (file)
@@ -39,7 +39,8 @@
                        "Iliev",
                        "Spas.Z.Spasov",
                        "АдмиралАнимЕ",
-                       "Irus"
+                       "Irus",
+                       "Kareyac"
                ]
        },
        "tog-underline": "Подчертаване на препратките:",
        "passwordreset-emailelement": "Потребителско име: \n$1\n\nВременна парола: \n$2",
        "passwordreset-emailsentemail": "Ако електронната Ви поща е свързана със сметката Ви, на нея е изпратено писмо за възстановяване на паролата.",
        "passwordreset-emailsentusername": "Ако това потребителско име е свързано с електронна поща, е изпратено писмо за възстановяване на паролата.",
-       "passwordreset-invalideamil": "Неправилен email адрес",
+       "passwordreset-invalidemail": "Неправилен email адрес",
        "changeemail": "Промяна или премахване на адреса за е-поща",
        "changeemail-header": "Попълнете формуляра, за да промените адреса на електронната си поща. Ако искате да премахнете адреса на електронната си поща, при попълване на формуляра оставете полето за новия адрес празно.",
        "changeemail-no-info": "За да достъпвате тази страница директно, необходимо е да влезете в системата.",
        "patrol-log-header": "Тази страница съдържа дневник на проверените версии.",
        "log-show-hide-patrol": "$1 на Дневника на патрула",
        "log-show-hide-tag": "$1 на дневника на отбелязванията",
+       "confirm-markpatrolled-button": "Добре",
        "deletedrevision": "Изтрита стара версия $1",
        "filedeleteerror-short": "Грешка при изтриване на файл: $1",
        "filedeleteerror-long": "Възникнаха грешки при изтриването на файла:\n\n$1",
index 45c7060..cdc13ad 100644 (file)
        "october-date": "$1 اکتوبر",
        "november-date": "$1 نوامبر",
        "december-date": "$1 ڈ\tسمبر",
+       "period-am": "سوب",
+       "period-pm": "دي‌گر/نواشام",
        "pagecategories": "{{PLURAL:$1|تهر|تهرئان}}",
        "category_header": "تهرِ تاکدیمان «$1»",
        "subcategories": "گونڈ\t تهرئان",
        "category-file-count-limited": "{{PLURAL:$1|جهلگین فایل|$1 جهلگین فایلان}} بی انونین تهرئ تا قرار دارنت.",
        "listingcontinuesabbrev": "(ادامه)",
        "index-category": "آ تاکدیمان که دیسته بوته گنت",
-       "noindex-category": "Ø¢ ØªØ§Ú©Ø¯Û\8cÙ\85اÙ\86 Ú©Ù\87 Ø¯Û\8cستÙ\87 Ù\86Ù\87 Ø¨Ù\88تÙ\87 Ú¯نت",
+       "noindex-category": "Ø¢ ØªØ§Ú©Ø¯Û\8cÙ\85اÙ\86 Ú©Ù\87 Ø§Û\8cÙ\86دÛ\8cکس Ù\86Ù\87 Ø¨Ù\88تÙ\87â\80\8cانت",
        "broken-file-category": "تاکدیمان گو خرابین لینکان بی فایلا",
        "about": "بی باره ها",
        "article": "محتوائین تاکدیم",
        "newwindow": "(نوکین دروازگئ تا پاچ بکنێت)",
        "cancel": "کنسیل",
        "moredotdotdot": "گیشتیر...",
-       "morenotlisted": "ای لڑ\t لیست کامل نه اینت.",
+       "morenotlisted": "ای لڑ\t لیست مومکین اینت که کامل مه‌بيت.",
        "mypage": "تاکدیم",
-       "mytalk": "گپ",
-       "anontalk": "اÛ\8c Ø¢Û\8c Ù¾Û\8c Ù\86شاÙ\86Û\8c Ø¦Û\8c Ø¨Ø§Ø±Ù\87 Ø¦Ø§ گپ",
+       "mytalk": "حبر/گپ",
+       "anontalk": "حبر/گپ",
        "navigation": "جهت یابي",
        "and": "&#32;و",
        "qbfind": "ودی کورتین",
        "unprotectthispage": "ای تاکدیمی قُلپئ ٹگل داتین",
        "newpage": "نوکین تاکدیم",
        "talkpage": "ای تاکدیم باره ئا هبر و گپ",
-       "talkpagelinktext": "گپ",
+       "talkpagelinktext": "حبر/گپ",
        "specialpage": "خاصین تاکدیم",
        "personaltools": "شخصین وسایل",
        "articlepage": "تاکدیمی محتوائانی نمایش",
        "talk": "هبر و گپ",
        "views": "دیستینین",
        "toolbox": "وسایللان",
+       "tool-link-userrights": "{{GENDER:$1|کار زوروکین}} گروپاني تغیر داتین",
+       "tool-link-emailuser": "په ای {{GENDER:$1|کار زوروکا}} ایمیلئ دیم داتین",
        "userpage": "کارزوروکین تاکدیمی دیستین",
        "projectpage": "پروژه ئی تاکدیمی دیستین",
        "imagepage": "فایلی تاکدیما نشان داتین",
        "nocookieslogin": "{{SITENAME}} په کارزوروکانی لوگین بوتینا شه کوکی ئان ایستیپاده ئه کننت.\nشما کوکی ئانه شه کار پرینته ایت.\nمهربانی بکنیت کوکی ئانه په کار بگریت و پدا کوشش بکنیت.",
        "nocookiesfornew": "کارزوروکی هیساب جۆڑ نه بوت، په خاتیریکه نتوانتن آیی منبه ئا تایید بکنن.\nموتمه ئین به یت که کوکی په ئال انت، آ وختا شه سری ن\tۆک بارگیری بکینت و پدا امتیهان بکنیت .",
        "noname": "شما یک موتبرین کار زوروکی ئین نامی ئا مشخص نه کورته ئیت.",
-       "loginsuccesstitle": "کامیابین لوگین",
+       "loginsuccesstitle": "لوگین بوتین",
        "loginsuccess": "'''شما انون گو «$1» ئی نا بی {{SITENAME}} ئی تا داخل بوته ایت.'''",
-       "nosuchuser": "کار زوروکئ گۆ «$1» ئی ناما موجود نه اینت.\nکار زورکئ نام گۆ گۆنڈی یا توُهی ئا هوروپ ئان هساس اینت.\nنامی املا ئا بگنیدیت، یا [[Special:CreateAccount|یک نوکین کار زورکی هسابئ جۆڑ بکنیت]].",
+       "nosuchuser": "کار زوروکئ گۆ «$1»‌ئی ناما موجود نه اینت.\nکار زورکئ نام گۆ گۆنڈین یا ٹوُهین حروفان حساس اینت.\nنامی املا ئا بگنیدیت، یا [[Special:CreateAccount|یک نوکین کار زورکی حسابئ جۆڑ بکنیت]].",
        "nosuchusershort": "هیچ کار زوروکئ بی نامئ  ''$1'' ئا وجود نداریت.\nوتئ املا ئا چیک بکنیت.",
        "nouserspecified": "باید یک کار زوروکئ نام مشخص بکنیت.",
        "login-userblocked": "ای کار زوروک بلاک بوته، په داخل بوتینا اجازه نه اینت.",
        "resetpass_submit": "پاسوردی تنظیم و داخل بوتین",
        "changepassword-success": "شمی پاسوردئ تغیر کامیاب بوت و پاسورد تغیر کورت",
        "changepassword-throttled": "شما بیخی باز وار په لوگین بوتینا کوشش کورته ایت.\nمهربانئ بکنیت دیم شه آیی که پدا کوشش بکنیت $1 صبر کنیت.",
+       "botpasswords-label-create": "جوڑ\t کورتین",
+       "botpasswords-label-update": "اپڈیٹ",
+       "botpasswords-label-cancel": "کنسیل",
+       "botpasswords-label-delete": "پاک کورتین",
+       "botpasswords-label-resetpassword": "پاسوردئ پاک کورتین",
        "resetpass_forbidden": "نه توانیت که پاسوردا تغیر بدهیت",
        "resetpass-no-info": "په ای تاکدیمی دسترسی ئی خاتیرا داخل بئیت.",
        "resetpass-submit-loggedin": "پاسوردی تغیر داتین",
        "passwordreset-emaildisabled": "ایمیلی گزینه بی ای یکی ئی تا پئال نه ونت.",
        "passwordreset-username": "کار زوروکین نام:",
        "passwordreset-domain": "دامنه:",
-       "passwordreset-capture": "ایمیلی آخیر نشان داته بیئت؟",
-       "passwordreset-capture-help": "اگه ای گزینه ئا بگیندیت ، ایمیل (گو موقتین پاسوردا) بی شما نشان داته ئه بیئت و په کار زوروکا هم دیم داته ئه بیئت.",
        "passwordreset-email": "ایمیل ادرس:",
        "passwordreset-emailtitle": "حسابئ مئلومات بی {{SITENAME}}",
        "passwordreset-emailelement": "کار زوروکئ نام: \n$1\n\nموقت ئین چیهرگال: \n$2",
        "revdelete-unsuppress": "محدودیتانئ پاک بوتین بئ پدا دیستین ئی تا ترمیم بوته",
        "revdelete-log": "دلیل:",
        "revdelete-submit": "اعمال بئ {{PLURAL:$1|نخسه|نخسه هان}} ئی سرا انتخاب بوته",
-       "revdelete-success": "'''نخسه ئی ودی بوتین گو کامیابیا اپڈیٹ بوت.'''",
+       "revdelete-success": "'''نخسه‌ئی ودي بوتین گو کامیابیا اپڈیٹ بوت.'''",
        "revdelete-failure": "'''نخسه ئی ودی بوتینئ اپڈیٹ بوتن امکان وجود نداریت :'''\n$1",
-       "logdelete-success": "Ù\84Ù\88Ú¯Û\8cÙ\86 Ø¦Û\8c Ù\82ابÙ\84Û\8cت Ø¯Û\8cست Ú¯Ù\88 Ú©Ø§Ù\85Û\8cابÛ\8cا انجام بوت.",
+       "logdelete-success": "Ù\85Ù\88رÛ\8cدئ Ù\88دÙ\8a Ø¨Ù\88تÛ\8cÙ\86 ØªØºÛ\8cر انجام بوت.",
        "logdelete-failure": "'''لوگین ئی قابلیت دیست تنظیم ئه نه بیئنت:'''\n$1",
        "revdel-restore": "نمایش/نهفتن",
        "pagehist": "تاکدیمی تاریخچه",
        "diff-multi-sameuser": "(ای کار زوروکئ {{PLURAL:$1|یک میانی نخسه|$1 میانی نخسه}}ِ نمایش داته بوته)",
        "diff-multi-otherusers": "({{PLURAL:$1|۱ میانین نخسه|$1 میانین نخسه}} دستکاری بوتگ شه {{PLURAL:$2|۱ کارزوروک|$2 کارزوروک}}ئ نیمگاه  نشان داته نه بوته)",
        "diff-multi-manyusers": "({{PLURAL:$1|یک|$1}} میانین دستکاری بوته ئین نخسه گیشتیر شه {{PLURAL:$2|یک|$2}} کارزورکئ نیمگاه نشان داته نه بوته)",
-       "searchresults": "گشتین ئی  نتیجه",
+       "searchresults": "گشتینئی  نتیجه",
        "searchresults-title": "گشتینئ نتایج په «$1»",
        "titlematches": "مقاله ئی ئنوانئ یکی کورتین",
        "textmatches": "مقاله ئی متنئ یکی کورتین",
        "search-category": "(تهر  $1)",
        "search-file-match": "(فایلی محتوایی یکرنگی)",
        "search-suggest": "آیا شمی منظور ایش ات: $1",
-       "search-rewritten": "$1 ئی نتیجه ئانی نمایش. گشتین په $2 جاها.",
+       "search-rewritten": "$1‌ئی نتیجه‌ئانی نشان داتین. گشتین په $2‌ئی جاگا.",
        "search-interwiki-caption": "گوارین پروژه ئان",
        "search-interwiki-default": "نتایج شه $1 :",
        "search-interwiki-more": "(گیشتیر)",
        "userrights-reason": "دلیل:",
        "userrights-no-interwiki": "شما دیگه ویکی هانی کار زوروکانئ اختیارانی تغیر داتینی اجازه ئا نداریت.",
        "userrights-nodatabase": " $1 مئلوماتئ بانک وجود نداریت یا محلی نه اینت.",
-       "userrights-nologin": "شما باید گو یک مدیرئی  [[Special:UserLogin|کار زوروکین حسابا لوگین بیئیت]] تا که بتوانیت دیگه کار زوروکانئ اختیارانا تعین بکنیت.",
-       "userrights-notallowed": "شما په کار زوروکئ حقوق ئی پاک کورتین یا افاضه کورتینی اجازه ئه نداریت.",
        "userrights-changeable-col": "ئا گروپان که شما توانیت آوانا ٹگل بدهیت",
        "userrights-unchangeable-col": "ئا گروپان که شما نتوانیت آوانا ٹگل بدهیت",
        "userrights-conflict": "حمله بئ کار زوروکئ حقان! مهربانی بکنیت بگیندیت و تغیرانا تائید بکنیت.",
-       "userrights-removed-self": "شما وتئ دسترسی ئانه سیستیت. انون شما دیگه بئ ای تاکدیما دسترسی نداریت.",
        "group": "گروپ:",
        "group-user": "کار زوروکان",
        "group-autoconfirmed": "تائید بُوته ئین کار زوروکان",
        "group-sysop-member": "{{GENDER:$1|مدیر}}",
        "group-bureaucrat-member": "{{GENDER:$1|دیوان‌سالار}}",
        "group-suppress-member": "{{GENDER:$1|نظارت}}",
-       "grouppage-user": "{{ns:project}}:کارزورک ئان",
+       "grouppage-user": "{{ns:project}}:کارزورکئان",
        "grouppage-autoconfirmed": "{{ns:project}}:تائید بُوته ئین کار زوروک ئان",
        "grouppage-bot": "{{ns:project}}:ربات‌ ئان",
        "grouppage-sysop": "{{ns:project}}:مدیر ئان",
        "right-userrights-interwiki": "دیگه ویکی ئی کار زوروکانئ اختیارانی ایڈیٹ کورتین",
        "right-siteadmin": "مئلومات ئین بانکئ قُلپ و یا پاچ کورتین",
        "right-sendemail": "دیم داتین ایمل په دیگه کار زوروکان",
-       "right-passwordreset": "پاسوردی نوک تنظیم کورتینی ایمیل",
        "right-managechangetags": "[[Special:Tags|برچسپ ئانی]] جۆڑ و پاک کورتین مه لوماتین بانکا",
        "newuserlogpage": "کار زوروکئ جوڑ کورتینی سیاه چال",
        "newuserlogpagetext": "ای سیاه چال شه نوکین کار زوروکئ ناما جوڑ بوته.",
        "all-logs-page": "عمومین موچین سیاه چال هان",
        "logempty": "شمی منطبقین آیتم بی سیاه چالئ تا ودی نه بوت.",
        "log-title-wildcard": "آ تاکدیمیانی پدا بگرد که آوانی ئنوان که گۆ ای ئبارت ئا شرو ئه بیئت",
+       "checkbox-all": "موچ",
        "allpages": "موچین تاکدیمان",
        "nextpage": "بعدین تاکدیم ($1)",
        "prevpage": "دیمی تاکدیم ($1)",
        "actionfailed": "کار نه بوت",
        "deletedtext": "«$1» پاک بوت.\nپه آخیرین پاک بوتینین سابقه ئا بئ $2 ئی تا مراجعه بکنیت.",
        "dellogpage": "پاک بوته‌ئانی کورم",
-       "dellogpagetext": "جهلگین لڑلیستا که گیندیت په آخیرئین پاک بوته‌ئین فابلاني خاتیرا اینت.\nموچین نشان داته بوته‌ئین وخت گو (گرینویچ‌ئی وختا) مطابق انت.",
+       "dellogpagetext": "جهلگین لڑلیستا که گیندیت په آخیرئین پاک بوته‌ئین فایلاني خاتیرا اینت.\nموچین نشان داته بوته‌ئین وخت گو (گرینویچ‌ئی وختا) مطابق انت.",
        "deletionlog": "پاک بوته‌ئانی کورم",
        "reverted": "بی دیمتیرین نخسه ئا بیئرگردینته بوت",
        "deletecomment": "دلیل:",
        "sp-contributions-newbies": "فقط نوکین مشارکتان نشان داته بیئنت",
        "sp-contributions-newbies-sub": "په نوک کاران",
        "sp-contributions-newbies-title": "په نوک کارین حسابانی خاتیرا کار زوروکئ شراکت ئان",
-       "sp-contributions-blocklog": "بلاک بوته ئین ئانی سیاهه",
+       "sp-contributions-blocklog": "بلاک بوته ئین‌ئانی کورم‌جاه",
        "sp-contributions-suppresslog": "کار زوروکئ کومک اوشتاته انت",
-       "sp-contributions-deleted": "کار زوروکئ پاک بوئین شراکت ئان",
-       "sp-contributions-uploads": "بُرز بوته هان",
-       "sp-contributions-logs": "سیاهه‌ها",
-       "sp-contributions-talk": "گپ",
-       "sp-contributions-userrights": "کار گیروکی اختیارانی مدیریت",
+       "sp-contributions-deleted": "{{GENDER:$1|کار زوروکئ}} پاک بوته‌ئین دستکاریان",
+       "sp-contributions-uploads": "بُرز بوته‌ئین فایلان",
+       "sp-contributions-logs": "کورم",
+       "sp-contributions-talk": "حبر/گپ",
+       "sp-contributions-userrights": "کار زوروکاني اختیاراني مدیریت کورتین",
        "sp-contributions-blocked-notice": "ای کار زوروکئ دسترسی بی انونین وختا بسته بوته.\nآخرین مورد شه دسترسی ئی سیستین به جهلگا آته:",
        "sp-contributions-blocked-notice-anon": "ای کار زوروکئ دسترسی بی انونین وختا بسته بوته.\nآخرین مورد شه دسترسی ئی سیستین به جهلگا آته:",
        "sp-contributions-search": "گشتین په شراکتان",
        "blocklist-nousertalk": "وتئ گپ ئی تاکدیما نتوان ایڈیٹ کورت",
        "ipblocklist-empty": "بسته بوته ئین ئانی لیست خالی اینت.",
        "blocklink": "بلاک یا بستین",
-       "unblocklink": "پاچ یا انبلاک بێت",
-       "change-blocklink": "بلاک ئی تغیرداتین",
+       "unblocklink": "پاچ کورتین",
+       "change-blocklink": "بلاک‌ئی تغیر داتین",
        "contribslink": "شراکت‌ئان",
        "emaillink": "ایمیلی دیم داتین",
        "blocklogpage": "بستینئ کورم",
        "javascripttest-qunit-intro": "[$1 آزمایشی مشتندانا] بئ mediawiki.org تا بگیندیت.",
        "tooltip-pt-userpage": "{{GENDER:|شمئ کار زُورۆکین}} تاکدیم",
        "tooltip-pt-mytalk": "{{GENDER:|شمئ}} حبر و گپئ تاکدیم",
+       "tooltip-pt-anontalk": "ای آی‌پی ادرس‌ئی دستکاریاني موریدا حبر/گپ",
        "tooltip-pt-preferences": "{{GENDER:|شمئ}} تنظیماتان",
        "tooltip-pt-watchlist": "آ دیمانی لیست که شما آوانی تغیرانا پدگیری ئا کنیت",
        "tooltip-pt-mycontris": "{{GENDER:|شمئ}} شراکتاني لڑ",
        "logentry-protect-modify-cascade": "$1 $3 $4 ئ قُلپئ اندازه گا په {{GENDER:$2|تغییر دات}}[آپشاری]",
        "logentry-rights-rights": "$1 ، $3 ئی عضویتا شه $4 ئی گروپا بئ $5 {{GENDER:$2|تغییر دات}}",
        "logentry-rights-rights-legacy": "$1 عضویتئ گروپا بئ $3 ئا {{GENDER:$2|تغییر دات}}",
-       "logentry-rights-autopromote": "$1 بئ اوتوماتیکین رکما وتر شه $4 بئ $5 {{GENDER:$2|ارتقاء دات}}",
+       "logentry-rights-autopromote": "$1 بِه اوتوماتیکین رقما شه $4 بِه $5‌ئا {{GENDER:$2|ارتقاء کورت}}",
        "logentry-upload-upload": "$1 $3 ئا {{GENDER:$2|بُرز کورت}}",
        "logentry-upload-overwrite": "$1 نوکین نخسه ئی شه $3 ئا {{GENDER:$2|بُرز کورت}}",
        "logentry-upload-revert": "$1 {{GENDER:$2|بُرز کورت}} $3 ئا",
        "special-characters-title-endash": "پاسیله خت",
        "special-characters-title-emdash": "تچکین پاسیله خت",
        "special-characters-title-minus": "منپی نشانگ",
-       "mw-widgets-titleinput-description-redirect": "گردینتین به $1 یی تا"
+       "mw-widgets-titleinput-description-redirect": "گردینتین به $1 یی تا",
+       "log-action-filter-delete": "پاک بوتین‌ئی رقم:",
+       "log-action-filter-all": "موچ"
 }
index a34a427..e137ee9 100644 (file)
@@ -17,7 +17,7 @@
        "tog-extendwatchlist": "खाली हाले के बदलाव ना बालुक, सगरी बदलाव के देखावे खातिर धियानसूची के बिस्तारित करीं",
        "tog-usenewrc": "तुरंत भइल बदलाव में आ धियानसूची में भइल बदलाव सभ के पन्ना अनुसार झुंड में बांटी",
        "tog-numberheadings": "हेडिंग के ऑटो-नंबरिंग",
-       "tog-showtoolbar": "समà¥\8dपादन औजारपट्टी के देखावल जाव",
+       "tog-showtoolbar": "सà¤\82पादन औजारपट्टी के देखावल जाव",
        "tog-editondblclick": "दुइ क्लिक पर पन्ना सभ के संपादन करीं",
        "tog-editsectiononrightclick": "खंड की हेडिंग पर दायाँ क्लिक कइ के खंड के सम्पादित करीं",
        "tog-watchcreations": "हमार बनावल पन्ना आ हमार अपलोड कइल फाइल सभ के हमरी धियानसूची में जोड़ दिहल जाव",
        "tog-watchuploads": "हम नया फाइल अपलोड करीं त उनहना के हमार धियानसूची में जोड़ल जाय",
        "tog-watchrollback": "हमरा द्वारा रोलबैक कइल गइल पन्ना सभ के हमार धियानसूची में जोड़ दिहल जाव",
        "tog-minordefault": "डिफाल्ट रूप से सगरी संपादन कुल के छोट संपादन की रुप में चिन्हित कइल जाव",
-       "tog-previewontop": "नमà¥\82ना (preview) संपादन बक्सा से पहिले देखावल जाय",
-       "tog-previewonfirst": "पहिला à¤¸à¤\82पादन à¤ªà¤° à¤¨à¤®à¥\82ना देखावल जाय",
-       "tog-enotifwatchlistpages": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¦à¤°à¥\8dà¤\9c à¤\95à¥\8cनà¥\8b à¤­à¥\80 à¤ªà¤¨à¥\8dना à¤¯à¤¾ à¤«à¤¾à¤\87ल à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤¹à¥\8bà¤\96ला à¤ªà¤° à¤¹à¤®à¤\95à¥\87 à¤\88-मà¥\87ल à¤\95रल जाव",
-       "tog-enotifusertalkpages": "यदि à¤¹à¤®à¤¾à¤° à¤µà¤¾à¤°à¥\8dतालाप à¤ªà¤¨à¥\8dना à¤ªà¤° à¤\95à¥\8cनà¥\8b à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\8bà¤\96à¥\87 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤\88-मà¥\87ल à¤\95रल जाव",
-       "tog-enotifminoredits": "पनà¥\8dना à¤\86 à¤«à¤¾à¤\87ल à¤ªà¤° à¤\9bà¥\8bà¤\9fà¥\8b à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¹à¥\8bà¤\96à¥\87 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤\88-मà¥\87ल à¤\95रल जाव",
-       "tog-enotifrevealaddr": "à¤\85धिसà¥\82à¤\9aना ई-मेल में हमार ई-मेल पता देखावल जाव",
+       "tog-previewontop": "à¤\9dलà¤\95 (पà¥\8dरà¥\80वà¥\8dयà¥\82) संपादन बक्सा से पहिले देखावल जाय",
+       "tog-previewonfirst": "पहिला à¤¸à¤\82पादन à¤ªà¤° à¤\9dलà¤\95 (पà¥\8dरà¥\80वà¥\8dयà¥\82) देखावल जाय",
+       "tog-enotifwatchlistpages": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤¦à¤°à¥\8dà¤\9c à¤\95à¥\8cनà¥\8b à¤­à¥\80 à¤ªà¤¨à¥\8dना à¤¯à¤¾ à¤«à¤¾à¤\87ल à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤¹à¥\8bà¤\96ला à¤ªà¤° à¤¹à¤®à¤\95à¥\87 à¤\88-मà¥\87ल à¤\95à¤\87ल जाव",
+       "tog-enotifusertalkpages": "à¤\85à¤\97र à¤¹à¤®à¤°à¥\87 à¤¬à¤¾à¤¤à¤\9aà¥\80त à¤ªà¤¨à¥\8dना à¤ªà¤° à¤\95à¥\8cनà¥\8b à¤¬à¤¦à¤²à¤¾à¤µ à¤¹à¥\8bà¤\96à¥\87 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤\88-मà¥\87ल à¤\95à¤\87ल जाव",
+       "tog-enotifminoredits": "पनà¥\8dना à¤\86 à¤«à¤¾à¤\87ल à¤ªà¤° à¤\9bà¥\8bà¤\9fà¥\8b à¤¬à¤¦à¤²à¤¾à¤µ à¤¹à¥\8bà¤\96à¥\87 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤\88-मà¥\87ल à¤\95à¤\87ल जाव",
+       "tog-enotifrevealaddr": "नà¥\8bà¤\9fिफिà¤\95à¥\87शन ई-मेल में हमार ई-मेल पता देखावल जाव",
        "tog-shownumberswatching": "धियान रखे वालन सदस्यन के देखावल जाव",
        "tog-oldsig": "राउर वर्तमान दसखत:",
        "tog-fancysig": "दसखत के विकी पाठ के रुप में उपयोग करीं (बिना ऑटोमेटिक कड़ी के)",
-       "tog-uselivepreview": "लà¤\97ातार à¤\9aालà¥\82 à¤¨à¤®à¥\82ना à¤¦à¥\87à¤\96ावल (preview) à¤\95à¥\87 à¤ªà¥\8dरयà¥\8bà¤\97 à¤\95रà¥\80à¤\82",
+       "tog-uselivepreview": "लà¤\97ातार à¤\9dलà¤\95 (लाà¤\87व à¤ªà¥\8dरà¥\80वà¥\8dयà¥\82) à¤\87सà¥\8dतà¥\87माल à¤\95à¤\87ल à¤\9cाव",
        "tog-forceeditsummary": "यदि संपादन सारांश ना दिहल होखे त हमके सूचित कइल जाय",
        "tog-watchlisthideown": "हमरी धियानसूची से हमार खुद के संपादन छिपाईं",
-       "tog-watchlisthidebots": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤¬à¥\89à¤\9f à¤¦à¥\8dवारा à¤\95रल à¤\97à¤\87ल à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤\9bिपाà¤\88à¤\82",
-       "tog-watchlisthideminor": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤\9bà¥\8bà¤\9f à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤\9bिपावल à¤\9cाव",
-       "tog-watchlisthideliu": "हमार à¤§à¤¿à¤¯à¤¾à¤¨à¤¸à¥\82à¤\9aà¥\80 à¤®à¥\87à¤\82 à¤²à¥\89à¤\97-à¤\87न à¤­à¤\87ल à¤¸à¤¦à¤¸à¥\8dयन à¤\95à¥\87 à¤¸à¤\82पादन à¤\9bिपावल à¤\9cाय",
+       "tog-watchlisthidebots": "धियानसà¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤¬à¥\89à¤\9f à¤¸à¤\82पादन à¤\9bिपावल à¤\9cाय",
+       "tog-watchlisthideminor": "धियानसà¥\82à¤\9aà¥\80 à¤¸à¥\87 à¤\9bà¥\8bà¤\9f à¤¸à¤\82पादन à¤\9bिपावल à¤\9cाय",
+       "tog-watchlisthideliu": "धियानसूची में लॉग-इन भइल सदस्यन के संपादन छिपावल जाय",
        "tog-watchlistreloadautomatically": "जब कौनों फिल्टर बदलल जाय तब धियानसूची ऑटोमेटिक दोबारा लोड होखे (जावास्क्रिप्ट जरूरी)",
        "tog-watchlisthideanons": "आइ॰पी॰ सदस्यन द्वारा करल गइल सम्पादन के हमार धियानसूची में से छिपावल जाय",
        "tog-watchlisthidepatrolled": "जाँचल गइल सम्पादन के हमार ध्यानसूची में से छिपावल जाय",
-       "tog-watchlisthidecategorization": "पनà¥\8dना à¤¶à¥\8dरà¥\87णà¥\80à¤\95रण à¤\9bिपाà¤\88à¤\82",
+       "tog-watchlisthidecategorization": "पनà¥\8dना à¤¶à¥\8dरà¥\87णà¥\80à¤\95रण à¤\9bिपावल à¤\9cाय",
        "tog-ccmeonemails": "हमरा द्वारा अन्य सदस्यन के भेजल गइल ईमेल के कॉपी हमरो के भेजल जाय",
-       "tog-diffonly": "à¤\85नà¥\8dतर à¤¦à¥\87à¤\96ावत à¤¸à¤®à¤¯ à¤\85à¤\82तर à¤\95à¥\80 à¤¨à¥\80à¤\9aà¥\87 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤®à¤¤ à¤¦à¥\87à¤\96ावल à¤\9cाव।",
+       "tog-diffonly": "à¤\85à¤\82तर à¤¦à¥\87à¤\96ावत à¤¸à¤®à¤¯ à¤¨à¥\80à¤\9aà¥\87 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤¨ à¤¦à¥\87à¤\96ावल à¤\9cाय",
        "tog-showhiddencats": "छिपल श्रेणियन के भी देखावल जाय",
-       "tog-norollbackdiff": "रà¥\8bलबà¥\88à¤\95 à¤\95à¤\87ला à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\85à¤\82तर à¤®à¤¤ à¤¦à¥\87à¤\96ावल à¤\9cाव",
-       "tog-useeditwarning": "à¤\9cà¥\8b à¤¹à¤® à¤\95à¥\8cनà¥\8bà¤\82 à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¸à¤\82पादन à¤\95रत à¤\98रà¥\80 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤¹à¥\87à¤\9cलà¥\87 à¤\9bà¥\8bड़ à¤¦à¥\87à¤\88à¤\82 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤\96बर à¤\95à¤\87ल à¤\9cाव",
+       "tog-norollbackdiff": "रà¥\8bलबà¥\88à¤\95 à¤\95à¤\87ला à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤\85à¤\82तर à¤¨ à¤¦à¥\87à¤\96ावल à¤\9cाय",
+       "tog-useeditwarning": "à¤\9cà¥\8b à¤¹à¤® à¤\95à¥\8cनà¥\8bà¤\82 à¤ªà¤¨à¥\8dना à¤ªà¤° à¤¸à¤\82पादन à¤\95रत à¤\98रà¥\80 à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤\95à¥\87 à¤¬à¤¿à¤¨à¤¾ à¤¸à¤¹à¥\87à¤\9cलà¥\87 à¤\9bà¥\8bड़ à¤¦à¥\87à¤\88à¤\82 à¤¤ à¤¹à¤®à¤\95à¥\87 à¤\96बर à¤\95à¤\87ल à¤\9cाय",
        "tog-prefershttps": "लॉगिन रहले पर हमेशा सुरक्षित कनेक्शन के प्रयोग कइल जाय",
        "underline-always": "हमेशा",
        "underline-never": "कभी ना",
-       "underline-default": "à¤\9cिलà¥\8dद (सà¥\8dà¤\95िन) à¤¯à¤¾ à¤¬à¥\8dराà¤\89सर डिफॉल्ट",
-       "editfont-style": "समà¥\8dपादन क्षेत्र के फॉन्ट स्टाइल:",
+       "underline-default": "à¤\9cिलà¥\8dद (सà¥\8dà¤\95िन) à¤¯à¤¾ à¤¬à¥\8dराà¤\89à¤\9cर डिफॉल्ट",
+       "editfont-style": "सà¤\82पादन क्षेत्र के फॉन्ट स्टाइल:",
        "editfont-default": "ब्राउजर डिफाल्ट",
        "editfont-monospace": "मोनोस्पेस्ड फोंट",
-       "editfont-sansserif": "सनà¥\8dस-सेरिफ फॉन्ट",
+       "editfont-sansserif": "सà¥\88à¤\82स-सेरिफ फॉन्ट",
        "editfont-serif": "सेरिफ फॉन्ट",
        "sunday": "इतवार",
        "monday": "सोमवार",
        "databaseerror-query": "अनुरोध: $1",
        "databaseerror-function": "फ़ंक्शन: $1",
        "databaseerror-error": "त्रुटि: $1",
+       "transaction-duration-limit-exceeded": "हाई रिप्लिकेशन लैग बनावे से बचे खातिर ई ट्रांजेक्शन निरस्त कर दिहल गइल, काहें से की राइट करे में लागे वाला समय ($1), $2 के सीमा से अधिक रहल।\nअगर आ कई ठो आइटम एकही साथ बदलत होखीं, तब कई टुकड़ा में ई काम करे के कोसिस करीं।",
        "laggedslavemode": "'''चेतावनी:''' इ पन्ना पर हाल के बदलाव ना होखे के आशंका बा।",
        "readonly": "डेटाबेस लॉक बा",
        "enterlockreason": "लॉक करे के कारण दिहीं, साथे लॉक खुले के समय के लगभग आकलन दिहीं।",
        "missingarticle-rev": "(संशोधन#: $1)",
        "missingarticle-diff": "(अंतर: $1, $2)",
        "readonly_lag": "उपमुख्य डाटाबेस सर्वर मुख्य डाटाबेस के बराबर परावर्तित होत समय मुख्य डाटाबेस सर्वर अपने आप लॉक हो गइल।",
+       "nonwrite-api-promise-error": "'Promise-Non-Write-API-Action' ऍचटीटीपी हेडर भेजल गइल रहल बाकी ई रिक्वेस्ट एपीआइ राइट मॉड्यूल खातिर रहल।",
        "internalerror": "आन्तरिक त्रुटि",
        "internalerror_info": "आन्तरिक त्रुटि: $1",
        "internalerror-fatal-exception": "प्रकार के गंभीर अपवाद \"$1\"",
        "mypreferencesprotected": "रउआ लगे आपन वरियतां ‍‍‍‍(पसंद) बदले के अधिकार नइखे।",
        "ns-specialprotected": "विशेष पन्ना के सम्पादन सम्भव नइखे",
        "titleprotected": "सदस्य [[User:$1|$1]] द्वारा इ शीर्षक के पन्ना बनावे से बचाव खातिर इ के सुरक्षित कर दिहल गइल बा।\nइ खातिर निम्न कारण दिहल गइल बा: <em>$2</em>",
-       "filereadonlyerror": "फाइल \"$1\" के बदलल सक्षम नइखे काहे कि संग्रह \"$2\" 'खाली पाठन हेतु' (रिड ऑन्ली) मोड में बा।\n\nजउन प्रबंधक इ प्रबंध लगउले बानी उहाँ के निम्न विवरण प्रदान कइले बानी: \"$3\"।",
+       "filereadonlyerror": "फाइल \"$1\" के बदलल सक्षम नइखे काहें कि संग्रह \"$2\" 'खाली पढ़े हेतु' (रीड ऑनली) मोड में बा।\n\nजे सिस्टम प्रबंधक ई प्रतिबंध लगावल ऊ नीचे दिहल कारण बतवले रहल: \"$3\"।",
        "invalidtitle-knownnamespace": "\"$2\" नामस्थान आ \"$3\" पाठ्य वाला गलत शीर्षक",
        "invalidtitle-unknownnamespace": "अज्ञात नामस्थान संख्या $1 आ नाम \"$2\" वाला गलत शीर्षक",
        "exception-nologin": "खाता में प्रवेश नइखे",
        "createacct-email-ph": "आपन ई-मेल पता लिखीं",
        "createacct-another-email-ph": "ई-मेल पता लिखीं",
        "createaccountmail": "एगो अस्थायी यादृच्छिक (रैन्डम) गुप्तशब्द के प्रयोग करीं आ निर्दिष्ट ई-मेल पता पर भेजीं",
+       "createaccountmail-help": "एकर इस्तेमाल केहू दुसरा खातिर खाता बनावे में कइल जा सके ला, बिना पासवर्ड जनले।",
        "createacct-realname": "असली नाम (वैकल्पिक)",
        "createaccountreason": "कारण:",
        "createacct-reason": "कारण",
        "eauthentsent": "दर्ज करावल गइल ई-मेल पता पर एगो पुष्टिकरण ई-मेल भेज दिहल गइल बा।\nउ खाता पर कौनो दुसर ईमेल भेजल जाओ उ से पहिले, रउआ भेजल गईल ई-मेल पर दिहल गइल निर्देश के अनुसरण कर के ई-मेल पता के पुष्टिकरण करावे के पड़ी ताकि पता चले की सही में उ राउरे खाता ह।",
        "throttled-mailpassword": "पिछला {{PLURAL:$1|एक घंटा|$1 घंटा}} के अंदर एगो गुप्तशब्द पुनर्स्थापन ई-मेल भेजल जा चुकल बा।\nदुरुपयोग से बचावे खातिर {{PLURAL:$1|एक घंटा|$1 घंटा}} में सिर्फ एगो गुप्तशब्द पुनर्स्थापन ई-मेल भेजल जाई।",
        "mailerror": "ई-मेल भेजे में त्रुटि: $1",
-       "acct_creation_throttle_hit": "राउर आइपी पता से आइल आगंतुक लोग पिछला चौबीस घंटा में एह विकि पर {{PLURAL:$1|एक ठो खाता|$1 खाता}} बना चुकल बा जवन एह समयअवधि में अधिकतम सीमा बा।\nएही कारण, एह आइपी पता के इस्तेमाल करे वाला आगंतुक अब कौनों अउरी खाता एह समय नइखें बना सकत।",
+       "acct_creation_throttle_hit": "राउर आइपी पता से आइल आगंतुक लोग पिछला $2 में एह विकि पर {{PLURAL:$1|एक ठो खाता|$1 खाता}} बना चुकल बा जवन एह समयअवधि में अधिकतम सीमा बा।\nएही कारण, एह आइपी पता के इस्तेमाल करे वाला आगंतुक अब कौनों अउरी खाता एह समय नइखें बना सकत।",
        "emailauthenticated": "$2 के $3 पर राउर ई-मेल पता के पुष्टीकरण हो चुकल बा।",
        "emailnotauthenticated": "राउर ई-मेल पता के अभी तक प्रमाणिकरण नइखे भईल।\nनिम्नलिखित कउनो भी सुविधा खातिर रउआ के कौनो भी ई-मेल ना भेजल जाई।",
        "noemailprefs": "इ सुविधा के प्रयोग करे खातिर आपन वरियता में एगो ई-मेल पता दिहीं।",
        "botpasswords-label-cancel": "कैंसिल",
        "botpasswords-label-delete": "मिटाईं",
        "botpasswords-label-resetpassword": "पासवर्ड रिसेट करीं",
+       "botpasswords-label-grants": "लागू हो सके वाला अनुमोदन:",
        "botpasswords-label-grants-column": "मंजूर भइल",
        "botpasswords-bad-appid": "बॉट नाँव \"$1\" वैध नइखे।",
+       "botpasswords-insert-failed": "बॉट नाँव $1 जोड़ल फेल हो गइल। का ई पहिलहीं जोड़ल जा चुकल बा?",
+       "botpasswords-update-failed": "बॉट नाँव \"$1\" अपडेट कइल फेल हो गइल। का ई मिटा दिहल बा?",
        "botpasswords-created-title": "बॉट पासवर्ड बनावल गइल",
+       "botpasswords-created-body": "प्रयोगकर्ता \"$2\" के बॉट नाँव \"$1\" खातिर बॉट पासवर्ड बना दिहल गइल।",
+       "botpasswords-updated-title": "बॉट पासवर्ड अपडेट भइल",
+       "botpasswords-updated-body": "प्रयोगकर्ता \"$2\" के बॉट नाँव \"$1\" खातिर बॉट पासवर्ड अपडेट भइल।",
+       "botpasswords-deleted-title": "बॉट पासवर्ड मिटावल गइल",
+       "botpasswords-deleted-body": "प्रयोगकर्ता \"$2\" के बॉट नाँव \"$1\" खातिर बॉट पासवर्ड मिटावल गइल।",
        "resetpass_forbidden": "गुप्तशब्द बदलल नइखे जा सकत",
        "resetpass-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआ पहिले खाता में प्रवेश करे के पड़ी।",
        "resetpass-submit-loggedin": "गुप्त शब्द बदलीं",
        "passwordreset-emailtext-user": "{{SITENAME}} ($4) पर सदस्य $1 राउर {{PLURAL:$3|खाता}} के गुप्तशब्द के पुनर्स्थापित करे के अनुरोध कइले बानी। इ ई-मेल पता से निम्न {{PLURAL:$3|खाता जुड़ल बा}}:\n\n$2\n\n{{PLURAL:$3|इ}} अस्थायी गुप्तशब्द {{PLURAL:$5|एक दिन|$5 दिन}} के बाद काम ना करी।\nरउआ खाता में प्रवेश करके एगो नया गुप्तशब्द अभीये चुन लेवे के चाहीं। यदि इ अनुरोध केहु अउर कइले बा, या फिर रउआ आपन मूल गुप्तशब्द याद आ गईल बा, अउर रउआ {{PLURAL:$3|आपन}} गुप्तशब्द नईखीं बदले के चाहत त, रउआ इ संदेश के अनदेखा कर के आपन पुरनका गुप्तशब्द के प्रयोग जारी रख सकत बानीं।",
        "passwordreset-emailelement": "सदस्यनाम: \n$1\n\nअस्थायी गुप्तशब्द: \n$2",
        "passwordreset-emailsentemail": "एगो गुप्तशब्द रिसेट ई-मेल भेजल जा चुकल बा।",
-       "passwordreset-invalideamil": "अवैध ईमेल पता",
+       "passwordreset-invalidemail": "अवैध ईमेल पता",
        "changeemail": "ई-मेल पता बदलीं",
        "changeemail-header": "खाता के ई-मेल पता बदलीं",
        "changeemail-no-info": "इ पन्ना के सिधे प्रयोग करे खातिर रउआ पहिले खाता में प्रवेश करे के पड़ी।",
        "editing": "$1 संपादन",
        "creating": "$1 बनावे जा रहल बानी",
        "editingsection": "$1 संपादन (खंड)",
-       "editingcomment": "$1 à¤¸à¤®à¥\8dपादन (नया à¤\85नà¥\81भाà¤\97)",
-       "editconflict": "सà¤\82पादन à¤\85à¤\82तरà¥\8dविरोध: $1",
-       "explainconflict": "à¤\86पà¤\95à¥\80 à¤¸à¤\82पादन à¤¶à¥\81रà¥\82 à¤\95à¤\87ला à¤\95à¥\80 à¤¬à¤¾à¤¦ à¤¸à¥\87 à¤\95à¥\87हà¥\82 à¤\85à¤\89रà¥\80 à¤\8f à¤ªà¤¨à¥\8dना à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95 à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤\9fà¥\87।\nà¤\8aपर à¤\95à¥\87 à¤ªà¤¾à¤  à¤¹à¤¿à¤¸à¥\8dसा à¤®à¥\87à¤\82 à¤²à¥\87à¤\96 à¤\95à¥\80 à¤ªà¤¾à¤  à¤\95à¥\87 à¤µà¤°à¥\8dतमान à¤¸à¥\8dथिति à¤¦à¥\87à¤\96ावल à¤\9cात à¤¬à¤¾à¥¤\nराà¤\89र à¤¸à¤\82पादन à¤¨à¥\80à¤\9aà¥\87 à¤\95à¥\80 पाठ हिस्सा में देखावल गइल बा।\nरउआँ के आपन बदलाव एह पहिले से मौजूद पाठ में मिलावे के परी।\n<strong>खाली</strong> ऊपर की पाठ हिस्सा में लउकत पाठ सहेजल जाई अगर आप \"{{int:savearticle}}\" बटन दबाइब।",
-       "yourtext": "राउर पाठ्य",
-       "storedversion": "सà¥\81रà¤\95à¥\8dषित à¤\95रल à¤\97à¤\88ल संशोधन",
+       "editingcomment": "$1 à¤¸à¤\82पादन (नया à¤\96à¤\82ड)",
+       "editconflict": "सà¤\82पादन à¤\85à¤\82तरà¥\8dबिरोध: $1",
+       "explainconflict": "à¤\86पà¤\95à¥\87 à¤¦à¥\8dवारा à¤¸à¤\82पादन à¤¸à¥\81रà¥\82 à¤\95à¤\87ला à¤\95à¥\87 à¤¬à¤¾à¤¦ à¤¸à¥\87 à¤\95à¥\87हà¥\82 à¤\85à¤\89रà¥\80 à¤\8f à¤ªà¤¨à¥\8dना à¤®à¥\87à¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95 à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¤\9fà¥\87।\nà¤\8aपर à¤\95à¥\87 à¤ªà¤¾à¤  à¤¹à¤¿à¤¸à¥\8dसा à¤®à¥\87à¤\82 à¤²à¥\87à¤\96 à¤\95à¥\87 à¤ªà¤¾à¤  à¤\95à¥\87 à¤µà¤°à¥\8dतमान à¤¸à¥\8dथिति à¤¦à¥\87à¤\96ावल à¤\9cात à¤¬à¤¾à¥¤\nराà¤\89र à¤¸à¤\82पादन à¤¨à¥\80à¤\9aà¥\87 à¤\95à¥\87 पाठ हिस्सा में देखावल गइल बा।\nरउआँ के आपन बदलाव एह पहिले से मौजूद पाठ में मिलावे के परी।\n<strong>खाली</strong> ऊपर की पाठ हिस्सा में लउकत पाठ सहेजल जाई अगर आप \"{{int:savearticle}}\" बटन दबाइब।",
+       "yourtext": "राउर पाठ",
+       "storedversion": "सà¥\81रà¤\95à¥\8dषित à¤\95à¤\87ल à¤\97à¤\87ल संशोधन",
        "nonunicodebrowser": "<strong>चेतावनी: राउर ब्राउसर युनिकोड समर्थ नइखे।</strong>\nपन्ना सभ के सुरक्षित संपादित करे के एगो तरीका सुझावल जात बा: गैर-ASCII अक्षर सभ संपादन बॉक्स में हेक्साडेसिमल कोड की रूप में देखावल जाई।",
        "editingold": "<strong>चेतावनी: रउआँ ए पन्ना क एगो पुरान अवतरण के संपादन करत बानी।</strong>\nअगर आप एकरा के सहेज देइब, त एकरी बाद के सगरी बदलाव गायब हो जाई।",
        "yourdiff": "अंतर",
        "templatesusedpreview": "इ पुर्वावलोकन में प्रयुक्त {{PLURAL:$1|टेम्पलेट|टेम्पलेट कुल}}:",
        "templatesusedsection": "एह खण्ड में इस्तेमाल {{PLURAL:$1|टेम्पलेट|कुल}}:",
        "template-protected": "(सुरक्षित)",
-       "template-semiprotected": "(à¤\95à¥\81à¤\9b-सुरक्षित)",
+       "template-semiprotected": "(à¤\86धा-सुरक्षित)",
        "hiddencategories": "ई पन्ना {{PLURAL:$1|1 छिपल श्रेणी|$1 छिपल श्रेणीसभ}} के सदस्य बा:",
        "nocreatetext": "{{SITENAME}} नया पन्ना बनावे पर रोक लगवले बा।\nपीछे जाईं आ पहिले से बनल पन्ना संपादित करीं या फिर [[Special:UserLogin|लॉगिन करीं या नया खाता बनाईं]]।",
-       "nocreate-loggedin": "नया पन्ना बनावे रउआ अधिकार नइखे।",
-       "sectioneditnotsupported-title": "अनुभाग सम्पादन समर्थित नइखे",
-       "sectioneditnotsupported-text": "इ पन्ना पर अनुभाग सम्पादन समर्थित नइखे",
-       "permissionserrors": "अनुमति त्रुटी",
-       "permissionserrorstext": "निम्नलिखित {{PLURAL:$1|कारण|कारणन}} के चलते आपके अइसन करे के अनुमति नइखे:",
-       "permissionserrorstext-withaction": "नीचे दिहल {{PLURAL:$1|कारण|कारणन}} से रउआँ के $2 के परमीशन नइखे:",
+       "nocreate-loggedin": "रउआँ के नया पन्ना बनावे के अधिकार नइखे।",
+       "sectioneditnotsupported-title": "खंड संपादन समर्थित नइखे",
+       "sectioneditnotsupported-text": "एह पन्ना पर खंड संपादन समर्थित नइखे",
+       "permissionserrors": "परमीशन खराबी",
+       "permissionserrorstext": "नीचे दिहल {{PLURAL:$1|कारण|कारणन}} के चलते आपके अइसन करे के परमीशन नइखे:",
+       "permissionserrorstext-withaction": "नीचे दिहल {{PLURAL:$1|कारण|कारणन}} के चलते रउआँ के $2 के परमीशन नइखे:",
+       "contentmodelediterror": "रउआँ एह अवतरण के संपादन नइखीं कर सकत काहें से कि एकर सामग्री मॉडल <code>$1</code> बा जवन पन्ना के के वर्तमान मॉडल <code>$2</code> से अलग बाटे।",
        "recreate-moveddeleted-warn": "<strong>चेतावनी: रउआँ एगो अइसन पन्ना दुबारा बनावे जा रहल बानी जेवन पहिले हटावल जा चुकल बा</strong>\n\nआपके ई बिचार क लेवे के चाहीं की आगे संपादन कइल ठीक बा की ना।\n\nसुविधा खातिर, ए पन्ना के हटवले आ स्थानांतरण के लॉग नीचे दिहल जात बा:",
        "moveddeleted-notice": "ई पन्ना हटा दिहल गइल बा।\nसंदर्भ खातिर हटावे आ स्थानांतरण के लॉग नीचे दिहल जात बाटे।",
        "log-fulllog": "पूरा लॉग देखीं",
        "edit-hook-aborted": "संपादन के हुक निरस्त क दिहलस।\nई कौनों कारन ना बतवलस।",
        "edit-gone-missing": "पन्ना अपडेट ना हो पावल।\nबुझात बा कि ई हटा दिहल गइल बा।",
-       "edit-conflict": "सà¤\82पादन à¤\85à¤\82तरà¥\8dविरोध",
-       "edit-no-change": "à¤\86पà¤\95à¥\87 à¤¸à¤®à¥\8dपादन à¤ªà¤° à¤§à¤¿à¤¯à¤¾à¤¨ à¤¨à¤¾ à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤\95ाहà¥\87à¤\82 à¤¸à¥\87 à¤\95à¥\80 à¤ªà¤¾à¤  à¤®à¥\87à¤\82 à¤\95à¥\8cनà¥\8bà¤\82 à¤¬à¤¦à¤²à¤¾à¤µ à¤¨à¤¾ à¤\95à¤\87ल à¤\97à¤\87ल à¤°à¤¹ल।",
-       "postedit-confirmation-created": "पनà¥\8dना à¤¬à¤¨à¤¾ à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल।",
+       "edit-conflict": "सà¤\82पादन à¤\85à¤\82तरà¥\8dबिरोध",
+       "edit-no-change": "पाठ à¤®à¥\87à¤\82 à¤\95à¥\8cनà¥\8bà¤\82 à¤\85à¤\82तर à¤¨à¤¾ à¤¹à¥\8bà¤\96à¥\87 à¤\95à¥\87 à¤\95ारण à¤°à¤¾à¤\89र à¤¸à¤\82पादन à¤ªà¤° à¤§à¤¿à¤¯à¤¾à¤¨ à¤¨à¤¾ à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल।",
+       "postedit-confirmation-created": "पनà¥\8dना à¤¬à¤¨à¤¾ à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल।",
        "postedit-confirmation-restored": "पन्ना के दुबारा अस्थापित कइल गइल।",
-       "postedit-confirmation-saved": "राà¤\89र à¤¸à¤®à¥\8dपादन à¤¸à¥\81रà¤\95à¥\8dषित à¤\95र à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल।",
+       "postedit-confirmation-saved": "राà¤\89र à¤¸à¤\82पादन à¤¸à¤¹à¥\87à¤\9c à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल।",
        "edit-already-exists": "नया पन्ना ना बनावल जा सकत बा।\nई पहिलहीं से मौजूद बाटे।",
-       "defaultmessagetext": "संदेश के डिफ़ॉल्ट पाठ्य",
-       "content-failed-to-parse": "$2 के सामग्री, $1 मॉडल खातिर पार्स (parse) ना हो पावल: $3",
-       "invalid-content-data": "अवैध डाटा सामग्री",
-       "content-not-allowed-here": "\"$1\" सामग्री, पन्ना [[$2]] पर ना डालल जा सकेला।",
-       "editwarning-warning": "ए पन्ना के छोड़ के हटला पर आपके कइल बदलाव गायब हो जाई।\nअगर आप लॉगिन कइले बानी तब ए चेतावनी के अपनी सेटिंग में \"{{int:prefs-editing}}\" खंड में जा के बन्द क सकत बानीं।",
-       "editpage-invalidcontentmodel-title": "सामग्री के मॉडल सपोर्टेड नइखे",
+       "defaultmessagetext": "डिफॉल्ट संदेस पाठ",
+       "content-failed-to-parse": "$2 के सामग्री, $1 मॉडल खातिर प्राप्त (पार्स) ना हो पावल: $3",
+       "invalid-content-data": "अवैध सामग्री डाटा",
+       "content-not-allowed-here": "पन्ना [[$2]] पर \"$1\" सामग्री डाले के इजाजत नइखे।",
+       "editwarning-warning": "ए पन्ना के छोड़ के हटला पर आपके द्वारा कइल बदलाव गायब हो सके लें।\nअगर आप लॉगिन कइले बानी तब ए चेतावनी के अपनी सेटिंग में \"{{int:prefs-editing}}\" खंड में जा के बंद कर सकत बानीं।",
+       "editpage-invalidcontentmodel-title": "सामग्री मॉडल सपोर्टेड नइखे",
+       "editpage-invalidcontentmodel-text": "सामग्री मॉडल \"$1\" सपोर्टेड नइखे।",
        "editpage-notsupportedcontentformat-title": "सामग्री के फॉरमैट सपोर्टेड नइखे।",
-       "editpage-notsupportedcontentformat-text": "सामà¤\97à¥\8dरà¥\80 à¤«à¥\89रमà¥\88à¤\9f $1 à¤\95à¥\87 à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤®à¥\89डल $2 à¤¸à¤ªà¥\8bरà¥\8dà¤\9f à¤¨à¤\87à¤\96à¥\87 à¤\95रत।",
-       "content-model-wikitext": "विà¤\95à¥\80पाठà¥\8dय",
-       "content-model-text": "सामानà¥\8dय पाठ",
+       "editpage-notsupportedcontentformat-text": "सामà¤\97à¥\8dरà¥\80 à¤®à¥\89डल $2 à¤¦à¥\8dवारा à¤¸à¤¾à¤®à¤\97à¥\8dरà¥\80 à¤«à¥\89रमà¥\88à¤\9f $1 à¤¸à¤ªà¥\8bरà¥\8dà¤\9fà¥\87ड à¤¨à¤\87à¤\96à¥\87।",
+       "content-model-wikitext": "विà¤\95िपाठ",
+       "content-model-text": "à¤\86म पाठ",
        "content-model-javascript": "जावास्क्रिप्ट",
        "content-model-css": "सी॰एस॰एस",
-       "content-json-empty-object": "खाली चीज (Empty object)",
-       "content-json-empty-array": "खाली अरे (Empty array)",
+       "content-json-empty-object": "खाली चीज (एम्प्टी ऑब्जेक्ट)",
+       "content-json-empty-array": "खाली ऍरे",
+       "deprecated-self-close-category-desc": "पन्ना में अवैध सेल्फ-क्लोज्ड ऍचटीऍमऍल टैग बाड़ें, जइसे कि <code>&lt;b/></code> या फिर <code>&lt;span/></code>। जल्दिये इनहन के बेहवार ऍचटीऍमऍल5 स्पेसिफिकेशन के साथ सामंजस्य वाला होखे खातिर बदल जाई, एही से इनहन के विकिपाठ में प्रयोग खाराबीयुक्त बाटे।",
        "duplicate-args-warning": "<strong>चेतावनी:</strong> [[:$1]], [[:$2]] के \"$3\" पैरामीटर खातिर एक से अधिका वैल्यू की संघे काल करत बाटे। दिहल गइल वैल्यू में से खाली सबसे आखिरी वैल्यू के प्रयोग कइल जाई।",
        "duplicate-args-category": "टेम्पलेट कॉल में डुप्लिकेट तर्क इस्तेमाल वाला पन्ना",
        "duplicate-args-category-desc": "पन्ना पर अइसन टेम्पलेट काल मौजूद बा जेवन डुप्लीकेट (दोहरा) आर्गुमेंट इस्तेमाल करत बाटे, जइसे की <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> या <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "<strong>चेतावनी:</strong> ई पन्ना बहुत ढेर सारा  खर्चीला पार्सर फंक्शन काल के इस्तेमाल करत बा।\n\nए पन्ना पर $2 {{PLURAL:$2|काल|काल कुल}} से कम संख्या में काल होखे के चाहीं, बाकी इहाँ ए समय {{PLURAL:$1|$1 काल बा|$1 काल कुल बाड़ी}}।",
        "expensive-parserfunction-category": "बहुत ढेर खर्चीला पार्सर फंक्शन काल वाला पन्ना सभ",
-       "post-expand-template-inclusion-warning": "'''à¤\9aà¥\87तावनà¥\80:''' à¤\96ाà¤\81à¤\9aा à¤\9cà¥\8bड़à¥\87 à¤\95à¥\87 à¤¸à¥\80मा à¤ªà¤¾à¤° à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¥¤\nà¤\95à¥\81à¤\9b à¤\96ाà¤\81à¤\9aा à¤¨à¤¾ à¤\9cà¥\8bड़ल à¤\9cाà¤\88।",
-       "post-expand-template-inclusion-category": "à¤\85à¤\87सन à¤ªà¥\83षà¥\8dठ à¤\9cà¥\87 à¤ªà¤° à¤¸à¤¾à¤\81à¤\9aा à¤\9cà¥\8bडे के सीमा पार हो गइल बा",
+       "post-expand-template-inclusion-warning": "'''à¤\9aà¥\87तावनà¥\80:''' à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f à¤\9cà¥\8bड़à¥\87 à¤\95à¥\87 à¤¸à¥\80मा à¤ªà¤¾à¤° à¤¹à¥\8b à¤\9aà¥\81à¤\95ल à¤¬à¤¾à¥¤\nà¤\95à¥\81à¤\9b à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f à¤¸à¤¾à¤®à¤¿à¤² à¤¨à¤¾ à¤¹à¥\8bà¤\96िहà¥\87à¤\82।",
+       "post-expand-template-inclusion-category": "पनà¥\8dना à¤\9cहाà¤\81 à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f à¤¸à¤¾à¤®à¤¿à¤² à¤\95रे के सीमा पार हो गइल बा",
        "post-expand-template-argument-warning": "<strong>चेतावनी:</strong> ए पन्ना पर कम से कम एक ठो अइसन टेम्पलेट आर्गुमेंट बा जेवन बहुत बड़ खर्चीला साइज के बा।\nअइसन आर्गुमेंट के लोप कइ दिहल गइल बा।",
        "post-expand-template-argument-category": "पन्ना जिनहन में लोप कइल गइल टेम्पलेट आर्गुमेंट बा",
        "parser-template-loop-warning": "टेम्पलेट लूप पकड़ में आइल बा:[[$1]]",
        "expansion-depth-exceeded-warning": "पन्ना अधिकतम बिस्तार गहिराई के पार क गइल",
        "parser-unstrip-loop-warning": "अनस्ट्रिप लूप पकड़ में आइल बा",
        "parser-unstrip-recursion-limit": "अनस्ट्रिप रिकर्शन सीमा पार हो गइल ($1)",
-       "converter-manual-rule-error": "मà¥\88नà¥\81à¤\85ल à¤­à¤¾à¤·à¤¾ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¨à¤¿à¤¯à¤® à¤®à¤¬ खराबी पकड़ल गइल",
+       "converter-manual-rule-error": "मà¥\88नà¥\81à¤\85ल à¤­à¤¾à¤·à¤¾ à¤ªà¤°à¤¿à¤µà¤°à¥\8dतन à¤¨à¤¿à¤¯à¤® à¤®à¥\87à¤\82 खराबी पकड़ल गइल",
        "undo-success": "संपादन वापस कइल जा सकत बा।\nनीचे दिहल तुलना के चेक करीं आ पुष्टी करीं की आप इहे कइल चाहत बाड़ीं, ओकरा बाद बदलाव सहेज के संपादन वापसी के पूरा करीं।",
        "undo-failure": "बीच में अउरी संपादन होखला की कारण ई संपादन वापस नइखे लिहल जा सकत।",
        "undo-norev": "संपादन वापस नइखे लिहल जा सकत, काहें से की या त ई हइये नइखे या हटा दिहल गइल बाटे।",
        "undo-nochange": "लागत बा की ई संपादन पहिलहीं वापस लिहल जा चुकल बाटे।",
-       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|वारà¥\8dता]]) à¤\95à¥\87 à¤¦à¥\8dवारा à¤\95à¤\87ल $1 à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 वापस कइल गइल",
-       "undo-summary-username-hidden": "à¤\8fà¤\97à¥\8b छिपल सदस्य द्वारा कइल बदलाव $1 वापस कइल गइल",
-       "cantcreateaccount-text": "एह आइपी पता (IP address)(<strong>$1</strong>) द्वारा नया खाता बनावे पर  [[User:$3|$3]] द्वारा रोक लगावल गइल बा।\n\nएकरा खातिर $3 के दिहल कारण:<em>$2</em>",
+       "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|वारà¥\8dता]]) à¤\95à¥\87 à¤\95à¤\87ल $1 à¤¬à¤¦à¤²à¤¾à¤µ वापस कइल गइल",
+       "undo-summary-username-hidden": "à¤\95à¥\87हà¥\82 छिपल सदस्य द्वारा कइल बदलाव $1 वापस कइल गइल",
+       "cantcreateaccount-text": "एह आइपी पता (IP address)(<strong>$1</strong>) द्वारा नया खाता बनावे पर [[User:$3|$3]] द्वारा रोक लगावल गइल बा।\n\nएकरा खातिर $3 के दिहल कारण:<em>$2</em>",
        "cantcreateaccount-range-text": "आइपी पता बिस्तार (IP address range) <strong>$1</strong> पर, जेवना में आपके आइपी (<strong>$4</strong>) भी बा, नया खाता बनावे पर [[User:$3|$3]] द्वारा रोक लगावल गइल बा।\n\nएकरा खातिर $3 के दिहल कारण बा:<em>$2</em>",
        "viewpagelogs": "ए पन्ना खातिर लॉग कुल देखीं",
        "nohistory": "ए पन्ना के कौनों संपादन इतिहास नइखे",
        "currentrev": "सबसे नया बदलाव",
        "currentrev-asof": "$1 ले भइल नया बदलाव",
        "revisionasof": "$1 ले भइल नया बदलाव",
-       "revision-info": "{{GENDER:$6|$2}}$7 à¤\95à¥\87 à¤¦à¥\8dवारा $1 à¤\95à¥\87 à¤¸à¤\82शà¥\8bधन",
-       "previousrevision": "â\86\90 à¤ªà¥\81रान à¤¸à¤\82शà¥\8bधन",
-       "nextrevision": "नया à¤¸à¤\82सà¥\8bधन →",
+       "revision-info": "{{GENDER:$6|$2}}$7 à¤\95à¥\87 à¤¦à¥\8dवारा $1 à¤\95à¥\87 à¤¬à¤¦à¤²à¤¾à¤µ",
+       "previousrevision": "â\86\90 à¤ªà¥\81रान à¤¬à¤¦à¤²à¤¾à¤µ",
+       "nextrevision": "नया à¤¬à¤¦à¤²à¤¾à¤µ →",
        "currentrevisionlink": "हाल के संसोधन",
        "cur": "हाल",
        "next": "अगिला",
        "last": "पछिला",
        "page_first": "पहिलका",
        "page_last": "आखिरी",
-       "histlegend": "à¤\9aà¥\81नाव à¤\85नà¥\8dतर: à¤¤à¥\81लना à¤\95रà¥\87 à¤\96ातिर à¤¸à¤\82शà¥\8bधन à¤\95à¥\87 à¤°à¥\87डियà¥\8b à¤¬à¤\9fन à¤ªà¤° à¤¨à¤¿à¤¶à¤¾à¤¨ à¤²à¤\97ाà¤\88à¤\82 à¤\86 enter à¤¬à¤\9fन à¤¦à¤¬à¤¾à¤\88à¤\82 à¤\86 à¤\9aाहà¥\87 à¤¨à¤¿à¤\9aला à¤¬à¤\9fन à¤¦à¤¬à¤¾à¤\88à¤\82।<br />\nLegend: '''({{int:cur}})''' = à¤¹à¤¾à¤² à¤\95à¥\87 à¤¸à¤\82शà¥\8bधन à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤\85à¤\82तर, '''({{int:last}})''' = à¤ªà¥\81रà¥\8dववरà¥\8dतà¥\80 à¤¸à¤\82शà¥\8bधन à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤\85à¤\82तर, '''{{int:minoreditletter}}''' = à¤\9bà¥\8bà¤\9f à¤¸à¤®à¥\8dपादन।",
-       "history-fieldset-title": "à¤\87तिहास à¤¨à¤¿à¤¹à¤¾à¤°ीं",
+       "histlegend": "à¤\85à¤\82तर à¤¬à¥\80à¤\9bà¥\80à¤\82: à¤¤à¥\81लना à¤¦à¥\87à¤\96à¥\87 à¤\96ातिर à¤¬à¤¦à¤²à¤¾à¤µà¤¨ à¤\95à¥\87 à¤°à¥\87डियà¥\8b à¤¬à¤\9fन à¤\9aिनà¥\8dहित à¤\95रà¥\80à¤\82 à¤\86 à¤\8fà¤\82à¤\9fर à¤¯à¤¾ à¤«à¤¿à¤° à¤¨à¥\80à¤\9aà¥\87 à¤¦à¤¿à¤¹à¤² à¤¬à¤\9fन à¤¦à¤¬à¤¾à¤\88à¤\82।<br />\nसà¤\82à¤\95à¥\87त: <strong>({{int:cur}})</strong> = à¤¸à¤­à¤¸à¥\87 à¤¨à¤¯à¤¾ à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤\85à¤\82तर, <strong>({{int:last}})</strong> = à¤ªà¤\9bिला à¤¬à¤¦à¤²à¤¾à¤µ à¤\95à¥\87 à¤¸à¤¾à¤¥ à¤\85à¤\82तर, <strong>{{int:minoreditletter}}</strong> = à¤\9bà¥\8bà¤\9f à¤¸à¤\82पादन।",
+       "history-fieldset-title": "à¤\87तिहास à¤¦à¥\87à¤\96ीं",
        "history-show-deleted": "खाली मेटावल",
        "histfirst": "सबसे पुरान",
        "histlast": "सबसे नया",
        "historysize": "({{PLURAL:$1|1 बाइट|$1 बाइट}})",
        "historyempty": "(खाली)",
-       "history-feed-title": "सà¤\82शà¥\8bधन इतिहास",
-       "history-feed-description": "विà¤\95ि à¤ªà¤° à¤\87 पन्ना के संशोधन के इतिहास",
+       "history-feed-title": "बदलाव इतिहास",
+       "history-feed-description": "विà¤\95ि à¤ªà¤° à¤\8fह पन्ना के संशोधन के इतिहास",
        "history-feed-item-nocomment": "$1 $2 पर",
-       "history-feed-empty": "à¤\85नà¥\81रà¥\8bध à¤\95रल à¤\97à¤\88ल à¤ªà¤¨à¥\8dना à¤\89पलबà¥\8dध à¤¨à¤\88à¤\96à¥\87। à¤¹à¥\8b à¤¸à¤\95त à¤¬à¤¾ à¤\89 à¤\95à¥\87 à¤µà¤¿à¤\95ि à¤ªà¤° à¤¸à¥\87 à¤®à¤¿à¤\9fा à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल à¤¹à¥\8bà¤\96à¥\87, à¤\86 à¤\9aाहà¥\87 à¤\89 à¤\95à¥\87 à¤¨à¤¾à¤® à¤¬à¤¦à¤² à¤¦à¥\87वल à¤\97à¤\88ल à¤¹à¥\8bà¤\96à¥\87।\nपà¥\8dरासà¤\82à¤\97िà¤\95 à¤ªà¤¨à¥\8dना à¤\95à¥\87 [[Special:Search|विà¤\95ि à¤ªà¤° à¤\96à¥\8bà¤\9cà¥\87 à¤\95à¥\87]] à¤\95à¥\8bशिश à¤\95रत à¤°à¤¹ीं।",
+       "history-feed-empty": "à¤\85नà¥\81रà¥\8bध à¤\95रल à¤\97à¤\87ल à¤ªà¤¨à¥\8dना à¤\89पलबà¥\8dध à¤¨à¤\87à¤\96à¥\87। à¤¹à¥\8b à¤¸à¤\95त à¤¬à¤¾ à¤\8fà¤\95रा à¤\95à¥\87 à¤µà¤¿à¤\95ि à¤ªà¤° à¤¸à¥\87 à¤¹à¤\9fा à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¹à¥\8bà¤\96à¥\87, à¤¯à¤¾ à¤\8fà¤\95र à¤¨à¤¾à¤\81व à¤¬à¤¦à¤²à¤² à¤\97à¤\87ल à¤¹à¥\8bà¤\96à¥\87।\nपà¥\8dरसà¤\82à¤\97 à¤\85नà¥\81सार à¤¨à¤¯à¤¾ à¤ªà¤¨à¥\8dना à¤\8fह [[Special:Search|विà¤\95ि à¤ªà¤° à¤\96à¥\8bà¤\9cà¥\87 à¤\95à¥\87]] à¤\95à¥\8bशिश à¤\95रीं।",
        "history-edit-tags": "सेलेक्ट कइल बदलाव खातिर संपादन टैग",
-       "rev-deleted-comment": "(समà¥\8dपादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¹à¤\9fावल à¤\97à¤\88ल)",
-       "rev-deleted-user": "(पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\87 à¤¨à¤¾à¤® à¤®à¤¿à¤\9fा à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल बा)",
-       "rev-deleted-event": "(लà¥\89à¤\97 à¤µà¤¿à¤µà¤°à¤£ à¤¹à¤\9fा à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल बा)",
-       "rev-deleted-user-contribs": "[पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤\86 à¤\9aाहà¥\87 à¤\86à¤\87 à¤ªà¥\80 à¤ªà¤¤à¤¾ à¤¹à¤\9fा à¤¦à¤¿à¤¹à¤² à¤\97à¤\88ल à¤¬à¤¾ - à¤¯à¥\8bà¤\97दान à¤¸à¥\87 à¤¸à¤®à¥\8dपादन à¤\9bà¥\81प à¤\97à¤\88ल बा]",
+       "rev-deleted-comment": "(समà¥\8dपादन à¤¸à¤¾à¤°à¤¾à¤\82श à¤¹à¤\9fावल à¤\97à¤\87ल)",
+       "rev-deleted-user": "(पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤\95à¥\87 à¤¨à¤¾à¤\81व à¤®à¤¿à¤\9fा à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल बा)",
+       "rev-deleted-event": "(लà¥\89à¤\97 à¤µà¤¿à¤µà¤°à¤£ à¤¹à¤\9fा à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल बा)",
+       "rev-deleted-user-contribs": "[पà¥\8dरयà¥\8bà¤\97à¤\95रà¥\8dता à¤¨à¤¾à¤® à¤¯à¤¾ à¤\86à¤\87पà¥\80 à¤ªà¤¤à¤¾ à¤¹à¤\9fा à¤¦à¤¿à¤¹à¤² à¤\97à¤\87ल à¤¬à¤¾ - à¤¯à¥\8bà¤\97दान à¤²à¤¿à¤¸à¥\8dà¤\9f à¤¸à¥\87 à¤¸à¤\82पादन à¤\9bिप à¤\97à¤\87ल बा]",
        "rev-deleted-text-permission": "ई पन्ना के संशोधन '''मिटा'''' दिहल गईल बा।\nमेटावल जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} डिलेशन लॉग] में मिली।",
        "rev-suppressed-text-permission": "ए पन्ना के बदलाव<strong>दबा दिहल गइल बा</strong>।\nबिस्तृत जानकारी [{{fullurl:{{#Special:Log}}/suppress|page={{FULLPAGENAMEE}}}} दबावल चीज के लॉग] पर मिल जाई।",
        "rev-deleted-text-unhide": "पन्ना पर क ई बदलाव <strong>हटा दिहल गइल बा</strong>।\nएकर डिटेल जानकारी [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} हटवले के लॉग] में मिल सकेला।\nअभी भी आप [$1 ई बदलाव देख सकत बानी]  अगर आप आगे देखल चाहत होखीं।",
        "action-delete": "ई पन्ना के मिटाईं",
        "action-unwatchedpages": "ध्यानसूची में जवन पन्ना नइखे ओकर सूची देखीं",
        "enhancedrc-history": "इतिहास",
-       "recentchanges": "तà¥\81रà¤\82त à¤­à¤\87ल बदलाव",
+       "recentchanges": "हाल à¤\95à¥\87 बदलाव",
        "recentchanges-legend": "हाल के बदलाव संबंधी बिकल्प",
        "recentchanges-summary": "ए विकि पर हाल में भइल बदलाव इहाँ देखल जा सकत बा।",
+       "recentchanges-noresult": "दिहल गइल समयअवधि खातिर एह पैमाना पर सही उतरे वाला कौनों बदलाव नइखे।",
+       "recentchanges-feed-description": "एह विकि पर सभसे हालिया बदलाव के एह फीड में निगरानी करीं।",
        "recentchanges-label-newpage": "ए संपादन से एगो नया पन्ना बनल",
        "recentchanges-label-minor": "ई एगो छोट संपादन बा",
        "recentchanges-label-bot": "इ संपादन एगो बॉट द्वारा कइल गइल बा",
        "recentchanges-label-unpatrolled": "ए संपादन के अभिन ले जाँचल नइखे गइल",
-       "recentchanges-label-plusminus": "à¤\8fतना à¤¬à¤¾à¤\87à¤\9fसà¥\8d से पन्ना के साइज बदलल गइल",
+       "recentchanges-label-plusminus": "à¤\8fतना à¤¬à¤¾à¤\87à¤\9fà¥\8dस से पन्ना के साइज बदलल गइल",
        "recentchanges-legend-heading": "<strong>संकेत:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (इहो देखीं [[Special:NewPages|नया पन्नवन के लिस्ट]])",
-       "rclistfrom": "$2, $3 से शुरु नया बदलाव देखाईं",
+       "recentchanges-submit": "देखावल जाय",
+       "rcnotefrom": "<strong>$3, $4</strong> से (<strong>$1</strong> तक ले के) {{PLURAL:$5|बदलाव|बदलाव सभ}} नीचे दिहल गइल बा।",
+       "rclistfrom": "$2, $3 से शुरु होखे वाला नया बदलाव देखावल जाय",
        "rcshowhideminor": "$1 छोट संपादन",
-       "rcshowhideminor-show": "दà¥\87à¤\96ाà¤\88à¤\82",
-       "rcshowhideminor-hide": "à¤\9bिपाà¤\88à¤\82",
+       "rcshowhideminor-show": "दà¥\87à¤\96ावल à¤\9cाय",
+       "rcshowhideminor-hide": "à¤\9bिपावल à¤\9cाय",
        "rcshowhidebots": "बॉट $1",
-       "rcshowhidebots-show": "दà¥\87à¤\96ाà¤\88à¤\82",
-       "rcshowhidebots-hide": "à¤\9bिपाà¤\88à¤\82",
+       "rcshowhidebots-show": "दà¥\87à¤\96ावल à¤\9cाय",
+       "rcshowhidebots-hide": "à¤\9bिपावल à¤\9cाय",
        "rcshowhideliu": "रजिस्टर्ड सदस्य $1",
-       "rcshowhideliu-show": "दà¥\87à¤\96ाà¤\88à¤\82",
-       "rcshowhideliu-hide": "à¤\9bिपाà¤\88à¤\82",
+       "rcshowhideliu-show": "दà¥\87à¤\96ावल à¤\9cाय",
+       "rcshowhideliu-hide": "à¤\9bिपावल à¤\9cाय",
        "rcshowhideanons": "बेनाम सदस्य $1",
-       "rcshowhideanons-show": "दà¥\87à¤\96ाà¤\88à¤\82",
-       "rcshowhideanons-hide": "à¤\9bिपाà¤\88à¤\82",
+       "rcshowhideanons-show": "दà¥\87à¤\96ावल à¤\9cाय",
+       "rcshowhideanons-hide": "à¤\9bिपावल à¤\9cाय",
        "rcshowhidepatr": "जाँचल बदलाव $1",
-       "rcshowhidepatr-show": "दà¥\87à¤\96ाà¤\88à¤\82",
-       "rcshowhidepatr-hide": "à¤\9bिपाà¤\88à¤\82",
+       "rcshowhidepatr-show": "दà¥\87à¤\96ावल à¤\9cाय",
+       "rcshowhidepatr-hide": "à¤\9bिपावल à¤\9cाय",
        "rcshowhidemine": "हमार संपादन $1",
-       "rcshowhidemine-show": "देखाईं",
-       "rcshowhidemine-hide": "छिपाईं",
-       "rclinks": "पछिला $2 दिन में भइल $1 बदलाव देखाईं<br />$3",
-       "diff": "अन्तर",
-       "hist": "इति",
-       "hide": "छिपाईं",
-       "show": "देखाईं",
+       "rcshowhidemine-show": "देखावल जाय",
+       "rcshowhidemine-hide": "छिपावल जाय",
+       "rcshowhidecategorization": "$1 पन्ना श्रेणीकरण",
+       "rcshowhidecategorization-show": "देखावल जाय",
+       "rcshowhidecategorization-hide": "छिपावल जाय",
+       "rclinks": "पछिला $2 दिन में भइल $1 बदलाव देखावल जाय<br />$3",
+       "diff": "अंतर",
+       "hist": "इतिहास",
+       "hide": "छिपावल जाय",
+       "show": "देखावल जाय",
        "minoreditletter": "छो",
        "newpageletter": "न",
        "boteditletter": "बॉ",
-       "number_of_watching_users_pageview": "[$1 देखल जा रहल बा {{PLURAL:$1|प्रयोगकर्ता|प्रयोगकर्ता}}]",
-       "rc_categories": "श्रेणिन के सीमा (\"|\" से अलगा करीं)",
-       "rc_categories_any": "कौनों",
-       "rc-change-size-new": "$1 {{PLURAL:$1|बाइट|बाइट सब}} बदलाव के बाद",
+       "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|प्रयोगकर्ता|प्रयोगकर्ता लोग}} के धियानसूची में बा]",
+       "rc_categories": "श्रेणिन के सीमा (\"|\" से अलगा करीं):",
+       "rc_categories_any": "बीछल में से कौनों एक ठो",
+       "rc-change-size-new": "बदलाव के बाद $1 {{PLURAL:$1|बाइट|बाइट्स}}",
+       "newsectionsummary": "/* $1 */ नया खंड",
+       "rc-enhanced-expand": "डिटेल देखावल जाय",
+       "rc-enhanced-hide": "डिटेल छिपावल जाय",
+       "rc-old-title": "मूल $1 नाँव से बनावल गइल",
        "recentchangeslinked": "संबंधित बदलाव",
-       "recentchangeslinked-feed": "समà¥\8dबनà¥\8dधित बदलाव",
+       "recentchangeslinked-feed": "सà¤\82बà¤\82धित बदलाव",
        "recentchangeslinked-toolbox": "संबंधित बदलाव",
-       "recentchangeslinked-title": "\"$1\" à¤¸à¥\87 à¤¸à¤\82बधी बदलाव",
+       "recentchangeslinked-title": "\"$1\" à¤¸à¤\82बà¤\82धी बदलाव",
        "recentchangeslinked-summary": "ई एगो पन्ना बिसेस से (या एगो श्रेणी बिसेस की सदस्य से) जुड़ल पन्नवन में हाल में भइल बदलाव के एगो लिस्ट हवे। \n[[Special:Watchlist|आपकी धियानसूची]] के पन्ना सब <strong>मोट अच्छर में</strong> लउकत बाटे।",
        "recentchangeslinked-page": "पन्ना नाँव:",
-       "recentchangeslinked-to": "ए पन्ना से जुड़ल पन्नवन मे भइल बदलाव भले देखाईं",
+       "recentchangeslinked-to": "एकरे बजाय ए पन्ना से जुड़ल पन्नवन मे भइल बदलाव देखावल जाय",
+       "recentchanges-page-added-to-category": "[[:$1]] श्रेणी में जोड़ल गइल",
        "upload": "फाइल अपलोड करीं",
        "uploadlogpage": "लदनी (अपलोड) के लॉग",
        "uploadlogpagetext": "नीचे हाल में अपलोड करल गइल फाइलन के सूची बा।\nदृश्य अवलोकन खातिर [[Special:NewFiles|नया फाइलन के गैलरी]] देखीं।",
        "unwatchedpages": "ध्यान न दिहल गइल पन्ना",
        "listredirects": "पुनर्निर्देशन के सूची",
        "unusedtemplates": "बिना प्रयोग के खाँचा",
-       "randompage": "बà¥\87तरतà¥\80ब पन्ना",
+       "randompage": "à¤\95à¥\8cनà¥\8bà¤\82 à¤\8fà¤\97à¥\8b पन्ना",
        "randomincategory": "श्रेणी में अनियमित पन्ना",
        "randomincategory-nopages": "[[:Category:$1|$1]] श्रेणी में कउनो पन्ना नइखे।",
        "randomincategory-category": "श्रेणी:",
        "wantedpages": "पन्ना चाहत बा",
        "wantedfiles": "जरुरत के फाईलसभ",
        "wantedfiletext-nocat-noforeign": "ई फाइल सभ इस्तेमाल में बाटे बाकी मौजूद नइखे।",
-       "wantedtemplates": "जरुरत के खाँचा",
-       "mostlinked": "सबसे ढेर पन्ना-जोड़ वाला",
-       "mostlinkedcategories": "सबसे अधिक से जुड़ल श्रेणीसभ",
-       "mostlinkedtemplates": "सभसे ढेर ट्रांसक्लूजन वाला पन्ना",
-       "mostcategories": "सबसे अधिक श्रेणी वाला पन्नाकुल",
-       "mostimages": "सभसे ढेर फाइल-जोड़ वाला",
-       "mostinterwikis": "सभसे ढेर इंटरविकि वाला पन्ना",
-       "mostrevisions": "सभसे ढेर रिवीजन वाला पन्ना सभ",
-       "prefixindex": "उपसर्ग अनुसार पन्ना",
-       "shortpages": "छोट पन्नासभ",
+       "wantedtemplates": "टेम्पलेट जिनहन के जरूरत बा",
+       "mostlinked": "पन्ना जहाँ सभसे ढेर कड़ी आ के जुड़त बा",
+       "mostlinkedcategories": "सबसे अधिक से जुड़ल श्रेणी",
+       "mostlinkedtemplates": "सभसे ढेर ट्रांसक्लूड पन्ना",
+       "mostcategories": "पन्ना जिनहन पर सभसे ढेर श्रेणी बा",
+       "mostimages": "पन्ना जिनहन पर सभसे ढेर फाइल बा",
+       "mostinterwikis": "पन्ना जिनहन में सभसे ढेर इंटरविकि कड़ी बा",
+       "mostrevisions": "सभसे ढेर बदलाव इतिहास वाला पन्ना",
+       "prefixindex": "सगरी पन्ना जिनहन में उपसर्ग बा",
+       "prefixindex-namespace": "सगरी पन्ना जिनहन में उपसर्ग ($1 नाँवस्थान) बा",
+       "prefixindex-submit": "देखीं",
+       "shortpages": "छोट पन्ना",
        "longpages": "लमहर पन्ना",
-       "deadendpages": "मरल-à¤\96पल पन्ना",
+       "deadendpages": "à¤\85à¤\82तिम à¤\9bà¥\8bर à¤ªà¤° à¤\9bà¥\82à¤\9fल पन्ना",
        "protectedpages": "सुरक्षित पन्ना",
        "protectedpages-noredirect": "अनुप्रेषण छिपाईं",
        "protectedpagesempty": "कौनों पन्ना के सुरक्षा ए पैमान पर नइखे",
        "protectedpages-timestamp": "टाइममोहर",
        "protectedpages-page": "पन्ना",
        "protectedpages-expiry": "एक्सपायर हो जाई",
-       "protectedpages-performer": "सदसà¥\8dय à¤¸à¥\81रà¤\95à¥\8dषा",
+       "protectedpages-performer": "सà¥\81रà¤\95à¥\8dषा à¤²à¤\97ावà¥\87 à¤µà¤¾à¤²à¤¾ à¤¸à¤¦à¤¸à¥\8dय",
        "protectedpages-params": "सुरक्षा पैमाना",
        "protectedpages-reason": "कारण",
+       "protectedpages-submit": "पन्ना देखीं",
        "protectedpages-unknown-timestamp": "नामालूम",
        "protectedpages-unknown-performer": "नामालूम सदस्य",
        "protectedtitles": "सुरक्षित शीर्षक",
        "protectedtitlesempty": "कौनों टाइटिल के सुरक्षा एह पैमान पर नइखे।",
+       "protectedtitles-submit": "शीर्षक देखीं",
        "listusers": "सदस्यसूची",
        "listusers-editsonly": "उहे सदस्य देखाईं जे संपादन कइले होखे",
        "listusers-creationsort": "बनवले की तारीख की हिसाब से सरियाईं",
        "usereditcount": "$1 {{PLURAL:$1|संपादन|संपादन सभ}}",
        "newpages": "नया पन्ना",
        "newpages-username": "सदस्यनाँव:",
-       "ancientpages": "सभन à¤¸à¥\87 à¤ªà¥\81रान à¤ªà¤¨à¥\8dनासभ",
-       "move": "सà¥\8dथानà¥\8dतरण",
-       "movethispage": "à¤\88 à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¥\8dथांतरण करीं",
+       "ancientpages": "पà¥\81रान à¤ªà¤¨à¥\8dना",
+       "move": "सà¥\8dथानाà¤\82तरण",
+       "movethispage": "à¤\8fह à¤ªà¤¨à¥\8dना à¤\95à¥\87 à¤¸à¥\8dथानांतरण करीं",
        "suppress": "ओवरसाइटर",
        "apihelp": "एपीआइ (API) मदद",
        "apihelp-no-such-module": "मॉड्युल $1 ना मिलल।",
        "trackingcategories-msg": "निगरानी श्रेणी",
        "trackingcategories-name": "संदेस नाँव",
        "emailuser": "ई प्रयोगकर्ता के ईमेल करीं",
-       "watchlist": "धà¥\8dयानसूची",
+       "watchlist": "धियानसूची",
        "mywatchlist": "धियानसूची",
        "watch": "धियानसूची में डालीं",
        "watchthispage": "ई पन्ना ध्यानसूची में डालीं",
-       "unwatch": "धà¥\8dयानसूची से हटाईं",
+       "unwatch": "धियानसूची से हटाईं",
        "watching": "ध्यानसूची में जाते हुए",
        "unwatching": "ध्यानसूची से हटते हुए",
        "created": "बनावल गईल",
        "actioncomplete": "काम पुरा भइल",
        "dellogpage": "हटवले के लिस्ट",
-       "rollbacklink": "वापिस à¤²à¥\80à¤\82",
+       "rollbacklink": "रà¥\8bलबà¥\88à¤\95",
        "rollbacklinkcount": "रोलबैक $1 {{PLURAL:$1|संपादन|संपादन सब}}",
        "protectlogpage": "सुरक्षा लॉग",
        "protectlogtext": "नीचे पन्ना सुरक्षा में भइल बदलावकुल के सूची बा।\nहाल में सुरक्षित पन्नन के सूची खातिर [[Special:ProtectedPages|सुरक्षित पन्नन के सूची]] देखीं।",
        "undelete": "हटावल पन्ना देखीं",
        "undeletepage": "हटावल पन्ना देखीं आ वापिस ले आईं",
        "undeletelink": "देखीं/बहाल करीं",
-       "namespace": "नामस्थान:",
+       "namespace": "नाà¤\81वस्थान:",
        "invert": "चुनाव पलटीं",
        "tooltip-invert": "चुनल गइल नामस्थान की संघे बदलाव छिपावे खातिर ए बाकस के चिन्हित करीं (सम्बन्धित नामस्थान के भी, अगर चिन्हित होखे)",
        "namespace_association": "संबंधित नामस्थान",
        "mycontris": "हमार योगदान",
        "anoncontribs": "योगदान",
        "nocontribs": "ई मानदंड से मिलत जुलत कौनो बदलाव ना मिलल।",
-       "uctop": "(हाल à¤\95à¥\87)",
+       "uctop": "(वरà¥\8dतमान)",
        "month": "महीना से (आ ओ से पहिले):",
        "year": "साल से (आ ओ से पहिले):",
        "sp-contributions-newbies": "खाली नया खाता के योगदान देखीं।",
        "sp-contributions-newbies-sub": "नया खाता खातिर",
        "sp-contributions-newbies-title": "नया खाता खातिर प्रयोगकर्ता के योगदान।",
-       "sp-contributions-blocklog": "निषà¥\8dà¤\95à¥\8dरà¥\80य à¤\96ाता",
+       "sp-contributions-blocklog": "बà¥\8dलà¥\89à¤\95 à¤²à¥\89à¤\97",
        "sp-contributions-deleted": "नष्ट प्रयोगकर्ता के योगदान।",
-       "sp-contributions-logs": "लà¥\8cग",
-       "sp-contributions-talk": "बात-चीत",
+       "sp-contributions-logs": "लà¥\89ग",
+       "sp-contributions-talk": "बातचीत",
        "sp-contributions-userrights": "प्रयोगकर्ता अधिकार प्रबन्धन",
        "sp-contributions-blocked-notice": "ई प्रयोगकर्ता के ई समय निष्क्रीय करल गईल बा।\nनविनतम नष्ट लौग प्रविष्टी उद्धरण खातिर निचे दिहल बा:",
        "whatlinkshere": "इहाँ का जुड़ल बा",
        "exif-iimcategory": "श्रेणी",
        "exif-orientation-1": "सामान्य",
        "namespacesall": "सगरी",
-       "monthsall": "सब",
-       "confirmemail": "à¤\87-मेल पता कन्फर्म करीं",
+       "monthsall": "सà¤\97रà¥\80",
+       "confirmemail": "à¤\88मेल पता कन्फर्म करीं",
        "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|बात करीं]])",
        "version-no-ext-name": "[अज्ञात नाम]",
        "fileduplicatesearch": "नकल प्रति फाइल खोजीं",
        "logentry-newusers-create": "खाता $1 {{GENDER:$2|बनावल गइल}}",
        "revdelete-summary": "सारांश संपादन",
        "searchsuggest-search": "खोजीं",
-       "api-error-nomodule": "भितरà¥\80 à¤¤à¥\8dरà¥\81à¤\9fी:कउनो अपलोड मॉड्युल सेट नइखे",
-       "expandtemplates": "फà¥\88लल à¤\96ाà¤\81à¤\9aा",
-       "mediastatistics": "मिडिया à¤¤à¤¥à¥\8dयाà¤\82à¤\95"
+       "api-error-nomodule": "भितरà¥\80 à¤\96राबी:कउनो अपलोड मॉड्युल सेट नइखे",
+       "expandtemplates": "à¤\9fà¥\87मà¥\8dपलà¥\87à¤\9f à¤¬à¤¿à¤¸à¥\8dतार",
+       "mediastatistics": "मà¥\80डिया à¤¸à¤¾à¤\82à¤\96à¥\8dयिà¤\95à¥\80"
 }
index 8a0eb59..3e79912 100644 (file)
        "yourname": "Ngaran pamakai:",
        "yourpassword": "Katasunduk:",
        "yourpasswordagain": "Katik pulang katasunduk:",
-       "remembermypassword": "Ingatakan log babuat ulun dalam komputer naya (salawas $1 {{PLURAL:$1|hari|hari}})",
        "yourdomainname": "Domain Pian:",
        "password-change-forbidden": "Pian kada kawa ma-ubah kata sunduk pada wiki ngini.",
        "externaldberror": "Ada kasalahan apakah kacucukan basis data atawa Pian kada bulih mamutakhirakan akun luar.",
        "passwordreset-emailtext-user": "Ada urang (pinanya Pian, matan alamat IP $1) maminta sabuting pangingat hagan rarincian akun Pian gasan {{SITENAME}} ($4). Pamakai barikut {{PLURAL:$3|akun|akun}}\ntarait awan suril:\n\n$2\n\n{{PLURAL:$3|katasunduk pahadangan ngini|kakatasunduk pahadangan ngini}} akan kadaluarsa dalam {{PLURAL:$5|asa hari|$5 hari}}.\nPian parlu babuat log wan mamilih katasunduk hanyar wayah ini jua. Amun urang lain nang maminta ngini, atawa amun Pian sudah paingatan awan katasunduk Pian, wan Pian kada handak maubahnya, Pian kawa kada mahuwal pasan ngini wan manyambung mamuruk katasunduk lawas Pian.",
        "passwordreset-emailelement": "Ngaran pamakai: \n$1\n\nKatasunduk pahadangan: \n$2",
        "passwordreset-emailsentemail": "Sabuting suril pangingat sudah takirim.",
-       "passwordreset-emailsent-capture": "Sabuting suril pangingat sudah dikirim, nangkaya ditampaiakan di bawah.",
-       "passwordreset-emailerror-capture": "Suril paugingat, nang ditampaikan di bawah, hudah dihasilakan, tagal gagal mangirimakannya ka pamakai: $1",
        "changeemail": "Ganti alamat suril",
        "changeemail-header": "Ganti akun alamat suril",
        "changeemail-no-info": "Pian musti babuat log hagan babuat ka tungkaran ngini langsung.",
        "undo-failure": "Babakan ini kada kawa diwalangi karana ada cakutan di tangah babakan-babakan.",
        "undo-norev": "Babakan kada kawa diwalangi karana ini kadada atawa tahapus.",
        "undo-summary": "←Mawalangakan ralatan $1 ulih [[Special:Contributions/$2|$2]] ([[User talk:$2|Pandir]])",
-       "cantcreateaccounttitle": "Akun kada kawa diulah",
        "cantcreateaccount-text": "Paulahan akun matan alamat IP ('''$1''') sudah diblukir ulih [[User:$3|$3]].\n\nAlasan nang dibari ulih $3 adalah ''$2''",
        "viewpagelogs": "Tiringi log tungkaran ini",
        "nohistory": "Kadada halam babakan gasan tungkaran ini.",
        "activeusers-intro": "Ngini adalah sabuah daptar papamuruk sabuah bantuk kagiatan dalam tauncit $1 {{PLURAL:$1|hari|hahari}}.",
        "activeusers-count": "$1 {{PLURAL:$1|babak|babakan}} dalam tauncit {{PLURAL:$3|hari|$3 hahari}}",
        "activeusers-from": "Manampaiakan papamuruk mulai matan:",
-       "activeusers-hidebots": "Sungkupakan bot",
-       "activeusers-hidesysops": "Sungkupakan pambakal",
        "activeusers-noresult": "Kadada papamuruk tatamu.",
        "listgrouprights": "Galambang hak pamuruk",
        "listgrouprights-summary": "Barikut adalah sabuah daptar matan galambang pamuruk nang ada di wiki ngini, lawan hak ungkai masing-masing.\nAda di [[{{MediaWiki:Listgrouprights-helppage}}|tambahan panjalasan]] pasal hak par urangan.",
        "htmlform-submit": "Kirim",
        "htmlform-reset": "Walangi paubahan",
        "htmlform-selectorother-other": "Lain-lain",
-       "sqlite-has-fts": "$1 awan sukungan panggagaian naskah-hibak",
-       "sqlite-no-fts": "$1 kada-awan sukungan panggagaian naskah-hibak",
        "logentry-delete-delete": "$1 mahapus tungkaran $3",
        "logentry-delete-restore": "$1 dibulikakan tungkaran $3",
        "logentry-delete-event": "$1 mangganti kakawaan dijanaki {{PLURAL:$5|sabuah log kajadian|$5 log kajadian}} pintangan $3: $4",
index 31ecf59..8b22db4 100644 (file)
@@ -30,7 +30,8 @@
                        "Bodhisattwa",
                        "Matma Rex",
                        "আজিজ",
-                       "Kayser Ahmad"
+                       "Kayser Ahmad",
+                       "NahidSultan"
                ]
        },
        "tog-underline": "সংযোগগুলির নিচে দাগ দেখানো হোক:",
        "passwordreset-emaildisabled": "এই উইকিতে ইমেইল অপশনটি বন্ধ করা হয়েছে।",
        "passwordreset-username": "ব্যবহারকারী নাম:",
        "passwordreset-domain": "ডোমেইন:",
-       "passwordreset-capture": "অনুসন্ধানের ফলাফলের ইমেইল দেখুন?",
-       "passwordreset-capture-help": "আপনি যদি এই পরীক্ষা বক্সে ক্লিক করেন, তবে অস্থায়ী পাসওয়ার্ডসহ একটি ইমেইল আপনাকে দেখানো হবে ও সেইসাথে ব্যবহারকারীকে তা পাঠানো হবে।",
        "passwordreset-email": "ইমেইল ঠিকানা:",
        "passwordreset-emailtitle": "{{SITENAME}} সাইটে ব্যবহারকারীর বিস্তারিত তথ্যাদি",
        "passwordreset-emailtext-ip": "কেউ একজন (সম্ভবত আপনি, $1 আইপি ঠিকানা থেকে) {{SITENAME}} ($4) সাইটের জন্য আপনার\nপাসওয়ার্ড বদলের জন্য অনুরোধ করেছে। নিচের ব্যবহারকারী {{PLURAL:$3|অ্যাকাউন্টটি|অ্যাকাউন্টগুলো}}\nএই ই-মেইল ঠিকানার সাথে সংযুক্ত:\n\n$2\n\n{{PLURAL:$3|এই অস্থায়ী পাসওয়ার্ডটি|এই অস্থায়ী পাসওয়ার্ডগুলো}} আগামী {{PLURAL:$5|এক দিন|$5 দিন}} পর মেয়াদোত্তীর্ণ হয়ে যাবে।\nআপনার অবশ্যই লগ-ইন করে একটি নতুন পাসওয়ার্ড পছন্দ করা উচিত। যদি অন্য কেউ এই অনুরোধ করে থাকে,\nঅথবা আপনি যদি পুরোনো পাসওয়ার্ড মনে করতে পারেন, এবং আপনার সেটি পরিবর্তন করার কোনো ইচ্ছা না থাকে, তবে\nআপনি এই বার্তাটি উপেক্ষা করতে পারে, এবং আপনার পুরোনো পাসওয়ার্ড ব্যবহার করা চালিয়ে যেতে পারেন।",
        "passwordreset-emailelement": "ব্যবহারকারী নাম: \n$1\n\nঅস্থায়ী পাসওয়ার্ড: \n$2",
        "passwordreset-emailsentemail": "যদি এই ই-মেইল ঠিকানা আপনার অ্যাকাউন্টের সাথে সংযুক্ত করা থাকে, তাহলে একটি পাসওয়ার্ড বদলের ইমেইল পাঠানো হবে।",
        "passwordreset-emailsentusername": "যদি এই ব্যবহারকারী নামের সাথে ই-মেইল ঠিকানা সংযুক্ত করা থাকে, তাহলে একটি পাসওয়ার্ড বদলের ইমেইল পাঠানো হবে।",
-       "passwordreset-emailsent-capture2": "পাসওয়ার্ড পুনঃধার্যকরণের {{PLURAL:$1|ইমেইল পাঠানো}} হয়েছে। {{PLURAL:$1|ব্যবহারকারী নাম ও পাসওয়ার্ড|ব্যবহারকারী নাম ও পাসওয়ার্ডের তালিকা}} এখানে দেখা যাবে।",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|ব্যবহারকারীকে}} ইমেইল পাঠানো যায়নি: $1 {{PLURAL:$3|ব্যবহারকারী নাম ও পাসওয়ার্ড|ব্যবহারকারী নাম ও পাসওয়ার্ডের তালিকা}} এখানে দেখা যাবে।",
        "passwordreset-nocaller": "একটি আহ্বানকারী প্রদান করা আবশ্যক",
        "passwordreset-nosuchcaller": "আহ্বানকারীর অস্তিত্ব নেই: $1",
        "passwordreset-ignored": "পাসওয়ার্ড পুনঃধার্যকরণ করা যায়নি। হয়তো কোন প্রদানকারী কনফিগার করা হয়েনি?",
-       "passwordreset-invalideamil": "ভুল ইমেইল ঠিকানা",
+       "passwordreset-invalidemail": "ভুল ইমেইল ঠিকানা",
        "passwordreset-nodata": "একটি ব্যবহারকারীর নাম বা একটি ইমেল ঠিকানা দুটির একটিও সরবরা দেয়া হয়নি",
        "changeemail": "ই-মেইল ঠিকানা পরিবর্তন বা বাতিল",
        "changeemail-header": "আপনার ইমেল ঠিকানা পরিবর্তন করতে এই ফরমটি পূরণ করুন। আপনি যদি আপনার একাউন্ট থেকে যে কোন ইমেল ঠিকানার এসোসিয়েশন অপসারণ করতে চান, তাহলে ফরমটি জমা দেওয়ার সময় নতুন ইমেইল ঠিকানা খালি রাখুন।",
        "userrights-reason": "কারণ (বাংলায় লিখুন):",
        "userrights-no-interwiki": "আপনার অন্য উইকিতে ব্যবহারকারী অধিকার সম্পাদনা করার অনুমতি নেই।",
        "userrights-nodatabase": "$1 ডাটাবেজটির হয় কোন অস্তিত্ব নেই অথবা এটি স্থানীয় ডাটাবেজ নয়।",
-       "userrights-nologin": "ব্যবহারকারী অধিকার প্রযুক্ত করতে হলে আপনাকে কোন প্রশাসকের অ্যাকাউন্টে [[Special:UserLogin|প্রবেশ]] করতে হবে।",
-       "userrights-notallowed": "আপনার, ব্যবহারকারী অধিকার যুক্ত বা অপসারণ করার অনুমতি নেই।",
        "userrights-changeable-col": "দল যা আপনি পরিবর্তন করতে পারেন",
        "userrights-unchangeable-col": "দল যা আপনি পরিবর্তন করতে পারবেন না",
        "userrights-conflict": "ব্যবহারকারী অধিকার দ্বন্দ্ব! অনুগ্রহ করে নিশ্চিত হোন এবং পুনরায় চেষ্টা করুন।",
-       "userrights-removed-self": "আপনি আপনার নিজের অধিকার পরিবর্তন করেছেন। এর ফলে এখন থেকে আপনি আর এই পাতায় প্রবেশ করতে পারবেন না।",
        "group": "দল:",
        "group-user": "ব্যবহারকারীগণ",
        "group-autoconfirmed": "স্বয়ংনিশ্চিতকৃত ব্যবহারকারীগণ",
        "right-createpage": "পাতা তৈরি করো (আলাপের পাতা নয়)",
        "right-createtalk": "আলোচনা পাতা তৈরি করুন",
        "right-createaccount": "নতুন ব্যবহারকারীর অ্যাকাউন্ট তৈরি করুন",
+       "right-autocreateaccount": "স্বয়ংক্রিয়ভাবে একটি বাহ্যিক ব্যবহারকারী অ্যাকাউন্ট দিয়ে প্রবেশ করুন",
        "right-minoredit": "অনুল্লেখ্য সম্পাদনা হিসেবে চিহ্নিত",
        "right-move": "পাতা সরান",
        "right-move-subpages": "পাতাগুলোকে তার উপপাতাসহ সরিয়ে নিন",
        "right-siteadmin": "ডাটাবেজ বন্ধ এবং খুলুন",
        "right-override-export-depth": "৫ম স্তর পর্যন্ত সংযুক্তিসহ একটি পাতা রপ্তানী করুন",
        "right-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
-       "right-passwordreset": "পাসওয়ার্ড পুনঃস্থাপনের ইমেইল দেখুন",
        "right-managechangetags": "[[Special:Tags|ট্যাগ]] তৈরি ও সক্রিয়/নিষ্ক্রিয় করুন",
        "right-applychangetags": "সম্পাদনার সাথে [[Special:Tags|ট্যাগ]] যুক্ত করুন",
        "right-changetags": "নির্দিষ্ট সংস্করণ এবং দীর্ঘ সম্পাদনাগুলোতে [[Special:Tags|ট্যাগ]] সংযোজন ও অপসারণ করুন",
        "right-deletechangetags": "ডাটাবেজ থেকে [[Special:Tags|ট্যাগ]] অপসারণ করা",
+       "grant-generic": "\"$1\" অধিকার স্তর",
        "grant-group-email": "ইমেইল পাঠান",
        "grant-group-customization": "অনুকূলকরণ ও পছন্দ",
        "grant-group-administration": "প্রশাসনিক কাজ সঞ্চালন করুন",
        "grant-editmywatchlist": "আপনার নজরতালিকা সম্পাদনা করুন",
        "grant-editpage": "বিদ্যমান পাতা সম্পাদনা করুন",
        "grant-editprotected": "সংরক্ষিত পাতা সম্পাদনা করুন",
+       "grant-highvolume": "উচ্চ-মাত্রার সম্পাদনা",
+       "grant-oversight": "ব্যবহারকারী লুকান ও ইতিহাস অপসারণ",
        "grant-privateinfo": "ব্যক্তিগত তথ্যে প্রবেশাধিকার",
+       "grant-protect": "পাতাসমূহ সুরক্ষা ও অরক্ষিত করুন",
        "grant-sendemail": "অন্য ব্যবহারকারীকে ইমেইল পাঠান",
        "grant-uploadeditmovefile": "ফাইল আপলোড, প্রতিস্থাপন এবং স্থানান্তর",
        "grant-uploadfile": "নতুন ফাইল আপলোড করুন",
        "newpages": "নতুন পাতাসমূহ",
        "newpages-submit": "দেখাও",
        "newpages-username": "ব্যবহারকারী নাম:",
-       "ancientpages": "পà§\81রানà§\8b à¦¨à¦¿à¦¬à¦¨à§\8dধ",
+       "ancientpages": "পà§\81রানà§\8b à¦ªà¦¾à¦¤à¦¾",
        "move": "সরিয়ে ফেলুন",
        "movethispage": "সরিয়ে ফেলুন",
        "unusedimagestext": "নিচের ফাইলগুলি কোনো পাতার অন্তর্ভুক্ত নয়।\nঅনুগ্রহ করে খেয়াল রাখবেন যে অন্য ওয়েবসাইট থেকে কোন ফাইলে সরাসরি URL-এর মাধ্যমে সংযোগ দেওয়া থাকতে পারে, এবং সেজন্য সক্রিয়ভাবে ব্যবহৃত হওয়া সত্ত্বেও ফাইলটি এখানে তালিকাভুক্ত হতে পারে।",
        "apisandbox-dynamic-parameters-add-label": "প্যারামিটার যোগ করুন:",
        "apisandbox-dynamic-parameters-add-placeholder": "প্যারামিটারের নাম",
        "apisandbox-dynamic-error-exists": "\"$1\" নামক একটি প্যারামিটার আগে থেকেই বিদ্যমান।",
+       "apisandbox-deprecated-parameters": "অননুমোদিত প্যারামিটার",
+       "apisandbox-fetch-token": "স্বয়ংক্রিয়ভাবে টোকেন পূরণ করুন",
+       "apisandbox-submit-invalid-fields-title": "কিছু ঘর অবৈধ",
+       "apisandbox-submit-invalid-fields-message": "দয়া করে চিহ্নিত ঘরগুলো সংশোধন করে, পুনরায় চেষ্ঠা করুন।",
        "apisandbox-results": "ফলাফল",
        "apisandbox-sending-request": "API অনুরোধ পাঠানো হচ্ছে...",
        "apisandbox-loading-results": "API ফলাফল গ্রহণ করা হচ্ছে...",
        "apisandbox-request-url-label": "অনুরোধের URL:",
        "apisandbox-request-time": "অনুরোধের সময়: {{PLURAL:$1|$1 মি.সে.}}",
+       "apisandbox-results-fixtoken": "টোকেন সংশোধন ও পুনরায় জমা",
+       "apisandbox-alert-page": "এই পাতার ঘরগুলো বৈধ নয়।",
+       "apisandbox-alert-field": "এই ক্ষেত্রের মান বৈধ নয়।",
        "apisandbox-continue": "অব্যাহত",
        "apisandbox-continue-clear": "পরিস্কার",
+       "apisandbox-multivalue-all-values": "$1 (সব মান)",
        "booksources": "বইয়ের উৎস",
        "booksources-search-legend": "বইয়ের উৎসের জন্য অনুসন্ধান করা হোক",
        "booksources-isbn": "আইএসবিএন:",
        "pageinfo-header-restrictions": "পাতা সুরক্ষা",
        "pageinfo-header-properties": "পাতা বৈশিষ্টসমূহ",
        "pageinfo-display-title": "শিরনাম প্রদর্শন",
-       "pageinfo-default-sort": "ডিফলà§\8dà¦\9f à¦¸à¦°à§\8dà¦\9f à¦\95ি",
+       "pageinfo-default-sort": "পà§\82রà§\8dবনিরà§\8dধারিত à¦¬à¦¾à¦\9bাà¦\87য়à§\87র à¦\9aাবি",
        "pageinfo-length": "পাতার দৈর্ঘ্য (বাইটে)",
        "pageinfo-article-id": "পাতার আইডি",
        "pageinfo-language": "পাতার তথ্যের ভাষা",
        "patrol-log-header": "এটি যাচাইকৃত রিভিশনের তালিকা।",
        "log-show-hide-patrol": "পরীক্ষণ লগ $1",
        "log-show-hide-tag": "ট্যাগ লগ $1",
+       "confirm-markpatrolled-button": "ঠিক আছে",
+       "confirm-markpatrolled-top": "$2-এর $3 নং সংস্করণটি পরীক্ষিত হিসেবে চিহ্নিত করবেন?",
        "deletedrevision": "মুছে ফেলা পুরাতন সংশোধন $1",
        "filedeleteerror-short": "ফাইল মুছতে গিয়ে ত্রুটি: $1",
        "filedeleteerror-long": "ফাইলটি মুছার সময় ত্রুটি দেখা দিয়েছে:\n\n$1",
        "table_pager_prev": "পূর্ববর্তী পাতা",
        "table_pager_first": "প্রথম পাতা",
        "table_pager_last": "শেষ পাতা",
-       "table_pager_limit": "প্রতি পাতায় $1 গুলো বিষয়বস্তু দেখাও",
+       "table_pager_limit": "প্রতি পাতায় $1টি উপাদান দেখাও",
        "table_pager_limit_label": "প্রতি পাতায় আইটেম সংখ্যা:",
        "table_pager_limit_submit": "চলো",
        "table_pager_empty": "ফলাফল শূন্য",
        "mw-widgets-dateinput-placeholder-month": "বববব-মম",
        "mw-widgets-titleinput-description-new-page": "পাতা এখনো বিদ্যমান নয়",
        "mw-widgets-titleinput-description-redirect": "$1-এ পুনঃনির্দেশিত",
+       "mw-widgets-categoryselector-add-category-placeholder": "একটি বিষয়শ্রেণী যোগ করুন...",
        "sessionmanager-tie": "একাধিক অনুরোধের প্রমাণীকরণের ধরন একত্রিত করা যাবে না: $1।",
        "sessionprovider-generic": "$1টি সেশন",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "কুকি-ভিত্তিক সেশন",
        "authmanager-authn-no-primary": "সরবরাহকৃত পরিচয়পত্রের অনুমোদন যাচাই করা যায়নি।",
        "authmanager-authn-autocreate-failed": "একটি স্থানীয় অ্যাকাউন্টের স্বয়ংক্রিয়-সৃষ্টি ব্যর্থ হয়েছে: $1",
        "authmanager-create-disabled": "অ্যাকাউন্ট সৃষ্টিকরণ নিষ্ক্রিয় করা হয়েছে।",
-       "authmanager-create-from-login": "à¦\86পনার à¦\8fà¦\95াà¦\89নà§\8dà¦\9f à¦¤à§\88রি à¦\95রতà§\87, à¦¨à§\80à¦\9aà§\87র à¦\95à§\8dষà§\87তà§\8dরà¦\97à§\81লি à¦ªà§\82রণ à¦\95রà§\81ন।",
+       "authmanager-create-from-login": "আপনার একাউন্ট তৈরি করতে, ক্ষেত্রগুলি পূরণ করুন।",
        "authmanager-authplugin-setpass-failed-title": "পাসওয়ার্ড পরিবর্তন ব্যর্থ হয়েছে",
        "authmanager-authplugin-setpass-bad-domain": "অবৈধ ডোমেইন।",
        "authmanager-autocreate-noperm": "স্বয়ংক্রিয় অ্যাকাউন্ট সৃষ্টি মঞ্জুরিপ্রাপ্ত নয়।",
        "usercssispublic": "অনুগ্রহ করে লক্ষ্য করুন: সিএসএসের উপপাতাগুলিতে গোপনীয় তথ্য থাকা উচিত নয় যেহেতু অন্যান্য ব্যবহারকারীও এগুলি দেখতে পান।",
        "restrictionsfield-badip": "আইপি ঠিকানা অথবা পরিসীমা অবৈধ: $1",
        "restrictionsfield-label": "অনুমোদিত আইপি পরিসীমা:",
-       "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে<br><code>0.0.0.0/0</code><br><code>::/0</code><br>ব্যবহার করুন",
-       "edit-error-short": "ত্রুটি: $1",
-       "edit-error-long": "ত্রুটিসমূহ:\n\n$1"
+       "restrictionsfield-help": "লাইন প্রতি একটি আইপি ঠিকানা বা CIDR পরিসীমা। সবকিছু সক্রিয় করতে<br><code>0.0.0.0/0</code><br><code>::/0</code><br>ব্যবহার করুন"
 }
index 5553398..085bd1f 100644 (file)
        "yourpassword": "ལམ་ཡིག",
        "userlogin-yourpassword-ph": "ཁྱེད་ཀྱི་གསང་བའི་ཨང་གྲངས་བླུག་རོགས།",
        "yourpasswordagain": "གསང་བའི་ཨང་ངོས་འཛིན་གནང་རོགས།",
-       "remembermypassword": "ངའི་ལམ་ཡིག་འདིར་(མང་མཐའ་ཉིན $1 {{PLURAL:$1}}) དྲན་པར་བྱས།",
        "yourdomainname": "ཁྱེད་ཀྱི་ཁྱབ་ཁུལ།",
        "login": "ནང་འཛུལ།",
        "nav-login-createaccount": "ནང་འཛུལ། / ཐོ་འགོད།",
index 152a1ec..0bdaf65 100644 (file)
        "yourname": "আতাকুরার নাংহান (Username)",
        "yourpassword": "খন্তাচাবিগ (password)",
        "yourpasswordagain": "খন্তাচাবিগ (password) আরাকমু ইকর",
-       "remembermypassword": "আহার গজে সেশনর কা খন্তাচাবি মনে থ(সর্বোচ্চ $1 {{PLURAL:$1|দিনর|দিনর}} কা)",
        "yourdomainname": "তর ডোমেইনগ",
        "externaldberror": "ডাটেবেজর মা বেসেপ আহান ইসে নাইলে তরতা বারেদের একাউন্ট বদালানির য়্যাথাং নেই।",
        "login": "হমানি",
        "post-expand-template-argument-warning": "' ' ' সিঙুইস: ' ' ' এরে পাতাহাত তিলসে টেম্পলেট এহার যুক্তি আহান লাম হেলসে। অহানে যুক্তি অহান বেলানি অইল।",
        "post-expand-template-argument-category": "পতাহাত পুসিসি মডেলর জর থা পরসেগা",
        "parser-template-loop-warning": "মডেলর তরিগ দেখরাং: [[$1]]",
-       "cantcreateaccounttitle": "একাউন্টহান হঙকরানি নাইব",
        "viewpagelogs": "পাতাহানর লগ চা",
        "nohistory": "পাতা এহান পতানির কোন ইতিহাস নেই।",
        "currentrev": "হাদিএহানর পতানি",
index 271b343..7fe1f34 100644 (file)
@@ -95,6 +95,8 @@
        "oct": "ئوکتوبر",
        "nov": "نوڤامر",
        "dec": "دئسامر",
+       "period-am": "دم سوڤ",
+       "period-pm": "پسين",
        "pagecategories": "{{PLURAL:$1|دسته|دسته ها}}",
        "category_header": "صفحات دردسته \"$1\"",
        "subcategories": "دسته های فرعی",
        "about": "درباره",
        "newwindow": "(پنجره تازه واز کن)",
        "cancel": "لغو",
+       "mypage": "بألگأ",
        "mytalk": "چأک چنأ",
+       "anontalk": "چأک چنأ",
        "navigation": "ناڤجوری",
        "and": "&#32;و",
        "qbfind": "پیدا کردن",
+       "qbbrowse": "قأرز کردن",
        "qbedit": "اصلاح",
+       "qbpageoptions": "اي بألگأ",
        "faq": "اف ای کیو",
        "faqpage": "Project:اف ای کیو",
        "namespaces": "نوم ڤأرگأ آ",
        "otherlanguages": "درزبانهای دیگر",
        "redirectedfrom": "(تصحیح مجدداز$1)",
        "redirectpagesub": "صفحه تصحیح وهدایت مجدد",
+       "redirectto": "ڤاگردۈنی سی:",
        "lastmodifiedat": "این صفحه اخیرا تغییر واصلاح شددر $1, در $2.",
        "viewcount": "این صفحه قابل دسترسی شده است {{PLURAL:$1|once|$1 times}}.",
        "protectedpage": "صفحه حمایت شده",
        "viewsourcetext": "ایسا ترین بوینین وکپی کنین منبع ای صفحه را:",
        "yourname": "نام کاربر:",
        "userlogin-yourname": "نوم کارياري",
+       "userlogin-yourname-ph": "نوم کاریاريتونأ بزنين",
        "yourpassword": "رمز:",
+       "userlogin-yourpassword": "رازينإ گوڤأرتن",
        "login": "اویدن به سیستم",
        "nav-login-createaccount": "اویدن به سیستم",
        "userlogin": "اویدن به سیستم / درست کردن حساب کاربری",
        "loginlanguagelabel": "زۈن:$1",
        "pt-login": "ڤامین اوڤیڌن",
        "pt-createaccount": "راسد کردن هساڤ کارياري",
+       "pt-userlogout": "ز سامۈنإ درأڤوڌن",
        "retypenew": "تایپ دوباره رمز:",
        "bold_sample": "متن گپ نما",
        "bold_tip": "متن گپ نما",
        "editing": "درحال اصلاح $1",
        "editingsection": "درحال اصلاح $1 (قسمت)",
        "copyrightwarning": "لطفاً دقت کنین که درنظر گریده ابوه که همه شراکتهای ایسا  {{SITENAME}} تحت «$2» منتشر ابون ).\n\n\n(سی دیدن  جزئیات بیشتر به $1 برین\n\nایر نه خوین نوشته‌هاتو بی‌رحمانه اصلاح بوه و به دلخواه ارسال بوه، ایچو نفرستن.<br />\nدرضمن ایسادارین به ایما قول ادین که خودتو یونه نوشتین یا هونه زه یک منبع آزاد با مالکیت عمومی یا مثل هو ورداشتین. '''کارهای دارای کارهای دارای حق کپی رایت را بی‌اجازه نفرستین!'''',",
-       "templatesused": "قالبهای استفاده شده من ای صفحه:",
+       "templatesused": "{{PLURAL:$1|چوٙأ|چوٙأیل}} ب کار گرهڌأ ڤابيڌإ مإن اي بألگأ:",
        "templatesusedpreview": "قالبها  یا الگوهای استفاده وابیده در ای پیش نمایش:",
        "template-protected": "(تحت حمایت)",
        "template-semiprotected": "(نیمه حمایت وابیده)",
        "viewpagelogs": "نشودادن نمایه ها سی ای صفحه",
        "currentrev": "نسخه جاری",
        "revisionasof": "اصلاح $1",
-       "revision-info": "یه نسخه اصلاح شده درتاریخ  $1 بوسیله $2",
+       "revision-info": "نوسقإ ڤانيأري ڤابيڌإ جۈر $1 ڤا $2",
        "previousrevision": "← اصلاح قبلی",
        "nextrevision": "نسخه بعدی →",
        "currentrevisionlink": "نسخه جاری",
        "histfirst": "کهنه ترین",
        "histlast": "تازه ترین",
        "history-feed-item-nocomment": "$1 در $2",
-       "history-title": "گزارش تاریخی نسخه زه \"$1\"",
+       "history-title": "دڤارتإ دیئن ڤيرگار $1",
        "lineno": "سطر $1:",
        "compareselectedversions": "مقایسه نسخه‌های انتخاب‌ وابیده",
        "editundo": "لغو اصلاح آخر",
        "searchresults-title": "نتيجإ آ پی جوري سي \"$1\"",
        "prevn": "قبلی {{PLURAL:$1|$1}}",
        "nextn": "بعدی {{PLURAL:$1|$1}}",
+       "nextn-title": "نيایي $1 {{PLURAL:$1|نتيجه|نتيجإآ}}",
        "viewprevnext": "مشاهده ($1 {{int:pipe-separator}} $2) ($3)",
        "searchprofile-articles": "بلگه آ مینونه دار",
        "searchprofile-images": "ڤارسگرا خلکمند",
        "searchprofile-articles-tooltip": "بگرد مئن $1",
        "searchprofile-images-tooltip": "جانیاانه پی جوری کو",
        "search-result-size": "$1 ({{PLURAL:$2|1 ڤاجه یل|$2 ڤاجه یل}})",
+       "search-redirect": "(ڤاگردۈني ز $1)",
        "search-section": "(بهرجا $1)",
        "searchall": "همه",
        "search-nonefound": "هیژ نتیجه یی وا پی جست تو یکی نئ.",
        "yourrealname": "نام واقعی:",
        "prefs-help-realname": "ذکر نام واقعی اختیاریه ایر تصمیم به گدن بگیرین هنگام ارجاع به آثارتو و انتساب هونو به ایسا زه نام واقعیتو استفاده ابوه",
        "grouppage-sysop": "{{ns:project}}:مدیران",
+       "right-writeapi": "سي نڤشدن اي پ آی ڤأنين ڤاکار",
        "newuserlogpage": "راسد ڤابیه وا کاریار",
        "rightslog": "نمایه حقوق کاربر",
        "nchanges": "$1 {{PLURAL:$1|تغییر|تغییرات}}",
        "recentchanges": "تغییرات اخیر",
        "recentchanges-legend": "گزينإ آ آلشدا ايسإني",
        "recentchanges-feed-description": "ردیابی آخرین تغییرات  ویکی در ای خورد",
+       "recentchanges-label-newpage": "ای ويرايشت يه بلگه تازه راس كرده",
        "recentchanges-label-minor": "یو یه ويرايشت کوچيره",
        "recentchanges-label-unpatrolled": "ای ويرايشت هنی تيه واداشت نوابيه",
        "recentchanges-legend-heading": "<strong>میراث:</strong>",
        "rcnotefrom": "در زیر تغییرات زه تاریخ <b>$2</b> آمده‌اند (تا <b>$1</b> مورد نشو داده ابوه).",
        "rclistfrom": "نشودادن تغییرات تازه با شروع زه $3 $2",
        "rcshowhideminor": "اصلاحات کوچیک $1",
+       "rcshowhideminor-show": "نشون دائن",
        "rcshowhideminor-hide": "قام کردن",
        "rcshowhidebots": "$1 ربات‌ها یا بوتها",
        "rcshowhidebots-show": "نشون دائن",
+       "rcshowhidebots-hide": "قام کردن",
        "rcshowhideliu": "$1 کاریارا ثوت نام کرده",
        "rcshowhideliu-hide": "قام کئردئن",
        "rcshowhideanons": "$1 کاربران داخل نوابیده",
+       "rcshowhideanons-show": "نشون دائن",
        "rcshowhideanons-hide": "قام کئردئن",
        "rcshowhidepatr": "$1 اصلاحات پاسداری شده",
        "rcshowhidemine": "$1 اصلاحات مو",
+       "rcshowhidemine-show": "نشون دائن",
        "rcshowhidemine-hide": "قام کئردئن",
        "rclinks": "نشودادن آخرین $1 تغییر در $2 روز اخیر؛ $3",
        "diff": "تفاوت",
        "uploadbtn": "آپلود فایل",
        "uploadlogpage": "نمایه آپلود",
        "filedesc": "چكستأ",
+       "license-header": "ب حال وبال ليسانس دار ڤابيڌن",
        "imgfile": "جانيا",
        "listfiles": "لیست فایل",
        "file-anchor-link": "فایل",
        "ancientpages": "کهنه ترین صفحات",
        "move": "جابجا کردن",
        "movethispage": "جابجایی ای صفحه",
+       "pager-older-n": "{{PLURAL:$1|گپسالتر 1|گپسالتر $1}}",
        "booksources": "منابع کتاب",
+       "booksources-search": "پی جۈري",
        "specialloguserlabel": "کاربر:",
        "speciallogtitlelabel": "عنوان:",
        "log": "نمایه ها",
        "categories": "دسته آ",
        "emailuser": "امیل ای کاربر",
        "watchlist": "لیست پیگیریهای مو",
-       "mywatchlist": "لیست پیگیریهای مو",
+       "mywatchlist": "سإیل برگ",
        "addedwatchtext": "صفحه «<nowiki>$1</nowiki>» به [[Special:Watchlist|لیست پی‌گیری‌های ]] ایسا\nاضاف وابید.\nتغییرات این صفحه و صفحه صحبت مر بوطه اش در آینده ایچو لیست ابوه. به‌علاوه، ای صفحه، سی واضح‌تر دیده وابیدن در [[Special:RecentChanges|فهرست تغییرات اخیر]] به شکل <b>سیاه</b> ایا.\n\nایر بعدا خواستین ای  صفحه زه لیست پی‌گیریهاتو ورداشته بوه، رو «'''عدم پی‌گیری'''» در بالای صفحه کلیک کنین.",
        "removedwatchtext": "آن صفحه\"[[:$1]]\" جابجا وابیده زه[[Special:لیست پیگیری|لیست پیگیری ایسا]].",
        "watch": "پی‌گیری",
        "deleteotherreason": "دیه/دلیل اضافی:",
        "deletereasonotherlist": "دلیل دیه",
        "rollbacklink": "عقب گرد",
+       "rollbacklinkcount": "چڤاسإ کردن $1 {{PLURAL:$1|ویرایشت|ویرایشتیا}}",
        "protectlogpage": "نمایه حفاظت وحمایت",
        "prot_1movedto2": "[[$1]] جابجا وابید به[[$2]]",
        "protectcomment": "دلیل:",
        "undeletebtn": "بازیافت",
        "namespace": "فضای نام:",
        "invert": "انتخاب برعکس بوه",
+       "namespace_association": "نوم جایل یأکاگرهڌأ",
        "blanknamespace": "(اصلی)",
        "contributions": "{{GENDER:$1|کاریار}} هومیاریا",
        "mycontris": "هومياریا",
+       "anoncontribs": "هومياریا",
        "contribsub2": "سی $1 ($2)",
        "uctop": "(بالا)",
        "month": "در این ماه (و قبل زه آن):",
        "nolinkshere": "هیچ صفحه ای پیوند نداردبه '''[[:$1]]'''.",
        "isredirect": "صفحه تغییر مسیر",
        "istemplate": "استفاده‌ وابیده داخل صفحه",
+       "isimage": "جانیا هوم پیوند",
        "whatlinkshere-prev": "{{PLURAL:$1|قبلی |مورد قبلی$1}}",
        "whatlinkshere-next": "{{PLURAL:$1|بعدی |مورد بعدی $1}}",
        "whatlinkshere-links": "← لینکها",
+       "whatlinkshere-hideredirs": "$1 redirects",
+       "whatlinkshere-hidelinks": "هوم پیڤأندا $1",
        "whatlinkshere-filters": "فيلترا",
        "blockip": "بستن کاربر",
        "ipboptions": "۲ ساعت:2 hours,۱ روز:1 day,۳ روز:3 days,۱ هفته:1 week,۲ هفته:2 weeks,۱ ماه:1 month,۳ ماه:3 months,۶ ماه:6 months,۱ سال:1 year,بی‌نهایت:infinite",
        "tooltip-recreate": "دوباره درست کردن صفحه ای که زه رو کینه وغرض پاک وابیده",
        "tooltip-upload": "شروع آپلود",
        "tooltip-rollback": "\"اعاده\" برگرداندن به وضع اولیه سی ای صفحه که بخاطر مشارکت  آخر اصلاح وابیده بایک کلیک",
+       "tooltip-summary": "یأ چکسدأ کۈچير ڤارڌ کونين",
        "pageinfo-toolboxlink": "دونسمندیا بلگه",
        "previousdiff": "← اصلاح قدیمی",
        "nextdiff": "تفاوت بعدی→",
        "file-nohires": "قابلیت تفکیک بالاتری در دسترس نه.",
        "svg-long-desc": "SVG فایل, تقریبا$1 × $2 پیکسل, اندازه فایل: $3",
        "show-big-image": "جانیا اصلی",
+       "show-big-image-preview": "أندازإ اي پیش سیل:$1.",
+       "show-big-image-other": "هنی{{PLURAL:$2|گپ نما کردن|گپ نما کردنیا}}: $1.",
        "show-big-image-size": "$1 × $2 پیکسل",
        "newimages": "گالری فایلهای تازه",
        "bad_image_list": "اطلاعات را وا به ای شکل وارد کنین:\n\nفقط سطرهایی که با * آغاز ابون در نظر گریده ابون. اولین لینک در هر سطر، باید لینکی به یک تصویر بد باشد.\nلینکهای بعدی در همان سطر، به عنوان موارد استثنا در نظر گریده ابون",
        "metadata-help": " ای فایل دارای اطلاعات اضافه‌ای است که احتمالاً با دوربین دیجیتالی‌ یا پویشگری که سی ایجاد یا دیجیتالی‌کردن آن به کار رهده اضاف وابیده . ایر فایل زه وضعیت اولیه اس تغییر داده وابیده بوه ممکنه همه توضیحات موجود اطلاعات عکس را منعکس نکنه",
        "metadata-expand": "نشودادن جزئیات تفصیلی",
        "metadata-collapse": "قایم کردن جزئیات تفصیلی",
-       "metadata-fields": "فراداده EXIF نشو داده وابیده در این پیام وقتی جدول فراداده‌های تصویر جمع وابیده بوه هم نمایش داده ابوه.\nبقیه موارد فقط وقتی نشوداده ابوه که جدول یادشده واز بوه.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "metadata-fields": "رشنه یا یا گپ دونسمنیا که د ای پیغوم نومگه کاری بینه د ور گرته بلگه عسگ ن که گات وختی که جدول گپ دونسمنیا واز بوئه نشون دئیه بوئن.\nچی یا هنی سی یه که پیش فرضن قام بوئن.\n*راست کو\n*مدل\n*دم وخت اصل\n*وخت آشگار\n*اف ان شماره\n*ایزو نرخ من سرعت\n*فوکالنس\n*هنرمن\n*کپی رایت\n*حالت جی پی اس \n*جی پی اس گپ حالت\n*جی پی اس همه حالت",
        "exif-orientation": "سرچشمأ",
+       "exif-xresolution": "گپ نما کردن اوفقي",
+       "exif-yresolution": "گپ نما کردن ز وارو",
        "exif-make": "سازیار دیربین",
        "exif-model": "مودل ديربين",
+       "exif-software": "نرم افزار ب کارگرهڌني",
+       "exif-exifversion": "نوسقإ Exif",
        "exif-colorspace": "رنگ ڤأرگأ",
+       "exif-datetimedigitized": "گات و وخت دیجیتالی کردن",
        "exif-orientation-1": "عادي",
        "namespacesall": "همه",
        "monthsall": "همه ماهها",
        "specialpages": "صفحات ویژه",
        "tag-filter": "[[Special:سرديسا|سرديس]] فيلتر:",
        "tag-list-wrapper": "([[Special:Tags|{{PLURAL:$1|سرديس|سرديسا}}]]: $2)",
+       "logentry-delete-delete": "$1 بألگأ {{GENDER:$2|پاکسا ڤابيأ}} $3",
+       "logentry-upload-upload": "$1 {{GENDER:$2|سوڤار کرده}} $3",
        "searchsuggest-search": "جستن {{SITENAME}}"
 }
index c0c6e29..8962400 100644 (file)
        "activeusers-intro": "Setu aze ur roll eus an implijerien zo bet oberiant mui pe vui e-pad an $1 {{PLURAL:$1|deiz|deiz}} diwezhañ.",
        "activeusers-count": "$1 {{PLURAL:$1|oberiadenn}} abaoe an {{PLURAL:$3|deiz|$3 deiz}} diwezhañ",
        "activeusers-from": "Diskouez an implijerien adal :",
-       "activeusers-hidebots": "Kuzhat ar botoù",
-       "activeusers-hidesysops": "Kuzhat ar verourien",
        "activeusers-noresult": "N'eus bet kavet implijer ebet.",
        "listgrouprights": "Gwirioù ar strolladoù implijer",
        "listgrouprights-summary": "Da-heul ez eus ur roll eus ar strolladoù implijerien termenet war ar wiki-mañ, gant ar gwirioù moned stag outo.\nGallout a ra bezañ [[{{MediaWiki:Listgrouprights-helppage}}|titouroù ouzhpenn]] diwar-benn ar gwirioù hiniennel.",
        "feedback-bugornote": "Ma'z oc'h prest da zeskrivañ ur gudenn deknikel dre ar munud e c'hallit [$1 kemenn un draen].\nA-hend-all e c'hallit ober gant ar furmskrid eeunaet dindan. Ouzhpennet e vo hoc'h evezhiadenn d'ar bajenn \"[$3 $2]\", a-gevret gant hoc'h anv implijer hag anv ar merdeer a rit gantañ.",
        "feedback-cancel": "Nullañ",
        "feedback-close": "Graet",
-       "feedback-error-title": "Fazi",
        "feedback-error1": "Fazi : disoc'h dianav a-berzh an API",
        "feedback-error2": "Fazi : N'eus ket bet gallet degemer ar c'hemmoù",
        "feedback-error3": "Fazi : respont ebet a-berzh an API",
index 114b000..10918da 100644 (file)
        "nocookiesfornew": "Korisnički račun nije napravljen, jer nismo mogli da potvrdimo njegov izvor.\nProvjerite da li su cookies omogućeni, ponovo učitajte ovu stranicu i pokušajte ponovo.",
        "noname": "Niste izabrali ispravno korisničko ime.",
        "loginsuccesstitle": "Prijavljen",
-       "loginsuccess": "'''Sad ste prijavljeni na {{SITENAME}} kao \"$1\".'''",
+       "loginsuccess": "<strong>Prijavili ste se na {{GRAMMAR:akuzativ|{{SITENAME}}}} kao \"$1\".</strong>",
        "nosuchuser": "Ne postoji korisnik s imenom \"$1\".\nKorisnička imena razlikuju velika i mala slova.\nProvjerite jeste li ga tačno upisali ili [[Special:CreateAccount|otvorite novi račun]].",
        "nosuchusershort": "Ne postoji korisnik s imenom \"$1\".\nProvjerite jeste li dobro ukucali.",
        "nouserspecified": "Morate izabrati korisničko ime.",
        "passwordreset-emaildisabled": "E-pošta je onemogućena na ovom wikiju.",
        "passwordreset-username": "Korisničko ime:",
        "passwordreset-domain": "Domen:",
-       "passwordreset-capture": "Pogledati krajnji e-mail?",
-       "passwordreset-capture-help": "Ako označite ovu kućicu, e-poruka (s privremenom lozinkom) će biti prikazana i poslata korisniku.",
        "passwordreset-email": "Adresa e-pošte:",
        "passwordreset-emailtitle": "Detalji računa na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Neko (vjerovatno Vi, s IP adrese $1) je zatražio podsjetnik Vaših detalja računa za {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun korisnika je|računi korisnika su}} povezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena šifra|Ove privremene šifre}} će isteći za {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu šifru. Ako je neko drugi napravio ovaj zahtjev, ili ako ste se sjetili Vaše početne šifre, a ne želite je promijeniti, možete zanemariti ovu poruku i nastaviti koristiti staru šifru.",
        "searchprofile-advanced-tooltip": "Traži u ostalim imenskim prostorima",
        "search-result-size": "$1 ({{PLURAL:$2|$2 riječ|$2 riječi}})",
        "search-result-category-size": "{{PLURAL:$1|1 član|$1 člana|$1 članova}} ({{PLURAL:$2|1 potkategorija|$2 potkategorije|$2 potkategorija}}, {{PLURAL:$3|1 datoteka|$3 datoteke|$3 datoteka}})",
-       "search-redirect": "(preusmjeravanje $1)",
+       "search-redirect": "(preusmjereno sa $1)",
        "search-section": "(sekcija $1)",
        "search-category": "(kategorija $1)",
        "search-file-match": "(podudara se sadržaj datoteke)",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate dopuštenja da uređujete korisnička prava na drugim wikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalna baza.",
-       "userrights-nologin": "Morate se [[Special:UserLogin|prijaviti]] sa administratorskim računom da bi ste mogli postavljati korisnička prava.",
-       "userrights-notallowed": "Nemate dopuštenje za dodavanje ili uklanjanje korisničkih prava.",
        "userrights-changeable-col": "Grupe koje možete mijenjati",
        "userrights-unchangeable-col": "Grupe koje ne možete mijenjati",
        "userrights-conflict": "Sukob u izmjeni korisničkih prava! Molimo da razmotrite i potvrdite Vaše promjene.",
-       "userrights-removed-self": "Uklonili ste vlastita prava. Zbog toga više ne možete pristupiti ovoj stranici.",
        "group": "Grupa:",
        "group-user": "Korisnici",
        "group-autoconfirmed": "Potvrđeni korisnici",
        "right-siteadmin": "Zaključavanje i otključavanje baze podataka",
        "right-override-export-depth": "Izvoz stranica uključujući povezane stranice do dubine od 5 linkova",
        "right-sendemail": "Slanje e-maila drugim korisnicima",
-       "right-passwordreset": "Pogledaj e-mailove za obnavljanje šifre",
        "right-managechangetags": "Napravi i (de)aktiviraj [[Special:Tags|oznake]]",
        "right-applychangetags": "Primijeni [[Special:Tags|oznake]] na nečije izmjene",
        "right-changetags": "Dodavanje ili uklanjanje raznih [[Special:Tags|oznaka]] na pojedinačnim verzijama i unosima zapisnika",
        "modifiedarticleprotection": "{{GENDER:|promijenio|promijenila}} je stepen zaštite stranice \"[[$1]]\"",
        "unprotectedarticle": "uklonjena zaštita sa stranice \"[[$1]]\"",
        "movedarticleprotection": "podešavanja zaštite premještena sa \"[[$2]]\" na \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Zaštitio|Zaštitila}} je stranicu \"[[$1]]\"",
        "protect-title": "Mijenjate nivo zašite za \"$1\"",
        "protect-title-notallowed": "Pregled stepena zaštite za \"$1\"",
        "prot_1movedto2": "članak [[$1]] premješten na [[$2]]",
        "feedback-thanks": "Hvala! Vaša povratna informacija postavljena je na stranicu \"[$2 $1]\".",
        "feedback-thanks-title": "Hvala!",
        "feedback-useragent": "Korisnički agent:",
-       "searchsuggest-search": "Traži",
+       "searchsuggest-search": "Pretraži {{GRAMMAR:akuzativ|{{SITENAME}}}}",
        "searchsuggest-containing": "sadrži...",
        "api-error-badaccess-groups": "Nemate ovlasti da postavljate datoteke na ovoj wiki.",
        "api-error-badtoken": "Unutrašnja greška: token nije ispravan.",
index bf8c180..8bed43c 100644 (file)
        "content-model-text": "simpleng teksto",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
-       "cantcreateaccounttitle": "Diri makagibo sa account",
        "next": "sunod",
        "last": "sinundan",
        "page_first": "una",
        "deletedcontributions": "Napurang mga ambag ka user",
        "linksearch-ok": "Pag-anapon",
        "listusers-submit": "Ipabayad",
-       "activeusers-hidebots": "Itago a bots",
        "listgrouprights-group": "Grupo",
        "listgrouprights-addgroup": "Mairurugang a {{PLURAL:$2|grupo|mga grupo}}: $1",
        "listgrouprights-addgroup-all": "Irugang ngamin na mga grupo",
index 00bb056..2cce206 100644 (file)
        "passwordreset-emaildisabled": "Les opcions de correu electrònic no estan habilitades en aquest wiki.",
        "passwordreset-username": "Nom d'usuari:",
        "passwordreset-domain": "Domini",
-       "passwordreset-capture": "Veure el missatge de correu electrònic?",
-       "passwordreset-capture-help": "Si marqueu aquesta casella, el missatge de correu electrònic (amb la contrasenya temporal) es mostrarà al mateix moment que sigui enviat a l'usuari.",
        "passwordreset-email": "Adreça electrònica:",
        "passwordreset-emailtitle": "Detalls del compte a {{SITENAME}}",
        "passwordreset-emailtext-ip": "Algú (vós mateix segurament, des de l'adreça IP $1) ha demanat una reinicialització de la vostra contrasenya al projecte {{SITENAME}} ($4). {{PLURAL:$3|El següent compte d'usuari està associat|Els següents comptes d'usuari estan associats}} amb aquesta adreça de correu electrònic:\n\n$2\n\n{{PLURAL:$3|Aquesta contrasenya temporal caducarà|Aquestes contrasenyes temporals caducaran}} en {{PLURAL:$5|un dia|$5 dies}}.\nHauríeu d'entrar al compte per a fixar-hi una nova contrasenya al més aviat possible. Si algú que no sou vós és qui ha fet aquesta petició o si heu recordat la contrasenya original i ja no la voleu canviar, podeu ignorar aquest missatge i seguir utilitzant la vostra antiga contrasenya.",
        "passwordreset-emailelement": "Nom d'usuari: \n$1\n\nContrasenya temporal: \n$2",
        "passwordreset-emailsentemail": "Si aquesta adreça electrònica està associada al vostre compte, s’enviarà un missatge de restabliment de contrasenya.",
        "passwordreset-emailsentusername": "Si existeix una adreça electrònica associada a aquest nom d'usuari, s’hi enviarà un missatge de reestabliment de contrasenya.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|S'ha enviat el correu|S'han enviat els correus}} de restabliment de {{PLURAL:$1|contrasenya|contrasenyes}}. A continuació es mostra {{PLURAL:$1|l'usuari i contrasenya|la llista d'usuaris i contrasenyes}}.",
-       "passwordreset-invalideamil": "Adreça de correu electrònic no vàlida",
+       "passwordreset-invalidemail": "Adreça de correu electrònic no vàlida",
        "passwordreset-nodata": "No s'ha proporcionat cap nom d'usuari ni adreça electrònica",
        "changeemail": "Canvia o elimina l’adreça electrònica",
        "changeemail-header": "Empleneu aquest formulari per canviar la vostra adreça electrònica. Si voleu eliminar qualssevol associacions d’adreces electròniques del vostre compte, deixeu en blanc el camp i envieu el formulari.",
        "userrights-reason": "Motiu:",
        "userrights-no-interwiki": "No teniu permisos per a editar els permisos d'usuari d'altres wikis.",
        "userrights-nodatabase": "La base de dades $1 no existeix o no és local.",
-       "userrights-nologin": "Heu [[Special:UserLogin|d'iniciar una sessió]] amb un compte d'administrador per a poder assignar permisos d'usuari.",
-       "userrights-notallowed": "No teniu autorització per concedir o retirar permisos d'usuari.",
        "userrights-changeable-col": "Grups que podeu canviar",
        "userrights-unchangeable-col": "Grups que no podeu canviar",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Conflicte de canvis dels permisos d'usuari. Reviseu i confirmeu els canvis.",
-       "userrights-removed-self": "Heu suprimit els vostres propis permisos. Per tant, ja no podeu tornar a accedir a aquesta pàgina.",
        "group": "Grup:",
        "group-user": "Usuaris",
        "group-autoconfirmed": "Usuaris autoconfirmats",
        "right-siteadmin": "Blocar i desblocar la base de dades",
        "right-override-export-depth": "Exportar pàgines incloent aquelles enllaçades fins a una fondària de 5",
        "right-sendemail": "Enviar missatges de correu electrònic a altres usuaris",
-       "right-passwordreset": "Veure les sol·licituds de restabliment de contrasenya per correu electrònic",
        "right-managechangetags": "Crear, activar i desactivar [[Special:Tags|etiquetes]]",
        "right-applychangetags": "Aplica les [[Special:Tags|etiquetes]] juntament amb els canvis propis",
        "right-changetags": "Afegeix i suprimeix [[Special:Tags|etiquetes]] en revisions individuals i entrades de registre",
        "unusedtemplates": "Plantilles no utilitzades",
        "unusedtemplatestext": "Aquesta pàgina mostra les pàgines en l'espai de noms {{ns:template}}, que no estan incloses en cap altra pàgina. Recordeu de comprovar les pàgines que hi enllacen abans d'esborrar-les.",
        "unusedtemplateswlh": "altres enllaços",
-       "randompage": "Pàgina a l'atzar",
+       "randompage": "Pàgina a latzar",
        "randompage-nopages": "No hi ha cap pàgina en {{PLURAL:$2|l'espai de noms següent|els espais de noms següents}}: $1.",
        "randomincategory": "Pàgina aleatòria en una categoria",
        "randomincategory-invalidcategory": "«$1» no és un nom de categoria vàlid.",
        "randomincategory-category": "Categoria:",
        "randomincategory-legend": "Pàgina a l’atzar en la categoria",
        "randomincategory-submit": "Vés-hi",
-       "randomredirect": "Redirecció a l'atzar",
+       "randomredirect": "Redirecció a latzar",
        "randomredirect-nopages": "No hi ha cap redirecció a l'espai de noms «$1».",
        "statistics": "Estadístiques",
        "statistics-header-pages": "Estadístiques de pàgines",
        "booksources-search": "Cerca",
        "booksources-text": "A sota hi ha una llista d'enllaços d'altres llocs que venen llibres nous i de segona mà, i també podrien tenir més informació dels llibres que esteu cercant:",
        "booksources-invalid-isbn": "El codi ISBN donat no és vàlid. Comproveu si l'heu copiat correctament.",
+       "magiclink-tracking-rfc": "Pàgines que usen enllaços màgics RFC",
+       "magiclink-tracking-pmid": "Pàgines que usen enllaços màgics PMID",
+       "magiclink-tracking-isbn": "Pàgines que usen enllaços màgics d'ISBN",
        "specialloguserlabel": "Realitzador:",
        "speciallogtitlelabel": "Objectiu (títol o «{{ns:user}}:nom d’usuari» per a un usuari):",
        "log": "Registres",
        "activeusers-intro": "Aquí hi ha una llista d'usuaris que han tingut algun tipus d'activitat en {{PLURAL:$1|el darrer dia|els darrers $1 dies}}.",
        "activeusers-count": "$1 {{PLURAL:$1|acció|accions}} en {{PLURAL:$3|el darrer dia|els $3 darrers dies}}",
        "activeusers-from": "Mostra els usuaris començant per:",
-       "activeusers-hidebots": "Amaga bots",
-       "activeusers-hidesysops": "Amaga administradors",
        "activeusers-noresult": "No s'han trobat usuaris.",
        "activeusers-submit": "Mostra els usuaris actius",
        "listgrouprights": "Drets dels grups d'usuaris",
        "tooltip-n-portal": "Sobre el projecte, què podeu fer, on podeu trobar coses",
        "tooltip-n-currentevents": "Per trobar informació general sobre l'actualitat",
        "tooltip-n-recentchanges": "Llista de canvis recents al wiki",
-       "tooltip-n-randompage": "Pàgina a l'atzar",
+       "tooltip-n-randompage": "Carrega una pàgina a l’atzar",
        "tooltip-n-help": "El lloc per saber més coses",
        "tooltip-t-whatlinkshere": "Llista de totes les pàgines wiki que enllacen aquí",
        "tooltip-t-recentchangeslinked": "Canvis recents a pàgines enllaçades des d'aquesta pàgina",
        "filedelete-old-unregistered": "La revisió de fitxer especificada «$1» no es troba a la base de dades.",
        "filedelete-current-unregistered": "El fitxer especificat «$1» no es troba a la base de dades.",
        "filedelete-archive-read-only": "El directori d'arxiu «$1» no té permisos d'escriptura per al servidor web.",
-       "previousdiff": "← Vés a l'edició anterior",
-       "nextdiff": "Vés a l'edició següent →",
+       "previousdiff": "← Edició anterior",
+       "nextdiff": "Edició següent →",
        "mediawarning": "'''Advertència''': Aquest fitxer podria contenir codi maliciós.\nSi l'executeu, podeu comprometre la seguretat del vostre sistema.",
        "imagemaxsize": "Límit de mida d'imatges:<br />''(per a pàgines de descripció de fitxers)''",
        "thumbsize": "Mida de la miniatura:",
        "linkaccounts-submit": "Enllaça els comptes",
        "unlinkaccounts": "Desenllaça els comptes",
        "unlinkaccounts-success": "El compte s'ha desenllaçat.",
-       "authenticationdatachange-ignored": "No s'ha gestionat el canvi de dades d'autenticació. Potser no s'ha configurat cap proveïdor?",
-       "edit-error-short": "Error: $1",
-       "edit-error-long": "Errors:\n\n$1"
+       "authenticationdatachange-ignored": "No s'ha gestionat el canvi de dades d'autenticació. Potser no s'ha configurat cap proveïdor?"
 }
index bde0e77..c61e871 100644 (file)
        "passwordreset-emaildisabled": "Электронан поштан функцеш хӀокху вики чохь дӀаяйина ю.",
        "passwordreset-username": "Декъашхочун цӀе:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Хьажа беанчу хааме?",
-       "passwordreset-capture-help": "Ахьа хӀара билгало хӀотта яхь хьона гур бу декъашхочо баийта чохь хана пароль йолу хаам.",
        "passwordreset-email": "Электронан поштан адрес:",
        "passwordreset-emailtitle": "{{SITENAME}}: декъашхочун дӀаяздарх лаьцна хаам",
        "passwordreset-emailtext-ip": "{{SITENAME}} ($4) проектехь цхьам я ахьа хӀокху IP-адрес $1 тӀера хьа декъашхочун пароль кхоссар дехна,\nоьцу электронан адресца дихкина ду {{PLURAL:$3|1хӀара декъашхочун дӀаяздар|хӀара декъашхочун дӀаяздар}}:\n\n$2\n\n{{PLURAL:$3|ХӀара хана пароль|ХӀара хана паролаш}} лелар ю {{PLURAL:$5|$5 дийнахь}}.\nСистемин чугӀой харжа керла пароль. \nХьой пароль кхоссар дехна дацахь я хьалхалера пароль дага еънехь хӀума цадеш Ӏад битта хӀара хаам хьа йиш ю шира пароль лелаян.",
        "userrights-groups-help": "Хьоьга хийцалун хӀокху декъашхочун бакъонаш.\n* Бакъона цӀера юххехь билгало елахь, цуна и бакъо йолуш ю.\n* Билгало яцахь — декъашхочун и бакъо яц.\n* Хьаьрко * билгала до ахьа бакъо еллачул тӀаьхьа хьуна и дӀаяккха цалуш хилар.",
        "userrights-reason": "Бахьана:",
        "userrights-no-interwiki": "Хьан бакъо яц декъашхой бакъо хийца кхечу википеди чохь.",
-       "userrights-nologin": "Куьйгалхочунна бакъо йолу [[Special:UserLogin|дӀаяздарца]] ло декъашхочун бакъо.",
-       "userrights-notallowed": "Хьан дӀаяздарца магийна дац декъашхошна бакъо яла а дӀаяккха а.",
        "userrights-changeable-col": "Хьоьга хийцалун бакъонаш",
        "userrights-unchangeable-col": "Хьоьга хийцалун бакъонаш",
        "group": "Тоба:",
        "right-siteadmin": "хаамийн гуламан блоктохар а, блокдӀаяккхар а",
        "right-override-export-depth": "агӀонаш экспорт ян, 5 кхаччалц къорга агӀонаш цхьан",
        "right-sendemail": "кхечу декъашхошка электронан хаамаш кхехьийта",
-       "right-passwordreset": "пароль хийцарца электроннан хаамашка хьажар",
        "right-managechangetags": "Хаамийн базан чохь [[Special:Tags|билгалонаш]] кхолла а, дӀаяха а",
        "grant-generic": "Бакъонийн гулам «$1»",
        "grant-group-page-interaction": "АгӀонашца зӀе",
        "booksources-search-legend": "Жайнех лаьцна хаам лахар",
        "booksources-search": "Лахар",
        "booksources-text": "ХӀокху агӀонгахь гул бина сайтийн тӀе хьажоргийн могӀам оцу чохь шуна жайнах лаьцна хаам каро мега. И ю интернет-туьканаш а категорийн библиотекийн категорешкахь лахаран система а.",
+       "magiclink-tracking-rfc": "RFC хьажоргаш лелош йолу агӀонаш",
+       "magiclink-tracking-rfc-desc": "ХӀокху агӀогахь лелош ю RFC хьажоргаш. Хьажа [[https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] дихьаяккхар муха кхочушдан деза дуьйцу.",
+       "magiclink-tracking-pmid": "PMID хьажоргаш лелош йолу агӀонаш",
+       "magiclink-tracking-pmid-desc": "ХӀокху агӀогахь лелош ю PMID хьажоргаш. Хьажа [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] дихьаяккхар муха кхочушдан деза дуьйцу.",
+       "magiclink-tracking-isbn": "ISBN хьажоргаш лелош йолу агӀонаш",
+       "magiclink-tracking-isbn-desc": "ХӀокху агӀогахь лелош ю ISBN хьажоргаш. Хьажа [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] дихьаяккхар муха кхочушдан деза дуьйцу.",
        "specialloguserlabel": "Декъашхо:",
        "speciallogtitlelabel": "Ӏалашо (цӀе я декъашхо):",
        "log": "Тéптарш",
        "activeusers-intro": "Лахахь гойтуш бу  {{PLURAL:$1|1=тӀаьхьара $1 динахь|тӀаьхьара $1 деношкахь}} хийцамаш бина декъашхой.",
        "activeusers-count": "{{PLURAL:$3|1=тӀаьхьарчу $3 динахь|тӀаьхьара $3 деношкахь}} $1 {{PLURAL:$1|1=нисдар|нисдарш}} дина",
        "activeusers-from": "Гучé баха декъашхой, болалуш болу тӀера:",
-       "activeusers-hidebots": "Къайлабаха боташ",
-       "activeusers-hidesysops": "Къайлабаха куьйгалхой",
        "activeusers-noresult": "Декъашхой цакарий.",
        "activeusers-submit": "Гайта жигара декъашхой",
        "listgrouprights": "Декъашхойн тобанийн бакъонаш",
        "revdelete-unrestricted": "куьйгалхойн доза тохар дӀаяьккхина",
        "logentry-block-block": "$1 {{GENDER:$2|блоктоьхна}} {{GENDER:$4|$3}} $5 $6 хан чекхйолу",
        "logentry-block-unblock": "$1 {{GENDER:$2|блокдаяьккхина}} {{GENDER:$4|$3}}",
+       "logentry-block-reblock": "$1 {{GENDER:$2|хийцина}} блоктоьхна хан {{GENDER:$4|$3}} → $5 $6",
        "logentry-suppress-block": "$1 {{GENDER:$2|блоктоьхна}} {{GENDER:$4|$3}} $5 $6 хан чекхйолу",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|хийцина}} блоктоьхна хан {{GENDER:$4|$3}} → $5 $6",
        "logentry-merge-merge": "$1 {{GENDER:$2|вовшахтоьхна}} $3 $4 чохь ($5 кхаччалц версеш)",
        "logentry-move-move": "$1 {{GENDER:$2|цӀе хийцина}} $3 → $4",
        "logentry-move-move-noredirect": "$1 {{GENDER:$2|цӀе хийцина}} $3 → $4 дӀасахьажорг цаюьтуш",
index 8dccaba..2a9ecd5 100644 (file)
        "yourname": "Ngalan sa tiggamit:",
        "yourpassword": "Pasword:",
        "yourpasswordagain": "Itayp og usab ang pasword:",
-       "remembermypassword": "Hinumdomi ako niining brawser (sa kadugayon nga $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}})",
        "yourdomainname": "Ang imong domain:",
        "externaldberror": "May nahitabong authentication database error o kaha wala ka tugoti nga mag-update sa imong eksternal nga akawnt.",
        "login": "Sulod",
        "undo-failure": "Ang pag-usab dili puyde mapa-way-bili tungod sa mga naka-conflict nga intermediate nga mga pag-usab.",
        "undo-norev": "Ang pag-usab dili puyde mapa-way-bili tungod kay wala pa ni mahimo o kaha natangtang na kini.",
        "undo-summary": "Giway-bili  ang rebisyon  $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|Hisgot]])",
-       "cantcreateaccounttitle": "Dili makahimo og akawnt",
        "cantcreateaccount-text": "Ang paghimo og akawnt gikan niining IP address ('''$1''') gi-block ni [[User:$3|$3]].\n\nAng rason nga gihatag ni $3 mao nga ''$2''",
        "viewpagelogs": "Tan-awa ang mga log niining panid",
        "nohistory": "Walay kaagi sa pag-usab niining panid.",
index 4274025..b104745 100644 (file)
        "yourname": "Nå'an ni muna'setbi:",
        "yourpassword": "Password:",
        "yourpasswordagain": "Taip ta'lo i password:",
-       "remembermypassword": "Na'hasso iyo-ku login gi este na komputer (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "yourdomainname": "Lugat-mu:",
        "login": "Log in",
        "nav-login-createaccount": "Hålom / fa'tinas kuenta-mu",
        "expensive-parserfunction-category": "Påhinas siha ni meggai mampos na inagang fungksion parser",
        "post-expand-template-inclusion-warning": "Adahi: Mampos dangkolo i mineddong muna'saonao plantiyas.\nTi para u na'saonao palu na plantiyas.",
        "post-expand-template-inclusion-category": "Påhina siha ni maloffan i mineddong muna'saonao plantiyas",
-       "cantcreateaccounttitle": "Ti siña mama'tinas kuenta",
        "cantcreateaccount-text": "Chinemma' mama'tinas kuenta ginen i IP ('''$1''') as [[User:$3|$3]].\n\nNina'i i rasion ''$2'' as $3",
        "viewpagelogs": "Atan i historian påhina",
        "nohistory": "Tåya' historian tinilaika este na påhina.",
index 71a2c6b..18887a3 100644 (file)
        "passwordreset": "ڕێکخستنەوەی تێپەڕوشە",
        "passwordreset-username": "ناوی بەکارھێنەری:",
        "passwordreset-domain": "پاوان:",
-       "passwordreset-capture": "بینینی ئیمەیڵی ئەنجام؟",
        "passwordreset-email": "ناونیشانی ئیمەیل:",
        "passwordreset-emailtitle": "وردەکارییەکانی ھەژمار لە {{SITENAME}}",
        "passwordreset-emailtext-ip": "‫کەسێک (لەوانەیە خۆت، بە ناونیشانی ئایپیی $1) داوای ڕیسێتکردنەوەی تێپەڕوشەکەت لە {{SITENAME}}دا ($4) کردووە. {{PLURAL:$3|ھەژماری بەکارھێنەریی ژێرەوە پەیوەندیی ھەیە|ھەژمارە بەکارھێنەرییەکانی ژێرەوە پەیوەندییان ھەیە}} بەم ناونیشانەی ئیمەیلەوە:\n\n$2\n\n{{PLURAL:$3|ئەم تێپەڕوشە کاتییە|ئەم تێپەڕوشە کاتییانە}} لە {{PLURAL:$5|ڕۆژێک|$5 ڕۆژ}}دا بەسەردەچێت.\nدەبێ بچیتە ژوورەوە و ھەر ئێستا تێپەڕوشەیەکی نوێ ھەڵبژێریت. ئەگەر کەسێکی تر ئەم داواکارییەی کردووە،\nیان ئەگەر تێپەڕوشە سەرەتاییەکەت ھاتووەتەوە بیرت و ئیتر ناتەوێ بیگۆڕی، دەتوانی گوێ بەم پەیامە نەدەیت و ھەر لە تێپەڕوشە کۆنەکەت کەڵک وەربگریت.",
        "searchprofile-advanced-tooltip": "گەڕان لەناو بۆشایی‌ناوە دڵخوازەکان",
        "search-result-size": "$1 ({{PLURAL:$2|یەک وشە|$2 وشە}})",
        "search-result-category-size": "{{PLURAL:$1|١ ئەندام|$1 ئەندام}} ({{PLURAL:$2|١ ژێرپۆل|$2 ژێرپۆل}}, {{PLURAL:$3|١ پەڕگە|$3 پەڕگە}})",
-       "search-redirect": "(ڕەوانەکەر $1)",
+       "search-redirect": "(ڕەوانەکراوە لە $1ەوە)",
        "search-section": "(بەشی $1)",
        "search-category": "(پۆلی $1)",
        "search-suggest": "ئایا مەبەستت ئەمە بوو: $1",
        "userrights-reason": "هۆکار:",
        "userrights-no-interwiki": "دەسەڵاتی گۆڕینی مافەکانی بەکارهێنەر لە ویکی‌یەکانی دیکەت نیە.",
        "userrights-nodatabase": "بنکەدراوی $1 بوونی نیە یا لەم شوێنە نیە.",
-       "userrights-nologin": "بۆ دانانی مافەکانی بەکارهێنەر دەبێ بە هەژماری بەڕێوبەری [[Special:UserLogin|بچیتە ژووروە]].",
-       "userrights-notallowed": "تۆ دەسەڵاتی دانان یان لابردنی مافەکانی بەکارھێنەرانت نییە.",
        "userrights-changeable-col": "ئەو گرووپانەی دەتوانی بیگۆڕی",
        "userrights-unchangeable-col": "ئەو گرووپانەی ناتوانی بیگۆڕی",
        "group": "گرووپ:",
        "right-siteadmin": "داخستن و کردنەوەی بنکەدراو",
        "right-override-export-depth": "هەناردنی لاپەڕەکان کە لاپەڕەکانی بەستەر پێ‌دراو تا قووڵایی 5 لەخۆ بگرێت",
        "right-sendemail": "ناردنی ئیمەیل بۆ بەکارھێنەرانی تر",
-       "right-passwordreset": "دیتنی ئیمەیلەکانی ڕێکخستنەوەی تێپەڕوشە",
        "right-managechangetags": "دروستکردن و سڕینەوەی [[Special:Tags|تاگەکان]] لە بنکەدراوە",
        "newuserlogpage": "لۆگی دروستکردنی بەکارھێنەر",
        "newuserlogpagetext": "ئەمە لۆگێکی دروستکردنی بەکارھێنەرە.",
        "activeusers-intro": "ئەمە لیستێکی ئەو بەکارھێنەرانەیە کە لە  $1 {{PLURAL:$1|ڕۆژ|ڕۆژ}}ی ڕابردوودا بە جۆرێک چالاکییەکیان ھەبووە.",
        "activeusers-count": "$1 {{PLURAL:$1|کردەوە}} لە دوایین {{PLURAL:$3|ڕۆژ|$3 ڕۆژ}}دا",
        "activeusers-from": "نیشاندانی بەکارھێنەران بە دەستپێکردن لە:",
-       "activeusers-hidebots": "بۆتەکان بشارەوە",
-       "activeusers-hidesysops": "بەڕێوبەران بشارەوە",
        "activeusers-noresult": "هیچ بەکارهێنەرێک نەدۆزرایەوە",
        "listgrouprights": "مافەکانی گرووپی بەکارھێنەر",
        "listgrouprights-summary": "ئەمە لیستێکە لە گرووپەکانی بەکارهێنەر لەسەر ئەم ویکی‌یە، دەگەڵ مافەکانی دەست‌پێ‌گەیشتنی هاوپەیوەندیان.\nلێرەدا لەوانەیە [[{{MediaWiki:Listgrouprights-helppage}}|زانیاری زیاترت]] دەست‌کەوێت سەبارەت بە مافە تاکەکەسیەکان.",
        "feedback-message": "پەیام:",
        "feedback-subject": "بابەت:",
        "feedback-submit": "ناردن",
-       "searchsuggest-search": "گەڕان",
+       "searchsuggest-search": "لە {{SITENAME}}دا بگەڕێ",
        "searchsuggest-containing": "بە لەبەرگرتنەوەی ...",
        "api-error-empty-file": "ئەو پەڕگەیە کە ناردووتە واڵا بوو.",
        "api-error-file-too-large": "ئەو پەڕگەیە ناردووتە زۆر گەورەیە.",
index 9eee086..457ee31 100644 (file)
        "post-expand-template-inclusion-warning": "'''Attenti:''' a dimensione di i mudelli inclusi è troppa maiò.\nParechji mudelli ùn seranu micca inclusi.",
        "post-expand-template-inclusion-category": "Pagine per e quale a dimensione di i mudelli inclusi supereghja a limita",
        "post-expand-template-argument-category": "Pagine cuntinenti argumenti di mudellu mancanti",
-       "cantcreateaccounttitle": "Registramentu micca pussibile",
        "currentrev": "Ultima revisione",
        "currentrev-asof": "Versione attuale di e $1",
        "revisionasof": "Versione di e $1",
index 9829a07..0899e65 100644 (file)
        "yourname": "Hayo (username):",
        "yourpassword": "Password:",
        "yourpasswordagain": "Liwata ka pindot ang password:",
-       "remembermypassword": "Dumduma ang pagsulod ko sa mini nga kompyuter (pinakadamu na ang $1 {{PLURAL:$1|adlaw|mga adlaw}})",
        "yourdomainname": "Imo domain:",
        "login": "Mag sulod",
        "nav-login-createaccount": "Magsulod / mag-ubra sang account",
index 4d8a73c..e48be9f 100644 (file)
        "yourpasswordagain": "Parolni bir daa yazıñız:",
        "createacct-yourpasswordagain": "Parolni tasdıqlav",
        "createacct-yourpasswordagain-ph": "Parolni bir daa yazıñız",
-       "remembermypassword": "Kirişimni bu kompyuterde hatırla (eñ çoq $1 {{PLURAL:$1|kün|kün}} içün)",
        "userlogin-remembermypassword": "Sistemada qalayım",
        "userlogin-signwithsecure": "Telükesiz bağlama qullanılsın",
        "yourdomainname": "Domen adıñız",
        "undo-failure": "Aradaki deñiştirmeler bir-birine kelişikli olmağanı içün deñiştirme lâğu etilip olamay.",
        "undo-norev": "Deñiştirme lâğu etilip olamaz, çünki o ya da yoq, ya da bar edi, amma yoq etilgen.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|muzakere]]) qullanıcısınıñ $1 nomeralı deñiştirmesini lâğu etüv.",
-       "cantcreateaccounttitle": "Esap yaratmaqnıñ iç çaresi yoq.",
        "cantcreateaccount-text": "Bu IP adresinden ('''$1''') esap yaratuv [[User:$3|$3]] tarafından blok etildi.\n\n$3 mına bu sebepni bildirdi: ''$2''",
        "viewpagelogs": "Bu saifeniñ jurnallarını köster",
        "nohistory": "Bu saifeniñ keçmiş versiyası yoq.",
index 5140c81..10f39b4 100644 (file)
        "views": "Zobrazení",
        "toolbox": "Nástroje",
        "tool-link-userrights": "Změnit uživatelské skupiny {{GENDER:$1|tohoto uživatele|této uživatelky}}",
+       "tool-link-userrights-readonly": "Zobrazit {{GENDER:$1|uživatelské}} skupiny",
        "tool-link-emailuser": "Poslat e-mail {{GENDER:$1|tomuto uživateli|této uživatelce}}",
        "userpage": "Prohlédnout si uživatelskou stránku",
        "projectpage": "Prohlédnout si stránku projektu",
        "botpasswords-label-delete": "Smazat",
        "botpasswords-label-resetpassword": "Resetovat heslo",
        "botpasswords-label-grants": "Použitelná oprávnění:",
-       "botpasswords-help-grants": "Každé přidělení dává přístup k uvedeným uživatelským oprávněním, která uživatelský účet již má. Viz [[Special:ListGrants|table of grants]] pro více informací.",
+       "botpasswords-help-grants": "Přidělení dávají přístup k oprávněním, která váš uživatelský účet již má. Zaškrtnutím přidělení zde nezíská váš účet jakákoli práva, která by jinak neměl. Viz [[Special:ListGrants|table of grants]] pro více informací.",
        "botpasswords-label-grants-column": "Přiděleno",
        "botpasswords-bad-appid": "Název bota „$1“ není platný.",
        "botpasswords-insert-failed": "Nepodařilo se přidat název bota „$1“. Nebyl už přidán?",
        "passwordreset-emaildisabled": "E-mailové funkce byly na této wiki vypnuty.",
        "passwordreset-username": "Uživatelské jméno:",
        "passwordreset-domain": "Doména:",
-       "passwordreset-capture": "Prohlédnout si výsledný e-mail?",
-       "passwordreset-capture-help": "Pokud zaškrtnete toto políčko, bude e-mail (s dočasným heslem) kromě zaslání uživateli zobrazen i vám.",
        "passwordreset-email": "E-mailová adresa:",
        "passwordreset-emailtitle": "Informace k účtu na {{grammar:6sg|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Někdo (patrně vy, z IP adresy $1) zažádal na {{grammar:6sg|{{SITENAME}}}} ($4) o nastavení nového hesla k vašemu účtu. K této adrese {{PLURAL:$3|je přiřazen následující účet|jsou přiřazeny následující účty}}:\n\n$2\n\n{{PLURAL:$3|Toto dočasné heslo|Tato dočasná hesla}} vyprší za {{PLURAL:$5|jeden den|$5 dny|$5 dnů}}.\nNyní byste se měli přihlásit a zvolit si nové heslo. Pokud tento požadavek poslal někdo jiný nebo jste si na své staré heslo vzpomněli, a nechcete ho tedy změnit, můžete tuto zprávu ignorovat a nadále používat původní heslo.",
        "passwordreset-emailelement": "Uživatelské jméno: \n$1\n\nDočasné heslo: \n$2",
        "passwordreset-emailsentemail": "Pokud je u vašeho účtu nastavena tato e-mailová adresa, bude vám zaslán e-mail pro získání nového hesla.",
        "passwordreset-emailsentusername": "Pokud je u tohoto účtu nastavena e-mailová adresa, bude vám zaslán e-mail pro získání nového hesla.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Byl odeslán e-mail|Byly odeslány e-maily}} pro získání nového hesla. Zde {{PLURAL:$1|jsou zobrazeny uživatelské jméno a heslo|je zobrazen seznam uživatelských jmen a hesel}}.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|Uživateli|Uživatelce}} se nepodařilo odeslat e-mail: $1 Zde {{PLURAL:$3|jsou zobrazeny uživatelské jméno a heslo|je zobrazen seznam uživatelských jmen a hesel}}.",
        "passwordreset-nocaller": "Musí být uveden volající",
        "passwordreset-nosuchcaller": "Volající neexistuje: $1",
        "passwordreset-ignored": "Žádost o nové heslo nebyla zpracována. Možná není nakonfigurován žádný poskytovatel?",
-       "passwordreset-invalideamil": "Neplatná e-mailová adresa",
+       "passwordreset-invalidemail": "Neplatná e-mailová adresa",
        "passwordreset-nodata": "Nebylo zadáno uživatelské jméno ani e-mailová adresa",
        "changeemail": "Změna nebo odstranění e-mailové adresy",
        "changeemail-header": "Vyplněním tohoto formuláře můžete změnit svou e-mailovou adresu. Pokud chcete ze svého účtu odstranit vazbu na všechny e-mailové adresy, ponechte při odeslání formuláře novou e-mailovou adresu prázdnou.",
        "prefs-help-recentchangescount": "Týká se posledních změn, historie stránek a protokolovacích záznamů.",
        "prefs-help-watchlist-token2": "Toto je tajný klíč k webovému kanálu vašich sledovaných stránek. Kdokoli, kdo bude tento klíč znát, bude moci váš seznam sledovaných stránek číst, takže ho nešiřte.\n[[Special:ResetTokens|Kliknutím sem ho můžete reinicializovat.]]",
        "savedprefs": "Nastavení byla uložena.",
-       "savedrights": "Práva {{GENDER:$1|uživatele|uživatelky}} $1 byla uložena.",
+       "savedrights": "Skupiny {{GENDER:$1|uživatele|uživatelky}} $1 byly uloženy.",
        "timezonelegend": "Časové pásmo:",
        "localtime": "Místní čas:",
        "timezoneuseserverdefault": "Použít časové pásmo wiki ($1)",
        "prefswarning-warning": "Provedli jste změny nastavení, které dosud nejsou uloženy. Pokud tuto stránku opustíte, aniž byste klikli na „$1“, vaše nastavení se nezmění.",
        "prefs-tabs-navigation-hint": "Tip: Pro přepínání mezi záložkami můžete používat šipky vlevo a vpravo.",
        "userrights": "Správa uživatelských skupin",
-       "userrights-lookup-user": "Spravovat uživatelské skupiny",
+       "userrights-lookup-user": "Vybrat uživatele",
        "userrights-user-editname": "Zadejte uživatelské jméno:",
-       "editusergroup": "Upravit {{GENDER:$1|uživatelské}} skupiny",
+       "editusergroup": "Načíst uživatelské skupiny",
        "editinguser": "Úprava práv {{GENDER:$1|uživatele|uživatelky}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Upravit uživatelské skupiny",
        "saveusergroups": "Uložit {{GENDER:$1|uživatelské}} skupiny",
        "userrights-reason": "Důvod:",
        "userrights-no-interwiki": "Nemáte povoleno měnit uživatelská práva na jiných wiki.",
        "userrights-nodatabase": "Databáze $1 neexistuje nebo není místní.",
-       "userrights-nologin": "Musíte se [[Special:UserLogin|přihlásit]] k účtu správce, abyste mohli měnit uživatelská práva.",
-       "userrights-notallowed": "Nemáte oprávnění měnit uživatelská práva.",
        "userrights-changeable-col": "Skupiny, které můžete měnit",
        "userrights-unchangeable-col": "Skupiny, které nemůžete měnit",
        "userrights-conflict": "Konflikt změn uživatelských práv! Zkontrolujte a potvrďte požadované změny.",
-       "userrights-removed-self": "Odebrali jste si vlastní práva. Tudíž už nemáte k této stránce přístup.",
        "group": "Skupina:",
        "group-user": "Uživatelé",
        "group-autoconfirmed": "Automaticky schválení uživatelé",
        "right-siteadmin": "Zamykání a odemykání databáze",
        "right-override-export-depth": "Exportovat stránky včetně odkazovaných stránek až do hloubky 5",
        "right-sendemail": "Odesílání e-mailů ostatním uživatelům",
-       "right-passwordreset": "Prohlížení e-mailů pro znovunastavení hesla",
        "right-managechangetags": "Vytváření a (de)aktivace [[Special:Tags|značek]]",
        "right-applychangetags": "Přidávání [[Special:Tags|značek]] k vlastním změnám",
        "right-changetags": "Přidávání libovolných [[Special:Tags|značek]] na jednotlivé revize a protokolovací záznamy a jejich odebírání",
        "apisandbox-continue": "Pokračovat",
        "apisandbox-continue-clear": "Vymazat",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} bude [https://www.mediawiki.org/wiki/API:Query#Continuing_queries pokračovat] v posledním požadavku; {{int:apisandbox-continue-clear}} vymaže parametry související s pokračováním.",
+       "apisandbox-param-limit": "Pro použití maximálního limitu zadejte <kbd>max</kbd>.",
+       "apisandbox-multivalue-all-namespaces": "$1 (všechny jmenné prostory)",
+       "apisandbox-multivalue-all-values": "$1 (všechny hodnoty)",
        "booksources": "Zdroje knih",
        "booksources-search-legend": "Vyhledat knižní zdroje",
        "booksources-search": "Hledat",
        "booksources-text": "Níže je seznam odkazů na servery prodávající knihy, nebo které mohou mít další informace o knihách, které hledáte.",
        "booksources-invalid-isbn": "Zadané ISBN se zdá být neplatné. Zkontrolujte jej s originálním zdrojem.",
-       "magiclink-tracking-rfc": "Stránky používající kouzelné odkazy RFC",
+       "magiclink-tracking-rfc": "Stránky obsahující kouzelné odkazy RFC",
        "magiclink-tracking-rfc-desc": "Tato stránka používá kouzelné odkazy RFC. Více informací k migraci najdete na [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
-       "magiclink-tracking-pmid": "Stránky používající kouzelné odkazy PMID",
+       "magiclink-tracking-pmid": "Stránky obsahující kouzelné odkazy PMID",
        "magiclink-tracking-pmid-desc": "Tato stránka používá kouzelné odkazy PMID. Více informací k migraci najdete na [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
-       "magiclink-tracking-isbn": "Stránky používající kouzelné odkazy ISBN",
+       "magiclink-tracking-isbn": "Stránky obsahující kouzelné odkazy ISBN",
        "magiclink-tracking-isbn-desc": "Tato stránka používá kouzelné odkazy ISBN. Více informací k migraci najdete na [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "specialloguserlabel": "Původce:",
        "speciallogtitlelabel": "Cíl (název nebo {{ns:user}}:Jméno pro uživatele):",
        "activeusers-count": "$1 {{PLURAL:$1|akce|akce|akcí}} během {{PLURAL:$3|posledního dne|posledních $3 dnů}}",
        "activeusers-from": "Zobrazit uživatele počínaje od:",
        "activeusers-groups": "Zobrazit uživatele patřící do skupin:",
+       "activeusers-excludegroups": "Nezobrazovat uživatele patřící do skupin:",
        "activeusers-noresult": "Nenalezen žádný uživatel.",
        "activeusers-submit": "Zobrazit aktivní uživatele",
        "listgrouprights": "Práva skupin uživatelů",
        "patrol-log-header": "Toto je kniha prověřených verzí.",
        "log-show-hide-patrol": "$1 knihu záznamů patroly",
        "log-show-hide-tag": "$1 knihu značek",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Označit revizi $3 stránky $2 jako prověřenou?",
        "deletedrevision": "Smazána stará revize $1",
        "filedeleteerror-short": "Chyba při mazání souboru: $1",
        "filedeleteerror-long": "Vyskytla se chyba při mazání souboru:\n\n$1",
        "tags-deactivate": "deaktivovat",
        "tags-hitcount": "$1 {{PLURAL:$1|změna|změny|změn}}",
        "tags-manage-no-permission": "Nemáte oprávnění spravovat značky pro změny.",
-       "tags-manage-blocked": "Nemůžete spravovat značky, když jste {{GENDER:|zablokován|zablokována|zablokováni}}.",
+       "tags-manage-blocked": "Nemůžete spravovat značky, když jste {{GENDER:$1|zablokován|zablokována|zablokováni}}.",
        "tags-create-heading": "Vytvořit novou značku",
        "tags-create-explanation": "Nově vytvořené značky jsou implicitně k dispozici uživatelům a botům.",
        "tags-create-tag-name": "Název značky:",
        "tags-deactivate-not-allowed": "Značku „$1“ nelze deaktivovat.",
        "tags-deactivate-submit": "Deaktivovat",
        "tags-apply-no-permission": "Nemáte oprávnění přidávat značky k vlastním změnám",
-       "tags-apply-blocked": "Nemůžete ke svým změnám přidávat značky, když jste {{GENDER:|zablokován|zablokována|zablokováni}}.",
+       "tags-apply-blocked": "Nemůžete ke svým změnám přidávat značky, když jste {{GENDER:$1|zablokován|zablokována|zablokováni}}.",
        "tags-apply-not-allowed-one": "Značku „$1“ není dovoleno ručně přidávat.",
        "tags-apply-not-allowed-multi": "Následující {{PLURAL:$2|značku|značky}} není dovoleno ručně přidávat: $1",
        "tags-update-no-permission": "Nemáte oprávnění přidávat libovolné značky na jednotlivé revize a protokolovací záznamy a odebírat je",
-       "tags-update-blocked": "Nemůžete přidávat nebo odebírat značky, když jste {{GENDER:|zablokován|zablokována|zablokováni}}.",
+       "tags-update-blocked": "Nemůžete přidávat nebo odebírat značky, když jste {{GENDER:$1|zablokován|zablokována|zablokováni}}.",
        "tags-update-add-not-allowed-one": "Značku „$1“ není dovoleno ručně přidávat.",
        "tags-update-add-not-allowed-multi": "Následující {{PLURAL:$2|značku|značky}} není dovoleno ručně přidávat: $1",
        "tags-update-remove-not-allowed-one": "Značku „$1“ není dovoleno odebírat.",
        "htmlform-user-not-exists": "Uživatel <strong>$1</strong> neexistuje.",
        "htmlform-user-not-valid": "<strong>$1</strong> není platné uživatelské jméno.",
        "logentry-delete-delete": "$1 {{GENDER:$2|smazal|smazala}} stránku $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|smazal|smazala}} přesunem přesměrování $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|obnovil|obnovila}} stránku $3",
        "logentry-delete-event": "$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|protokolovacího záznamu|$5 protokolovacích záznamů}} ke stránce $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|změnil|změnila}} viditelnost {{PLURAL:$5|revize|$5 revizí}} stránky $3: $4",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
        "mw-widgets-titleinput-description-new-page": "stránka zatím neexistuje",
        "mw-widgets-titleinput-description-redirect": "přesměrování na $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Přidat kategorii…",
        "sessionmanager-tie": "Nelze kombinovat několik typů autentizace požadavků: $1.",
        "sessionprovider-generic": "relace pomocí $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "relace pomocí cookies",
        "log-action-filter-contentmodel-change": "Změna modelu obsahu",
        "log-action-filter-contentmodel-new": "Založení stránky s nestandardním modelem obsahu",
        "log-action-filter-delete-delete": "Smazání stránky",
+       "log-action-filter-delete-delete_redir": "Smazání přesměrování",
        "log-action-filter-delete-restore": "Obnovení stránky",
        "log-action-filter-delete-event": "Smazání záznamu",
        "log-action-filter-delete-revision": "Smazání revize",
        "authmanager-authn-autocreate-failed": "Automatické založení lokálního účtu se nezdařilo: $1",
        "authmanager-change-not-supported": "Uvedené přihlašovací údaje nelze změnit, protože by je nikdo nepoužíval.",
        "authmanager-create-disabled": "Zakládání účtů je zakázáno.",
-       "authmanager-create-from-login": "Pro založení účtu vyplňte níže uvedená pole.",
+       "authmanager-create-from-login": "Pro založení účtu vyplňte uvedená pole.",
        "authmanager-create-not-in-progress": "Zakládání účtu neprobíhá nebo se ztratila data sezení. Začněte prosím znovu od začátku.",
        "authmanager-create-no-primary": "Uvedené přihlašovací údaje nelze použít pro založení účtu.",
        "authmanager-link-no-primary": "Uvedené přihlašovací údaje nelze použít pro propojení účtů.",
        "usercssispublic": "Uvědomte si prosím, že podstránky s CSS by neměly obsahovat tajné údaje, protože jsou viditelné ostatním uživatelům.",
        "restrictionsfield-badip": "Neplatná IP adresa nebo rozsah: $1",
        "restrictionsfield-label": "Povolené rozsahy IP adres:",
-       "restrictionsfield-help": "Jedna IP adresa nebo CIDR rozsah na řádek. Všechno povolíte pomocí<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Chyba: $1",
-       "edit-error-long": "Chyby:\n\n$1"
+       "restrictionsfield-help": "Jedna IP adresa nebo CIDR rozsah na řádek. Všechno povolíte pomocí<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 44f9503..8877f73 100644 (file)
        "yourname": "Miono brëkòwnika",
        "yourpassword": "Twòja parola",
        "yourpasswordagain": "Pòwtórzë parolã",
-       "remembermypassword": "Spamiãtôj mòją parolã na tim kòmpùtrze (maksymalno przez $1 {{PLURAL:$1|dzéń|dni|dniów}})",
        "yourdomainname": "Twòjô domena",
        "login": "Wlogùjë mie",
        "nav-login-createaccount": "Logòwanié",
index d614209..7b44e84 100644 (file)
        "userlogin-yourname": "Усă куракан ят",
        "yourpassword": "Вăрттăн сăмах:",
        "yourpasswordagain": "Вăрттăн сăмах тепре çырăр:",
-       "remembermypassword": "Ку компьютер çинче мана астуса хăвармалла (for a maximum of $1 {{PLURAL:$1|1=day|days}})",
        "yourdomainname": "Сирĕн доменă:",
        "login": "Кĕрĕр",
        "nav-login-createaccount": "Сайта кĕр / регистрацилен",
        "post-expand-template-argument-category": "Шаблон аргуменчĕсене сиктерсе хăварнă страницăсем",
        "undo-norev": "Ку тӳрлетĕве пăрахăçлама май çук — вăл е пулман та, е ăна кăларса пăрахнă.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|сӳтсе яв]]) $1 улăштарнине тавăрчĕ",
-       "cantcreateaccounttitle": "Хутшăнакана кĕртме май çук",
        "viewpagelogs": "Ку страницăн журналĕсене пăхмалли",
        "nohistory": "Ку страницăн улшăнусен журналĕ çук.",
        "currentrev": "Хальхи верси",
        "listusers-noresult": "Хутшăнакансем тупăнмарĕç.",
        "listusers-blocked": "(чарса хунă)",
        "activeusers-count": "$1 {{PLURAL:$1|тӳрлетни|тӳрлетнисем}} юлашки {{PLURAL:$3|кун|$3 кунсенче}}",
-       "activeusers-hidesysops": "Администраторĕсене пытар",
        "listgrouprights-group": "Ушкăн",
        "listgrouprights-helppage": "Help:Ушкăн прависем",
        "listgrouprights-members": "(хутшăнакансен списокĕ)",
index ceb726e..1ef05f9 100644 (file)
        "passwordreset-emailelement": "Enw'r defnyddiwr: \n$1\n\nY cyfrinair dros dro: \n$2",
        "passwordreset-emailsentemail": "Anfonwyd e-bost i ailosod eich cyfrinair atoch.",
        "passwordreset-ignored": "Ailosod y cyfrinair nad ymdriniwyd â. Efallai y nid y darparwr yn osod?",
-       "passwordreset-invalideamil": "Cyfeiriad e-bost annilys",
+       "passwordreset-invalidemail": "Cyfeiriad e-bost annilys",
        "changeemail": "Newid y cyfeiriad e-bost",
        "changeemail-header": "Cwbwlhewch y ffurflen hon i newid cyfeiriad e-bost y cyfrifi. I ddileu pob cysylltiad i bob cyfeiriad ebost, gadewch e'n wag.",
        "changeemail-no-info": "Ni allwch fynd at y dudalen hon heblaw eich bod wedi mewngofnodi.",
        "activeusers-intro": "Dyma restr y defnyddwyr a fuont yn weithgar o fewn y {{PLURAL:$1|diwrnod|diwrnod|deuddydd|tridiau|$1 diwrnod|$1 diwrnod}} diwethaf.",
        "activeusers-count": "$1 {{PLURAL:$1|golygiad|golygiad|olygiad|golygiad}} yn ystod y {{PLURAL:$3|diwrnod|diwrnod|deuddydd|tridiau|$3 diwrnod}} diwethaf",
        "activeusers-from": "Rhestru'r defnyddwyr gan ddechrau gyda:",
-       "activeusers-hidebots": "Cuddio botiau",
-       "activeusers-hidesysops": "Cuddio gweinyddwyr",
        "activeusers-noresult": "Dim defnyddwyr i'w cael.",
        "activeusers-submit": "Dangos defnyddwyr byw",
        "listgrouprights": "Galluoedd grwpiau defnyddwyr",
index df0b4e1..5b56d6d 100644 (file)
@@ -58,7 +58,8 @@
                        "Ribewiki",
                        "Jens Jensen",
                        "Nemo bis",
-                       "Anders Feder"
+                       "Anders Feder",
+                       "Jhertel"
                ]
        },
        "tog-underline": "Understreg henvisninger:",
        "talk": "Diskussion",
        "views": "Visninger",
        "toolbox": "Værktøjer",
+       "tool-link-userrights": "Ændre {{GENDER:$1|bruger}}grupper",
+       "tool-link-userrights-readonly": "Se {{GENDER:$1|bruger}}grupper",
+       "tool-link-emailuser": "Send e-mail til denne {{GENDER:$1|bruger}}",
        "userpage": "Se brugersiden",
        "projectpage": "Se projektsiden",
        "imagepage": "Se filside",
        "createacct-yourpasswordagain-ph": "Indtast adgangskode igen",
        "userlogin-remembermypassword": "Husk mig",
        "userlogin-signwithsecure": "Brug sikker forbindelse",
+       "cannotlogin-title": "Kan ikke logge ind",
+       "cannotlogin-text": "Det er ikke muligt at logge ind.",
        "cannotloginnow-title": "Kan ikke logge ind på nuværende tidspunkt",
        "cannotloginnow-text": "Det er ikke muligt at logge på når du bruger $1.",
+       "cannotcreateaccount-title": "Kan ikke oprette konti",
+       "cannotcreateaccount-text": "Direkte kontooprettelse er ikke aktiveret på denne wiki.",
        "yourdomainname": "Dit domænenavn:",
        "password-change-forbidden": "Du kan ikke ændre adgangskoder på denne wiki.",
        "externaldberror": "Der er opstået en fejl i en ekstern adgangsdatabase, eller du har ikke rettigheder til at opdatere denne.",
        "createaccountreason": "Begrundelse:",
        "createacct-reason": "Årsag",
        "createacct-reason-ph": "Hvorfor du vil oprette endnu en konto",
+       "createacct-reason-help": "Besked vist i kontooprettelsesloggen.",
        "createacct-submit": "Opret din konto",
        "createacct-another-submit": "Opret konto",
+       "createacct-continue-submit": "Fortsæt kontooprettelse",
+       "createacct-another-continue-submit": "Fortsæt kontooprettelse",
        "createacct-benefit-heading": "{{SITENAME}} laves af mennesker som dig.",
        "createacct-benefit-body1": "{{PLURAL:$1|redigering|redigeringer}}",
        "createacct-benefit-body2": "{{PLURAL:$1|side|sider}}",
        "nocookiesnew": "Din brugerkonto er nu oprettet, men du er ikke logget på. {{SITENAME}} bruger cookies til at logge brugere på.\nDu har slået cookies fra. \nVær venlig at slå cookies til og log derefter på med dit nye brugernavn og adgangskode.",
        "nocookieslogin": "{{SITENAME}} bruger cookies til at logge brugere på. Du har slået cookies fra. Slå dem venligst til og prøv igen.",
        "nocookiesfornew": "Denne brugerkonto er ikke oprettet, da vi ikke kunne bekræfte dens kilde.\nSørg for, at du har aktivereret cookies, genindlæs siden og prøv igen.",
+       "createacct-loginerror": "Kontoen blev oprettet, men du kunne ikke blive logget ind automatisk. Fortsæt venligst til [[Special:UserLogin|manuel log ind]].",
        "noname": "Du har ikke angivet et gyldigt brugernavn.",
-       "loginsuccesstitle": "Du er nu logget på",
+       "loginsuccesstitle": "Logget ind",
        "loginsuccess": "'''Du er nu logget på {{SITENAME}} som \"$1\".'''",
        "nosuchuser": "Der er ingen bruger med navnet \"$1\".\nDer skelnes mellem store og bogstaver i brugernavne.\nKontrollér stavemåden, eller [[Special:CreateAccount|opret en ny konto]].",
        "nosuchusershort": "Der er ingen bruger ved navn \"$1\". Tjek din stavning.",
        "passwordreset-emaildisabled": "E-mailfunktioner er slået fra på denne wiki.",
        "passwordreset-username": "Brugernavn:",
        "passwordreset-domain": "Domæne:",
-       "passwordreset-capture": "Se den resulterende e-mail?",
-       "passwordreset-capture-help": "Hvis du krydser dette felt af, vil e-mailen (med den midlertidige adgangskode) blive vist til dig i tillæg til at blive sendt til brugeren.",
        "passwordreset-email": "E-mailadresse:",
        "passwordreset-emailtitle": "Kontooplysninger på {{SITENAME}}",
        "passwordreset-emailtext-ip": "Nogen (sandsynligvis dig, fra IP-adressen $1) har anmodet om at få nulstillet din adgangskode til {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brugerkonto er associeret|De følgende brugerkonti er associerede}} med denne e-mailadresse:\n\n$2\n\n{{PLURAL:$3|Denne midlertidige adgangskode|Disse midlertidige adgangskoder}} vil udløbe om {{PLURAL:$5|en dag|$5 dage}}.\nDu bør logge på og vælge en ny adgangskode nu. Hvis en anden end dig har lavet denne anmodning, eller hvis du er kommet i tanke om din oprindelig adgangskode og ikke længere ønsker at ændre den, kan du ignorere denne meddelelse og fortsætte med at bruge din gamle adgangskode.",
        "changeemail-password": "Din adgangskode til {{SITENAME}}:",
        "changeemail-submit": "Ændre e-mail",
        "changeemail-throttled": "Du har forsøgt at logge på for mange gange.\nVent venligst $1, før du prøver igen.",
+       "changeemail-nochange": "Angiv venligst en anden ny e-mailadresse.",
        "resettokens": "Nulstil nøgler",
        "resettokens-text": "Du kan nulstille nøgler, som giver adgang til visse private data i forbindelse med din konto her.\n\nDu bør gøre det, hvis du ved et uheld deler dem med nogen, eller hvis din konto er blevet kompromitteret.",
        "resettokens-no-tokens": "Der er ingen nøgler at nulstille.",
        "missingcommenttext": "Skriv venligst en kommentar nedenfor.",
        "missingcommentheader": "<strong>Bemærk:</strong> Du har ikke angivet en overskrift/emne for denne kommentar. Hvis du trykker \"{{int:savearticle}}\" én gang til, gemmes dine ændringer uden overskrift/emne.",
        "summary-preview": "Forhåndsvisning af beskrivelsen:",
-       "subject-preview": "Forhåndsvisning af emnet:",
+       "subject-preview": "Forhåndsvisning af emne/overskrift:",
        "previewerrortext": "Der opstod en fejl under forsøget på at lave en forhåndsvisning af dine ændringer.",
        "blockedtitle": "Du eller din IP-adresse er blokeret",
        "blockedtext": "'''Dit brugernavn eller din IP-adresse er blevet blokeret.'''\n\nBlokeringen er foretaget af $1.\nDen anførte grund er ''$2''.\n\nBlokeringen starter: $8\nBlokeringen udløber: $6\nBlokeringen er rettet mod: $7\n\nDu kan kontakte $1 eller en af de andre [[{{MediaWiki:Grouppage-sysop}}|administratorer]] for at diskutere blokeringen.\nDu kan ikke bruge funktionen 'e-mail til denne bruger' medmindre der er angivet en gyldig e-mailadresse i dine\n[[Special:Preferences|kontoindstillinger]], og du ikke er blevet blokeret fra at bruge den.\n\nDin nuværende IP-adresse er $3, og blokerings-id er #$5.\nAngiv venligst alle ovenstående detaljer ved henvendelser om blokeringen.",
        "accmailtext": "En tilfældigt dannet adgangskode for [[User talk:$1|$1]] er sendt til $2. Den kan ændres på siden ''[[Special:ChangePassword|skift adgangskode]]'', når du logger på.",
        "newarticle": "(Ny)",
        "newarticletext": "Du har fulgt en henvisning til en side som endnu ikke findes.\nFor at oprette siden skal du begynde at skrive i boksen nedenfor\n(se [$1 hjælpesiden] for yderligere information).\nHvis du er her ved en fejl, så tryk på din browsers '''tilbage'''-knap.",
-       "anontalkpagetext": "---- ''Dette er en diskussionsside for en anonym bruger, der ikke har oprettet en konto endnu eller ikke bruger den.\nVi er derfor nødt til at bruge den numeriske IP-adresse til at identificere ham eller hende.\nEn IP-adresse kan være delt mellem flere brugere.\nHvis du er en anonym bruger og synes, at du har fået irrelevante kommentarer på sådan en side, så vær venlig at [[Special:CreateAccount|oprette en brugerkonto]] og [[Special:UserLogin|logge på]], så vi undgår fremtidige forvekslinger med andre anonyme brugere.''",
+       "anontalkpagetext": "----\n<em>Dette er en diskussionsside for en anonym bruger, der ikke har oprettet en konto endnu eller ikke bruger den.</em>\nVi er derfor nødt til at bruge den numeriske IP-adresse til at identificere vedkommende.\nEn sådan IP-adresse kan være delt mellem flere brugere.\nHvis du er en anonym bruger og synes, at irrelevante kommentarer er blevet rettet mod dig, så [[Special:CreateAccount|opret en brugerkonto]] eller [[Special:UserLogin|log på]] for at undgå fremtidige forvekslinger med andre anonyme brugere.",
        "noarticletext": "Der er i øjeblikket ikke nogen tekst på denne side.\nDu kan [[Special:Search/{{PAGENAME}}|søge efter sidenavnet]] på andre sider,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søge i relaterede logger]\neller [{{fullurl:{{FULLPAGENAME}}|action=edit}} oprette siden]</span>.",
        "noarticletext-nopermission": "Der er i øjeblikket ikke nogen tekst på denne side.\nDu kan [[Special:Search/{{PAGENAME}}|søge efter sidenavnet]] på andre sider,\neller <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} søge i relaterede loglister]</span>,\nmen du har ikke tilladelse til at oprette denne side.",
        "missing-revision": "Revision #$1 af siden med navnet \"{{FULLPAGENAME}}\" eksisterer ikke.\n\nDette skyldes normalt at et forældet historik-link er fulgt til en side der er slettet.\nDetaljer kan findes i [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} sletningsloggen].",
        "userpage-userdoesnotexist": "Brugerkontoen \"<nowiki>$1</nowiki>\" findes ikke. Overvej om du ønsker at oprette eller redigere denne side.",
        "userpage-userdoesnotexist-view": "Brugerkontoen \"$1\" er ikke oprettet.",
        "blocked-notice-logextract": "Denne bruger er i øjeblikket blokeret.\nLoggen over den seneste blokering ses nedenfor:",
-       "clearyourcache": "'''Bemærk:''' Efter at have gemt er du måske nødt til at tømme din browsers cache for at kunne se ændringerne.\n* '''Firefox / Safari:''' Hold ''Shift'' nede og klik på ''Reload'', eller tryk enten ''Ctrl-F5'' eller ''Ctrl-R'' (''⌘-R'' på en Mac).\n* '''Google Chrome:''' Tryk ''Ctrl-Shift-R'' (''⌘-Shift-R'' på en Mac).\n* '''Internet Explorer:''' Hold ''Ctrl'' nede og klik på ''Refresh'' eller tryk på ''Ctrl-F5''.\n* '''Opera:''' Tøm cachen i ''Tools → Preferences''.",
+       "clearyourcache": "<strong>Bemærk:</strong> Efter at have gemt er du måske nødt til at tømme din browsers cache for at kunne se ændringerne.\n* <strong>Firefox / Safari:</strong> Hold <em>Shift</em> nede og klik på <em>Reload</em>, eller tryk enten <em>Ctrl-F5</em> eller <em>Ctrl-R</em> (<em>⌘-R</em> på en Mac).\n* <strong>Google Chrome:</strong> Tryk <em>Ctrl-Shift-R</em> (<em>⌘-Shift-R</em> på en Mac).\n* <strong>Internet Explorer:</strong> Hold <em>Ctrl</em> nede og klik på <em>Refresh</em>, eller tryk på <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Go to <em>Menu → Settings</em> (<em>Opera → Preferences</em> on a Mac) and then to <em>Privacy & security → Clear browsing data → Cached images and files</em>",
        "usercssyoucanpreview": "'''Tip:''' Brug \"{{int:showpreview}}\"-knappen for at teste dit nye CSS inden du gemmer.",
        "userjsyoucanpreview": "'''Tip:''' Brug \"{{int:showpreview}}\"-knappen for at teste dit nye JavaScript inden du gemmer.",
        "usercsspreview": "'''Husk at dette kun er en forhåndsvisning af dit eget css.\n'''Det er ikke gemt endnu!'''",
        "previewnote": "'''Husk at dette er kun en forhåndsvisning.'''\nDine ændringer er endnu ikke blevet gemt!",
        "continue-editing": "Gå til redigeringsfeltet",
        "previewconflict": "Denne forhåndsvisning er resultatet af den redigérbare tekst ovenfor, sådan vil det komme til at se ud hvis du vælger at gemme teksten.",
-       "session_fail_preview": "'''Din ændring kunne ikke gemmes, da dine sessionsdata er gået tabt.\nPrøv venligst igen. Hvis problemet fortsætter, log af og log på igen.'''",
-       "session_fail_preview_html": "'''Din ændring kunne ikke gemmes, da dine sessionsdata er gået tabt.'''\n\n''Da ren HTM er aktiveret i denne Wiki, er forhåndsvisningen blændet ud for at forebygge JavaScript-angreb.''\n\n'''Forsøg venligst igen. Hvis problemet fortsætter, log af og log på igen.'''",
+       "session_fail_preview": "Beklager! Vi kunne ikke behandle din redigering på grund af et tab af sessionsdata.\n\nDu er måske blevet logget ud. <strong>Kontroller venligst, at du stadig er logget ind, og prøv så igen</strong>.\nHvis det stadig ikke virker, så prøv at [[Special:UserLogout|logge ud]] og logge ind igen. Du kan også kontrollere, at din browser tillader cookies fra dette websted.",
+       "session_fail_preview_html": "Beklager! Vi kunne ikke behandle din redigering på grund af et tab af sessionsdata.\n\n<em>Fordi {{SITENAME}} har rå HTML aktiveret, er forhåndsvisningen skjult som en sikkerhedsforanstaltning mod JavaScript-angreb.</em>\n\n<strong>Hvis dette er et legitimt forsøg på redigere, så prøv venligst igen.</strong>\nHvis det stadig ikke virker, så prøv at [[Special:UserLogout|logge ud]] og logge ind igen. Du kan også kontrollere, at din browser tillader cookies fra dette websted.",
        "token_suffix_mismatch": "'''Din redigering er afvist, da din browser har forvansket tegnsætningen i redigeringskontrolfilen. Afvisningen sker for at forhindre utilsigtede ændringer i artiklen. Denne fejl opstår nogle gange, når du redigerer gennem en fejlprogrammeret webbaseret anonymiseringstjeneste.'''",
        "edit_form_incomplete": "'''Nogle dele af redigeringsformularen nåede ikke serveren; dobbelttjek, at redigeringerne er intakte, og prøv igen.'''",
        "editing": "Redigerer $1",
        "yourdiff": "Forskelle",
        "copyrightwarning": "Bemærk venligst at alle bidrag til {{SITENAME}} er at betragte som udgivne under $2 (se $1 for detaljer).\nHvis du ikke ønsker at din tekst skal udsættes for nådesløse redigeringer og at den kan blive kopieret efter forgodtbefindende, så skal du ikke placere den her.<br />\nDu lover os også, at du selv har forfattet teksten eller har kopieret den fra en public domain-kilde eller en tilsvarende fri kilde.\n'''Læg aldrig materiale her som er beskyttet af andres ophavsret uden deres tilladelse!'''",
        "copyrightwarning2": "Bemærk venligst at alle bidrag til {{SITENAME}} kan bearbejdes, ændres eller slettes af andre brugere.\nLæg ingen tekster ind, hvis du ikke kan acceptere at disse kan ændres.\n\nDu bekræfter hermed også, at du selv har skrevet denne tekst eller kopieret den fra en fri kilde (se $1 for detaljer).\n'''OVERFØR IKKE OPHAVSRETSLIGT BESKYTTET INDHOLD UDEN TILLADELSE!'''",
+       "editpage-cannot-use-custom-model": "Indholdsmodellen for denne side kan ikke ændres.",
        "longpageerror": "'''Fejl: Teksten, som du ville gemme, er {{PLURAL:$1|en kilobyte|$1 kilobytes}} stor, hvilket er mere end det tilladte maksimum på {{PLURAL:$2|en kilobyte|$2 kilobytes}}.'''\nDet er ikke muligt at gemme den.",
-       "readonlywarning": "'''Advarsel: Databasen er låst på grund af vedligeholdelse, så du kan ikke gemme dine ændringer lige nu.'''\nDet kan godt være en god ide at kopiere din tekst til en tekstfil, så du kan gemme den til senere.\n\nAdministratoren som låste databasen, gav denne forklaring: $1",
+       "readonlywarning": "<strong>Advarsel: Databasen er låst på grund af vedligeholdelse, så du kan ikke gemme dine ændringer lige nu.</strong>\nDet kan være en god idé at kopiere din tekst over i en tekstfil og gemme den til senere.\n\nAdministratoren, som låste databasen, gav denne forklaring: $1",
        "protectedpagewarning": "'''ADVARSEL: Denne side er skrivebeskyttet, så kun administratorer kan redigere den.'''<br />\nDen seneste logpost vises nedenfor:",
        "semiprotectedpagewarning": "'''Bemærk: Siden er låst, så kun registrerede brugere kan ændre den.'''\n<br />Den seneste logpost vises nedenfor:",
        "cascadeprotectedwarning": "<strong>Advarsel:</strong> Denne side er blevet beskyttet, så den kun kan ændres af brugere med administratorrettigheder, fordi indholdet er inkluderet i følgende {{PLURAL:$1|side|sider}} med nedarvet sidebeskyttelse:",
        "prefswarning-warning": "Du har foretaget ændringer af dine indstillinger, som ikke er gemt endnu.\nHvis du forlader denne side uden at klikke \"$1\", vil dine indstillinger ikke blive opdateret.",
        "prefs-tabs-navigation-hint": "Tip: Du kan bruge venstre og højre piletasterne til at navigere mellem fanerne i fanelisten.",
        "userrights": "Håndtering af brugerrettigheder",
-       "userrights-lookup-user": "Administrér brugergrupper",
+       "userrights-lookup-user": "Vælg en bruger",
        "userrights-user-editname": "Skriv et brugernavn:",
-       "editusergroup": "Redigér {{GENDER:$1|brugergrupper}}",
+       "editusergroup": "Indlæs brugergrupper",
        "editinguser": "Ændrer brugerrettigheder for {{GENDER:$1|brugeren}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Redigér brugergrupper",
        "saveusergroups": "Gem {{GENDER:$1|brugergrupper}}",
        "userrights-reason": "Årsag:",
        "userrights-no-interwiki": "Du har ikke tilladelse til at redigere brugerrettigheder på andre wikier.",
        "userrights-nodatabase": "Databasen $1 eksisterer ikke lokalt.",
-       "userrights-nologin": "Du skal [[Special:UserLogin|logge på]] med en administrativ konto, før du kan ændre brugerrettigheder.",
-       "userrights-notallowed": "Du har ikke tilladelse til at tilføje eller fjerne brugerrettigheder.",
        "userrights-changeable-col": "Redigerbare grupper",
        "userrights-unchangeable-col": "Uredigerbare grupper",
        "userrights-conflict": "Konflikt i ændringer af brugerrettigheder!\nVær venlig at gennemse og bekræft dine ændringer.",
-       "userrights-removed-self": "Du har fjernet dine egne rettigheder. Du har derfor ikke længere adgang til denne side.",
        "group": "Gruppe:",
        "group-user": "Brugere",
        "group-autoconfirmed": "Registrerede brugere",
        "right-createpage": "Oprette andre sider end diskussionssider",
        "right-createtalk": "Oprette diskussionssider",
        "right-createaccount": "Oprette nye brugere",
+       "right-autocreateaccount": "Log automatisk ind med en ekstern brugerkonto",
        "right-minoredit": "Markere redigeringer som mindre",
        "right-move": "Flytte sider",
        "right-move-subpages": "Flytte sider og undersider",
        "right-siteadmin": "Låse og frigive databasen",
        "right-override-export-depth": "Eksportere sider inkl. henviste sider op til en dybde på 5",
        "right-sendemail": "Sende e-mail til andre brugere",
-       "right-passwordreset": "Se e-mails til nulstilling af adgangskoder",
-       "right-managechangetags": "Oprette og slette [[Special:Tags|tags]] fra databasen",
+       "right-managechangetags": "Opret og (de)aktivér [[Special:Tags|tags]]",
        "right-applychangetags": "Tilføje [[Special:Tags|tags]] sammen med ens ændringer",
        "right-changetags": "Tilføje og fjerne vilkårlige [[Special:Tags|tags]] for enkelte versioner og logposter",
+       "right-deletechangetags": "Slet [[Special:Tags|tags]] fra databasen",
+       "grant-generic": "Rettighedspakke \"$1\"",
+       "grant-group-page-interaction": "Interagere med sider",
+       "grant-group-file-interaction": "Interagere med medier",
+       "grant-group-watchlist-interaction": "Interagere med din overvågningsliste",
+       "grant-group-email": "Sende e-mail",
+       "grant-group-high-volume": "Udføre højvolumenaktivitet",
+       "grant-group-customization": "Tilpasning og indstillinger",
+       "grant-group-administration": "Udføre administrative handlinger",
+       "grant-group-private-information": "Tilgå private oplysninger om dig",
+       "grant-group-other": "Diverse aktivitet",
+       "grant-blockusers": "Blokering og ophævelse af blokering af brugere",
+       "grant-createaccount": "Oprette af konti",
+       "grant-createeditmovepage": "Oprette, redigere og flytte sider",
+       "grant-delete": "Slette sider, revisioner og logposter",
+       "grant-editinterface": "Redigere MediaWiki-navnerummet og bruger-CSS/JavaScript",
+       "grant-editmycssjs": "Redigere din bruger-CSS/JavaScript",
+       "grant-editmyoptions": "Redigere dine brugerindstillinger",
+       "grant-editmywatchlist": "Redigere din overvågningsliste",
+       "grant-editpage": "Redigere eksisterende sider",
+       "grant-editprotected": "Redigere beskyttede sider",
+       "grant-highvolume": "Højvolumen-redigering",
+       "grant-oversight": "Skjule brugere og undertrykke revisioner",
+       "grant-patrol": "Patruljere sideændringer",
+       "grant-privateinfo": "Tilgå private oplysninger",
+       "grant-protect": "Beskytte og fjerne beskyttelsen af sider",
+       "grant-rollback": "Tilbagerulle ændringer til sider",
+       "grant-sendemail": "Sende e-mail til andre brugere",
+       "grant-uploadeditmovefile": "Uploade, udskifte og flytte filer",
+       "grant-uploadfile": "Uploade nye filer",
+       "grant-basic": "Grundlæggende rettigheder",
+       "grant-viewdeleted": "Se slettede filer og sider",
+       "grant-viewmywatchlist": "Se din overvågningsliste",
+       "grant-viewrestrictedlogs": "Vise adgangsbeskyttede logposter",
        "newuserlogpage": "Brugeroprettelseslog",
        "newuserlogpagetext": "Dette er en log over de senest oprettede brugere.",
        "rightslog": "Rettighedslog",
        "action-createpage": "oprette denne side",
        "action-createtalk": "oprette denne diskussionsside",
        "action-createaccount": "Oprette denne brugerkonto",
+       "action-autocreateaccount": "automatisk at oprette denne eksterne brugerkonto",
        "action-history": "se historik for denne side",
        "action-minoredit": "markere denne redigering som mindre",
        "action-move": "flytte denne side",
        "action-viewmyprivateinfo": "se din private information",
        "action-editmyprivateinfo": "rediger dine private oplysninger",
        "action-editcontentmodel": "redigere indholdsmodellen for en side",
-       "action-managechangetags": "oprette og slette tags fra databasen",
+       "action-managechangetags": "oprette og (de)aktivere tags",
        "action-applychangetags": "tilføje tags sammen med dine ændringer",
        "action-changetags": "tilføje og fjerne vilkårlige tags for enkelte versioner og logposter",
+       "action-deletechangetags": "slette tags fra databasen",
+       "action-purge": "rense denne side",
        "nchanges": "$1 {{PLURAL:$1|ændring|ændringer}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|siden sidste besøg}}",
        "enhancedrc-history": "historik",
        "recentchangeslinked-page": "Sidenavn:",
        "recentchangeslinked-to": "Vis ændringer i sider der henviser til den angivne side i stedet",
        "recentchanges-page-added-to-category": "[[:$1]] tilføjet til kategori",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] og [[Special:WhatLinksHere/$1|{{PLURAL:$2|én side|$2 sider}}]] 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",
        "upload": "Læg en fil op",
        "uploadbtn": "Læg en fil op",
        "reuploaddesc": "Tilbage til formularen til at lægge filer op.",
        "enotif_subject_created": "{{SITENAME}} side $1 er blevet oprettet af {{gender:$2|$2}}",
        "enotif_subject_moved": "{{SITENAME}} side $1 er blevet flyttet af {{gender:$2|$2}}",
        "enotif_subject_restored": "{{SITENAME}} side $1 er blevet gendannet af {{gender:$2|$2}}",
-       "enotif_subject_changed": "{{SITENAME}} side $1 er blevet ændret af {{gender:$2|$2}}",
+       "enotif_subject_changed": "{{SITENAME}}-side $1 er blevet ændret af {{gender:$2|$2}}",
        "enotif_body_intro_deleted": "{{SITENAME}}siden $1 er blevet slettet $PAGEEDITDATE af {{gender:$2|$2}}, se $3.",
        "enotif_body_intro_created": "{{SITENAME}} siden $1 er blevet oprettet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.",
        "enotif_body_intro_moved": "{{SITENAME}} siden $1 er blevet flyttet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle revision.",
        "enotif_body_intro_restored": "{{SITENAME}} siden $1 er blevet gendannet den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.",
-       "enotif_body_intro_changed": "{{SITENAME}} siden $1 er blevet ændret den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.",
-       "enotif_lastvisited": "Se $1 for alle ændringer siden dit sidste besøg.",
-       "enotif_lastdiff": "Se $1 for at vise denne ændring.",
+       "enotif_body_intro_changed": "{{SITENAME}}-siden $1 er blevet ændret den $PAGEEDITDATE af {{gender:$2|$2}}, se $3 for den aktuelle version.",
+       "enotif_lastvisited": "Gå til $1 for at se alle ændringer siden dit sidste besøg.",
+       "enotif_lastdiff": "Gå til $1 for at se denne ændring.",
        "enotif_anon_editor": "anonym bruger $1",
-       "enotif_body": "Kære $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nBidragyderens opsummering: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt bidragyderen:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDu vil ikke modtage flere beskeder om yderligere aktivitet medmindre du besøger denne side. På din overvågningsliste kan du også nulstille alle markeringer for de sider, du overvåger.\n\n         Med venlig hilsen {{SITENAME}}s informationssystem\n\n--\nFor at ændre dine indstillinger for e-mail meddelelser, besøg\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor at ændre indstillingerne for din overvågningsliste, besøg\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor at slette siden fra din overvågningsliste, besøg\n$UNWATCHURL\n\nTilbagemelding og yderligere hjælp:\n$HELPPAGE",
+       "enotif_body": "Kære $WATCHINGUSERNAME\n\n$PAGEINTRO $NEWPAGE\n\nBidragyderens opsummering: $PAGESUMMARY $PAGEMINOREDIT\n\nKontakt bidragyderen:\ne-mail: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nDu vil ikke modtage flere beskeder om yderligere aktivitet medmindre du besøger denne side. På din overvågningsliste kan du også nulstille alle markeringer for de sider, du overvåger.\n\n         Med venlig hilsen {{SITENAME}}s informationssystem\n\n--\nFor at ændre dine indstillinger for e-mail-meddelelser, besøg\n{{canonicalurl:{{#special:Preferences}}}}\n\nFor at ændre indstillingerne for din overvågningsliste, besøg\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nFor at slette siden fra din overvågningsliste, besøg\n$UNWATCHURL\n\nTilbagemelding og yderligere hjælp:\n$HELPPAGE",
        "created": "oprettet",
        "changed": "ændret",
        "deletepage": "Slet side",
        "log-action-filter-protect-modify": "Ændring af beskyttelse",
        "log-action-filter-protect-unprotect": "Fjernede beskyttelse",
        "log-action-filter-protect-move_prot": "Flyttede beskyttelse",
-       "authmanager-provider-temporarypassword": "Midlertidig adgangskode",
-       "edit-error-short": "Fejl: $1"
+       "authmanager-provider-temporarypassword": "Midlertidig adgangskode"
 }
index 792991a..215cdea 100644 (file)
        "views": "Ansichten",
        "toolbox": "Werkzeuge",
        "tool-link-userrights": "{{GENDER:$1|Benutzergruppen}} ändern",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Benutzergruppen}} ansehen",
        "tool-link-emailuser": "E-Mail an {{GENDER:$1|diesen Benutzer|diese Benutzerin}} senden",
        "userpage": "Benutzerseite anzeigen",
        "projectpage": "Projektseite anzeigen",
        "passwordreset-emaildisabled": "Die E-Mail-Funktionen wurden auf diesem Wiki deaktiviert.",
        "passwordreset-username": "Benutzername:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Die E-Mail-Nachricht ansehen?",
-       "passwordreset-capture-help": "Wenn du dieses Kästchen ankreuzt, wird die E-Mail-Nachricht mit dem temporären Passwort sowohl dir angezeigt als auch dem Benutzer zugesandt.",
        "passwordreset-email": "E-Mail-Adresse:",
        "passwordreset-emailtitle": "Benutzerkontoinformationen auf {{SITENAME}}",
        "passwordreset-emailtext-ip": "Jemand mit der IP-Adresse $1, wahrscheinlich du selbst, hat eine Zurücksetzung deines Passworts bei {{SITENAME}} angefordert ($4). {{PLURAL:$3|Das folgende Benutzerkonto ist|Die folgenden Benutzerkonten sind}} mit dieser E-Mail-Adresse verknüpft:\n\n$2\n\n{{PLURAL:$3|Dieses temporäre Passwort läuft|Diese temporären Passwörter laufen}} innerhalb von {{PLURAL:$5|einem Tag|$5 Tagen}} ab.\nDu solltest dich anmelden und ein neues Passwort vergeben. Falls jemand anderes diese Anfrage getätigt hat oder du dich wieder an dein ursprüngliches Passwort erinnern kannst und es nicht länger ändern möchtest, kannst du diese Nachricht ignorieren und weiterhin dein altes Passwort benutzen.",
        "passwordreset-emailelement": "Benutzername: \n$1\n\nTemporäres Passwort: \n$2",
        "passwordreset-emailsentemail": "Falls diese E-Mail-Adresse mit deinem Benutzerkonto verknüpft ist, wird eine Passwort-Zurücksetzungs-E-Mail versandt.",
        "passwordreset-emailsentusername": "Falls es eine E-Mail-Adresse gibt, die mit diesem Benutzernamen verknüpft ist, wird eine Passwort-Zurücksetzungs-E-Mail versandt.",
-       "passwordreset-emailsent-capture2": "Die Passwort-Zurücksetzungs-{{PLURAL:$1|E-Mail wurde|E-Mails wurden}} versandt. {{PLURAL:$1|Der Benutzername und das Passwort|Die Liste der Benutzernamen und Passwörter}} wird hier angezeigt.",
-       "passwordreset-emailerror-capture2": "Das Senden der E-Mail an {{GENDER:$2|den Benutzer|die Benutzerin}} ist fehlgeschlagen: $1 {{PLURAL:$3|Der Benutzername und das Passwort|Die Liste der Benutzernamen und Passwörter}} wird hier angezeigt.",
        "passwordreset-nocaller": "Es muss ein Rufer angegeben werden",
        "passwordreset-nosuchcaller": "Rufer ist nicht vorhanden: $1",
        "passwordreset-ignored": "Die Passwortzurücksetzung konnte nicht verarbeitet werden. Vielleicht wurde kein Dienstanbieter konfiguriert?",
-       "passwordreset-invalideamil": "Ungültige E-Mail-Adresse",
+       "passwordreset-invalidemail": "Ungültige E-Mail-Adresse",
        "passwordreset-nodata": "Weder ein Benutzername noch eine E-Mail-Adresse wurde angegeben",
        "changeemail": "E-Mail-Adresse ändern oder entfernen",
        "changeemail-header": "Fülle dieses Formular vollständig aus, um deine E-Mail-Adresse zu ändern. Falls du die Zuweisung einer E-Mail-Adresse zu deinem Benutzerkonto entfernen möchtest, lasse beim Übermitteln des Formulars das Feld für die neue E-Mail-Adresse leer.",
        "prefs-help-recentchangescount": "Dies umfasst die Liste der letzten Änderungen, die Versionsgeschichte und die Logbücher.",
        "prefs-help-watchlist-token2": "Dies ist der geheime Schlüssel zum Webfeed deiner Beobachtungsliste.\nJeder, der ihn kennt, kann deine Beobachtungsliste lesen. Teile ihn deshalb nicht Anderen mit.\nSofern notwendig, [[Special:ResetTokens|kannst du ihn zurücksetzen]].",
        "savedprefs": "Deine Einstellungen wurden gespeichert.",
-       "savedrights": "Die Benutzerrechte von {{GENDER:$1|$1}} wurden gespeichert.",
+       "savedrights": "Die Benutzergruppen von {{GENDER:$1|$1}} wurden gespeichert.",
        "timezonelegend": "Zeitzone:",
        "localtime": "Ortszeit:",
        "timezoneuseserverdefault": "Standardzeit dieses Wikis nutzen ($1)",
        "prefswarning-warning": "Du hast Änderungen an deinen Einstellungen durchgeführt, die noch nicht gespeichert wurden.\nWenn du diese Seite verlässt ohne auf „$1“ zu klicken, werden deine Einstellungen nicht aktualisiert.",
        "prefs-tabs-navigation-hint": "Tipp: Du kannst die linke und rechte Pfeiltasten benutzen, um zwischen den Registerkarten in der Reiterliste zu navigieren.",
        "userrights": "Benutzerrechte verwalten",
-       "userrights-lookup-user": "Gruppenzugehörigkeit verwalten",
+       "userrights-lookup-user": "Einen Benutzer auswählen",
        "userrights-user-editname": "Benutzername:",
-       "editusergroup": "{{GENDER:$1|Benutzergruppen}} verwalten",
+       "editusergroup": "Benutzergruppen laden",
        "editinguser": "Ändere Benutzerrechte {{GENDER:$1|des Benutzers|der Benutzerin}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Benutzer-Gruppenzugehörigkeit bearbeiten",
        "saveusergroups": "{{GENDER:$1|Gruppenzugehörigkeit}} ändern",
        "userrights-reason": "Grund:",
        "userrights-no-interwiki": "Du hast nicht die erforderliche Berechtigung, um Benutzerrechte in anderen Wikis ändern zu können.",
        "userrights-nodatabase": "Die Datenbank $1 ist nicht vorhanden oder nicht lokal.",
-       "userrights-nologin": "Du musst dich mit einem Administrator-Benutzerkonto [[Special:UserLogin|anmelden]], um Benutzerrechte zu ändern.",
-       "userrights-notallowed": "Du verfügst nicht über die erforderlichen Berechtigungen, um Benutzerrechte vergeben oder entziehen zu können.",
        "userrights-changeable-col": "Gruppenzugehörigkeit, die du ändern kannst",
        "userrights-unchangeable-col": "Gruppenzugehörigkeit, die du nicht ändern kannst",
        "userrights-conflict": "Benutzerrechteänderungskonflikt! Bitte überprüfe und bestätige deine Änderungen.",
-       "userrights-removed-self": "Du hast deine eigenen Rechte entfernt. Du kannst nicht länger auf diese Seite zugreifen.",
        "group": "Gruppe:",
        "group-user": "Benutzer",
        "group-autoconfirmed": "Automatisch bestätigte Benutzer",
        "right-siteadmin": "Datenbank sperren und entsperren",
        "right-override-export-depth": "Exportiere Seiten einschließlich verlinkter Seiten bis zu einer Tiefe von 5",
        "right-sendemail": "E-Mails an andere Benutzer senden",
-       "right-passwordreset": "Passwort eines Benutzers zurücksetzen und die dazu verschickte E-Mail einsehen",
        "right-managechangetags": "[[Special:Tags|Markierungen]] erstellen und (de)aktivieren",
        "right-applychangetags": "[[Special:Tags|Markierungen]] zusammen mit den Änderungen anwenden",
        "right-changetags": "Beliebige [[Special:Tags|Markierungen]] zu einzelnen Versionen und Logbucheinträgen hinzufügen und entfernen",
        "apisandbox-continue": "Fortfahren",
        "apisandbox-continue-clear": "Löschen",
        "apisandbox-continue-help": "Mit „{{int:apisandbox-continue}}“ kann man die letzte Anfrage [https://www.mediawiki.org/wiki/API:Query#Continuing_queries fortfahren]; „{{int:apisandbox-continue-clear}}“ löscht fortsetzungsbezogene Parameter.",
+       "apisandbox-param-limit": "Gib <kbd>max</kbd> ein, um das maximale Limit zu verwenden.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Alle Namensräume)",
+       "apisandbox-multivalue-all-values": "$1 (Alle Werte)",
        "booksources": "ISBN-Suche",
        "booksources-search-legend": "Suche nach Bezugsquellen für Bücher",
        "booksources-search": "Suchen",
        "activeusers-count": "$1 {{PLURAL:$1|Aktion|Aktionen}} in den {{PLURAL:$3|letzten 24 Stunden|vergangenen $3 Tagen}}",
        "activeusers-from": "Zeige Benutzer ab:",
        "activeusers-groups": "Benutzer anzeigen, die zu diesen Gruppen gehören:",
+       "activeusers-excludegroups": "Benutzer ausschließen, die zu diesen Gruppen gehören:",
        "activeusers-noresult": "Keine Benutzer gefunden.",
        "activeusers-submit": "Aktive Benutzer anzeigen",
        "listgrouprights": "Benutzergruppenrechte",
        "tags-deactivate": "deaktivieren",
        "tags-hitcount": "$1 {{PLURAL:$1|Änderung|Änderungen}}",
        "tags-manage-no-permission": "Du hast keine Berechtigung, Änderungsmarkierungen zu verwalten.",
-       "tags-manage-blocked": "Du kannst keine Änderungsmarkierungen verwalten, während du gesperrt bist.",
+       "tags-manage-blocked": "Du kannst keine Änderungsmarkierungen verwalten, während {{GENDER:$1|du}} gesperrt bist.",
        "tags-create-heading": "Eine neue Markierung erstellen",
        "tags-create-explanation": "Standardmäßig werden neu erstellte Markierungen für die Verwendung durch Benutzer und Bots verfügbar gemacht.",
        "tags-create-tag-name": "Name der Markierung:",
        "tags-deactivate-not-allowed": "Es ist nicht möglich, die Markierung „$1“ zu deaktivieren.",
        "tags-deactivate-submit": "Deaktivieren",
        "tags-apply-no-permission": "Du hast keine Berechtigung, um Änderungsmarkierungen zusammen mit deinen Änderungen anzuwenden.",
-       "tags-apply-blocked": "Du kannst keine Änderungsmarkierungen zusammen mit deinen Änderungen anwenden, während du gesperrt bist.",
+       "tags-apply-blocked": "Du kannst keine Änderungsmarkierungen zusammen mit deinen Änderungen anwenden, während {{GENDER:$1|du}} gesperrt bist.",
        "tags-apply-not-allowed-one": "Die Markierung „$1“ darf nicht manuell angewendet werden.",
        "tags-apply-not-allowed-multi": "Die {{PLURAL:$2|folgende Markierung darf|folgenden Markierungen dürfen}} nicht manuell angewendet werden: $1",
        "tags-update-no-permission": "Du hast keine Berechtigung, um Änderungsmarkierungen von einzelnen Versionen oder Logbucheinträgen hinzuzufügen oder zu entfernen.",
-       "tags-update-blocked": "Du kannst keine Änderungsmarkierungen hinzufügen oder entfernen, während du gesperrt bist.",
+       "tags-update-blocked": "Du kannst keine Änderungsmarkierungen hinzufügen oder entfernen, während {{GENDER:$1|du}} gesperrt bist.",
        "tags-update-add-not-allowed-one": "Die Markierung „$1“ darf nicht manuell hinzugefügt werden.",
        "tags-update-add-not-allowed-multi": "Die {{PLURAL:$2|folgende Markierung darf|folgenden Markierungen dürfen}} nicht manuell hinzugefügt werden: $1",
        "tags-update-remove-not-allowed-one": "Die Markierung „$1“ darf nicht entfernt werden.",
        "htmlform-user-not-exists": "<strong>$1</strong> ist nicht vorhanden.",
        "htmlform-user-not-valid": "<strong>$1</strong> ist kein gültiger Benutzername.",
        "logentry-delete-delete": "$1 {{GENDER:$2|löschte}} Seite $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|löschte}} die Weiterleitung $3 durch Überschreiben",
        "logentry-delete-restore": "$1 {{GENDER:$2|stellte}} Seite $3 wieder her",
        "logentry-delete-event": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit {{PLURAL:$5|eines Logbucheintrags|von $5 Logbucheinträgen}} auf $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|änderte}} die Sichtbarkeit {{PLURAL:$5|einer Version|von $5 Versionen}} der Seite $3: $4",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "Seite ist noch nicht vorhanden",
        "mw-widgets-titleinput-description-redirect": "Weiterleitung nach $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Eine Kategorie hinzufügen …",
        "sessionmanager-tie": "Mehrere Anfrageauthentifikationstypen konnten nicht kombiniert werden: $1.",
        "sessionprovider-generic": "$1-Sitzungen",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebasierten Sitzungen",
        "log-action-filter-contentmodel-change": "Inhaltsmodelländerung",
        "log-action-filter-contentmodel-new": "Erstellung einer Seite mit einem Nicht-Standard-Inhaltsmodell",
        "log-action-filter-delete-delete": "Seitenlöschung",
+       "log-action-filter-delete-delete_redir": "Überschreiben einer Weiterleitung",
        "log-action-filter-delete-restore": "Seitenwiederherstellung",
        "log-action-filter-delete-event": "Logbucheintrag-Löschung",
        "log-action-filter-delete-revision": "Versionslöschung",
        "usercssispublic": "Bitte beachten: CSS-Unterseiten sollten keine vertraulichen Daten enthalten, da sie von anderen Benutzern eingesehen werden können.",
        "restrictionsfield-badip": "Ungültige IP-Adresse oder ungültiger IP-Adressbereich: $1",
        "restrictionsfield-label": "Erlaubte IP-Adressbereiche:",
-       "restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Fehler: $1",
-       "edit-error-long": "Fehler:\n\n$1"
+       "restrictionsfield-help": "Eine IP-Adresse oder ein CIDR-Bereich pro Zeile. Um alles zu aktivieren, verwende<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 82507cb..110d9b5 100644 (file)
        "newpage": "Pela newiye",
        "talkpage": "Ena pele sero werêne",
        "talkpagelinktext": "werênayış",
-       "specialpage": "Pela xısusiye",
+       "specialpage": "Pella xısusi",
        "personaltools": "Hacetê şexsiy",
        "articlepage": "Pera zerreki bıvin",
-       "talk": "Werênayış",
+       "talk": "Behs",
        "views": "Asayışi",
        "toolbox": "Haceti",
        "tool-link-userrights": "Grubanê {{GENDER:$1|karberi}} bıvırnë",
        "mainpage": "Pela Seri",
        "mainpage-description": "Pela seri",
        "policy-url": "Project:Terzê hereketi",
-       "portal": "Portalê cemaeti",
+       "portal": "Meydanê cemaeti",
        "portal-url": "Project:Portalë şëlıgi",
        "privacy": "Politikaya nımıteyiye",
        "privacypage": "Project:Xısusiyetê nımıtışi",
        "sort-descending": "Rêzkerdışo kêmbiyaye",
        "sort-ascending": "Rêzkerdışo zêdiyaye",
        "nstab-main": "Pele",
-       "nstab-user": "Pela karberi",
+       "nstab-user": "Pella karberi",
        "nstab-media": "Pela medya",
-       "nstab-special": "Pela xısusiye",
+       "nstab-special": "Pella xısusi",
        "nstab-project": "Pela proceyi",
        "nstab-image": "Dosya",
        "nstab-mediawiki": "Mesac",
        "mainpage-nstab": "Pera esas",
        "nosuchaction": "Fealiyeto wınasi çıniyo",
        "nosuchactiontext": "URL ra kar qebul nêbı.\nŞıma belka URL şaş nuşt, ya zi gıreyi şaş ra ameyi.\nKeyepelê {{SITENAME}} eşkeno xeta eşkera bıkero.",
-       "nosuchspecialpage": "Pela xasa wınasiye çıniya",
+       "nosuchspecialpage": "Pella xısusi ya unasin çınya",
        "nospecialpagetext": "<strong>To yew pela xasa nêvêrdiye waşte.</strong>\n\nSeba lista pelanê xasanê vêrdeyan reca kena: [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Xeta",
        "databaseerror": "Ğetay ardoği",
        "passwordreset-emaildisabled": "Na wikid hısusiyeté e-posta dewera vıcyayé",
        "passwordreset-username": "Nameyê karberi:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "neticey e-postay bıasne yo?",
-       "passwordreset-capture-help": "Şıma na dorek morkerê se, e-posta (idareten eposta ya) şıma rê yana karbera rê rışêno.",
        "passwordreset-email": "Adresa e-postey:",
        "passwordreset-emailtitle": "Hesab timarê {{SITENAME}}",
        "passwordreset-emailtext-ip": "Jeweri, {{SITENAME}} ra (ma heta şımayê, $1 IP adresi ra) ($4) teferuatê hesabdê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
        "passwordreset-emailtext-user": "$1 enê karberi, {{SITENAME}}  ra ($4) teferuatê hesab dê şıma  va wa biyaro xo viri. Karbero ke cêrdeyo {{PLURAL:$3|hesaba|eno hesaba}} ena e-posta adresiya aleqey cı esto:\n\n$2\n\n{{PLURAL:$3|ena parola idaretena|ena parola idareten}} {{PLURAL:$5|jew roc|$5  roca}}rêya.\nEna parolaya deqewe de u xorê ju parolaya newi bıweçine. Parolaya şıma emaya şıma viri se  yana  ena e-posta şıma nê weştase u şıma qayıl niye parolaya xo bıvurnese, ena mesacer peygoş bıkerê.",
        "passwordreset-emailelement": "Nameyê karberi: \n$1\n\nParolaya vêrdiye: \n$2",
        "passwordreset-emailsentemail": "Eger kı ena e-posta şıma rê se, yew e-posta do bırışiyo eno hesab.",
-       "passwordreset-invalideamil": "Adresê eposta raşt niya",
+       "passwordreset-invalidemail": "Adresê eposta raşt niya",
        "changeemail": "E-posta adresa xo wedarne",
        "changeemail-header": "E-posta adresa xo vuriyayışi rë ena former pır kerë. Eger kı şıma qayılë kı e postay adresi ra wedarnë se formi rıştış dı heruna e posta veng verdë",
        "changeemail-no-info": "Şıma gani bıkewê pele ke derdest bıresê na pele.",
        "summary": "Xulasa:",
        "subject": "Mewzu:",
        "minoredit": "No yew vurnayışo werdiyo",
-       "watchthis": "Na pele seyr ke",
-       "savearticle": "Qeyd ke",
-       "savechanges": "Vurnayışan qeyd ke",
+       "watchthis": "Ena pele bıewne",
+       "savearticle": "Peller qeyd kı",
+       "savechanges": "Vuryayışa qeyd kerê",
        "publishpage": "Perer bıhesırne",
        "publishchanges": "Vurnayışa vıla ke",
        "preview": "Verqayt",
-       "showpreview": "Verqayti bıvêne",
-       "showdiff": "Vurriyayışan bımocne",
+       "showpreview": "Var asani bıvinê",
+       "showdiff": "Vurriyayışa bıasne",
        "anoneditwarning": "<strong>İqaz:</strong> Şıma be hesabê xo nêkewtê cı. \nAdresê şımayê IP tarixê vırnayışê na pele de do qeyd bo. Eke şıma <strong>[$1 cıkewê]</strong> ya zi <strong>[$2 hesab vırazê]</strong>, vurnayışê şıma be zewbina kare ra nameyê şıma rê bar beno.",
        "anonpreviewwarning": "\"Şıma be hesabê xo nêkewtê cı. Eke qeyd kerê, adresê şımaê IP tarixê vırnayışê na pele de do qeyd bo.\"",
        "missingsummary": "'''DİQET:''' Şıma jû xulasa nênuşte.\nEke şıma \"{{int:savearticle}}\" reyna bıtıknê, vırnayışê şıma bê xulasa qeyd beno.",
        "datedefault": "Tercih çıniyo",
        "prefs-labs": "Xacetê labs",
        "prefs-user-pages": "Pelê karberi",
-       "prefs-personal": "Pela karberi",
+       "prefs-personal": "Profilê karberi",
        "prefs-rc": "Vurriyayışê peyêni",
        "prefs-watchlist": "Lista seyrkerdışi",
        "prefs-editwatchlist": "Lista seyrkerdışi bıvurne",
        "userrights-reason": "Sebeb:",
        "userrights-no-interwiki": "Heqa şıma çıniya ke heqanê karberanê Wikipediyanê binan sero bıgureyê.",
        "userrights-nodatabase": "Database $1 çıniyo ya zi mehelli niyo.",
-       "userrights-nologin": "Eke şıma wazenê ke heqa karberi/karbere cı dê, şıma gani be [[Special:UserLogin|cikewtiye]] pê yew hesabê idarekeran cı kewê",
-       "userrights-notallowed": "Hesabdê şımadı heqanê xo hewadayış u xorê heq dekerdış çıno.",
        "userrights-changeable-col": "Grubê ke şıma şenê bıvurnê",
        "userrights-unchangeable-col": "Grubê ke şıma nêşenê bıvurnê",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Heqan de karberi de dıbare vıcyayo! Kerem ke vurnayışane xo çımser ra ravyarne  u tesdiq keri.",
-       "userrights-removed-self": "Heqi şıma usula hewadeyay. Qan de coy şıma hendana nişeni ena pela resi.",
        "group": "Grube:",
        "group-user": "Karberi",
        "group-autoconfirmed": "Karberê ke otomatikmen biyê araşt",
        "grouppage-autoconfirmed": "{{ns:project}}:Karberê ke otomatikmen biyê araşt",
        "grouppage-bot": "{{ns:project}}:Boti",
        "grouppage-sysop": "{{ns:project}}:İdarekeri",
-       "grouppage-bureaucrat": "{{ns:project}}:Burokrati",
+       "grouppage-bureaucrat": "{{ns:project}}:Buroqrati",
        "grouppage-suppress": "{{ns:project}}:Teftişkar",
        "right-read": "Pera bıwané",
        "right-edit": "Pele bıvurne",
        "right-siteadmin": "Database kilit bike u a bike",
        "right-override-export-depth": "Peleyanê ke tede linkanê 5 ra zafyer estê ay export bike",
        "right-sendemail": "Karberanê binî ra e-mail bişirav",
-       "right-passwordreset": "E-postayanê parola reset kerdışa vineno",
        "right-managechangetags": "[[Special:Tags|Etiketi]] vıraz u aktiv (me)ke",
        "right-applychangetags": "[[Special:Tags|Etiketa]]  vurnayışana piya dezge fi.",
        "grant-group-page-interaction": "Peran na tesiri",
        "recentchanges-submit": "Bımocne",
        "rcnotefrom": "Cêr de <strong>$2</strong> ra nata {{PLURAL:$5|vurnayışiyê}} asenê (tewr vêşi <strong>$1</strong> asenê) <strong>$3, $4</strong>",
        "rclistfrom": "$3 $2 ra tepiya vurnayışanê neweyan bımocne",
-       "rcshowhideminor": "Vurriyayışê werdiy $1",
+       "rcshowhideminor": "Vurriyayışanê werdiya $1",
        "rcshowhideminor-show": "Bımocne",
        "rcshowhideminor-hide": "Bınımne",
        "rcshowhidebots": "botan $1",
        "rcshowhidebots-show": "Bımocne",
        "rcshowhidebots-hide": "Bınımne",
-       "rcshowhideliu": "karberê qeydbiyayeyi $1",
+       "rcshowhideliu": "karberanê qeydina $1",
        "rcshowhideliu-show": "Bımocne",
        "rcshowhideliu-hide": "Bınımne",
-       "rcshowhideanons": "karberê bênameyi $1",
+       "rcshowhideanons": "karberanê bênameyan $1",
        "rcshowhideanons-show": "Bımocne",
        "rcshowhideanons-hide": "Bınımne",
        "rcshowhidepatr": "$1 vurnayışê ke dewriya geyrayê",
        "listredirects": "Listeya Hetenayışan",
        "listduplicatedfiles": "Lista dosyeyanê ke kopyaya cı vêniyena",
        "listduplicatedfiles-entry": "[[$3|{{PLURAL:$2|kapyay|$2 kopyey}}]] dosya da [[:File:$1|$1]]'i est a",
-       "unusedtemplates": "Şablonê ke nêguriyenê",
+       "unusedtemplates": "Şablonê kı nêgurweyênê",
        "unusedtemplatestext": "no pel, {{ns:template}} pelê ke pelê binan de nêaseni, ninan keno.",
        "unusedtemplateswlh": "linkanê binî",
        "randompage": "Pela raştameyiye",
        "randompage-nopages": "Na {{PLURAL:$2|heruna namey|heruna nameyan}} de nê peli çıniyê: $1.",
-       "randomincategory": "Ğoseri pera kategoriya",
+       "randomincategory": "Kategori ra raşt amıyayi perr",
        "randomincategory-invalidcategory": "\"$1\" yew nameyê kategoriya vêrdiye niyo.",
        "randomincategory-nopages": "Kategori da [[:Category:$1|$1]] de qet  per çıniya.",
        "randomincategory-category": "Kategoriye:",
        "statistics-users": "[[Special:ListUsers|Karber]]ê qeydıni",
        "statistics-users-active": "Karberê aktifi",
        "statistics-users-active-desc": "{{PLURAL:$1|roco peyin de|$1 roco peyin de}} karber ê ke kar kerdê.",
-       "pageswithprop": "Peli be yew xısusiyetê pele",
+       "pageswithprop": "Perrê kı hendê ju perrer rê",
        "pageswithprop-legend": "Peli be yew xısusiyetê pele",
        "pageswithprop-text": "Na per pimanen pera kena liste.",
        "pageswithprop-prop": "Nameyo xısusi:",
        "brokenredirectstext": "Redireksiyonê ey ki pelanê hama çiniyeno ra link dano:",
        "brokenredirects-edit": "bıvurne",
        "brokenredirects-delete": "bestere",
-       "withoutinterwiki": "Pelê ke zıwananê binan rê gıreyê cı çıniyo",
+       "withoutinterwiki": "Perrê ke zıwananê binan rê gıreyê cı çıni yo",
        "withoutinterwiki-summary": "Enê pelî ke versiyonê ziwanî binî ra link nidano.",
        "withoutinterwiki-legend": "Verole",
        "withoutinterwiki-submit": "Bımocne",
-       "fewestrevisions": "Pelê be senık çımraviyarnayışi",
+       "fewestrevisions": "Perrê kı tewr tayn timaryayê",
        "nbytes": "$1 {{PLURAL:$1|bayt|bayti}}",
        "ncategories": "$1 {{PLURAL:$1|Kategori|Kategoriy}}",
        "ninterwikis": "$1 {{PLURAL:$1|interwiki|interwikiy}}",
        "nimagelinks": "$1 {{PLURAL:$1|pele de|pelan de}} gureyeno",
        "ntransclusions": "$1 {{PLURAL:$1|pele de|pelan de}} gureyeno",
        "specialpage-empty": "Seba na rapore netice çıniyo.",
-       "lonelypages": "Pelê seyi",
+       "lonelypages": "Perrê kı cı rê gre çıni yo",
        "lonelypagestext": "Ena pelî link nibiyê ya zi pelanê binî {{SITENAME}} de transclude biy.",
        "uncategorizedpages": "Pelê ke kategorize nêbiyê",
        "uncategorizedcategories": "Kategoriyê ke kategorize nêbiyê",
-       "uncategorizedimages": "Dosyeyê ke bêkategoriyê",
+       "uncategorizedimages": "Dosye yê  bêkategori",
        "uncategorizedtemplates": "Şablonê ke bêkategoriyê",
-       "unusedcategories": "Kategoriyê ke nêgureniyê",
+       "unusedcategories": "Kategoriyê ke nêkarênê",
        "unusedimages": "Dosyeyê ke nêguriyenê",
        "wantedcategories": "Kategoriyê ke waziyayê",
        "wantedpages": "Pelê ke waziyayê",
        "wantedpages-badtitle": "sernuşte meqbul niyo: $1",
-       "wantedfiles": "Dosyeyê cıgeyriyayeyi",
+       "wantedfiles": "Dosyeyê waştey",
        "wantedfiletext-cat": "Dosyaya cêrên karvıstedeya lakin çınya. Mewcud dosyayan de xeriba miyan de liste bena. Xırabiya wınisin dana <del>ateber</del>. Zewbi zi, şırê pela da dosyeyê ke çınyaya [[:$1]].",
        "wantedfiletext-nocat": "Dosyeyê cêrêni estê lekin karnêvıstê. Dosyeyê xeribi liste benê. bo babeta dano <del>ateber</del>",
        "wantedtemplates": "Şablonê ke waziyenê",
        "mostimages": "Dosyayan ke tewr zaf link estê.",
        "mostinterwikis": "Pelan ke tewr zaf interwiki biyê.",
        "mostrevisions": "Pelan ke tewr zaf revizyonî biyê.",
-       "prefixindex": "Veroleya peley pêro",
+       "prefixindex": "Verbenda pelli heme",
        "prefixindex-namespace": "Peleyê Veroleyıni ($1 cay nami)",
        "prefixindex-submit": "Bımocne",
        "prefixindex-strip": "Listeya réz bıyayışi",
-       "shortpages": "Pelê kılmeki",
-       "longpages": "Pe dergeki",
-       "deadendpages": "Pelê nêgıredayeyi",
+       "shortpages": "Perrê kılmeki",
+       "longpages": "Perrê  dergeki",
+       "deadendpages": "Perrê kı perranê binan rê grey c çıni yo",
        "deadendpagestext": "Ena pelan ke {{SITENAME}} de zerrî ey de link çini yo.",
-       "protectedpages": "Pelê pawıteyi",
+       "protectedpages": "Pellê kı pawıyayeyè",
        "protectedpages-indef": "têna pawıteyê bêmuddeti",
        "protectedpages-summary": "Listeya ena peler newke pawıtiya.Sername de  ena lista rê pawıte vıraştışi rê [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]] bıvinê.",
        "protectedpages-cascade": "Kilit biyaye ke teyna cascadiye",
        "listusers-desc": "Kemeyen rézed ratn",
        "usereditcount": "$1 {{PLURAL:$1|vurnayîş|vurnayîşî}}",
        "usercreated": "$2 de $1 {{GENDER:$3|viraziya}}",
-       "newpages": "Pelê newey",
+       "newpages": "Perrê newey",
        "newpages-submit": "Bımocne",
        "newpages-username": "Nameyê karberi:",
-       "ancientpages": "Pelê kehenêri",
+       "ancientpages": "Perrê kı rewnayo kı nêvuriya yê",
        "move": "Bıkırışe",
        "movethispage": "Ena pele bıkırışe",
        "unusedimagestext": "Enê dosyey estê, feqet zerrey yew pele de wedardey niyê.\nXo vira mekerê ke, sıteyê webiê bini şenê direkt ebe URLi yew dosya ra gırê bê, u wına şenê verba gurênayışo feal de tiya hewna lista bê.",
        "apisandbox-sending-request": "API waştış rışêno...",
        "apisandbox-request-url-label": "URL waştış:",
        "apisandbox-request-time": "Demê waştışi: {{PLURAL:$1|$1 ms}}",
-       "booksources": "Çımeyê kıtaban",
+       "booksources": "Çıme kıtabi",
        "booksources-search-legend": "Seba çımeyanê kıtaban cı geyre",
        "booksources-isbn": "ISBN:",
        "booksources-search": "Cı geyre",
        "checkbox-all": "Pêro",
        "checkbox-none": "Temam",
        "checkbox-invert": "Rageyre",
-       "allpages": "Peli pêro",
+       "allpages": "Pelli pêro",
        "nextpage": "Pela badê cû ($1)",
        "prevpage": "Pela verêne ($1)",
        "allpagesfrom": "Pera liste kerdışi bıasne:",
        "usermessage-editor": "Xeberdarê sistemi",
        "usermessage-template": "MediaWiki:UserMessage",
        "watchlist": "Listey pawıteyan",
-       "mywatchlist": "Listey pawıteyan",
+       "mywatchlist": "Lista mına cıewniyayışi",
        "watchlistfor2": "Qandê $1 ($2)",
        "nowatchlist": "listeya temaşa kerdıişê şıma de yew madde zi çina.",
        "watchlistanontext": "qey vurnayişê maddeya listeya temaşakerdiş ronıştış akerê",
        "removedwatchtext": "Ena pela \"[[:$1]]\" biya wedariya [[Special:Watchlist|listeyê seyr-kerdışi şıma]].",
        "removedwatchtext-short": "Pera $1`i listeya seyran de şıma ra wedari yê",
        "watch": "Seyr ke",
-       "watchthispage": "Na pele seyr ke",
+       "watchthispage": "Peller seyr kı",
        "unwatch": "Teqib meke",
        "unwatchthispage": "temaşa kerdışê peli vındarn.",
        "notanarticle": "mebhesê peli niyo",
        "rollback-success": "vurnayişê no kesi $1 tepiya geriyayo u hetê no\n$2 kesi ra cıwa ver o ke revizyon biyo no revizyon tepiya anciyayo.",
        "sessionfailure-title": "Seans xeripiya",
        "sessionfailure": "cıkewtışê hesabê şıma de yew problem aseno;\nno kar semedê dızdiyê hesabi ibtal biyo.\nkerem kerê \"tepiya\" şiyerê u pel o ke şıma tera ameyî u o pel newe ra bar kerê , newe ra tesel/cereb kerê.",
+       "changecontentmodel": "Modelê zerrekê pele bıvurne",
        "changecontentmodel-title-label": "Sernameyê pele",
        "changecontentmodel-model-label": "Modelê zerrekiyo newe",
        "changecontentmodel-reason-label": "Sebeb:",
        "tooltip-minoredit": "Nay vırnayışa werdi nışan bıkeré",
        "tooltip-save": "Vurnayışanê xo qeyd ke",
        "tooltip-publish": "Vurnayışê xo vıla kı",
-       "tooltip-preview": "Vurnayışané ğo çımra ravyarné. Verdé qeyd kerdışi eneri bıkarné!",
+       "tooltip-preview": "Vuryayışané xo çım ra ravyarné. Verdé qeyd kerdışi eneri bıkarné!",
        "tooltip-diff": "Metni sero vurnayışan mocneno",
        "tooltip-compareselectedversions": "Ena per de ferqê rewziyonan de dı weçinaya bıvinê",
        "tooltip-watch": "Ena pele lista xoya seyrkerdışi ke",
        "file-info-png-frames": "$1 {{PLURAL:$1|çerçeve|çerçeveyi}}",
        "file-no-thumb-animation": "'''Not: Dılet tekniko limit, gırd agozneya resm de qıckek de animasyoni miyan dı nêbo.'''",
        "file-no-thumb-animation-gif": "'''Not: Dılet tekniko limit, gırd agozneya resm de qıckek de  GIF imaci de animasyon do nêbo.'''",
-       "newimages": "Galeriya dosyanê neweyan",
+       "newimages": "Galeriya dosyanê newan",
        "imagelisttext": "Cêr de yew listeyê '''$1''' esto {{PLURAL:$1|dosya|dosyayi}} veçiniya $2.",
        "newimages-summary": "Ena pela xasi dosyayi ke peni de bar biyayeyi mocnane.",
        "newimages-legend": "Avrêc",
        "version": "Versiyon",
        "version-extensions": "Ekstensiyonî ke ronaye",
        "version-skins": "Bar kerde bejni",
-       "version-specialpages": "Pelê xısusiyi",
+       "version-specialpages": "Pellê xısusiy",
        "version-parserhooks": "Çengelê Parserî",
        "version-variables": "Vurnayeyî",
        "version-antispam": "Spam vındarnayış",
        "version-libraries-license": "Lisans",
        "version-libraries-description": "Şınasnayış",
        "version-libraries-authors": "Nuştekari",
-       "redirect": "Serşıkıtena dosya, karberi, pele ya ki revizyonê kamiya dosya",
+       "redirect": "Kırıştena dosya, karberi, perra ya ki revizyonê ID",
        "redirect-summary": "Na pela xase to hetê yew dosya (nameyê dosya dayeyo), yew pele (kamiya revizyoni ya zi pele dayiya) ya zi yew pela karberi (kamiya karberiya reqemkiye dayiya) ser şıknena. Gurenayış: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], ya zi  [[{{#Special:Redirect}}/user/101]].",
        "redirect-submit": "Şo",
        "redirect-lookup": "Bewni",
        "fileduplicatesearch-result-1": "Dosyayê ''$1î'' de hem-kopya çini yo.",
        "fileduplicatesearch-result-n": "Dosyayê ''$1î'' de {{PLURAL:$2|1 hem-kopya|$2 hem-kopyayî'}} esto.",
        "fileduplicatesearch-noresults": "Ebe namey \"$1\" ra dosya nêdiyayê.",
-       "specialpages": "Pelê xısusiyi",
+       "specialpages": "Pellê xısusiy",
        "specialpages-note-top": "Kıtabek",
        "specialpages-note": "* Pelê xasê normali.\n* <span class=\"mw-specialpagerestricted\">Pelê xasê nımıtey.</span>",
        "specialpages-group-maintenance": "Raporê pawıtışi",
        "specialpages-group-login": "Dekew / hesab vıraz",
        "specialpages-group-changes": "Vurnayışê peyêni û qeydi",
        "specialpages-group-media": "Raporê medya û barkerdışi",
-       "specialpages-group-users": "Karberi û heqi",
+       "specialpages-group-users": "Karberi u heqê cı",
        "specialpages-group-highuse": "Peleyê ke vêşi karênê",
        "specialpages-group-pages": "Listeyê pelan",
        "specialpages-group-pagetools": "Haletê pelan",
        "tags-create-reason": "Sebeb:",
        "tags-create-submit": "Vıraze",
        "tags-edit-reason": "Sebeb:",
-       "comparepages": "Pela miqeyese ke",
+       "comparepages": "Perra pêver kı",
        "compare-page1": "Pele 1",
        "compare-page2": "Pele 2",
        "compare-rev1": "Revizyonê 1i",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|bayt|bayti}}",
        "limitreport-expansiondepth": "Tewr veşi herayina dergbiyayışi",
        "limitreport-expensivefunctioncount": "Amoriya fonksiyonde vay agozni",
-       "expandtemplates": "şablonan hêra ker",
+       "expandtemplates": "şablona hera kı",
        "expand_templates_intro": "Na pela xususi metın geno u şablonê ke tedeyê reyna reyna hêra keno.\nU hem zi nê fonksiyonan hêra keno\n<nowiki>{{</nowiki>#language:…}}</code>, u zey nê parametreyan\n<nowiki>{{</nowiki>CURRENTDAY}}</code>\nEneri Medya wiki sera xo keno.",
        "expand_templates_title": "Sernameyê weziyeti, misal qandê {{FULLPAGENAME}}.:",
        "expand_templates_input": "sernameyê cıkewtışi:",
        "mw-widgets-dateinput-placeholder-day": "SSSS-AA-RR",
        "mw-widgets-dateinput-placeholder-month": "SSSS-AA",
        "mw-widgets-titleinput-description-redirect": "berd be $1",
-       "log-action-filter-newusers": "Babetê hesabvıraştışi:"
+       "randomrootpage": "Raştamaye perra çımey",
+       "log-action-filter-newusers": "Babetê hesabvıraştışi:",
+       "changecredentials": "Malumatanê karberi bıvurnê",
+       "removecredentials": "Kamiyer wedarne",
+       "removecredentials-submit": "Kamiyer wedarne"
 }
index cf025f0..f59d719 100644 (file)
        "yourpasswordagain": "Šćitne gronidło hyšći raz zapódaś:",
        "createacct-yourpasswordagain": "Gronidło wobkšuśiś",
        "createacct-yourpasswordagain-ph": "Zapódaj gronidło hyšći raz",
-       "remembermypassword": "Na toś tom licadle pśizjawjony wóstaś (za maksimalnje $1 {{PLURAL:$1|źeń|dnja|dny|dnjow}})",
        "userlogin-remembermypassword": "Pśizjawjony wóstaś",
        "userlogin-signwithsecure": "Wěsty zwisk wužywaś",
        "yourdomainname": "Twója domejna",
        "activeusers-intro": "To jo lisćina wužywarjow, kotrež su byli aktiwne za {{PLURAL:$1|slědny źeń|slědnej $1 dnja|slědne $1 dny|slědnych $1 dnjow}}.",
        "activeusers-count": "$1 {{PLURAL:$1|akcija|akciji|akcije|akcijow}} w {{PLURAL:$3|slědnem dnju|slědnyma $3 dnjoma|slědnych $3 dnjach}}",
        "activeusers-from": "Wužywarjow zwobrazniś, zachopinajucy z:",
-       "activeusers-hidebots": "Boty schowaś",
-       "activeusers-hidesysops": "Administratorow schowaś",
        "activeusers-noresult": "Žedne wužywarje namakane.",
        "listgrouprights": "Pšawa wužywarskeje kupki",
        "listgrouprights-summary": "To jo lisćina wužywarskich kupkow definěrowanych w toś tom wikiju z jich zwězanymi pśistupnymi pšawami. Móžo [[{{MediaWiki:Listgrouprights-helppage}}|pśidatne informacije]] wó jadnotliwych pšawach daś.",
        "htmlform-cloner-create": "Wěcej pśidaś",
        "htmlform-cloner-delete": "Wótpóraś",
        "htmlform-cloner-required": "Nanejmjenjej jadna gódnota jo trěbna.",
-       "sqlite-has-fts": "Wersija $1 z pódpěru za połnotekstowe pytanje",
-       "sqlite-no-fts": "Wersija $1 bźez pódpěry za połnotekstowe pytanje",
        "logentry-delete-delete": "$1 jo bok $3 {{GENDER:$2|wulašował|wulašowała}}",
        "logentry-delete-restore": "$1 jo bok $3 {{GENDER:$2|wótnowił|wótnowiła}}",
        "logentry-delete-event": "$1 jo {{GENDER:$2|změnił|změniła}} widobnosć {{PLURAL:$5|protokolowego zapiska|$5 protokoloweju zapiskowu|$5 protokolowych zapiskow}} na $3: $4",
index e40e405..68ce13c 100644 (file)
        "yourpasswordagain": "Mintaipo kaatalib:",
        "createacct-yourpasswordagain": "Kompomo borospanalib",
        "createacct-yourpasswordagain-ph": "Posuango kaagu borospanalib",
-       "remembermypassword": "Soroho ot loginku id popogihuman diti (gisom solinaid do $1 {{PLURAL:$1|tadau|madau}})",
        "userlogin-remembermypassword": "Potilombuso oku do poinsuang log",
        "userlogin-signwithsecure": "Gunoo noputan noumoligan",
        "yourdomainname": "Damin nu:",
        "passwordreset-emailtitle": "Kointalangan takaun id {{SITENAME}}",
        "passwordreset-emailelement": "Ngaranmoguno: \n$1\n\nKaatalib daamot: \n$2",
        "passwordreset-emailsentemail": "Surat-i pononsorou nakaatod noh.",
-       "passwordreset-emailsent-capture": "Surat-i pononsorou nakaatod noh, miagal id siriba diti.",
-       "passwordreset-emailerror-capture": "Surat-i pononsorou nopudali noh, miagal id siriba diti, nga awu kaatod id momomoguno: $1",
        "changeemail": "Alanai porikatan surat-i",
        "changeemail-header": "Alanai akaun porikatan surat-i",
        "changeemail-no-info": "Mositi sumuang log ko do mongoguno monilombus id bolikon diti.",
index 2a4bf50..b6e1b18 100644 (file)
        "category-file-count-limited": "निम्न {{PLURAL:$1|फाइल|$1 फाइलहरू}} यै श्रेणीमी रया छ ।",
        "listingcontinuesabbrev": "निरन्तरता...",
        "index-category": "क्रमाङ्कित पानाहरू",
-       "noindex-category": "à¤\95à¥\8dरमाà¤\99à¥\8dà¤\95न à¤¨à¤\97रà¥\80याà¤\95ा à¤ªà¤¾à¤¨à¤¾à¤¹à¤°à¥\82",
+       "noindex-category": "à¤\85नà¥\81à¤\95à¥\8dरमित à¤¨à¤\85रियाऽ à¤ªà¤¨à¥\8dनाà¤\85न",
        "broken-file-category": "टुटेको फाइल लिङ्कहरूसितको पाना",
        "about": "बारेमी",
        "article": "सामाग्री पानो",
        "passwordreset": "पासवर्ड पूर्वनिर्धारित गर",
        "passwordreset-username": "प्रयोगकर्ता-नाम:",
        "passwordreset-domain": "डोमेन",
-       "passwordreset-capture": "निस्कने इमेलको नमुना हेर्ने ?",
        "passwordreset-email": "इमेल ठेगाना:",
        "passwordreset-emailtitle": "{{SITENAME}}मा खाता विवरण",
        "passwordreset-emailelement": "प्रयोगकर्ताको नाम: \n$1\n\nअस्थाई पासवर्ड: \n$2",
        "passwordreset-emailsentemail": "यदि यो इमेल ठेगाना तम सित सम्बन्धित छ भण्या, तब यक पासवर्ड रिसेट इमेल पठाएलो।",
-       "passwordreset-invalideamil": "अबैध ई-मेल ठेगाना",
+       "passwordreset-invalidemail": "अबैध ई-मेल ठेगाना",
        "changeemail": "इमेल ठेगाना बदेल वा हटा",
        "changeemail-header": "तमरो इमेल ठेगाना बदेल्लाइ एइ फाराम पुराइ भरऽ। यदि तम तमरा खाता बठेइ कसै लै इमेल ठेगाना सितोऽ सम्बन्ध हटौन चाहन्छऽ भण्या, फाराम बुजौन्ज्याँ नौलो इमेल ठेगाना भण्ण्या ठौर खालि छाण्याऽ।",
        "changeemail-oldemail": "अईलको इमेल-ठेगाना:",
        "searchprofile-advanced-tooltip": "अनुकुल नेमस्पेसमा खोज्या",
        "search-result-size": "$1 ({{PLURAL:$2|1 आँखर|$2 आँखर}})",
        "search-result-category-size": "{{PLURAL:$1|एक सदस्य|$1 सदस्यहरू}} ({{PLURAL:$2|1 उपश्रेणी|$2  उपश्रेणीहरू}}, {{PLURAL:$3|एउटा फाइल|$3 फाइलहरू}})",
-       "search-redirect": "(जान्या $1)",
+       "search-redirect": "($1 बठेइ पुन:निर्देशित)",
        "search-section": "(खण्ड $1)",
        "search-category": "(श्रेणी $1)",
        "search-file-match": "(भेटिईया फाइल सामाग्री)",
        "userrights-changeable-col": "तमले परिवर्तन गद्द सक्दया समूहअन",
        "userrights-unchangeable-col": "तमीले परिवर्तन गद्द नसक्ने समूहहरू",
        "userrights-conflict": "प्रयोगकर्ताको अधिकार परिवर्तनमी मतभेद भयो ! कृपया तमरो परिवर्तन पुनरावलोकन तथा पुष्टि गर ।",
-       "userrights-removed-self": "तमले सफलतापूर्वक आफनो अधिकारहरूलाई मेटाया । त्यै कारण तम आब यो पानो हेद्द नाइसक्दा ।",
        "group": "समूह:",
        "group-user": "प्रयोगकर्ताहरू",
        "group-autoconfirmed": "स्वत स्थापित प्रयोगकर्ताहरू",
        "activeusers-intro": "यो सूची ती प्रयोगकर्तानको हो जनले विगत $1 {{PLURAL:$1|दिन| दिन}}मी  गतिविधि देखायाकाछन्।",
        "activeusers-count": "विगत {{PLURAL:$3|दिनमी|$3 दिनहरूमी}}  $1 {{PLURAL:$1|सम्पादन गरियो|सम्पादनहरू गरिया}}",
        "activeusers-from": "यहाँबठे सुरु हुन्या प्रयोगकर्ताहरू धेकाओ:",
-       "activeusers-hidesysops": "प्रवन्धकहरू लुकाउन्या",
        "activeusers-noresult": "प्रयोगकर्ताहरू भेटियानन्",
        "mailnologintext": "तमीले अरु प्रयोगकर्तानलाई ईमेल पठाउनको लागि आफु पहिली [[Special:UserLogin|प्रवेश(लगइन)गर्याको]] हुनुपडन्छ र [[Special:Preferences|आफ्नो रोजाइहरूमी]] एउटा वैध ईमेल ठेगाना भयाको हुनुपडन्छ ।",
        "emailpagetext": "तल दियाको फार्मले तमी यै {{GENDER:$1|प्रयोगकर्ता}}लाई इमेल पठाउन सक्द्या हौ । तमीले जो ठेगाना [[Special:Preferences|आफ्नो प्रयोगकर्ता रोजाईहरू]]मी दियाका छियौ त्यो यै इमेललाई \"पठाउने\" को रूपमी आउन्याछ, अतः प्राप्तकर्ता तमीलाई सिधै जवाफ दिनसक्द्याछ ।",
        "logentry-newusers-create": "प्रयोगकर्ता खाता $1 {{GENDER:$2|खोलियो}}",
        "logentry-upload-upload": "$1 ले $3 {{GENDER:$2|अपलोड अरेका छन्}}",
        "feedback-bugornote": "यदि तमी कुनै प्राविधिक समस्यालाई विस्तारले सम्झाउन तयार छौ भण्या कृपया [$1 बग राख]।\nयदि हैन, भण्या तमी तल दियाको सरल फारमको प्रयोग गद्दसक्द्याहौ । तमरो टिप्पणी, तमरो प्रयोगकर्ता नाम र तमरो ब्राउजरको नाम सहित \"[$3 $2]\" पानामी जोडिन्याछ ।",
-       "searchsuggest-search": "खोज:",
+       "searchsuggest-search": "{{SITENAME}} खोजऽ",
        "api-error-duplicate": "यै साइटमी पहिलीबठे यस्तै सामग्री {{PLURAL:$1|भयाको अर्को फाइल छ|भयाका  केहि अरु फाइलहरू छन्}} ।",
        "api-error-duplicate-archive": "यै साइटमी पहिलेबाट यस्तै सामग्री {{PLURAL:$1|भयाको अर्को फाइल थियो|भयाका केहि अरु फाइलहरू थिए}} ।\nतर {{PLURAL:$1|यो मेट्याको थियो|यी मेटायाका थिए}} ।",
        "expand_templates_preview_fail_html": "<em>किनकि {{SITENAME}} सिधै एचटिएमयल सक्षम छ र तमीले लग इन गर्या छैनौ, पूर्वावलोकन लुकाइयाको छ ताकि सम्भावित जाभास्क्रिप्ट आक्रमणलाई रोक्द सकियोस् ।</em>\n\n<strong>यदि यो मान्य पूर्ववावलोकन प्रयास हो भण्या पुन प्रयास गर ।</strong>\nयदि यसले कार्य पूर्ण भएन भण्या [[Special:UserLogout|लग आउट गरिबर]] फेरी लग इन गर्या ।",
index 8e70898..40d6931 100644 (file)
        "categories": "ގިސްމުތައް",
        "categoriespagetext": "ތިރީގައި މިވާ ގިސްމުތައް ވިކީ ގައި މައުޖޫދުވެގެން ވެއެވެ.\n[[Special:UnusedCategories|Unused categories]] are not shown here.\nAlso see [[Special:WantedCategories|wanted categories]].",
        "activeusers": "ހަރަކާތްތެރި މެމްބަރުންގެ ލިސްޓު",
-       "activeusers-hidebots": "ބޮޓް ފޮރުއްވާ",
-       "activeusers-hidesysops": "އެޑްމިނިސްޓްރޭޓަރުން ފޮރުއްވާ",
        "listgrouprights-members": "(މެމްބަރުންގެ ލިސްޓު)",
        "emailuser": "މި މެންބަރަށް އީމޭލު ފޮނުއްވާ",
        "watchlist": "މަގޭ ނަޒަރު",
index dcb9f4c..3cfb2c2 100644 (file)
        "cannotloginnow-title": "Δεν μπορείτε να συνδεθείτε τώρα",
        "cannotloginnow-text": "Η σύνδεση δεν είναι δυνατή όταν χρησιμοποιείτε την $1.",
        "cannotcreateaccount-title": "Αδυναμία δημιουργίας λογαριασμού",
+       "cannotcreateaccount-text": "Άμεση δημιουργία λογαριασμού δεν είναι ενεργοποιημένη σε αυτό το wiki.",
        "yourdomainname": "Το domain σας:",
        "password-change-forbidden": "Δεν μπορείτε να αλλάξετε τους κωδικούς πρόσβασης σε αυτό το βίκι.",
        "externaldberror": "Είτε συνέβη κάποιο σφάλμα εξωτερικής πιστοποίησης της βάσης δεδομένων είτε δεν σας έχει επιτραπεί να ενημερώσετε τον εξωτερικό σας λογαριασμό.",
        "botpasswords-newpassword": "Ο νέος κωδικός πρόσβασης για να συνδεθείτε με το <strong>$1</strong> είναι <strong>$2</strong>. <em>Παρακαλούμε σημειώστε το για μελλοντική αναφορά.</em><br />(Για παλιά bot που απαιτούν το όνομα σύνδεσης να είναι το ίδιο με το τελικό όνομα χρήστη, μπορείτε επίσης να χρησιμοποιήσετε το  <strong>$3</strong> ως όνομα χρήστη και <strong>$4</strong> ως κωδικό.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider δεν είναι διαθέσιμο.",
        "botpasswords-restriction-failed": "Περιορισμοί κωδικών πρόσβασης bot εμποδίζουν τη συγκεκριμένη σύνδεση.",
+       "botpasswords-invalid-name": "Το όνομα χρήστη που ορίζεται δεν περιέχει το διαχωριστικό κωδικό πρόσβασης bot (\"$1\").",
+       "botpasswords-not-exist": "Ο χρήστης \"$1\" δεν έχει κωδικό bot με όνομα \"$2\"",
        "resetpass_forbidden": "Οι κωδικοί πρόσβασης δεν μπορούν να αλλαχθούν",
        "resetpass_forbidden-reason": "Οι κωδικοί πρόσβασης δεν μπορούν να αλλαχθούν: $1",
        "resetpass-no-info": "Πρέπει να είστε συνδεδεμένος για να δείτε αυτήν την σελίδα απευθείας",
        "passwordreset-emaildisabled": "Τα χαρακτηριστικά ηλεκτρονικού ταχυδρομείου έχουν απενεργοποιηθεί σ' αυτό το wiki.",
        "passwordreset-username": "Όνομα χρήστη:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Προβολή του μηνύματος ηλεκτρονικού ταχυδρομείου που δημιουργήθηκε;",
-       "passwordreset-capture-help": "Εάν μαρκάρετε αυτό το πλαίσιο, το μήνυμα ηλεκτρονικού ταχυδρομείου (με το προσωρινό κωδικό πρόσβασης) θα εμφανιστεί σε σας καθώς θα αποσταλεί στο χρήστη.",
        "passwordreset-email": "Διεύθυνση ηλεκτρονικού ταχυδρομείου:",
        "passwordreset-emailtitle": "Λεπτομέρειες λογαριασμού για {{SITENAME}}",
        "passwordreset-emailtext-ip": "Κάποιος (πιθανώς εσείς, από την διεύθυνση IP $1) ζήτησε την επαναφορά του κωδικού σας σε {{SITENAME}} ($4).  {{PLURAL:$3|Ο ακόλουθος λογαριασμός|Οι ακόλουθοι λογαριασμοί}} χρήστη συνδέονται με αυτή τη διεύθυνση e-mail:\n\n$2\n\n{{PLURAL:$3|Αυτός ο προσωρινός κωδικός πρόσβασης θα λήξει|Αυτοί οι προσωρινοί κωδικοί πρόσβασης θα λήξουν}} σε {{PLURAL:$5|μία ημέρα|$5 ημέρες}}.\nΘα πρέπει να συνδεθείτε τώρα και να επιλέξετε ένα νέο κωδικό. Αν κάποιος άλλος έκανε αυτό το αίτημα ή αν έχετε θυμηθεί τον αρχικό κωδικό πρόσβασής σας, και δεν επιθυμείτε πια να τον αλλάξετε, μπορείτε να αγνοήσετε αυτό το μήνυμα και να συνεχίσετε να χρησιμοποιείτε τον παλιό σας κωδικό πρόσβασης.",
        "passwordreset-emailelement": "Όνομα χρήστη: \n$1\n\nΠροσωρινός κωδικός πρόσβασης:\n$2",
        "passwordreset-emailsentemail": "Αν αυτή η διεύθυνση ηλεκτρονικού ταχυδρομείου συνδέεται με το  λογαριασμό σας, τότε  θα σας αποσταλεί μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού πρόσβασης.",
        "passwordreset-emailsentusername": "Αν υπάρχει μια διεύθυνση ηλεκτρονικού ταχυδρομείου που συνδέεται με αυτό το όνομα χρήστη, τότε θα σας αποσταλεί ένα μήνυμα ηλεκτρονικού ταχυδρομείου για την επαναφορά του κωδικού πρόσβασης.",
-       "passwordreset-invalideamil": "Μη έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
+       "passwordreset-invalidemail": "Μη έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου",
        "changeemail": "Αλλαγή ή αφαίρεση της διεύθυνσης ηλεκτρονικού ταχυδρομείου",
        "changeemail-header": "Συμπληρώστε αυτήν τη φόρμα για να αλλάξετε τη διεύθυνσή σας ηλεκτρονικού ταχυδρομείου. Αν θέλετε να καταργήσετε τη σύνδεση οποιασδήποτε διεύθυνσης ηλεκτρονικού ταχυδρομείου με το λογαριασμό σας, αφήστε τη νέα διεύθυνση ηλεκτρονικού ταχυδρομείου κενή κατά την υποβολή της φόρμας.",
        "changeemail-no-info": "Πρέπει να έχετε συνδεθεί για άμεση πρόσβαση σε αυτήν τη σελίδα.",
        "prefs-help-recentchangescount": "Αυτό περιλαμβάνει τις πρόσφατες αλλαγές, τα ιστορικά των σελίδων, και τα αρχεία διαγραφών.",
        "prefs-help-watchlist-token2": "Αυτό είναι το μυστικό κλειδί για την web τροφοδοσία  της λίστας παρακολούθησής σας.\nΌποιος το γνωρίζει θα είναι σε θέση να διαβάσει την λίστα παρακολούθησης σας, οπότε μην τον μοιράζεστε.\n[[Special:ResetTokens|Κάνε κλικ εδώ εάν θέλετε να τον επαναφέρετε]].",
        "savedprefs": "Οι προτιμήσεις σας έχουν αποθηκευτεί.",
-       "savedrights": "Τα Î´Î¹ÎºÎ±Î¹Ï\8eμαÏ\84α Ï\87Ï\81ήÏ\83Ï\84η Î±Ï\80Ï\8c {{GENDER:$1|$1}} έχουν αποθηκευτεί.",
+       "savedrights": "Î\9fι Î¿Î¼Î¬Î´ÎµÏ\82 Ï\87Ï\81ηÏ\83Ï\84Ï\8eν {{GENDER:$1|Ï\84οÏ\85 $1|Ï\84ηÏ\82 $1}} έχουν αποθηκευτεί.",
        "timezonelegend": "Ζώνη ώρας:",
        "localtime": "Εμφάνιση τοπικής ώρας:",
        "timezoneuseserverdefault": "Χρήση της προεπιλογής του wiki ($1)",
        "userrights-reason": "Αιτία:",
        "userrights-no-interwiki": "Δεν έχετε άδεια να επεξεργαστείτε τα δικαιώματα χρηστών σε άλλα wiki.",
        "userrights-nodatabase": "Η βάση δεδομένων $1 δεν υπάρχει ή δεν είναι τοπική.",
-       "userrights-nologin": "Πρέπει να [[Special:UserLogin|συνδεθείτε]] με έναν λογαριασμό διαχειριστή συστήματος ώστε να ορίσετε δικαιώματα χρηστών.",
-       "userrights-notallowed": "Δεν έχετε άδεια να προσθέσετε ή να καταργήσετε δικαιώματα χρήστη.",
        "userrights-changeable-col": "Ομάδες που μπορείτε να αλλάξετε",
        "userrights-unchangeable-col": "Ομάδες που δεν μπορείτε να αλλάξετε",
        "userrights-conflict": "Σύγκρουση αλλαγών στα δικαιώματα χρήστη! Παρακαλώ επανεξετάστε και επικυρώστε τις αλλαγές σας.",
-       "userrights-removed-self": "Έχετε καταργήσει τα δικά σας δικαιώματα. Ως εκ τούτου, δεν είστε πλέον σε θέση να έχετε πρόσβαση σε αυτή τη σελίδα.",
        "group": "Ομάδα:",
        "group-user": "Χρήστες",
        "group-autoconfirmed": "Αυτοεπιβεβαιωμένοι χρήστες",
        "right-siteadmin": "Κλείδωμα και ξεκλείδωμα της βάσης δεδομένων",
        "right-override-export-depth": "Εξαγωγή σελίδων συμπεριλαμβάνοντας συνδεδεμένες σελίδες έως ένα βάθος 5 επιπέδων",
        "right-sendemail": "Αποστολή ηλεκτρονικού μηνύματος σε άλλους χρήστες",
-       "right-passwordreset": "Εμφάνιση email επαναφοράς κωδικού πρόσβασης",
        "right-managechangetags": "Δημιουργία και (απ)ενεργοποίηση [[Special:Tags|ετικετών]]",
        "right-applychangetags": "Εφαρμόστε [[Special:Tags|ετικέτες]] μαζί με τις αλλαγές",
        "right-changetags": "Προσθέστε και αφαιρέστε αυθαίρετες [[Special:Tags|ετικέτες]] σε μεμονωμένες εκδόσεις και καταχωρήσεις καταγραφών",
        "activeusers-intro": "Αυτή είναι μια λίστα από χρήστες που είχαν κάποιου είδους δραστηριότητα {{PLURAL:$1|την τελευταία $1 μέρα|τις τελευταίες $1 μέρες}}.",
        "activeusers-count": "$1 {{PLURAL:$1|ενέργεια|ενέργειες}} {{PLURAL:$3|την τελευταία μέρα|τις τελευταίες $3 μέρες}}",
        "activeusers-from": "Προβολή χρηστών ξεκινώντας από:",
-       "activeusers-hidebots": "Απόκρυψη bots",
-       "activeusers-hidesysops": "Απόκρυψη διαχειριστών",
        "activeusers-noresult": "Δεν βρέθηκε χρήστης.",
        "activeusers-submit": "Προβολή ενεργών χρηστών",
        "listgrouprights": "Δικαιώματα ομάδων χρηστών",
        "htmlform-user-not-exists": "Δεν υπάρχει χρήστης με όνομα <strong>$1</strong>.",
        "htmlform-user-not-valid": "Το <strong>$1</strong> δεν είναι έγκυρο όνομα χρήστη.",
        "logentry-delete-delete": "{{GENDER:$2|Ο|Η}} $1 διέγραψε τη σελίδα $3",
+       "logentry-delete-delete_redir": "{{GENDER:$2|Ο|Η}} $1 διέγραψε την ανακατεύθυνση $3 με αντικατάσταση",
        "logentry-delete-restore": "Ο/Η $1 αποκατέστησε τη σελίδα $3",
        "logentry-delete-event": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ορατότητα {{PLURAL:$5|ενός καταγραφόμενου συμβάντος|$5 καταγραφόμενων συμβάντων}} στο $3: $4",
        "logentry-delete-revision": "{{GENDER:$2|Ο|Η}} $1 άλλαξε την ορατότητα {{PLURAL:$5|μίας αναθεώρησης|$5 αναθεωρήσεων}} στη σελίδα $3: $4",
        "feedback-thanks": "Ευχαριστούμε! Τα σχόλιά σας έχουν καταχωρηθεί στη σελίδα \"[$2 $1]\".",
        "feedback-thanks-title": "Σας ευχαριστούμε!",
        "feedback-useragent": "User agent:",
-       "searchsuggest-search": "Αναζήτηση",
+       "searchsuggest-search": "Αναζήτηση σε {{SITENAME}}",
        "searchsuggest-containing": "περιέχει...",
        "api-error-badaccess-groups": "Δεν επιτρέπεται να ανεβάσετε αρχεία σε αυτό το wiki.",
        "api-error-badtoken": "Εσωτερικό σφάλμα: εσφαλμένο διακριτικό.",
index d3643dd..afd13f0 100644 (file)
        "views": "Views",
        "toolbox": "Tools",
        "tool-link-userrights": "Change {{GENDER:$1|user}} groups",
+       "tool-link-userrights-readonly": "View {{GENDER:$1|user}} groups",
        "tool-link-emailuser": "Email this {{GENDER:$1|user}}",
        "userpage": "View user page",
        "projectpage": "View project page",
        "passwordreset-emaildisabled": "Email features have been disabled on this wiki.",
        "passwordreset-username": "Username:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "View the resulting email?",
-       "passwordreset-capture-help": "If you check this box, the email (with the temporary password) will be shown to you as well as being sent to the user.",
        "passwordreset-email": "Email address:",
        "passwordreset-emailtitle": "Account details on {{SITENAME}}",
        "passwordreset-emailtext-ip": "Someone (probably you, from IP address $1) requested a reset of your\npassword for {{SITENAME}} ($4). The following user {{PLURAL:$3|account is|accounts are}}\nassociated with this email address:\n\n$2\n\n{{PLURAL:$3|This temporary password|These temporary passwords}} will expire in {{PLURAL:$5|one day|$5 days}}.\nYou should log in and choose a new password now. If someone else made this\nrequest, or if you have remembered your original password, and you no longer\nwish to change it, you may ignore this message and continue using your old\npassword.",
        "passwordreset-emailelement": "Username:\n$1\n\nTemporary password:\n$2",
        "passwordreset-emailsentemail": "If this email address is associated with your account, then a password reset email will be sent.",
        "passwordreset-emailsentusername": "If there is an email address associated with this username, then a password reset email will be sent.",
-       "passwordreset-emailsent-capture2": "The password reset {{PLURAL:$1|email has|emails have}} been sent. The {{PLURAL:$1|username and password|list of usernames and passwords}} is shown here.",
-       "passwordreset-emailerror-capture2": "Emailing the {{GENDER:$2|user}} failed: $1 The {{PLURAL:$3|username and password|list of usernames and passwords}} is shown here.",
        "passwordreset-nocaller": "A caller must be provided",
        "passwordreset-nosuchcaller": "Caller does not exist: $1",
        "passwordreset-ignored": "The password reset was not handled. Maybe no provider was configured?",
-       "passwordreset-invalideamil": "Invalid email address",
+       "passwordreset-invalidemail": "Invalid email address",
        "passwordreset-nodata": "Neither a username nor an email address was supplied",
        "changeemail": "Change or remove email address",
        "changeemail-summary": "",
        "prefs-help-recentchangescount": "This includes recent changes, page histories, and logs.",
        "prefs-help-watchlist-token2": "This is the secret key to the web feed of your watchlist.\nAnyone who knows it will be able to read your watchlist, so do not share it.\nIf you need to, [[Special:ResetTokens|you can reset it]].",
        "savedprefs": "Your preferences have been saved.",
-       "savedrights": "The user rights of {{GENDER:$1|$1}} have been saved.",
+       "savedrights": "The user groups of {{GENDER:$1|$1}} have been saved.",
        "timezonelegend": "Time zone:",
        "localtime": "Local time:",
        "timezoneuseserverdefault": "Use wiki default ($1)",
        "prefs-tabs-navigation-hint": "Tip: You can use the left and right arrow keys to navigate between the tabs in the tabs list.",
        "userrights": "User rights management",
        "userrights-summary": "",
-       "userrights-lookup-user": "Manage user groups",
+       "userrights-lookup-user": "Select a user",
        "userrights-user-editname": "Enter a username:",
-       "editusergroup": "Edit {{GENDER:$1|user}} groups",
+       "editusergroup": "Load user groups",
        "editinguser": "Changing user rights of {{GENDER:$1|user}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Edit user groups",
        "saveusergroups": "Save {{GENDER:$1|user}} groups",
        "userrights-reason": "Reason:",
        "userrights-no-interwiki": "You do not have permission to edit user rights on other wikis.",
        "userrights-nodatabase": "Database $1 does not exist or is not local.",
-       "userrights-nologin": "You must [[Special:UserLogin|log in]] with an administrator account to assign user rights.",
-       "userrights-notallowed": "You do not have permission to add or remove user rights.",
        "userrights-changeable-col": "Groups you can change",
        "userrights-unchangeable-col": "Groups you cannot change",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Conflict of user rights changes! Please review and confirm your changes.",
-       "userrights-removed-self": "You removed your own rights. As such, you are no longer able to access this page.",
        "group": "Group:",
        "group-user": "Users",
        "group-autoconfirmed": "Autoconfirmed users",
        "right-siteadmin": "Lock and unlock the database",
        "right-override-export-depth": "Export pages including linked pages up to a depth of 5",
        "right-sendemail": "Send email to other users",
-       "right-passwordreset": "View password reset emails",
        "right-managechangetags": "Create and (de)activate [[Special:Tags|tags]]",
        "right-applychangetags": "Apply [[Special:Tags|tags]] along with one's changes",
        "right-changetags": "Add and remove arbitrary [[Special:Tags|tags]] on individual revisions and log entries",
        "apisandbox-continue": "Continue",
        "apisandbox-continue-clear": "Clear",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} will [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continue] the last request; {{int:apisandbox-continue-clear}} will clear continuation-related parameters.",
+       "apisandbox-param-limit": "Enter <kbd>max</kbd> to use the maximum limit.",
+       "apisandbox-multivalue-all-namespaces": "$1 (All namespaces)",
+       "apisandbox-multivalue-all-values": "$1 (All values)",
        "booksources": "Book sources",
        "booksources-summary": "",
        "booksources-search-legend": "Search for book sources",
        "activeusers-count": "$1 {{PLURAL:$1|action|actions}} in the last {{PLURAL:$3|day|$3 days}}",
        "activeusers-from": "Display users starting at:",
        "activeusers-groups": "Display users belonging to groups:",
+       "activeusers-excludegroups": "Exclude users belonging to groups:",
        "activeusers-noresult": "No users found.",
        "activeusers-submit": "Display active users",
        "listgrouprights": "User group rights",
        "listgrants-summary": "The following is a list of grants with their associated access to user rights. Users can authorize applications to use their account, but with limited permissions based on the grants the user gave to the application. An application acting on behalf of a user cannot actually use rights that the user does not have however.\nThere may be [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] about individual rights.",
        "listgrants-grant": "Grant",
        "listgrants-rights": "Rights",
+       "listgrants-grant-display": "$1 <code>($2)</code>",
        "trackingcategories": "Tracking categories",
        "trackingcategories-summary": "This page lists tracking categories which are automatically populated by the MediaWiki software. Their names can be changed by altering the relevant system messages in the {{ns:8}} namespace.",
        "trackingcategories-msg": "Tracking category",
        "tags-deactivate": "deactivate",
        "tags-hitcount": "$1 {{PLURAL:$1|change|changes}}",
        "tags-manage-no-permission": "You do not have permission to manage change tags.",
-       "tags-manage-blocked": "You cannot manage change tags while you are blocked.",
+       "tags-manage-blocked": "You cannot manage change tags while {{GENDER:$1|you}} are blocked.",
        "tags-create-heading": "Create a new tag",
        "tags-create-explanation": "By default, newly created tags will be made available for use by users and bots.",
        "tags-create-tag-name": "Tag name:",
        "tags-deactivate-not-allowed": "It is not possible to deactivate the tag \"$1\".",
        "tags-deactivate-submit": "Deactivate",
        "tags-apply-no-permission": "You do not have permission to apply change tags along with your changes.",
-       "tags-apply-blocked": "You cannot apply change tags along with your changes while you are blocked.",
+       "tags-apply-blocked": "You cannot apply change tags along with your changes while {{GENDER:$1|you}} are blocked.",
        "tags-apply-not-allowed-one": "The tag \"$1\" is not allowed to be manually applied.",
        "tags-apply-not-allowed-multi": "The following {{PLURAL:$2|tag is|tags are}} not allowed to be manually applied: $1",
        "tags-update-no-permission": "You do not have permission to add or remove change tags from individual revisions or log entries.",
-       "tags-update-blocked": "You cannot add or remove change tags while you are blocked.",
+       "tags-update-blocked": "You cannot add or remove change tags while {{GENDER:$1|you}} are blocked.",
        "tags-update-add-not-allowed-one": "The tag \"$1\" is not allowed to be manually added.",
        "tags-update-add-not-allowed-multi": "The following {{PLURAL:$2|tag is|tags are}} not allowed to be manually added: $1",
        "tags-update-remove-not-allowed-one": "The tag \"$1\" is not allowed to be removed.",
        "htmlform-user-not-valid": "<strong>$1</strong> isn't a valid username.",
        "rawmessage": "$1",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} page $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|deleted}} redirect $3 by overwriting",
        "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3",
        "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a revision|$5 revisions}} on page $3: $4",
        "mw-widgets-dateinput-no-date": "No date selected",
        "mw-widgets-dateinput-placeholder-day": "YYYY-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM",
+       "mw-widgets-mediasearch-input-placeholder": "Search for media",
+       "mw-widgets-mediasearch-noresults": "No results found.",
        "mw-widgets-titleinput-description-new-page": "page does not exist yet",
        "mw-widgets-titleinput-description-redirect": "redirect to $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Add a category...",
        "sessionmanager-tie": "Cannot combine multiple request authentication types: $1.",
        "sessionprovider-generic": "$1 sessions",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-based sessions",
        "log-action-filter-contentmodel-change": "Change of Contentmodel",
        "log-action-filter-contentmodel-new": "Creation of page with non-standard Contentmodel",
        "log-action-filter-delete-delete": "Page deletion",
+       "log-action-filter-delete-delete_redir": "Redirect overwrite",
        "log-action-filter-delete-restore": "Page undeletion",
        "log-action-filter-delete-event": "Log deletion",
        "log-action-filter-delete-revision": "Revision deletion",
        "usercssispublic": "Please note: CSS subpages should not contain confidential data as they are viewable by other users.",
        "restrictionsfield-badip": "Invalid IP address or range: $1",
        "restrictionsfield-label": "Allowed IP ranges:",
-       "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Error: $1",
-       "edit-error-long": "Errors:\n\n$1"
+       "restrictionsfield-help": "One IP address or CIDR range per line. To enable everything, use<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index b4df263..31f0641 100644 (file)
        "passwordreset-nocaller": "Vokanto devas esti provizita",
        "passwordreset-nosuchcaller": "Vokanto ne ekzistas: $1",
        "passwordreset-ignored": "La pasvorta reensignado ne estis pritraktita. Eble neniu provizanto estis formita?",
-       "passwordreset-invalideamil": "Nevalida retpoŝta adreso",
+       "passwordreset-invalidemail": "Nevalida retpoŝta adreso",
        "passwordreset-nodata": "Nek salutnomo nek retpoŝta adreso estis provizita",
        "changeemail": "Ŝanĝi aŭ forigi retpoŝtadreson",
        "changeemail-header": "Plenigu ĉi tiun formularon por ŝanĝi vian retpoŝtadreson. Se vi volas forigi la difinon de retpoŝtadreso por via uzantokonto, lasu la kampon por la nova retpoŝtadreso malplena ĉe la transigo.",
index 6dd1515..6b8740b 100644 (file)
                        "AlvaroMolina",
                        "Tokvo",
                        "Irus",
-                       "Sophivorus"
+                       "Sophivorus",
+                       "Pompilos",
+                       "Igv",
+                       "Juanpabl"
                ]
        },
        "tog-underline": "Subrayar los enlaces:",
        "passwordreset-emaildisabled": "Se han desactivado las funciones de correo electrónico en este wiki.",
        "passwordreset-username": "Nombre de usuario:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-capture": "¿Ver el mensaje resultante?",
-       "passwordreset-capture-help": "Si marcas esta casilla, se te mostrará el correo electrónico (con la contraseña temporal) además de enviarse al usuario.",
        "passwordreset-email": "Dirección de correo electrónico:",
        "passwordreset-emailtitle": "Detalles de la cuenta en {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguien (probablemente tú, desde la dirección IP $1) ha solicitado el restablecimiento de tu contraseña en {{SITENAME}} ($4). {{PLURAL:$3|La siguiente cuenta está asociada|Las siguientes cuentas están asociadas}}\na esta dirección de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Esta contraseña temporal|Estas contraseñas temporales}} caducarán en {{PLURAL:$5|un día|$5 días}}.\nAhora puedes iniciar sesión y establecer una nueva contraseña. Si fue otra persona la que realizó esta solicitud, o si ya recuerdas tu contraseña original y, por tanto, no deseas cambiarla, puedes ignorar este mensaje y continuar usando tu contraseña anterior.",
        "passwordreset-emailelement": "Nombre de {{GENDER:$1|usuario|usuaria}}: \n$1\n\nContraseña temporal: \n$2",
        "passwordreset-emailsentemail": "Si esta dirección de correo electrónico está asociada a tu cuenta, entonces se enviará un correo electrónico para restablecer la contraseña.",
        "passwordreset-emailsentusername": "Si existe una dirección de correo electrónico asociada a este nombre de usuario, entonces se enviará un correo para restablecer la contraseña.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Se ha enviado el mensaje de restablecimiento de contraseña|Se han enviado los mensajes de restablecimiento de contraseña}}. {{PLURAL:$1|El nombre de usuario y la contraseña|La lista de nombres de usuarios y contraseñas}} se muestra aquí.",
-       "passwordreset-emailerror-capture2": "No fue posible mandar un correo electrónico {{GENDER:$2|al usuario|a la usuaria}}: $1 {{PLURAL:$3|El nombre de usuario y la contraseña|La lista de nombres de usuarios y contraseñas}} se muestra aquí.",
        "passwordreset-nocaller": "Debe de proporcionarse un interlocutor",
        "passwordreset-nosuchcaller": "La persona que llama no existe: $1",
        "passwordreset-ignored": "No se logró el reestablecimiento de la contraseña. ¿Tal vez no se configuró un proveedor?",
-       "passwordreset-invalideamil": "Dirección de correo electrónico no válida.",
+       "passwordreset-invalidemail": "Dirección de correo electrónico no válida.",
        "passwordreset-nodata": "No se ha proporcionado ni un nombre de usuario ni una dirección de correo electrónico",
        "changeemail": "Cambiar o eliminar la dirección de correo electrónico",
        "changeemail-header": "Completa este formulario para cambiar tu dirección de correo electrónico. Si quieres eliminar la asociación de cualquier dirección de correo electrónico con tu cuenta, deja en blanco la nueva dirección de correo electrónico cuando envíes el formulario.",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "No tienes permiso para editar permisos de usuario en otros wikis.",
        "userrights-nodatabase": "La base de datos $1 no existe o no es local.",
-       "userrights-nologin": "Debes [[Special:UserLogin|iniciar sesión]] con una cuenta de administrador para poder editar los grupos de los usuarios.",
-       "userrights-notallowed": "No tienes permiso para añadir o quitar permisos de usuario.",
        "userrights-changeable-col": "Grupos que puedes cambiar",
        "userrights-unchangeable-col": "Grupos que no puedes cambiar",
        "userrights-conflict": "¡Conflicto de cambio de los permisos de usuario! Por favor, revisa y confirma tus cambios.",
-       "userrights-removed-self": "Has eliminado tus propios permisos. Por tanto, ya no podrás volver a acceder a esta página.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "group-autoconfirmed": "Autoconfirmados",
        "right-block": "Bloquear a otros usuarios para que no editen",
        "right-blockemail": "Bloquear a un usuario para que no pueda mandar correos electrónicos",
        "right-hideuser": "Bloquear un nombre de usuario, haciéndolo invisible",
-       "right-ipblock-exempt": "Quedar exento de bloqueos a IPs, autobloqueos y bloqueos de rango.",
+       "right-ipblock-exempt": "Evitar bloqueos a IP, automáticos y por intervalos",
        "right-unblockself": "Desbloquearse a sí mismo",
        "right-protect": "Cambiar niveles de protección y editar páginas protegidas en cascada",
        "right-editprotected": "Editar páginas protegidas como «{{int:protect-level-sysop}}»",
        "right-siteadmin": "Bloquear y desbloquear la base de datos",
        "right-override-export-depth": "Exportar páginas, incluyendo aquellas enlazadas hasta una profundidad de 5",
        "right-sendemail": "Enviar correo electrónico a otros usuarios",
-       "right-passwordreset": "Ver los mensajes de restablecimiento de contraseña",
        "right-managechangetags": "Crear y (des)activar [[Special:Tags|etiquetas]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] junto con los cambios propios",
        "right-changetags": "Agregar y quitar [[Special:Tags|etiquetas]] arbitrarias a revisiones individuales y entradas del registro",
        "apisandbox-alert-field": "El valor de este campo no es válido.",
        "apisandbox-continue": "Continuar",
        "apisandbox-continue-clear": "Vaciar",
+       "apisandbox-param-limit": "Escribe <kbd>max</kbd> para usar el límite máximo.",
        "booksources": "Fuentes de libros",
        "booksources-search-legend": "Buscar fuentes de libros",
        "booksources-search": "Buscar",
        "booksources-text": "Abajo hay una lista de enlaces a otros sitios que venden libros nuevos y usados, puede que contengan más información sobre los libros que estás buscando.",
        "booksources-invalid-isbn": "El número de ISBN no parece ser válido; comprueba los errores copiándolo de la fuente original.",
+       "magiclink-tracking-rfc": "Páginas que usan enlaces mágicos de RFC",
+       "magiclink-tracking-rfc-desc": "Esta página usa enlaces mágicos de RFC. Véase [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sobre cómo migrar.",
+       "magiclink-tracking-pmid": "Páginas que usan enlaces mágicos de PMID",
+       "magiclink-tracking-pmid-desc": "Esta página usa enlaces mágicos de PMID. Véase [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sobre cómo migrar.",
+       "magiclink-tracking-isbn": "Páginas que usan enlaces mágicos de ISBN",
+       "magiclink-tracking-isbn-desc": "Esta página usa enlaces mágicos de ISBN. Véase [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] sobre cómo migrar.",
        "specialloguserlabel": "Usuario:",
        "speciallogtitlelabel": "Objetivo (título o {{ns:user}}:nombre de usuario):",
        "log": "Registros",
        "activeusers": "Lista de usuarios activos",
        "activeusers-intro": "Esta es una lista de usuarios que han tenido alguna actividad en los últimos $1 {{PLURAL:$1|día|días}}.",
        "activeusers-count": "$1 {{PLURAL:$1|acción|acciones}} en {{PLURAL:$3|el último día|los últimos $3 días}}",
-       "activeusers-from": "Mostrando a los usuarios empezando por:",
+       "activeusers-from": "Mostrar los usuarios que empiezan por:",
        "activeusers-groups": "Mostrar los usuarios que pertenecen a los grupos:",
+       "activeusers-excludegroups": "Excluir a los usuarios que pertenezcan a los grupos:",
        "activeusers-noresult": "No se encontraron usuarios.",
        "activeusers-submit": "Mostrar usuarios activos",
        "listgrouprights": "Permisos de los grupos de usuarios",
        "modifiedarticleprotection": "cambió el nivel de protección de «[[$1]]»",
        "unprotectedarticle": "desprotegió «[[$1]]»",
        "movedarticleprotection": "cambiadas protecciones de «[[$2]]» a «[[$1]]»",
+       "protectedarticle-comment": "{{GENDER:$2|Protegió}} «[[$1]]»",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Cambió el nivel de protección}} de «[[$1]]»",
+       "unprotectedarticle-comment": "{{GENDER:$2|Eliminó la protección}} de «[[$1]]»",
        "protect-title": "Cambiando el nivel de protección de «$1»",
        "protect-title-notallowed": "Ver el nivel de protección de «$1»",
        "prot_1movedto2": "[[$1]] se trasladó a [[$2]]",
        "undeletehistorynoadmin": "El artículo ha sido borrado. La razón de su eliminación se indica abajo en el resumen, así como los detalles de las ediciones realizadas antes del borrado. El texto completo del artículo está disponible sólo para usuarios con permisos de administrador.",
        "undelete-revision": "Edición borrada de $1 (fechada el $4, a las $5) por $3:",
        "undeleterevision-missing": "Revisión no válida o perdida. Puede deberse a un enlace incorrecto,\no a que la revisión haya sido restaurada o eliminada del archivo.",
+       "undeleterevision-duplicate-revid": "No se {{PLURAL:$1|pudo restaurar una modificación|pudieron restaurar $1 modificaciones}} porque {{PLURAL:$1|su <code>rev_id</code> ya se estaba|sus <code>rev_id</code> ya se estaban}} utilizando.",
        "undelete-nodiff": "No existe una revisión previa.",
        "undeletebtn": "Restaurar",
        "undeletelink": "ver/restaurar",
        "filemissing": "Falta archivo",
        "thumbnail_error": "Error al crear miniatura: $1",
        "thumbnail_error_remote": "Mensaje de error de $1:\n$2",
-       "djvu_page_error": "Página DjVu fuera de rango",
+       "djvu_page_error": "Página DjVu fuera de los límites",
        "djvu_no_xml": "Imposible obtener XML para el archivo DjVu",
        "thumbnail-temp-create": "No se ha podido crear el archivo temporal de la miniatura",
        "thumbnail-dest-create": "No se ha podido guardar la miniatura",
        "pageinfo-redirects-name": "Número de redirecciones a esta página",
        "pageinfo-redirects-value": "$1",
        "pageinfo-subpages-name": "Subpáginas de esta página",
-       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirección|redirecciones}}; $3 {{PLURAL:$3|no-redirección|no-redirecciones}})",
+       "pageinfo-subpages-value": "$1 ($2 {{PLURAL:$2|redirección|redirecciones}}; $3 {{PLURAL:$3|no redirección|no redirecciones}})",
        "pageinfo-firstuser": "Creador de la página",
        "pageinfo-firsttime": "Fecha de creación de la página",
        "pageinfo-lastuser": "Último editor",
        "patrol-log-header": "Este es un registro de revisiones verificadas.",
        "log-show-hide-patrol": "$1 registro de verificación",
        "log-show-hide-tag": "$1 registro de etiquetas",
+       "confirm-markpatrolled-button": "Aceptar",
+       "confirm-markpatrolled-top": "marcar la revisión $3 de $2 como revisada?",
        "deletedrevision": "Borrada revisión antigua $1",
        "filedeleteerror-short": "Error al borrar el archivo: $1",
        "filedeleteerror-long": "Se han producido errores mientras se borraba el archivo:\n\n$1",
        "confirmemail_sendfailed": "No fue posible enviar el correo de confirmación. Por favor, comprueba la validez de la dirección de correo.\n\nEl servidor indicó el error: $1",
        "confirmemail_invalid": "Código de confirmación incorrecto.\nEl código debe haber expirado.",
        "confirmemail_needlogin": "Necesitas $1 para confirmar tu dirección electrónica.",
-       "confirmemail_success": "Su dirección de correo ha sido confirmada\nAhora puedes [[Special:UserLogin|identificarte]] y colaborar en el wiki.",
+       "confirmemail_success": "Se ha confirmado tu dirección de correo electrónico.\nAhora puedes [[Special:UserLogin|acceder]] y disfrutar del wiki.",
        "confirmemail_loggedin": "Tu dirección de correo electrónico ha sido confirmada.",
        "confirmemail_subject": "confirmación de la dirección de correo de {{SITENAME}}",
        "confirmemail_body": "Alguien, probablemente tú mismo, ha registrado desde la dirección IP $1 la cuenta \"$2\" en {{SITENAME}}, utilizando esta dirección de correo.\n\nPara confirmar que esta cuenta realmente te pertenece y activar el correo en {{SITENAME}}, sigue este enlace en tu navegador:\n\n$3\n\nSi la cuenta *no* es tuya, sigue este otro enlace para cancelar la confirmación de la dirección de correo:\n\n$5\n\nEl código de confirmación expirará el $4.",
        "tags-deactivate": "desactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|cambio|cambios}}",
        "tags-manage-no-permission": "No tienes permiso para gestionar las etiquetas de cambios.",
-       "tags-manage-blocked": "No puedes gestionar el cambio de etiquetas mientras estés bloqueado.",
+       "tags-manage-blocked": "No puedes gestionar etiquetas de cambio mientras estés {{GÉNERO:$1|bloqueado|bloqueada}}.",
        "tags-create-heading": "Crear una etiqueta",
        "tags-create-explanation": "De manera predeterminada, las etiquetas nuevas estarán disponibles para su uso por usuarios y bots.",
        "tags-create-tag-name": "Nombre de la etiqueta:",
        "tags-deactivate-not-allowed": "No es posible desactivar la etiqueta «$1».",
        "tags-deactivate-submit": "Desactivar",
        "tags-apply-no-permission": "No tienes permiso para aplicar etiquetas de cambios, junto con tus cambios.",
-       "tags-apply-blocked": "No puedes aplicar etiquetas de cambio con tus cambios mientras estés {{GENDER:|bloqueado|bloqueada}}.",
+       "tags-apply-blocked": "No puedes aplicar etiquetas de cambio junto a tus cambios mientras estés {{GENDER:$1|bloqueado|bloqueada}}.",
        "tags-apply-not-allowed-one": "No se permite aplicar manualmente la etiqueta «$1».",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta no se puede|Las siguientes etiquetas no se pueden}} aplicar manualmente: $1",
        "tags-update-no-permission": "No tienes permiso para agregar o quitar etiquetas de cambio de las revisiones individuales o las entradas del registro.",
-       "tags-update-blocked": "No puedes añadir o eliminar etiquetas de cambio mientras estés {{GENDER:|bloqueado|bloqueada}}.",
+       "tags-update-blocked": "No puedes añadir o eliminar etiquetas de cambio mientras estés {{GENDER:$1|bloqueado|bloqueada}}.",
        "tags-update-add-not-allowed-one": "No se permite la adición manual de la etiqueta «$1».",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|La siguiente etiqueta no se puede|Las siguientes etiquetas no se pueden}} agregar manualmente: $1",
        "tags-update-remove-not-allowed-one": "No se permite eliminar la etiqueta «$1».",
        "authmanager-authn-autocreate-failed": "Falló la creación automática de una cuenta local: $1",
        "authmanager-change-not-supported": "Las credenciales proporcionadas no se pueden cambiar, ya que no hay nada que fuera a hacer uso de ellas.",
        "authmanager-create-disabled": "Está desactivada la creación de cuentas.",
-       "authmanager-create-from-login": "Para crear tu cuenta, completa los campos a continuación.",
+       "authmanager-create-from-login": "Para crear una cuenta, rellena los campos.",
        "authmanager-create-not-in-progress": "El proceso de creación de la cuenta no está en progreso o se perdieron los datos de la sesión. Empieza de nuevo desde el principio.",
        "authmanager-create-no-primary": "Las credenciales suministradas no pueden usarse para la creación de la cuenta.",
        "authmanager-link-no-primary": "Las credenciales proporcionadas no se han podido utilizar para enlazar cuentas.",
        "usercssispublic": "Recuerda: las subpáginas CSS no deberían contener datos confidenciales, pues otros usuarios los pueden ver.",
        "restrictionsfield-badip": "Dirección o intervalo IP no válidos: $1",
        "restrictionsfield-label": "Intervalos de IP permitidos:",
-       "restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activar todo, utiliza<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Error: $1",
-       "edit-error-long": "Errores:\n\n$1"
+       "restrictionsfield-help": "Una dirección IP o intervalo de CIDR por renglón. Para activar todo, utiliza<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index ec27ab5..35a399d 100644 (file)
        "passwordreset-emaildisabled": "E-posti funktsioonid on selles vikis keelatud.",
        "passwordreset-username": "Kasutajanimi:",
        "passwordreset-domain": "Domeen:",
-       "passwordreset-capture": "Näita lähetatavat e-kirja?",
-       "passwordreset-capture-help": "Kui valid selle märkeruudu, näidatakse sulle ajutist parooli sisaldavat e-kirja, mis ühtlasi kasutajale saadetakse.",
        "passwordreset-email": "E-posti aadress:",
        "passwordreset-emailtitle": "{{GRAMMAR:genitive|{{SITENAME}}}} konto andmed",
        "passwordreset-emailtext-ip": "Keegi, arvatavasti sina ise, IP-aadressilt $1 palus lähtestada sinu {{GRAMMAR:genitive|{{SITENAME}}}} ($4) parooli. Selle e-posti aadressiga on seotud {{PLURAL:$3|järgmine konto|järgmised kontod}}:\n\n$2\n\n{{PLURAL:$3|See ajutine parool aegub|Need ajutised paroolid aeguvad}} {{PLURAL:$5|ühe|$5}} päeva pärast.\nPeaksid nüüd sisse logima ja uue parooli valima. Kui selle palve esitas keegi teine või kui sulle meenus su parool ja sa ei soovi seda enam muuta, võid teadet eirata ja jätkata vana parooli kasutamist.",
        "content-model-css": "CSS",
        "content-json-empty-object": "Tühi objekt",
        "content-json-empty-array": "Tühi massiiv",
+       "deprecated-self-close-category": "Vigaste endassesuletud HTML-siltidega leheküljed",
        "duplicate-args-warning": "<strong>Hoiatus:</strong> [[:$1]] kutsub malli [[:$2]] nii, et parameetrile \"$3\" vastab rohkem kui üks väärtus. Väärtustest kasutatakse ainult viimast.",
        "duplicate-args-category": "Leheküljed, kus mallikutses on topeltargument",
        "duplicate-args-category-desc": "Lehekülg sisaldab mallikutseid, kus mõnd argumenti on kasutatud mitu korda, näiteks <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> või <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "prefs-help-recentchangescount": "See käib viimaste muudatuste, lehekülgede ajalugude ja logide kohta.",
        "prefs-help-watchlist-token2": "See on sinu jälgimisloendi veebivoo salavõti.\nIgaüks, kes seda teab, saab lugeda sinu jälgimisloendit. Seega ära jaga seda.\n[[Special:ResetTokens|Klõpsa siia, kui sul on vaja see lähtestada]].",
        "savedprefs": "Sinu eelistused on salvestatud.",
-       "savedrights": "Kasutaja $1 õigused on salvestatud.",
+       "savedrights": "Kasutaja $1 rühmad on salvestatud.",
        "timezonelegend": "Ajavöönd:",
        "localtime": "Kohalik aeg:",
        "timezoneuseserverdefault": "Kasuta serveri vaikesätet ($1)",
        "prefswarning-warning": "Oled teinud eelistustes muudatusi, mida pole veel salvestatud.\nKui lahkud sellelt leheküljelt ilma nupul \"$1\" klõpsamata, jäävad kehtima senised eelistused.",
        "prefs-tabs-navigation-hint": "Spikker: Kaardiloendis toodud kaartide vahel liikumiseks saad kasutada vasakut ja paremat nooleklahvi.",
        "userrights": "Kasutajaõiguste haldus",
-       "userrights-lookup-user": "Kasutajarühma muutmine",
+       "userrights-lookup-user": "Kasutaja valimine",
        "userrights-user-editname": "Sisesta kasutajanimi:",
-       "editusergroup": "Muuda {{GENDER:$1|kasutajarühmi}}",
+       "editusergroup": "Laadi kasutajarühmad",
        "editinguser": "Kasutaja '''[[User:$1|$1]]''' $2 õiguste muutmine",
        "userrights-editusergroup": "Kasutajarühmade muutmine",
        "saveusergroups": "Salvesta {{GENDER:$1|kasutajarühmad}}",
        "userrights-reason": "Põhjus:",
        "userrights-no-interwiki": "Sul ei ole luba muuta kasutajaõigusi teistes vikides.",
        "userrights-nodatabase": "Andmebaasi $1 ei ole olemas või pole see kohalik.",
-       "userrights-nologin": "Et kasutajaõigusi jagada, pead administraatori kontoga [[Special:UserLogin|sisse logima]].",
-       "userrights-notallowed": "Sul pole õigust kasutajaõigusi lisada ega eemaldada.",
        "userrights-changeable-col": "Rühmad, mida sa saad muuta",
        "userrights-unchangeable-col": "Rühmad, mida sa ei saa muuta",
        "userrights-conflict": "Kasutajaõiguste muutmise konflikt! Palun vaata oma muudatused üle ja kinnita need.",
-       "userrights-removed-self": "Võtsid endalt õigused. Seetõttu sellele leheküljele sa enam ligi ei pääse.",
        "group": "Rühm:",
        "group-user": "Kasutajad",
        "group-autoconfirmed": "Automaatselt kinnitatud kasutajad",
        "right-siteadmin": "Panna lukku ja lukust lahti teha andmebaasi",
        "right-override-export-depth": "Eksportida lehekülgi, kaasates viidatud leheküljed kuni viienda tasemeni",
        "right-sendemail": "Saata teistele kasutajatele e-kirju",
-       "right-passwordreset": "Vaadata parooli lähtestamise e-kirju",
        "right-managechangetags": "Koostada ja (in)aktiveerida [[Special:Tags|märgiseid]]",
        "right-applychangetags": "Rakendada [[Special:Tags|märgiseid]] enda muudatuste suhtes",
        "right-changetags": "Lisada ja eemaldada käsitsi rakendatavaid [[Special:Tags|märgiseid]] üksikute redaktsioonide ja logisissekannete juures",
        "statistics-files": "Üleslaaditud faile",
        "statistics-edits": "Redigeerimisi alates {{GRAMMAR:genitive|{{SITENAME}}}} loomisest",
        "statistics-edits-average": "Keskmiselt redigeerimisi lehekülje kohta",
-       "statistics-users": "Registreeritud [[Special:ListUsers|kasutajaid]]",
-       "statistics-users-active": "Aktiivseid kasutajaid",
+       "statistics-users": "Registreeritud [[Special:ListUsers|kasutajad]]",
+       "statistics-users-active": "Aktiivsed kasutajad",
        "statistics-users-active-desc": "Kasutajad, kes on viimase {{PLURAL:$1|päeva|$1 päeva}} jooksul tegutsenud",
        "pageswithprop": "Leheatribuudiga leheküljed",
        "pageswithprop-legend": "Leheatribuudiga leheküljed",
        "booksources-search": "Otsi",
        "booksources-text": "Allpool on linke teistele lehekülgedele, kus müüakse uusi ja kasutatud raamatuid. Lehekülgedel võib olla ka lisainfot raamatute kohta:",
        "booksources-invalid-isbn": "Antud ISBN-number ei ole korrektne; kontrolli algallikast kopeerides vigu.",
+       "magiclink-tracking-rfc": "RFC-võlulingiga leheküljed",
+       "magiclink-tracking-pmid": "PMID-võlulingiga leheküljed",
+       "magiclink-tracking-isbn": "ISBN-võlulingiga leheküljed",
        "specialloguserlabel": "Täitja:",
        "speciallogtitlelabel": "Objekt (pealkiri või {{ns:user}}:kasutajanimi):",
        "log": "Logid",
        "activeusers-intro": "See on loetelu kasutajatest, kes on viimase $1 {{PLURAL:$1|päev|päeva}} jooksul midagi teinud.",
        "activeusers-count": "$1 {{PLURAL:$1|toiming|toimingut}} viimase {{PLURAL:$3|päeva|$3 päeva}} jooksul",
        "activeusers-from": "Näita kasutajaid alates:",
+       "activeusers-groups": "Kuva kasutajad, kes kuuluvad järgmistesse rühmadesse:",
        "activeusers-noresult": "Kasutajaid ei leidunud.",
        "activeusers-submit": "Kuva aktiivsed kasutajad",
        "listgrouprights": "Kasutajarühma õigused",
        "trackingcategories-msg": "Süsteemikategooria",
        "trackingcategories-name": "Sõnumi nimi",
        "trackingcategories-desc": "Kategooriasse arvamise kriteeriumid",
+       "restricted-displaytitle-ignored": "Eiratava kuvapealkirjaga leheküljed",
        "noindex-category-desc": "Robotid ei indekseeri lehekülge, sest sellel on võlusõna <code><nowiki>__NOINDEX__</nowiki></code> ja lehekülg on nimeruumis, kus see silt on lubatud.",
        "index-category-desc": "Leheküljel on <code><nowiki>__INDEX__</nowiki></code> ja lehekülg on nimeruumis, kus see silt on lubatud ning seetõttu indekseerivad robotid lehekülge seal, kus nad muidu seda ei teeks.",
        "post-expand-template-inclusion-category-desc": "Kõigi mallide hõrendamise järel on lehekülg suurem kui <code>$wgMaxArticleSize</code>, mistõttu jäid mõned mallid hõrendamata.",
        "pageinfo-category-pages": "Lehekülgi",
        "pageinfo-category-subcats": "Alamkategooriaid",
        "pageinfo-category-files": "Faile",
+       "pageinfo-user-id": "Kasutaja identifikaator",
        "markaspatrolleddiff": "Märgi kontrollituks",
        "markaspatrolledtext": "Märgi see leht kontrollituks",
        "markaspatrolledtext-file": "Märgi see failiversioon kontrollituks",
        "patrol-log-header": "See on kontrollitud redaktsioonide logi.",
        "log-show-hide-patrol": "$1 kontrollimislogi",
        "log-show-hide-tag": "$1 märgiste logi",
+       "confirm-markpatrolled-button": "Sobib",
        "deletedrevision": "Kustutatud vanem versioon $1",
        "filedeleteerror-short": "Tõrge faili kustutamisel: $1",
        "filedeleteerror-long": "Faili kustutamisel esines tõrkeid:\n\n$1",
        "newimages-label": "Failinimi (või selle osa):",
        "newimages-showbots": "Näita robotite üles laaditud faile",
        "noimages": "Uusi pilte ei ole.",
+       "gallery-slideshow-toggle": "Lülita pisipildid ümber",
        "ilsubmit": "Otsi",
        "bydate": "kuupäeva järgi",
        "sp-newimages-showfrom": "Näita uusi faile alates kuupäevast $2, kell $1",
        "tags-deactivate": "keela",
        "tags-hitcount": "$1 {{PLURAL:$1|muudatus|muudatust}}",
        "tags-manage-no-permission": "Sul pole õigust muudatusmärgiseid hallata.",
-       "tags-manage-blocked": "Muudatusmärgiseid ei saa hallata, kui oled blokeeritud.",
+       "tags-manage-blocked": "Muudatusmärgiseid ei saa hallata, kui {{GENDER:$1|oled}} blokeeritud.",
        "tags-create-heading": "Uue märgise koostamine",
        "tags-create-explanation": "Vaikimisi on vastkoostatud märgised kasutajate ja robotite jaoks kasutatavad.",
        "tags-create-tag-name": "Märgise nimi:",
        "tags-deactivate-not-allowed": "Märgist \"$1\" pole võimalik keelata.",
        "tags-deactivate-submit": "Keela",
        "tags-apply-no-permission": "Sul pole lubatud rakendada muudatusmärgiseid enda muudatuste suhtes.",
-       "tags-apply-blocked": "Muudatusmärgiseid ei saa enda muudatustele rakendada, kui oled blokeeritud.",
+       "tags-apply-blocked": "Muudatusmärgiseid ei saa enda muudatustele rakendada, kui {{GENDER:$1|oled}} blokeeritud.",
        "tags-apply-not-allowed-one": "Märgist \"$1\" pole lubatud käsitsi rakendada.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Järgmist märgist|Järgmiseid märgiseid}} pole lubatud käsitsi rakendada: $1",
        "tags-update-no-permission": "Sul pole lubatud üksikute redaktsioonide ega logisissekannete juures muudatusmärgiseid lisada ega eemaldada.",
-       "tags-update-blocked": "Muudatusmärgiseid ei saa lisada ega eemaldada, kui oled blokeeritud.",
+       "tags-update-blocked": "Muudatusmärgiseid ei saa lisada ega eemaldada, kui {{GENDER:$1|oled}} blokeeritud.",
        "tags-update-add-not-allowed-one": "Märgist \"$1\" pole lubatud käsitsi lisada.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Järgmist märgist|Järgmiseid märgiseid}} pole lubatud käsitsi lisada: $1",
        "tags-update-remove-not-allowed-one": "Märgist \"$1\" pole lubatud eemaldada.",
        "special-characters-group-ipa": "IPA-laiendid",
        "special-characters-group-symbols": "Sümbolid",
        "special-characters-group-greek": "Kreeka",
+       "special-characters-group-greekextended": "Kreeka (laiendatud)",
        "special-characters-group-cyrillic": "Kirillitsa",
        "special-characters-group-arabic": "Araabia",
        "special-characters-group-arabicextended": "Araabia (laiendatud)",
        "mw-widgets-titleinput-description-redirect": "ümbersuunamine leheküljele \"$1\"",
        "randomrootpage": "Juhuslik juurlehekülg",
        "log-action-filter-block": "Blokeeringu tüüp:",
+       "log-action-filter-contentmodel": "Sisumudeli muudatuse tüüp:",
+       "log-action-filter-delete": "Kustutamise tüüp:",
+       "log-action-filter-import": "Impordi tüüp:",
+       "log-action-filter-managetags": "Märgiste haldamistegevuse tüüp:",
+       "log-action-filter-move": "Teisaldamise tüüp:",
+       "log-action-filter-newusers": "Konto loomise tüüp:",
+       "log-action-filter-patrol": "Kontrolli tüüp:",
+       "log-action-filter-protect": "Kaitsmise tüüp:",
+       "log-action-filter-rights": "Õiguste muudatuse tüüp:",
+       "log-action-filter-upload": "Üleslaadimise tüüp:",
        "log-action-filter-all": "Kõik",
        "log-action-filter-block-block": "Blokeerimine",
        "log-action-filter-block-reblock": "Blokeeringu muutmine",
        "log-action-filter-block-unblock": "Blokeeringu tühistamine",
+       "log-action-filter-contentmodel-change": "Sisumudeli muudatus",
+       "log-action-filter-contentmodel-new": "Ebastandardse sisumudeliga lehekülje loomine",
+       "log-action-filter-delete-delete": "Lehekülje kustutamine",
+       "log-action-filter-delete-restore": "Lehekülje taastamine",
+       "log-action-filter-delete-event": "Logi kustutamine",
+       "log-action-filter-delete-revision": "Redaktsiooni kustutamine",
+       "log-action-filter-import-interwiki": "Vikidevaheline import",
+       "log-action-filter-import-upload": "XML-faili üleslaadimisega import",
+       "log-action-filter-managetags-create": "Märgise koostamine",
+       "log-action-filter-managetags-delete": "Märgise kustutamine",
+       "log-action-filter-managetags-activate": "Märgise lubamine",
+       "log-action-filter-managetags-deactivate": "Märgise keelamine",
+       "log-action-filter-move-move": "Teisaldamine ümbersuunamise ülekirjutamiseta",
+       "log-action-filter-move-move_redir": "Teisaldamine ümbersuunamise ülekirjutamisega",
+       "log-action-filter-newusers-create": "Loonud anonüümne kasutaja",
+       "log-action-filter-newusers-create2": "Loonud registreeritud kasutaja",
+       "log-action-filter-newusers-autocreate": "Loodud automaatselt",
+       "log-action-filter-newusers-byemail": "Loodud e-kirjatsi saadetud parooliga",
+       "log-action-filter-patrol-patrol": "Kontrollitud käsitsi",
+       "log-action-filter-patrol-autopatrol": "Kontrollitud automaatselt",
+       "log-action-filter-protect-protect": "Kaitsmine",
+       "log-action-filter-protect-modify": "Kaitse muutmine",
+       "log-action-filter-protect-unprotect": "Kaitse eemaldamine",
+       "log-action-filter-protect-move_prot": "Kaitse teisaldamine",
+       "log-action-filter-rights-rights": "Muudetud käsitsi",
+       "log-action-filter-rights-autopromote": "Muudetud automaatselt",
+       "log-action-filter-upload-upload": "Uus üleslaadimine",
+       "log-action-filter-upload-overwrite": "Uuesti üleslaadimine",
        "authmanager-provider-password": "Paroolipõhine autentimine",
        "authmanager-provider-password-domain": "Parooli- ja domeenipõhine autentimine",
        "authmanager-provider-temporarypassword": "Ajutine parool",
        "userjsispublic": "Pea silmas, et JavaScripti alamleheküljed ei tohiks sisaldada konfidentsiaalseid andmeid, kuna neid näevad teised kasutajad.",
        "restrictionsfield-badip": "Vigane IP-aadress või -aadressivahemik: $1",
        "restrictionsfield-label": "Lubatud IP-aadressivahemikud:",
-       "restrictionsfield-help": "Üks IP-aadress või CIDR-vahemik rea kohta. Et lubada kõik, kasuta süntaksit <br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Tõrge: $1",
-       "edit-error-long": "Tõrked:\n\n$1"
+       "restrictionsfield-help": "Üks IP-aadress või CIDR-vahemik rea kohta. Et lubada kõik, kasuta süntaksit <br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index be79578..c45118c 100644 (file)
@@ -25,7 +25,8 @@
                        "Macofe",
                        "Xð",
                        "Asierog",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Gorkaazk"
                ]
        },
        "tog-underline": "Azpimarratu loturak:",
        "login": "Saioa hasi",
        "nav-login-createaccount": "Saioa hasi / kontua sortu",
        "userlogin": "Saioa hasi / kontua sortu",
-       "userloginnocreate": "Saioa hasi",
+       "userloginnocreate": "Hasi saioa",
        "logout": "Saioa itxi",
        "userlogout": "Saioa itxi",
        "notloggedin": "Saioa hasi gabe",
        "loginlanguagelabel": "Hizkuntza: $1",
        "suspicious-userlogout": "Saioa amaitzeko egin duzun eskaria ukatu da. Izan ere, ematen du eskari hori gaizki dabilen nabigatzaile edo cache proxy batek bidali duela.",
        "createacct-another-realname-tip": "Benetako izena hautazkoa da.\nEmatea erabakitzen baduzu hori erabiliko da lanaren atribuzioa egiterako garaian.",
-       "pt-login": "Saioa hasi",
-       "pt-login-button": "Saioa hasi",
+       "pt-login": "Hasi saioa",
+       "pt-login-button": "Hasi saioa",
        "pt-login-continue-button": "Konexioa jarraitu",
        "pt-createaccount": "Sortu kontua",
        "pt-userlogout": "Saioa itxi",
        "passwordreset-emaildisabled": "E-posta aukerak ez daude eskuragarri wiki honetan.",
        "passwordreset-username": "Lankide izena:",
        "passwordreset-domain": "Domeinua:",
-       "passwordreset-capture": "Bidaliko den e-posta ikusi nahi?",
-       "passwordreset-capture-help": "Kutxa hau hautatzen baduzu behin-behineko pasahitza duen e-posta erakutsiko zatzaizu, eta erabiltzaileari bidaliko zaio.",
        "passwordreset-email": "E-mail helbidea:",
        "passwordreset-emailtitle": "{{SITENAME}}-rako kontuaren xehetasunak",
        "passwordreset-emailelement": "Erabiltzaile izena: \n$1\n\nBehin-behineko pasahitza: \n$2",
        "nosuchsectiontitle": "Atala ez da aurkitu",
        "nosuchsectiontext": "Existitzen ez den atala editatzen saiatu zara.\nBaliteke orrialdea begiratzen zenuen bitartean norbaitek ezabatu edo izenburua aldatu izana.",
        "loginreqtitle": "Saioa hastea beharrezkoa",
-       "loginreqlink": "saioa hasi",
+       "loginreqlink": "hasi saioa",
        "loginreqpagetext": "Beste orrialde batzuk ikusteko $1 beharra daukazu..",
        "accmailtitle": "Pasahitza bidali da.",
        "accmailtext": "[[User talk:$1|$1]]-entzako ausaz sortutako pasahitza $2-(r)a bidali da.\n\n''[[Special:ChangePassword|pasahitz aldaketa]]'' orrialdean alda daiteke, behin barruan sartuta.",
        "preferences": "Hobespenak",
        "mypreferences": "Hobespenak",
        "prefs-edits": "Aldaketa kopurua:",
-       "prefsnologintext2": "Mesedez saioa hasi zure hobespenak aldatzeko.",
+       "prefsnologintext2": "Mesedez hasi saioa zure hobespenak aldatzeko.",
        "prefs-skin": "Itxura",
        "skin-preview": "Aurrebista",
        "datedefault": "Hobespenik ez",
        "userrights-reason": "Arrazoia:",
        "userrights-no-interwiki": "Ez duzu beste wikietan erabiltzaile eskumenak aldatzeko baimenik.",
        "userrights-nodatabase": "$1 datubasea ez da existitzen edo ez dago lokalki.",
-       "userrights-nologin": "Administratzaile kontu batekin [[Special:UserLogin|hasi behar duzu saioa]] erabiltzaile eskubideak esleitzeko.",
-       "userrights-notallowed": "Zure kontuak ez du baimenik erabiltzaile eskumenak aldatzeko.",
        "userrights-changeable-col": "Alda ditzakezun taldeak",
        "userrights-unchangeable-col": "Aldatu ezin ditzakezun taldeak",
        "userrights-conflict": "Gatazka gertatu da erabiltzaile eskubideak aldatzean. Mesedez, berrikusi eta baieztatu zure aldaketak.",
-       "userrights-removed-self": "Zure eskumenak kendu dituzu. Beraz jada ezin duzu orrialde hau gehiago ikusi.",
        "group": "Taldea:",
        "group-user": "Erabiltzaileak",
        "group-autoconfirmed": "Lankide autokonfirmatuak",
        "right-siteadmin": "Blokeatu eta desblokeatu datu basea blokeatu",
        "right-override-export-depth": "5eko sakonerararteko loturiko orrialdeak barne esportatu",
        "right-sendemail": "Beste erabiltzaileei e-posta bidali",
-       "right-passwordreset": "Ikusi pasahitza berrezartze e-postak",
        "grant-group-email": "E-posta bidali",
        "grant-createaccount": "Kontuak sortu",
        "grant-editmycssjs": "Zure CSS/JavaScript aldatu",
        "activeusers": "Lankide aktiboen zerrenda",
        "activeusers-count": "{{PLURAL:$1|Ekintza berri bat|$1 ekintza berri}} azken {{PLURAL:$3|egunean|$3 egunetan}}",
        "activeusers-from": "Bilatu honela hasten diren lankideak:",
-       "activeusers-hidebots": "Ezkutatu bot-ak",
-       "activeusers-hidesysops": "Ezkutatu administratzaileak",
        "activeusers-noresult": "Ez da lankiderik aurkitu.",
        "listgrouprights": "Erabiltzaile talde eskumenak",
        "listgrouprights-summary": "Ondorengo zerrendak wikian dauden lankide taldeak agertzen dira, beraien eskubideekin.\nBadago [[{{MediaWiki:Listgrouprights-helppage}}|informazio osagarria]] banakako eskubideei buruz.",
        "feedback-subject": "Gaia:",
        "feedback-submit": "Bidali",
        "feedback-thanks-title": "Eskerrik asko!",
-       "searchsuggest-search": "Bilatu",
+       "searchsuggest-search": "{{SITENAME}} wikian bilatu",
        "searchsuggest-containing": "edukian...",
        "api-error-badaccess-groups": "Ez duzu baimendik fitxategi hauek wiki honetara igotzeko.",
        "api-error-badtoken": "Barne akatsa: token okerra.",
index 38189f2..486fc28 100644 (file)
        "number_of_watching_users_pageview": "[$1 {{PLURAL:$1|usuáriu está|usuárius están}} vehilandu]",
        "rc_categories": "Arrayal a categorias (separás pol \"|\")",
        "rc_categories_any": "Cualisquiá",
-       "rc-change-size-new": "$1{{PLURAL:$1|byte|bytes}} dempués el chambu",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} dempués el chambu",
        "newsectionsummary": "/* $1 */ seción nueva",
        "rc-enhanced-expand": "muestral detallis (es mestel JavaScript)",
        "rc-enhanced-hide": "Açonchal detallis",
index c435b73..4bffbc9 100644 (file)
        "passwordreset-nocaller": "فراخواننده می‌بايست مشخص شده باشد",
        "passwordreset-nosuchcaller": "اين فراخواننده وجود ندارد:$1",
        "passwordreset-ignored": "به بازنشانی گذرواژه پرداخته نشد. آیا ممکن است که هيچ مهياکننده‌ای برای این کار تنظيم نشده باشد؟",
-       "passwordreset-invalideamil": "آدرس ایمیل نامعتبر",
+       "passwordreset-invalidemail": "آدرس ایمیل نامعتبر",
        "passwordreset-nodata": "یک نام کاربری و یا یک آدرس ايميل، هيچکدام ارائه نشده",
        "changeemail": "تغییر یا حذف نشانی ایمیل",
        "changeemail-header": "برای تغییر ایمیلتان این فرم را کامل کنید. برای حذف ایملیتان کافی است بخش ایمیل را خالی رها کنید و فرم را ارسال کنید.",
        "prefs-advancedwatchlist": "گزینه‌های پیشرفته",
        "prefs-displayrc": "گزینه‌های نمایش",
        "prefs-displaywatchlist": "گزینه‌های نمایش",
-       "prefs-tokenwatchlist": "نشانه",
+       "prefs-tokenwatchlist": "بلیط",
        "prefs-diffs": "تفاوت‌ها",
        "prefs-help-prefershttps": "تأثیر این ترجیح بعد از ورود بعدی شما اعمال خواهد شد.",
        "prefswarning-warning": "تغییراتتان به ترجیحات هنوز ذحیره نشده است.\nاگر این صفحه بدون کلیک بر «$1» ترک کنید ترجیحاتتان ذخیره نخواهد شد.",
        "activeusers-intro": "در زیر فهرستی از کاربرانی را می‌بینید که در $1 {{PLURAL:$1|روز|روز}} گذشته فعالیتی داشته‌اند.",
        "activeusers-count": "$1 {{PLURAL:$1|فعالیت|فعالیت}} در {{PLURAL:$3|روز|$3 روز}} اخیر",
        "activeusers-from": "نمایش کاربران با آغاز از:",
-       "activeusers-hidebots": "نهفتن ربات‌ها",
-       "activeusers-hidesysops": "نهفتن مدیران",
        "activeusers-noresult": "کاربری پیدا نشد.",
        "activeusers-submit": "نمایش کاربران فعال",
        "listgrouprights": "اختیارات گروه‌های کاربری",
index 76610b4..8cf7922 100644 (file)
        "passwordreset-emaildisabled": "Sähköpostitoiminnot on poistettu käytöstä tässä wikissä.",
        "passwordreset-username": "Käyttäjätunnus:",
        "passwordreset-domain": "Verkkotunnus:",
-       "passwordreset-capture": "Näytä lähetettävä sähköpostiviesti?",
-       "passwordreset-capture-help": "Jos valitset tämän, sähköposti (tilapäisellä salasanalla) näytetään sinulle sekä lähetetään käyttäjälle.",
        "passwordreset-email": "Sähköpostiosoite:",
        "passwordreset-emailtitle": "Tunnuksen tiedot {{GRAMMAR:inessive|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Joku (todennäköisesti sinä, IP-osoitteesta $1) pyysi salasanasi\nvaihtamista sivustolla {{SITENAME}} ($4). {{PLURAL:$3|Seuraava käyttäjätunnus on|Seuraavat käyttäjätunnukset ovat}}\nyhdistettynä tähän sähköpostiosoitteeseen:\n\n$2\n\n{{PLURAL:$3|Tämä väliaikainen salasana vanhentuu|Nämä väliaikaiset salasanat vanhentuvat}} {{PLURAL:$5|yhden päivän|$5 päivän}} kuluttua.\nKirjaudu sisään nyt ja valitse uusi salasana heti. Jos joku toinen teki tämän pyynnön \ntai jos muistitkin vanhan salasanasi etkä halua enää muuttaa sitä,\nvoit jättää tämän viestin huomiotta ja jatkaa vanhan salasanasi käyttämistä.",
        "passwordreset-emailelement": "Käyttäjätunnus: \n$1\n\nVäliaikainen salasana: \n$2",
        "passwordreset-emailsentemail": "Jos tämä on sinun tunnuksellesi rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
        "passwordreset-emailsentusername": "Jos on olemassa vastaava rekisteröity sähköpostiosoite, salasanan uudistamisesta kertova viesti lähetetään.",
-       "passwordreset-emailsent-capture2": "Salasananpalautus{{PLURAL:$1|sähköposti|sähköpostit}} on lähetetty. {{PLURAL:$1|Käyttäjä ja salasana|Luettelo käyttäjistä ja salasanoista}} näytetään alapuolella.",
-       "passwordreset-emailerror-capture2": "Sähköpostin lähettäminen {{GENDER:$2|käyttäjälle}} epäonnistui: $1 {{PLURAL:$3|Käyttäjänimi ja salasana|Luettelo käyttäjänimistä ja salasanoista}} näytetään alla.",
        "passwordreset-ignored": "Salasanan palauttamista ei käsitelty. Ehkä tarjoajaa ei ollut määritetty?",
-       "passwordreset-invalideamil": "Virheellinen sähköpostiosoite",
+       "passwordreset-invalidemail": "Virheellinen sähköpostiosoite",
        "passwordreset-nodata": "Käyttäjätunnusta ja salasanaa ei annettu",
        "changeemail": "Muuta tai poista sähköpostiosoite",
        "changeemail-header": "Täydennä tämä lomake, jolla voit muuttaa sähköpostiosoitettasi. Jos haluat poistaa sähköpostiosoitteesi kokonaan tunnuksesi yhteydestä, älä kirjoita uudeksi osoitteeksi mitään vaan jätä se tyhjäksi.",
        "right-siteadmin": "Lukita tietokanta",
        "right-override-export-depth": "Viedä sivuja sisältäen viitatut sivut viiden syvyydellä",
        "right-sendemail": "Lähettää sähköpostia muille käyttäjille",
-       "right-passwordreset": "Tarkastella salasanan alustusviestejä",
        "right-managechangetags": "Luoda ja ottaa käyttöön [[Special:Tags|merkkauksia]]",
        "right-applychangetags": "Asettaa [[Special:Tags|merkkauksia]] omien muutosten yhteyteen",
        "right-changetags": "Lisätä ja poistaa satunnaisia [[Special:Tags|merkkauksia]] yksittäisissä sivuversioissa tai lokimerkinnöissä",
        "grant-group-high-volume": "Suorittaa suuri määrä toimintoja",
        "grant-group-customization": "Mukauttaminen ja asetukset",
        "grant-group-administration": "Suorittaa ylläpitoon liittyviä toimintoja",
+       "grant-group-private-information": "Päästä näkemään yksityiset tiedot, jotka koskevat sinua",
        "grant-group-other": "Sekalainen toiminta",
        "grant-blockusers": "Estää käyttäjiä muokkaamasta ja poistaa estoja",
        "grant-createaccount": "Luoda käyttäjätunnuksia",
        "grant-highvolume": "Suorittaa paljon muokkauksia",
        "grant-oversight": "Piilottaa käyttäjiä ja häivyttää yksittäisiä versioita",
        "grant-patrol": "Partioida sivuihin tehtyjä muutoksia",
+       "grant-privateinfo": "Päästä näkemään yksityiset tiedot",
        "grant-protect": "Suojata sivuja tai poistaa suojauksia",
        "grant-rollback": "Palauttaa sivuun tehtyjä muutoksia",
        "grant-sendemail": "Lähettää sähköpostia toisille käyttäjille",
        "grant-basic": "Perustason oikeudet",
        "grant-viewdeleted": "Nähdä poistettuja sivuja ja tiedostoja",
        "grant-viewmywatchlist": "Nähdä oma tarkkailulista",
+       "grant-viewrestrictedlogs": "Nähdä rajoitettuja lokimerkintöjä",
        "newuserlogpage": "Uudet käyttäjät",
        "newuserlogpagetext": "Tämä on loki luoduista käyttäjätunnuksista.",
        "rightslog": "Käyttöoikeusloki",
        "activeusers": "Aktiivisten käyttäjien lista",
        "activeusers-intro": "Tämä on luettelo käyttäjistä, jotka ovat tehneet jotain viimeisen $1 {{PLURAL:$1|päivän}} sisällä.",
        "activeusers-count": "$1 {{PLURAL:$1|toiminto|toimintoa}} viimeisen {{PLURAL:$3|päivän|$3 päivän}} aikana",
-       "activeusers-from": "Näytä käyttäjät alkaen",
+       "activeusers-from": "Näytä käyttäjät alkaen kohdasta:",
+       "activeusers-groups": "Näytä käyttäjät, jotka kuuluvat ryhmiin:",
        "activeusers-noresult": "Käyttäjiä ei löytynyt.",
        "activeusers-submit": "Hae aktiiviset käyttäjät",
        "listgrouprights": "Käyttäjäryhmien oikeudet",
        "watchnologin": "Et ole kirjautunut sisään",
        "addwatch": "Lisää tarkkailulistalle",
        "addedwatchtext": "\"[[:$1]]\" ja sen keskustelusivu on lisätty [[Special:Watchlist|tarkkailulistallesi]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" ja siihen liittyvä sivu on lisätty [[Special:Watchlist|tarkkailulistallesi]].",
        "addedwatchtext-short": "Sivu ”$1” on lisätty tarkkailulistallesi.",
        "removewatch": "Poista tarkkailulistalta",
        "removedwatchtext": "\"[[:$1]]\" ja sen keskustelusivu on poistettu [[Special:Watchlist|tarkkailulistaltasi]].",
+       "removedwatchtext-talk": "\"[[:$1]]\" ja siihen liittyvä sivu on poistettu [[Special:Watchlist|tarkkailulistaltasi]].",
        "removedwatchtext-short": "Sivu ”$1” on poistettu tarkkailulistaltasi.",
        "watch": "Tarkkaile",
        "watchthispage": "Tarkkaile tätä sivua",
        "rollbacklinkcount-morethan": "palauta yli $1 {{PLURAL:$1|muutos|muutosta}}",
        "rollbackfailed": "Palautus epäonnistui",
        "rollback-missingparam": "Tarvittavat parametrit puuttuvat pyynnöstä.",
+       "rollback-missingrevision": "Ei voitu ladata sivuversiota koskevaa tietoa.",
        "cantrollback": "Aiempaan versioon ei voi palauttaa, koska viimeisin kirjoittaja on sivun ainoa tekijä.",
        "alreadyrolled": "Käyttäjän [[User:$2|$2]] ([[User talk:$2|keskustelu]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) tekemiä muutoksia sivuun [[:$1]] ei voida kumota, koska joku toinen käyttäjä on joko muuttanut sivua tai palauttanut muokkauksen.\n\nViimeisimmän muokkauksen on tehnyt käyttäjä [[User:$3|$3]] ([[User talk:$3|keskustelu]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "Muokkauksen yhteenveto oli: <em>$1</em>.",
        "modifiedarticleprotection": "muutti sivun [[$1]] suojausasetuksia",
        "unprotectedarticle": "poisti suojauksen sivulta [[$1]]",
        "movedarticleprotection": "siirsi suojausasetukset sivulta [[$2]] sivulle [[$1]]",
+       "protectedarticle-comment": "{{GENDER:$2|Suojasi}} sivun \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Muutti suojaustasoa}} sivulla \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Otti pois suojauksen}} sivulta \"[[$1]]\"",
        "protect-title": "Muuta suojausta sivulla ”$1”",
        "protect-title-notallowed": "Katsele kohteen $1 suojauksen tasoa",
        "prot_1movedto2": "siirsi sivun [[$1]] uudelle nimelle [[$2]]",
        "movelogpagetext": "Tämä on luettelo kaikista sivujen siirroista.",
        "movesubpage": "{{PLURAL:$1|Alasivu|Alasivut}}",
        "movesubpagetext": "Tällä sivulla on $1 {{PLURAL:$1|alasivu|alasivua}}, jotka näkyvät alla.",
+       "movesubpagetalktext": "Sivuun liittyvällä keskustelusivulla on $1 {{PLURAL:$1|alasivu|alasivua}}, jotka näytetään alla.",
        "movenosubpage": "Tällä sivulla ei ole alasivuja.",
        "movereason": "Syy:",
        "revertmove": "kumoa siirto",
        "pageinfo-category-pages": "Sivujen määrä",
        "pageinfo-category-subcats": "Alaluokkien määrä",
        "pageinfo-category-files": "Tiedostojen määrä",
+       "pageinfo-user-id": "Käyttäjän tunnistenumero",
        "markaspatrolleddiff": "Merkitse tarkastetuksi",
        "markaspatrolledtext": "Merkitse muutos tarkastetuksi",
        "markaspatrolledtext-file": "Merkitse tämä tiedoston versio tarkastetuksi",
        "patrol-log-header": "Tämä on loki tarkastetuista muutoksista.",
        "log-show-hide-patrol": "$1 muutostentarkastusloki",
        "log-show-hide-tag": "$1 merkkausloki",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Merkitäänkö versio $3 kohdesivusta $2 partioiduksi?",
        "deletedrevision": "Poistettiin vanha versio $1",
        "filedeleteerror-short": "Tiedoston $1 poistaminen epäonnistui",
        "filedeleteerror-long": "Tiedoston poistaminen epäonnistui:\n\n$1",
        "newimages-showbots": "Näytä bottien tekemät tallennukset",
        "newimages-hidepatrolled": "Piilota tarkastetut tiedostotallennukset",
        "noimages": "Ei uusia tiedostoja.",
+       "gallery-slideshow-toggle": "Vaihda pienoiskuvaa",
        "ilsubmit": "Hae",
        "bydate": "päiväyksen mukaan",
        "sp-newimages-showfrom": "Näytä uudet tiedostot alkaen $1 kello $2",
        "authmanager-authn-autocreate-failed": "Paikallisen tunnuksen automaattinen luonti epäonnistui: $1",
        "authmanager-change-not-supported": "Annettuja kirjautumistietoja ei voida muuttaa, koska mikään ei käyttäisi niitä.",
        "authmanager-create-disabled": "Tunnusten luonti ei ole käytössä.",
-       "authmanager-create-from-login": "Luodaksesi tunnuksen täytä alla olevat kentät.",
+       "authmanager-create-from-login": "Luodaksesi tunnuksen kirjoita tiedot kenttiin.",
        "authmanager-create-not-in-progress": "Tunnuksen luonti ei ole käynnissä tai istunnon tiedot ovat hävinneet. Ole hyvä ja aloita uudelleen alusta.",
        "authmanager-create-no-primary": "Annettuja kirjautumistietoja ei voitu käyttää tunnuksen luontiin.",
        "authmanager-link-no-primary": "Annettuja kirjautumistietoja ei voitu käyttää tunnuksen linkittämiseen.",
        "authprovider-resetpass-skip-help": "Ohita salasanan palautus.",
        "authform-nosession-login": "Varmennus onnistui, mutta selaimesi ei pysty \"muistamaan\" sisäänkirjautumista.\n\n$1",
        "authform-nosession-signup": "Tunnus luotiin, mutta selaimesi ei pysty \"muistamaan\" sisäänkirjautumista.\n\n$1",
+       "authform-newtoken": "Puuttuva \"token\". $1",
+       "authform-notoken": "Puuttuva \"token\"",
+       "authform-wrongtoken": "Väärä \"token\"",
        "specialpage-securitylevel-not-allowed-title": "Ei sallittu",
        "specialpage-securitylevel-not-allowed": "Valitettavasti sinulla ei ole oikeutta muokata tätä sivua, koska henkilöllisyyttäsi ei voitu varmentaa.",
        "authpage-cannot-login": "Kirjautumista ei voitu aloittaa.",
index edf9094..19113d8 100644 (file)
@@ -11,7 +11,8 @@
                        "Urhixidur",
                        "לערי ריינהארט",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Irus"
                ]
        },
        "tog-underline": "Undirstrika leinki:",
        "yourpasswordagain": "Skriva loyniorð umaftur:",
        "createacct-yourpasswordagain": "Váttað loyniorðið",
        "createacct-yourpasswordagain-ph": "Skrivað loyniorðið enn einaferð",
-       "remembermypassword": "Minst til logg inn hjá mær á hesum kaganum (í mesta lagi í $1 {{PLURAL:$1|dag|dagar}})",
        "userlogin-remembermypassword": "Lat meg vera innritaðan",
        "userlogin-signwithsecure": "Nýt trygt samband",
        "yourdomainname": "Títt domene:",
        "passwordreset-emailtext-user": "Brúkari $1 á {{SITENAME}} hevur biðið um eina nullstillan av tínum loyniorði til {{SITENAME}} \n($4). Fylgjandi brúkara {{PLURAL:$3|konta er|kontur eru}} settar í samband við hesa t-post adressuna:\n\n$2\n\n{{PLURAL:$3|Hetta fyribils loyniorðið|Hesi fyribils loyniorðini}} ganga út um {{PLURAL:$5|ein dag|$5 dagar}}.\nTú eigur at rita inn og velja eitt nýtt loyniorð nú. Um onkur annar hevur gjørt hesa umbøn, ella um tú ert komin í tankar um títt uppruna loyniorð, og tú ikki longur ynskir at broyta tað, so kanst tú síggja burtur frá hesum boðum og halda fram at brúka títt gamla loyniorð.",
        "passwordreset-emailelement": "Brúkaranavn: \n$1\n\nFyribils loyniorð: \n$2",
        "passwordreset-emailsentemail": "Ein teldupostur har tú kanst nullstillað loyniorðið er blivin sendur.",
-       "passwordreset-emailsent-capture": "Ein teldupostur, har ið tú kanst nullstilla loyniorðið, er blivin sendur, sum víst niðanfyri.",
-       "passwordreset-emailerror-capture": "Ein teldupostur við nullstillaðum loyniorði var gjørdur, sum víst niðanfyri, men tað miseydnaðist at senda til {{GENDER:$2|brúkaran}}: $1",
        "changeemail": "Broyt teldupost adressu",
        "changeemail-header": "Broyt t-post adressuna hjá kontuni",
        "changeemail-no-info": "Tú mást vera innritað/ur fyri at fáa beinleiðis atgongd til hesa síðu.",
        "undo-norev": "Rættingin kann ikki takast burtur, tí at hon er ikki til ella var strikað.",
        "undo-summary": "Tak burtur versjón $1 hjá [[Special:Contributions/$2|$2]] ([[User talk:$2|kjak]])",
        "undo-summary-username-hidden": "Angra versjón $1 sum ein fjaldur brúkari hevur gjørt",
-       "cantcreateaccounttitle": "Tað ber ikki til at upprætta konto",
        "cantcreateaccount-text": "Upprættan frá hesi IP adressuni ('''$1''') er blivin sperrað av [[User:$3|$3]]. Orsøkin til sperringina sigst vera ''$2''\n\n$3 sigur orsøkina vera ''$2''",
        "cantcreateaccount-range-text": "IP adressur í intervallinum <strong>$1</strong>, sum fevnir um tína IP adressu (<strong>$4</strong>), eru sperraðar fyri upprættan av nýggjari konto av [[User:$3|$3]].\n\n$3 segði orsøkina vera <em>$2</em>",
        "viewpagelogs": "Sí logg fyri hesa grein",
        "activeusers-intro": "Hetta er ein listi yvir brúkarar, ið høvdu okkurt slag av aktiviteti tann seinasta/teir seinastu $1 {{PLURAL:$1|dagin|dagarnar}}.",
        "activeusers-count": "$1 {{PLURAL:$1|handling|handlingar}} tann seinasta/teir seinastu {{PLURAL:$3|dagin|$3 dagarnar}}",
        "activeusers-from": "Vís brúkarar, ið byrja við:",
-       "activeusers-hidebots": "Fjal bottar",
-       "activeusers-hidesysops": "Fjal umboðsstjórar (administratorar)",
        "activeusers-noresult": "Ongir brúkarar funnir.",
        "listgrouprights": "Brúkara bólka rættindi",
        "listgrouprights-summary": "Henda síða vísir ein lista av brúkarabólkum, sum eru útgreinaðir á hesi wiki og rættindini hjá teimum einstøku bólkunum.\nMøguliga er [[{{MediaWiki:Listgrouprights-helppage}}|meira kunning]] um einstøk rættindi.",
        "contributions": "{{GENDER:$1|Brúkaraíkøst}}",
        "contributions-title": "Brúkaraíkøst fyri $1",
        "mycontris": "Íkøst",
+       "anoncontribs": "Íkøst",
        "contribsub2": "Fyri {{GENDER:$3|$1}} ($2)",
        "nocontribs": "Ongar broytingar vóru funnar, sum samsvaraðu hesar treytirnar.",
        "uctop": "(verandi)",
        "import-logentry-upload-detail": "$1 {{PLURAL:$1|versjón|versjónir}}",
        "import-logentry-interwiki-detail": "$1 {{PLURAL:$1|versjón|versjónir}} frá $2",
        "javascripttest": "Royndarkoyring av JavaScript",
-       "tooltip-pt-userpage": "Tín brúkarasíða",
+       "tooltip-pt-userpage": "{{GENDER:|Tín}} brúkarasíða",
        "tooltip-pt-anonuserpage": "Brúkarasíðan fyri IP adressuna, sum tú rættar frá",
        "tooltip-pt-mytalk": "Tín kjaksíða",
        "tooltip-pt-anontalk": "Kjak um rættingar frá hesi IP adressuni",
        "tooltip-pt-logout": "Rita út",
        "tooltip-pt-createaccount": "Vit mæla tær til at upprætta eina konto, tað er tó ikki eitt krav.",
        "tooltip-ca-talk": "Kjak um innihaldssíðuna",
-       "tooltip-ca-edit": "Tú kanst broyta hesa síðuna. Vinarliga nýt forskoðanarknøttin áðrenn tú goymir.",
+       "tooltip-ca-edit": "Rætta hesa síðuna",
        "tooltip-ca-addsection": "Byrja eitt nýtt brot",
        "tooltip-ca-viewsource": "Henda síðan er friðað. Tú kanst síggja keldukotuna.",
        "tooltip-ca-history": "Fyrrverandi útgávur av hesi síðu.",
        "logentry-upload-upload": "$1 {{GENDER:$2|legði út}} $3",
        "rightsnone": "(ongin)",
        "revdelete-summary": "yvirlit yvir broytingar",
-       "searchsuggest-search": "Leita",
+       "searchsuggest-search": "Leita í {{SITENAME}}",
        "api-error-empty-file": "Fílan sum tú sendi inn var tóm.",
        "api-error-file-too-large": "Fílan sum tú sendi inn var óv stór.",
        "api-error-http": "Internur feilur: Kann ikki fáa samband við servaran.",
        "expand_templates_preview": "Forskoðan",
        "mw-widgets-dateinput-placeholder-day": "ÁÁÁÁ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "ÁÁÁÁ-MM",
-       "mw-widgets-titleinput-description-new-page": "síðan er ikki til enn",
-       "api-error-blacklisted": "Vinarliga vel ein annarleiðis tittul, sum lýsir fíluna betri."
+       "mw-widgets-titleinput-description-new-page": "síðan er ikki til enn"
 }
index 2387cb4..5423d90 100644 (file)
                        "Dcausse",
                        "Lucas",
                        "Mabroukb",
-                       "Pymouss"
+                       "Pymouss",
+                       "Derugon"
                ]
        },
        "tog-underline": "Soulignement des liens :",
        "index-category": "Pages indexées",
        "noindex-category": "Pages non indexées",
        "broken-file-category": "Pages avec des liens de fichiers brisés",
+       "categoryviewer-pagedlinks": "($1) ($2)",
+       "category-header-numerals": "$1–$2",
        "about": "À propos",
        "article": "Page de contenu",
        "newwindow": "(ouvre dans une nouvelle fenêtre)",
        "views": "Affichages",
        "toolbox": "Outils",
        "tool-link-userrights": "Modifier les groupes de {{GENDER:$1|l’utilisateur|l’utilisatrice}}",
+       "tool-link-userrights-readonly": "Voir les {{GENDER:$1|groupes utilisateur}}",
        "tool-link-emailuser": "Envoyer un courriel à {{GENDER:$1|l’utilisateur|l’utilisatrice}}",
        "userpage": "Voir la page utilisateur",
        "projectpage": "Voir la page du projet",
        "versionrequiredtext": "La version $1 de MediaWiki est nécessaire pour utiliser cette page.\nConsultez [[Special:Version|la page des versions]].",
        "ok": "Valider",
        "pagetitle": "$1 — {{SITENAME}}",
+       "pagetitle-view-mainpage": "{{SITENAME}}",
+       "backlinksubtitle": "← $1",
        "retrievedfrom": "Récupérée de « $1 »",
        "youhavenewmessages": "{{PLURAL:$3|Vous avez}} $1 ($2).",
        "youhavenewmessagesfromusers": "{{PLURAL:$4|Vous avez}} $1 {{PLURAL:$3|d'un autre utilisateur|de $3 autres utilisateurs}} ($2).",
        "site-atom-feed": "Flux Atom de $1",
        "page-rss-feed": "Flux RSS de « $1 »",
        "page-atom-feed": "Flux Atom de « $1 »",
+       "feed-atom": "Atom",
+       "feed-rss": "RSS",
        "red-link-title": "$1 (page inexistante)",
        "sort-descending": "Tri décroissant",
        "sort-ascending": "Tri croissant",
        "nocookiesnew": "Le compte utilisateur a été créé, mais vous n’êtes pas connecté{{GENDER:||e|(e)}}.\n{{SITENAME}} utilise des témoins (''cookies'') pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter avec le même nom et le même mot de passe.",
        "nocookieslogin": "{{SITENAME}} utilise des témoins (''cookies'') pour conserver la connexion mais vous les avez désactivés.\nVeuillez les activer et vous reconnecter.",
        "nocookiesfornew": "Le compte utilisateur n’a pas été créé, car nous n’avons pas pu identifier son origine.\nVérifiez que vous avez activé les témoins (''cookies''), rechargez la page et essayez à nouveau.",
+       "nocookiesforlogin": "{{int:nocookieslogin}}",
        "createacct-loginerror": "Le compte a bien été créé mais vous ne pouvez pas vous connecter automatiquement. Veuillez vous [[Special:UserLogin|connecter manuellement]].",
        "noname": "Vous n’avez pas saisi un nom d’utilisateur valide.",
        "loginsuccesstitle": "Connecté",
        "passwordreset-emaildisabled": "Les fonctionnalités de courriel ont été désactivées sur ce wiki.",
        "passwordreset-username": "Nom d'utilisateur :",
        "passwordreset-domain": "Domaine :",
-       "passwordreset-capture": "Voir le courriel résultant ?",
-       "passwordreset-capture-help": "Si vous cochez cette case, le courriel (avec le mot de passe temporaire) vous sera affiché en même temps qu’il sera envoyé à l’utilisateur.",
        "passwordreset-email": "Adresse de courriel :",
        "passwordreset-emailtitle": "Détails du compte sur {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quelqu’un (probablement vous, depuis l’adresse IP $1) a demandé une réinitialisation de votre mot de passe pour {{SITENAME}} ($4). {{PLURAL:$3|Le compte utilisateur suivant est associé|Les comptes utilisateurs suivants sont associés}} à cette adresse de courriel :\n\n$2\n\n{{PLURAL:$3|Ce mot de passe temporaire expirera|Ces mots de passe temporaires expireront}} dans {{PLURAL:$5|un jour|$5 jours}}. \nVous devez maintenant vous connecter et choisir un nouveau mot de passe. Si cette demande ne provient pas de vous, ou si vous avez retrouvé votre mot de passe initial, et ne souhaitez plus le modifier, vous pouvez ignorer ce message et continuer à utiliser votre ancien mot de passe.",
        "passwordreset-emailelement": "Nom d’utilisateur : \n$1\n\nMot de passe temporaire : \n$2",
        "passwordreset-emailsentemail": "Si cette adresse de courriel est associée à votre compte, alors un courriel de réinitialisation de mot de passe sera envoyé.",
        "passwordreset-emailsentusername": "S’il y a une adresse de courriel associée à ce nom d’utilisateur, alors un courriel de réinitialisation de mot de passe sera envoyé.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Le courriel de réinitialisation du mot de passe a été envoyé|Les courriels de réinitialisation du mot de passe ont été envoyés}}. {{PLURAL:$1|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et mots de passe est affichée}} ici.",
-       "passwordreset-emailerror-capture2": "L’envoi de courriel à {{GENDER:$2|l’utilisateur|l’utilisatrice}} a échoué : $1 {{PLURAL:$3|Le nom d’utilisateur et le mot de passe sont affichés|La liste des noms d’utilisateur et des mots de passe est affichée}} ici.",
        "passwordreset-nocaller": "Un appelant doit être fourni",
        "passwordreset-nosuchcaller": "L’appelant n’existe pas : $1",
        "passwordreset-ignored": "La réinitialisation du mot de passe n’a pas été gérée. Peut-être qu’aucun fournisseur n’a été configuré ?",
-       "passwordreset-invalideamil": "Adresse de messagerie non valide",
+       "passwordreset-invalidemail": "Adresse de messagerie non valide",
        "passwordreset-nodata": "Aucun nom d’utilisateur ou adresse de messagerie n’a été fourni",
        "changeemail": "Changer ou supprimer l’adresse de courriel",
        "changeemail-header": "Complétez ce formulaire pour modifier votre adresse de courriel. Si vous voulez supprimer l’association d’une adresse de courriel avec votre compte, laissez la nouvelle adresse de courriel vide lors de la soumission du formulaire.",
        "content-model-text": "texte brut",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
+       "content-model-json": "JSON",
        "content-json-empty-object": "Objet vide",
        "content-json-empty-array": "Tableau vide",
        "deprecated-self-close-category": "Pages utilisant des balises HTML auto-fermantes non valides",
        "prefswarning-warning": "Vous avez effectué des modifications dans vos préférences qui n’ont pas encore été enregistrées.\nSi vous quittez cette page sans cliquer sur « $1 », vos préférences ne seront pas mises à jour.",
        "prefs-tabs-navigation-hint": "Astuce : Vous pouvez utiliser les flèches de gauche et de droite pour naviguer entre les onglets.",
        "userrights": "Gestion des droits des utilisateurs",
-       "userrights-lookup-user": "Gestion des groupes d'utilisateurs",
+       "userrights-lookup-user": "Sélectionner un utilisateur",
        "userrights-user-editname": "Entrez un nom d'utilisateur :",
-       "editusergroup": "Modification des groupes d’{{GENDER:$1|utilisateurs}}",
+       "editusergroup": "Charger des groupes d’utilisateurs",
        "editinguser": "Modification des droits de l’{{GENDER:$1|utilisateur|utilisatrice}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modifier les groupes de l'utilisateur",
        "saveusergroups": "Enregistrer les groupes de l’{{GENDER:$1|utilisateur|utilisatrice}}",
        "userrights-groupsmember": "Membre de :",
        "userrights-groupsmember-auto": "Membre implicite de :",
+       "userrights-groupsmember-type": "$1",
        "userrights-groups-help": "Vous pouvez modifier les groupes auxquels appartient {{GENDER:$1|cet utilisateur|cette utilisatrice}} :\n* Une case cochée signifie que l’utilisat{{GENDER:$1|eur|rice}} se trouve dans ce groupe.\n* Une case non cochée signifie qu’{{GENDER:$1|il|elle}} ne s’y trouve pas.\n* Un astérisque (*) indique que vous ne pouvez pas retirer ce groupe une fois que vous l’avez ajouté, ou vice-versa.",
        "userrights-reason": "Motif :",
        "userrights-no-interwiki": "Vous n'avez pas la permission de modifier les droits utilisateur sur d'autres wikis.",
        "userrights-nodatabase": "La base de données « $1 » n'existe pas ou n'est pas locale.",
-       "userrights-nologin": "Vous devez vous [[Special:UserLogin|connecter]] avec un compte d'administrateur pour modifier les droits utilisateur.",
-       "userrights-notallowed": "Vous n’avez pas la permission d’ajouter ou de supprimer des droits utilisateur.",
        "userrights-changeable-col": "Les groupes que vous pouvez modifier",
        "userrights-unchangeable-col": "Les groupes que vous ne pouvez pas modifier",
+       "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Conflit de modification des droits utilisateur ! Veuillez relire et confirmer vos modifications.",
-       "userrights-removed-self": "Vous avez supprimé vos propres droits. Par conséquent, vous ne pouvez plus accéder à cette page.",
        "group": "Groupe :",
        "group-user": "Utilisateurs",
        "group-autoconfirmed": "Utilisateurs autoconfirmés",
        "right-move-rootuserpages": "Renommer la page principale d'un utilisateur",
        "right-move-categorypages": "Renommer des pages de catégorie",
        "right-movefile": "Renommer des fichiers",
-       "right-suppressredirect": "Ne pas créer de redirection depuis le titre d'origine en renommant les pages",
+       "right-suppressredirect": "Ne pas créer de redirection depuis le titre dorigine en renommant les pages",
        "right-upload": "Importer des fichiers",
        "right-reupload": "Écraser un fichier existant",
        "right-reupload-own": "Écraser un fichier que l'on a soi-même importé",
        "right-siteadmin": "Verrouiller ou déverrouiller la base de données",
        "right-override-export-depth": "Exporter les pages en incluant les pages liées jusqu'à une profondeur de 5 niveaux",
        "right-sendemail": "Envoyer un courriel aux autres utilisateurs",
-       "right-passwordreset": "Voir les courriels de réinitialisation des mots de passe",
        "right-managechangetags": "Créer et (dés)activer des [[Special:Tags|balises]]",
        "right-applychangetags": "Appliquer [[Special:Tags|les balises]] avec ses propres modifications",
        "right-changetags": "Ajouter et supprimer de façon arbitraire [[Special:Tags|des balises]] sur des révisions individuelles et des entrées de journal",
        "minoreditletter": "m",
        "newpageletter": "N",
        "boteditletter": "b",
+       "unpatrolledletter": "!",
        "number_of_watching_users_pageview": "[$1 utilisateur{{PLURAL:$1||s}} en train de suivre]",
        "rc_categories": "Limiter aux catégories (séparées par « | ») :",
        "rc_categories_any": "Une des sélectionnées",
+       "rc-change-size": "$1",
        "rc-change-size-new": "$1 {{PLURAL:$1|octet|octets}} après changement",
        "newsectionsummary": "/* $1 */ nouvelle section",
        "rc-enhanced-expand": "Voir les détails",
        "emptyfile": "Le fichier que vous voulez importer semble vide.\nCeci peut être dû à une erreur dans le nom du fichier.\nVeuillez vérifier que vous désirez vraiment importer ce fichier.",
        "windows-nonascii-filename": "Ce wiki ne prend pas en charge les noms de fichiers avec des caractères spéciaux.",
        "fileexists": "Un fichier existe déjà sous ce nom.\nMerci de vérifier <strong>[[:$1]]</strong> si vous n'êtes pas certain{{GENDER:||e|}} de vouloir le remplacer.\n[[$1|thumb]]",
-       "filepageexists": "La page de description pour ce fichier a déjà été créée ici <strong>[[:$1]]</strong>, mais aucun fichier n'existe actuellement sous ce nom.\nLe résumé que vous allez spécifier n'apparaîtra pas sur la page de description.\nPour que ce soit le cas, vous devrez modifier manuellement la page. \n[[$1|thumb]]",
+       "filepageexists": "La page de description pour ce fichier a déjà été créée ici <strong>[[:$1]]</strong>, mais aucun fichier n’existe actuellement sous ce nom.\nLe résumé que vous allez spécifier n’apparaîtra pas sur la page de description.\nPour que ce soit le cas, vous devrez modifier manuellement la page.\n[[$1|thumb]]",
        "fileexists-extension": "Un fichier existe avec un nom proche : [[$2|thumb]]\n* Nom du fichier à importer : <strong>[[:$1]]</strong>\n* Nom du fichier existant : <strong>[[:$2]]</strong>\nPeut-être voulez-vous utiliser un nom plus explicite ?",
        "fileexists-thumbnail-yes": "Le fichier semble être une image en taille réduite <em>(vignette)</em>. \n[[$1|thumb]]\nVeuillez vérifier le fichier <strong>[[:$1]]</strong>.\nSi le fichier vérifié est la même image avec la taille initiale, il n'y a pas besoin d'importer une version réduite.",
        "file-thumbnail-no": "Le nom du fichier commence par <strong>$1</strong>.\nIl est possible qu'il s'agisse d'une version réduite <em>(vignette)</em>.\nSi vous disposez du fichier en haute résolution, importez-le, sinon veuillez modifier son nom.",
        "apisandbox-continue": "Continuer",
        "apisandbox-continue-clear": "Effacer",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuera] la dernière requête ; {{int:apisandbox-continue-clear}} effacera les paramètres relatifs à la continuation.",
+       "apisandbox-param-limit": "Saisir <kbd>max</kbd> pour utiliser la limite maximale.",
+       "apisandbox-multivalue-all-namespaces": "$1 (tous les espaces de noms)",
+       "apisandbox-multivalue-all-values": "$1 (Toutes les valeurs)",
        "booksources": "Ouvrages de référence",
        "booksources-search-legend": "Rechercher parmi des ouvrages de référence",
        "booksources-isbn": "ISBN :",
        "activeusers-count": "$1 {{PLURAL:$1|action|actions}} lors {{PLURAL:$3|du dernier jour|des $3 derniers jours}}",
        "activeusers-from": "Afficher les utilisateurs depuis :",
        "activeusers-groups": "Afficher les utilisateurs appartenant aux groupes :",
+       "activeusers-excludegroups": "Exclure les utilisateurs appartenant aux groupes :",
        "activeusers-noresult": "Aucun utilisateur trouvé.",
        "activeusers-submit": "Afficher les utilisateurs actifs",
        "listgrouprights": "Droits des groupes d'utilisateurs",
-       "listgrouprights-summary": "Cette page contient une liste des groupes définis sur ce wiki ainsi que les droits d'accès qui leur sont associés.\nDes [[{{MediaWiki:Listgrouprights-helppage}}|informations additionnelles]] peuvent exister au sujet des droits individuels.",
+       "listgrouprights-summary": "Cette page contient une liste des groupes définis sur ce wiki ainsi que les droits d'accès qui leur sont associés.\nDes [[{{MediaWiki:Listgrouprights-helppage}}|renseignements complémentaires]] peuvent exister au sujet des droits individuels.",
        "listgrouprights-key": "Légende :\n*<span class=\"listgrouprights-granted\">Droit octroyé</span>\n*<span class=\"listgrouprights-revoked\">Droit révoqué</span>",
        "listgrouprights-group": "Groupe",
        "listgrouprights-rights": "Droits associés",
        "movepagebtn": "Renommer la page",
        "pagemovedsub": "Renommage réussi",
        "movepage-moved": "<strong>« $1 » a été renommée en « $2 »</strong>",
-       "movepage-moved-redirect": "Une redirection depuis l'ancien nom a été créée.",
-       "movepage-moved-noredirect": "La création d'une redirection depuis l'ancien nom a été annulée.",
+       "movepage-moved-redirect": "Une redirection depuis lancien nom a été créée.",
+       "movepage-moved-noredirect": "La création d’une redirection depuis l’ancien nom a été annulée.",
        "articleexists": "Il existe déjà une page portant ce titre, ou le titre que vous avez choisi n'est pas correct.\nVeuillez en choisir un autre.",
        "cantmove-titleprotected": "Vous ne pouvez pas déplacer une page vers cet emplacement car la création de page avec ce nouveau titre a été protégée.",
        "movetalk": "Renommer aussi la page de discussion associée",
        "patrol-log-header": "Voici l’historique des versions relues.",
        "log-show-hide-patrol": "$1 l’historique des relectures",
        "log-show-hide-tag": "$1 le journal des balises",
+       "confirm-markpatrolled-button": "Valider",
+       "confirm-markpatrolled-top": "Marquer la révision de $3 de $2 comme prise en compte ?",
        "deletedrevision": "Ancienne version $1 supprimée",
        "filedeleteerror-short": "Erreur lors de la suppression du fichier : $1",
        "filedeleteerror-long": "Des erreurs ont été rencontrées lors de la suppression du fichier :\n\n$1",
        "exif-copyrighted-false": "État des droits d’auteur non défini",
        "exif-photometricinterpretation-1": "Noir et blanc (0 pour le noir)",
        "exif-photometricinterpretation-4": "Masque de transparence",
+       "exif-photometricinterpretation-32803": "Matrice de Filtre de Couleur",
        "exif-unknowndate": "Date inconnue",
        "exif-orientation-1": "Normale",
        "exif-orientation-2": "Inversée horizontalement",
        "tags-deactivate": "désactiver",
        "tags-hitcount": "$1 modification{{PLURAL:$1||s}}",
        "tags-manage-no-permission": "Vous n'avez pas la permission de gérer les modifications de balises.",
-       "tags-manage-blocked": "Vous ne pouvez pas accéder à l’interface de modification des balises lorsque vous êtes bloqué{{GENDER:||e}}.",
+       "tags-manage-blocked": "Vous ne pouvez pas accéder à l’interface de modification des balises lorsque vous êtes bloqué{{GENDER:$1||e}}.",
        "tags-create-heading": "Créer une nouvelle balise",
        "tags-create-explanation": "Par défaut, les nouvelles balises créées seront disponibles pour les utilisateurs et les robots.",
        "tags-create-tag-name": "Nom de la balise :",
        "tags-deactivate-reason": "Motif :",
        "tags-deactivate-not-allowed": "Il n'est pas possible de désactiver la balise « $1 ».",
        "tags-deactivate-submit": "Désactiver",
-       "tags-apply-no-permission": "Vous n’avez pas le droit d’appliquer des balises de changement avec vos modifications.",
-       "tags-apply-blocked": "Vous ne pouvez pas appliquer les modifications de balises lorsque vous êtes bloqué{{GENDER:||e}}.",
+       "tags-apply-no-permission": "Vous n’avez pas le droit d’appliquer des balises de changement en même temps que vos modifications.",
+       "tags-apply-blocked": "Vous ne pouvez pas appliquer les modifications de balises et vos modifications lorsque vous êtes bloqué{{GENDER:$1||e}}.",
        "tags-apply-not-allowed-one": "La balise « $1 » n’est pas autorisée à être appliquée manuellement.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|La balise suivante n’est pas autorisée à être appliquée|Les balises suivantes ne sont pas autorisées à être appliquées}} manuellement : $1",
-       "tags-update-no-permission": "Vous n’avez pas le droit d’ajouter ou de supprimer des balises de modification des révisions individuelles ou des entrées de journal.",
-       "tags-update-blocked": "Vous ne pouvez pas ajouter ou supprimer des balises de modifications lorsque vous êtes bloqué{{GENDER:||e}}.",
+       "tags-update-no-permission": "Vous n’avez pas le droit d’ajouter ou de supprimer \nles balises de modification des révisions individuelles ou des entrées de journal.",
+       "tags-update-blocked": "Vous ne pouvez pas ajouter ou supprimer des balises de modifications lorsque vous êtes bloqué{{GENDER:$1||e}}.",
        "tags-update-add-not-allowed-one": "La balise « $1 » ne peut pas être ajoutée manuellement.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|La balise suivante ne peut pas être ajoutée|Les balises suivantes ne peuvent pas être ajoutées}} manuellement : $1",
        "tags-update-remove-not-allowed-one": "La balise « $1 » ne peut pas être enlevée.",
        "dberr-info": "(Accès à la base de données impossible : $1)",
        "dberr-info-hidden": "(Accès à la base de données impossible)",
        "dberr-usegoogle": "Vous pouvez essayer de chercher avec Google pendant ce temps.",
-       "dberr-outofdate": "Notez que leurs index de notre contenu peuvent être dépassés.",
-       "dberr-cachederror": "Ceci est une copie cachée de la page demandée et peut être dépassée.",
-       "htmlform-invalid-input": "Des problèmes sont survenus avec certaines valeurs",
+       "dberr-outofdate": "Notez que leurs index de notre contenu peuvent ne plus être actuels.",
+       "dberr-cachederror": "Ceci est une copie cachée de la page demandée et peut ne plus être actuelle.",
+       "htmlform-invalid-input": "Des problèmes sont survenus avec certaines de vos valeurs.",
        "htmlform-select-badoption": "La valeur que vous avez spécifiée n'est pas une option valide.",
        "htmlform-int-invalid": "La valeur que vous avec spécifiée n'est pas un entier.",
        "htmlform-float-invalid": "La valeur que vous avez spécifiée n'est pas un nombre.",
        "htmlform-time-invalid": "La valeur que vous avez spécifiée n’est pas une heure reconnue. Essayez en utilisant le format HH:MM:SS.",
        "htmlform-datetime-invalid": "La valeur que vous avez spécifiée n’est pas un horodatage reconnu. Essayez en utilisant le format AAAA-MM-JJ HH:MM:SS.",
        "htmlform-date-toolow": "La valeur que vous avez spécifiée est antérieure à la date autorisée la plus ancienne, qui est $1.",
-       "htmlform-date-toohigh": "La valeur que vous avez spécifiée est postérieure à la date autorisée la plus lointaine, qui est $1.",
+       "htmlform-date-toohigh": "La valeur que vous avez spécifiée est postérieure à la plus grande date autorisée qui est $1.",
        "htmlform-time-toolow": "La valeur que vous avez spécifiée est antérieure à la plus petite heure autorisée, qui est $1.",
        "htmlform-time-toohigh": "La valeur que vous avez spécifiée est postérieure à la plus grande heure autorisée, qui est $1.",
        "htmlform-datetime-toolow": "La valeur que vous avez spécifiée est antérieure à l’horodatage autorisé le plus ancien, qui est $1.",
        "htmlform-user-not-exists": "<strong>$1</strong> n’existe pas.",
        "htmlform-user-not-valid": "<strong>$1</strong> n’est pas un nom d’utilisateur valide.",
        "logentry-delete-delete": "$1 {{GENDER:$2|a supprimé}} la page $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|supprimé}} redirigé vers $3 par écrasement.",
        "logentry-delete-restore": "$1 {{GENDER:$2|a restauré}} la page $3",
        "logentry-delete-event": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'un événement du journal|de $5 événements du journal}} sur $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|a modifié}} la visibilité {{PLURAL:$5|d'une révision|de $5 révisions}} sur la page $3 : $4",
        "revdelete-uname-unhid": "nom d'utilisateur affiché",
        "revdelete-restricted": "restrictions appliquées aux administrateurs",
        "revdelete-unrestricted": "restrictions retirées pour les administrateurs",
-       "logentry-block-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} $5 $6",
+       "logentry-block-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} avec la durée $5 $6",
        "logentry-block-unblock": "$1 {{GENDER:$2|a débloqué}} {{GENDER:$4|$3}}",
-       "logentry-block-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres de blocage pour {{GENDER:$4|$3}} $5 $6",
-       "logentry-suppress-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} $5 $6",
-       "logentry-suppress-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres de blocage pour {{GENDER:$4|$3}} $5 $6",
+       "logentry-block-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres de blocage pour {{GENDER:$4|$3}} avec une durée de $5 $6",
+       "logentry-suppress-block": "$1 {{GENDER:$2|a bloqué}} {{GENDER:$4|$3}} avec une durée de $5 $6",
+       "logentry-suppress-reblock": "$1 {{GENDER:$2|a modifié}} les paramètres de blocage pour {{GENDER:$4|$3}} avec une durée de $5 $6",
        "logentry-import-upload": "$1 {{GENDER:$2|a importé}} $3 par téléchargement de fichier",
        "logentry-import-upload-details": "$1 {{GENDER:$2|a importé}} $3 par téléchargement de fichier ($4 {{PLURAL:$4|révision|révisions}})",
        "logentry-import-interwiki": "$1 {{GENDER:$2|a importé}} $3 depuis un autre wiki",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "la page n’existe pas encore",
        "mw-widgets-titleinput-description-redirect": "redirection vers $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Ajouter une catégorie...",
        "sessionmanager-tie": "Impossible de combiner des types multiples de demandes d’authentification : $1.",
        "sessionprovider-generic": "sessions $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessions basées sur les témoins (''cookies'')",
        "log-action-filter-contentmodel-change": "Changement de modèle de contenu",
        "log-action-filter-contentmodel-new": "Création de page avec un modèle de contenu non-standard",
        "log-action-filter-delete-delete": "Suppression de pages",
+       "log-action-filter-delete-delete_redir": "Rediriger l'écrasement",
        "log-action-filter-delete-restore": "Restauration de page",
        "log-action-filter-delete-event": "Suppression du journal",
        "log-action-filter-delete-revision": "Suppression de révison",
        "usercssispublic": "Veuillez noter: les sous-pages CSS ne doivent pas contenir de données confidentielles parce qu'elles sont visibles des autres utilisateurs.",
        "restrictionsfield-badip": "Adresse IP ou plage non valide : $1",
        "restrictionsfield-label": "Plages IP autorisées :",
-       "restrictionsfield-help": "Une adresse IP ou une plage CIDR par ligne. Pour tout activer, utiliser <br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Erreur : $1",
-       "edit-error-long": "Erreurs :\n\n$1"
+       "restrictionsfield-help": "Une adresse IP ou une plage CIDR par ligne. Pour tout activer, utiliser <br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 8e542fb..3ae9648 100644 (file)
        "yourpasswordagain": "Mot de passe encore:",
        "createacct-yourpasswordagain": "Confirmes le mot de passe",
        "createacct-yourpasswordagain-ph": "Entres à nouveau le mot de passe",
-       "remembermypassword": "Garder mon mot de passe dans cette browser (pour un maximum of $1 {{PLURAL:$1|jour|jours}})",
        "yourdomainname": "Votre domaine:",
        "externaldberror": "Soit y avait une erreur avec la base d'information de certification extérieur, soit vous avez pas la permission de renouveler votre compte extérieur.",
        "login": "Connecter",
        "undo-success": "Le changement peut être renversé.  Regardez donc la comparaison en bas pour être sûr que c'est comme vous voulez, et puis sauvez les changements en bas pour finir le renversage du changement.",
        "undo-failure": "Le changement pouvait pas être renversé à cause d'une dispute de changements.",
        "undo-summary": "Défaire la révision $1 par [[Special:Contributions/$2|$2]] ([[User talk:$2|Discussion]])",
-       "cantcreateaccounttitle": "Impossible de créer le compte",
        "viewpagelogs": "Voir les notes pour cette page",
        "nohistory": "Y a pas de changements pour cette page.",
        "currentrev": "Version courante",
index d3828ca..006492e 100644 (file)
        "yourpasswordagain": "Confirmâd lo contresegno :",
        "createacct-yourpasswordagain": "Confirmâd lo contresegno",
        "createacct-yourpasswordagain-ph": "Tornâd buchiér lo contresegno",
-       "remembermypassword": "Sè rapelar de mon contresegno sur cél navegator (por lo més $1 jorn{{PLURAL:$1||s}})",
        "userlogin-remembermypassword": "Gouardar ma sèssion activa",
        "userlogin-signwithsecure": "Empleyér un branchement sècurisâ",
        "cannotloginnow-title": "Ora y at pas moyen de sè branchiér",
        "botpasswords-label-resetpassword": "Rebetar a zérô lo contresegno",
        "botpasswords-label-grants": "Drêts aplicâblos :",
        "botpasswords-help-grants": "Châque drêt balye accès ux drêts d’utilisator listâs qu’at ja un comptio. Vêde la [[Special:ListGrants|grelye des drêts]] por més d’enformacions.",
-       "botpasswords-label-restrictions": "Rèstriccions d’usâjo :",
        "botpasswords-label-grants-column": "Acordâ",
        "botpasswords-bad-appid": "Lo nom de robot « $1 » est pas justo.",
        "botpasswords-insert-failed": "Falyita de l’aponsa du nom de robot « $1 ». Est-o qu’il est ja étâ apondu ?",
        "passwordreset-emailelement": "Nom d’utilisator :\n$1\n\nContresegno temporèro :\n$2",
        "passwordreset-emailsentemail": "Se cel’adrèce èlèctronica est associyêe a voutron comptio, adonc un mèssâjo de remês’a zérô de contresegno serat mandâ.",
        "passwordreset-emailsentusername": "S’y at un’adrèce èlèctronica associyêe a cél nom d’utilisator, adonc un mèssâjo de remês’a zérô de contresegno serat mandâ.",
-       "passwordreset-emailsent-capture": "Un mèssâjo de remês’a zérô de contresegno est étâ mandâ, qu’il est montrâ ce-desot.",
-       "passwordreset-emailerror-capture": "Un mèssâjo de remês’a zérô de contresegno est étâ fêt, qu’il est montrâ ce-desot, mas l’èxpèdicion a l’utilisat{{GENDER:$2|or|rice}} at pas reussi : $1",
        "changeemail": "Changiér enlevar l’adrèce èlèctronica",
        "changeemail-header": "Complètâd cél formulèro por changiér voutron adrèce èlèctronica. Se vos voléd enlevar l’associacion d’un’adrèce èlèctronica avouéc voutron comptio, lèssiéd la novèl’adrèce èlèctronica voueda pendent la somission du formulèro.",
-       "changeemail-passwordrequired": "Vos devréd buchiér voutron contresegno por confirmar cél changement.",
        "changeemail-no-info": "Vos dête étre branchiê por arrevar tot drêt a cela pâge.",
        "changeemail-oldemail": "Adrèce èlèctronica d’ora :",
        "changeemail-newemail": "Novèl’adrèce èlèctronica :",
        "undo-nochange": "Semble que lo changement seye ja étâ dèfêt.",
        "undo-summary": "Dèfêta du changement $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|discutar]])",
        "undo-summary-username-hidden": "Dèfêta du changement $1 d’un utilisator cachiê",
-       "cantcreateaccounttitle": "Y at pas moyen de fâre lo comptio",
        "cantcreateaccount-text": "La crèacion de comptio dês cel’adrèce IP (<strong>$1</strong>) est étâye blocâye per [[User:$3|$3]].\n\nLa rêson balyêe per $3 ére <em>$2</em>",
        "cantcreateaccount-range-text": "La crèacion de comptio dês les adrèces IP dedens la plage <strong>$1</strong>, que comprend voutron adrèce IP (<strong>$4</strong>), sont étâye blocâyes per [[User:$3|$3]].\n\nLa rêson balyêe per $3 ére <em>$2</em>",
        "viewpagelogs": "Vêde los jornâls de cela pâge",
        "activeusers-intro": "O est na lista des utilisators qu’ant ègzèrciê un’activitât quinta que seye pendent {{PLURAL:$1|lo jorn passâ|los $1 jorns passâs}}.",
        "activeusers-count": "$1 accion{{PLURAL:$1||s}} pendent {{PLURAL:$3|lo jorn passâ|los $3 jorns passâs}}",
        "activeusers-from": "Fâre vêre los utilisators dês :",
-       "activeusers-hidebots": "Cachiér los robots",
-       "activeusers-hidesysops": "Cachiér los administrators",
        "activeusers-noresult": "Nion utilisator est étâ trovâ.",
        "activeusers-submit": "Fâre vêre los utilisators actifs",
        "listgrouprights": "Drêts de les tropes d’utilisators",
        "htmlform-submit": "Sometre",
        "htmlform-reset": "Dèfâre los changements",
        "htmlform-selectorother-other": "Ôtro",
-       "sqlite-has-fts": "$1 avouéc rechèrche en tèxto complèt recognua",
-       "sqlite-no-fts": "$1 sen rechèrche en tèxto complèt recognua",
        "logentry-delete-delete": "$1 {{GENDER:$2|at suprimâ}} la pâge $3",
        "logentry-delete-restore": "$1 at refêt la pâge $3",
        "logentry-delete-event": "$1 at changiê la visibilitât {{PLURAL:$5|d’un èvènement|de $5 èvènements}} du jornal dessus $3 : $4",
index d361eae..a9446ce 100644 (file)
        "yourpasswordagain": "Skriiw det paaswurd noch ans weder hen:",
        "createacct-yourpasswordagain": "Paaswurd gudkään",
        "createacct-yourpasswordagain-ph": "Du det paaswurd noch ans iin",
-       "remembermypassword": "Üüb diheer reegner üüb düür uunmelde (maksimaal för $1 {{PLURAL:$1|dai|daar}})",
        "userlogin-remembermypassword": "Uunmeldet bliiw",
        "userlogin-signwithsecure": "Seeker ferbinjang brük",
        "yourdomainname": "Din domain:",
        "botpasswords-label-resetpassword": "Paaswurd turagsaat",
        "botpasswords-label-grants": "Mögelk brükerrochten:",
        "botpasswords-help-grants": "Mä arke brükerrocht könst dü üüb ööder brükerrochten faan en brükerkonto tugrip. Luke iin uun det [[Special:ListGrants|tabel]] am muar informatjuun.",
-       "botpasswords-label-restrictions": "Kört brükerrochten:",
        "botpasswords-label-grants-column": "Tugestenen",
        "botpasswords-bad-appid": "Di bot-nööm \"$1\" gongt ei.",
        "botpasswords-insert-failed": "Di bot-nööm \"$1\" küd ei apnimen wurd. Ferlicht as hi al diar?",
        "passwordreset-emailtext-user": "Di brüker $1 üüb {{SITENAME}} hää am brükerinformatsjuunen för {{SITENAME}} uunfraaget ($4). {{PLURAL:$3|Detdiar brükerkonto as|Jodiar brükerkontos san}} mä detdiar E-Mail-Adres ferbünjen:\n\n$2\n\n{{PLURAL:$3|Detheer tidjwiis paaswurd lääpt|Joheer tidjwiis paaswurden luup}} efter {{PLURAL:$5|ään dai|$5 daar}} uf. Dü skulst di uunmelde an en nei paaswurd iinracht. Wan hoker ööders detheer uunfraag steld hää of dü din ual paaswurd käänst, säärst dü niks widjer onernem. Melde di ianfach mä din ual paaswurd uun.",
        "passwordreset-emailelement": "Brükernööm: \n$1\n\nTidjwiis paaswurd: \n$2",
        "passwordreset-emailsentemail": "Diar as en E-Mail tu di onerwais.",
-       "passwordreset-emailsent-capture": "Detdiar E-Mail, wat oner uunwiset woort, as tu di onerwais.",
-       "passwordreset-emailerror-capture": "Detdiar E-Mail, wat oner uunwiset woort, wiar tu di onerwais, oober küd ei tu di {{GENDER:$2|brüker}} ufsjüürd wurd: $1",
        "changeemail": "Feranre det E-Mail-adres",
        "changeemail-header": "Feranre det E-Mail-adres",
        "changeemail-no-info": "Dü möist önjmälded weese am ju sid diräkt tu tu gripen.",
        "undo-nochange": "Detdiar feranrang as wel al ans turagsaat wurden.",
        "undo-summary": "Feranrang $1 faan [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskuschuun]]) turagsaat.",
        "undo-summary-username-hidden": "Feranrang $1 faan en ferbürgenen brüker turagsaat",
-       "cantcreateaccounttitle": "Det brükerkonto koon ei iinracht wurd",
        "cantcreateaccount-text": "Det iinrachten faan en brükerkonto faan det IP-adres '''($1)''' as faan [[User:$3|$3]] speret wurden.\n\nGrünj för det sper: ''$2''",
        "cantcreateaccount-range-text": "Det iinrachten faan brükerkontos uun det IP-adresfial <strong>$1</strong>, huar uk din IP (<strong>$4</strong>) uun as, as faan [[User:$3|$3]] speret wurden.\n\nDi grünj faan $3 wiar: <em>$2</em>",
        "viewpagelogs": "Logbuken faan detdiar sidj uunwise",
        "activeusers-intro": "Jodiar brükern wiar {{PLURAL:$1|di leetst dai| a leetst $1 daar}} aktiif.",
        "activeusers-count": "$1 {{PLURAL:$1|aktjuun|aktjuunen}} uun a {{PLURAL:$3|leetst 24 stünj|leetst $3 daar}}",
        "activeusers-from": "Wise brükern mä began üüb:",
-       "activeusers-hidebots": "Bots fersteeg",
-       "activeusers-hidesysops": "Administratooren fersteeg",
        "activeusers-noresult": "Nään brükern fünjen.",
        "listgrouprights": "Brükersköölrochten",
        "listgrouprights-summary": "Jodiar brükersköölen an hör rochten san uun detheer Wiki fäästlaanj wurden.\nMuar diartu fanjst dü üüb  [[{{MediaWiki:Listgrouprights-helppage}}|detdiar sidj]].",
        "htmlform-title-not-exists": "$1 jaft at ei.",
        "htmlform-user-not-exists": "<strong>$1</strong> jaft at ei.",
        "htmlform-user-not-valid": "<strong>$1</strong> as nään tuläät brükernööm",
-       "sqlite-has-fts": "Werjuun $1 mä halep för't schüken uun di hialer tekst.",
-       "sqlite-no-fts": "Werjuun $1 saner halep för't schüken uun di hialer tekst.",
        "logentry-delete-delete": "$1 {{Gender:$2}} hää det sidj $3 stregen",
        "logentry-delete-restore": "$1 {{GENDER:$2}} hää det sidj $3 weder iinsteld",
        "logentry-delete-event": "$1 {{GENDER:$2}} hää det uunsicht feranert faan {{PLURAL:$5|en logbuk iindrach|$5 logbuk iindracher}} üüb $3: $4",
        "feedback-external-bug-report-button": "En technisk apgoow iinschüür",
        "feedback-dialog-title": "Komentaar ufsjüür",
        "feedback-dialog-intro": "Dü könst det ianfach formulaar diar oner för dan komentaar brük. Dan komentaar komt tuup mä dan brükernööm tu det sidj „$1“.",
-       "feedback-error-title": "Diar as wat skiaf gingen",
        "feedback-error1": "Feeler: Ünbekäänd API-bööd",
        "feedback-error2": "Feeler: Bewerkin as skiaf gingen.",
        "feedback-error3": "Feeler: Nian API-oonswaar",
index 20c4d1c..159834d 100644 (file)
        "yourpasswordagain": "Torne a scrivile",
        "createacct-yourpasswordagain": "Conferme la password",
        "createacct-yourpasswordagain-ph": "Torne a scrivi la tô password",
-       "remembermypassword": "Visiti di me di une session a chê altre (fin a $1 {{PLURAL:$1|zornade|zornadis}})",
        "userlogin-remembermypassword": "Tegnimi colegât",
        "yourdomainname": "Il to domini",
        "login": "Jentre",
        "activeusers-intro": "Cheste e je une liste dai utents che a àn vût cualchi gjenar di ativitât {{PLURAL:$1|te ultime dì|tai ultins $1 diis}}.",
        "activeusers-count": "$1 {{PLURAL:$1|cambiament|cambiaments}} {{PLURAL:$3|te ultime dì|tai ultins $3 diis}}",
        "activeusers-from": "Mostre i utents scomençant di:",
-       "activeusers-hidebots": "Plate i bots",
-       "activeusers-hidesysops": "Plate i aministradôrs",
        "activeusers-noresult": "Nissun utent cjatât.",
        "listgrouprights": "Dirits dai grups di utents",
        "listgrouprights-group": "Grup",
index 93caec8..e10b921 100644 (file)
        "yourpasswordagain": "Jo wachtwurd (nochris)",
        "createacct-yourpasswordagain": "Befêstigje wachtwurd",
        "createacct-yourpasswordagain-ph": "Befêstigje wachtwurd nochris",
-       "remembermypassword": "Oare kear fansels oanmelde (maksimaal $1 {{PLURAL:$1|dei|dagen}})",
        "userlogin-remembermypassword": "Ynlogd bliuwe",
        "userlogin-signwithsecure": "Feilige ferbining brûke",
        "yourdomainname": "Jo domein:",
        "undo-failure": "De feroarings kinne net werom set wurde troch in konflikt mei oare feroarings tuskentroch.",
        "undo-norev": "De feroaring kin werom set wurde, omdat it net bestiet of is wiske.",
        "undo-summary": "Werom sette fan ferzje $1 fan [[Special:Contributions/$2|$2]] ([[User talk:$2|Oerlis]])",
-       "cantcreateaccounttitle": "Registrearjen is mislearre.",
        "cantcreateaccount-text": "Registraasje fan in brûker fia dit IP-adres ('''$1''') is blokkearre troch [[User:$3|$3]].\n\nDe fan $3 opjûne reden is ''$2''",
        "viewpagelogs": "Lochboek foar dizze side sjen litte",
        "nohistory": "Dit is de earste ferzje fan de side.",
        "listusers-blocked": "(blokkearre)",
        "activeusers": "Aktive meidoggers",
        "activeusers-count": "$1 {{PLURAL:$1|aksje|aksjes}} yn de lêste {{PLURAL:$3|dei|$3 dagen}}",
-       "activeusers-hidebots": "Bots ferbergje",
-       "activeusers-hidesysops": "Behearders ferbergje",
        "activeusers-noresult": "Gjin meidoggers fûn.",
        "listgrouprights": "Rjochten fan brûkersgroepen",
        "listgrouprights-summary": "Op dizze side steane de brûkersgroepen yn dizze wiki beskreaun, mei har derby hearrende rjochten.\nDer kin [[{{MediaWiki:Listgrouprights-helppage}}|ekstra ynformaasje]] oer yndividuele rjochten oanwêzich wêze.",
        "feedback-back": "Foarige",
        "feedback-cancel": "Annulearje",
        "feedback-close": "Dien",
-       "feedback-error-title": "Flater",
        "feedback-message": "Berjocht:",
        "feedback-subject": "Ûnderwerp:",
        "feedback-submit": "Ferstjoere",
index 25c12fd..8509a8a 100644 (file)
        "tog-hidepatrolled": "Folaigh giotaí eagartha smachtaithe sna athruithe is déanaí",
        "tog-newpageshidepatrolled": "Folaigh leathanaigh smachtaithe ó liosta leathanaigh úire",
        "tog-extendwatchlist": "Leathnaigh an liosta faire chun gach athrú cuí a thaispeáint",
-       "tog-usenewrc": "Stíl nua do na hathruithe is déanaí (JavaScript riachtanach)",
+       "tog-usenewrc": "Athruithe a ghrúpáil de réir leathanaigh sna hathruithe le déanaí agus sa liosta faire",
        "tog-numberheadings": "Uimhrigh ceannteidil go huathoibríoch",
-       "tog-showtoolbar": "Taispeáin an barra uirlisí eagair (JavaScript)",
-       "tog-editondblclick": "Déghliogáil chun leathanaigh a chur in eagar (JavaScript)",
-       "tog-editsectiononrightclick": "Cumasaigh mír-eagarthóireacht le deaschliceáil<br /> ar cheannteidil (JavaScript)",
+       "tog-showtoolbar": "Taispeáin an barra uirlisí eagair",
+       "tog-editondblclick": "Déchliceáil chun leathanaigh a chur in eagar",
+       "tog-editsectiononrightclick": "Cumasaigh mír-eagarthóireacht le deaschliceáil ar cheannteidil",
        "tog-watchcreations": "Cuir ar mo liosta faire leathanaigh a chruthaím",
-       "tog-watchdefault": "Déan faire ar leathanaigh a athraím",
-       "tog-watchmoves": "Cuir ar mo liosta faire leathanaigh a athainmnaím",
-       "tog-watchdeletion": "Cuir ar mo liosta faire leathanaigh a scriosaim",
+       "tog-watchdefault": "Cuir leathanaigh agus comhaid a athraím le mo liosta faire",
+       "tog-watchmoves": "Cuir ar mo liosta faire leathanaigh agus comhaid a bhogaim",
+       "tog-watchdeletion": "Cuir ar mo liosta faire leathanaigh agus comhaid a scriosaim",
        "tog-minordefault": "Déan mionathruithe de gach aon athrú, mar réamhshocrú",
        "tog-previewontop": "Cuir an réamhamharc os cionn an bhosca eagair, <br />agus ná cuir é taobh thíos de",
        "tog-previewonfirst": "Taispeáin réamhamharc don chéad athrú",
-       "tog-enotifwatchlistpages": "Cuir ríomhphost chugam nuair a athraítear leathanaigh",
+       "tog-enotifwatchlistpages": "Cuir ríomhphost chugam nuair a athraítear leathanach nó comhad atá ar mo liosta faire",
        "tog-enotifusertalkpages": "Cuir ríomhphost chugam nuair a athraítear mo leathanach phlé úsáideora",
        "tog-enotifminoredits": "Cuir ríomhphost chugam nuair a dhéantar mionathruithe chomh maith",
        "tog-enotifrevealaddr": "Taispeáin mo sheoladh ríomhphoist i dteachtaireachtaí fógra",
        "tog-shownumberswatching": "Taispeán an méid úsáideoirí atá ag faire",
-       "tog-oldsig": "Réamhamharc ar an síniú atá ann:",
+       "tog-oldsig": "An síniú atá agat faoi láthair:",
        "tog-fancysig": "Sínithe bunúsacha mar vicítéacs (gan nasc uathoibríoch)",
-       "tog-uselivepreview": "Bain úsáid as réamhamharc beo (JavaScript) (Turgnamhach)",
+       "tog-uselivepreview": "Bain úsáid as réamhamharc beo",
        "tog-forceeditsummary": "Cuir in iúl dom nuair a chuirim isteach achoimre eagair folamh",
        "tog-watchlisthideown": "Folaigh mo chuid athruithe ón liosta faire",
        "tog-watchlisthidebots": "Folaigh athruithe de chuid róbat ón liosta faire",
        "moredotdotdot": "Tuilleadh...",
        "mypage": "Leathanach",
        "mytalk": "Plé",
-       "anontalk": "Plé don seoladh IP seo",
+       "anontalk": "Plé",
        "navigation": "Nascleanúint",
        "and": "&#32;agus",
        "qbfind": "Aimsigh",
        "protect": "Glasáil",
        "protect_change": "athraigh",
        "protectthispage": "Glasáil an lch seo",
-       "unprotect": "Díghlasáil",
-       "unprotectthispage": "Díghlasáil an lch seo",
+       "unprotect": "Athraigh an chosaint",
+       "unprotectthispage": "Athraigh an chosaint atá ag an lch seo",
        "newpage": "Leathanach nua",
        "talkpage": "Pléigh an lch seo",
        "talkpagelinktext": "Plé",
        "pool-errorunknown": "Earráid anaithnid",
        "aboutsite": "Maidir leis an {{SITENAME}}",
        "aboutpage": "Project:Maidir leis",
-       "copyright": "Tá an t-ábhar le fáil faoin $1.",
+       "copyright": "Tá an t-ábhar le fáil faoin $1 mura sonraítear a mhalairt.",
        "copyrightpage": "{{ns:project}}:Cóipchearta",
        "currentevents": "Cúrsaí reatha",
        "currentevents-url": "Project:Cúrsaí reatha",
        "laggedslavemode": "Rabhadh: B'fhéidir nach bhfuil na nuashonrúcháin is déanaí le feiceáil ar an leathanach seo.",
        "readonly": "Bunachar sonraí faoi ghlas",
        "enterlockreason": "Iontráil cúis don glasáil, agus meastachán\nden uair a díghlasálfar an bunachar sonraí.",
-       "readonlytext": "Tá an bunachar sonraí {{GRAMMAR:genitive|{{SITENAME}}}} glasáilte anois do iontráilí agus athruithe nua\n(is dócha go bhfuil sé do gnáthchothabháil).\nTar éis seo, díghlasálfar an bunachar sonraí arís.\nTugadh an míniú seo ag an riarthóir a ghlasáil é:\n$1",
+       "readonlytext": "Tá an bunachar sonraí glasáilte anois agus ní féidir iontrálacha nua ná athruithe eile a dhéanamh. Gach seans go bhfuil gnáthchothabháil ar siúl, agus beidh gach rud ar ais mar a bhí nuair a bheidh sin thart.\n\nThug an riarthóir a ghlasáil é an míniú seo:\n$1",
        "missing-article": "Ní bhfuarthas téacs an leathanaigh ceart, darbh ainm \"$1\" $2.\n\nDe ghnáth, tarlaíonn sé seo nuair a leantar nasc stáire nó difr chuig leathanach a scriosadh.\n\nMurab fhíor é seo, is féidir go bhfuair tú fabht sa bhogearraí. Beimid buíoch duit é a chur in iúl do [[Special:ListUsers/sysop|riarthóir]], chomh maith le URL an suíoimh.",
        "missingarticle-rev": "(leagan#: $1)",
        "missingarticle-diff": "(Dif: $1, $2)",
        "cannotdelete": "Ní féidir an leathanach nó comhad \"$1\" a scriosadh.\nB'fhéidir gur scrios duine eile é cheana féin.",
        "badtitle": "Teideal neamhbhailí",
        "badtitletext": "Bhí teideal an leathanaigh a d'iarr tú ar neamhbhailí, folamh, nó\nteideal idirtheangach nó idirvicí nasctha go mícheart.",
-       "perfcached": "Fuarthas na sonraí a leanas as taisce, agus is dócha go bhfuil siad as dáta. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.",
+       "perfcached": "Fuarthas na sonraí a leanas as taisce, agus seans go bhfuil siad as dáta. Tá {{PLURAL:$1|aon toradh amháin|$1 thoradh}} ar fáil sa taisce.",
        "perfcachedts": "Tá na sonraí seo a leanas sa taisce, nuashonraithe $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "viewsource": "Féach ar fhoinse",
        "actionthrottled": "Gníomh scóigthe",
-       "actionthrottledtext": "Mar theicníc frithurscair, ní féidir lear an gníomh seo a dhéanamh barraíocht taobh istigh de thréimhse ghairid ama, agus tá an méid sáraithe agat.\nBain trial arís as i gcionn cúpla bomaite más é do thoil é.",
+       "actionthrottledtext": "Mar theicníc frithurscair, ní féidir lear an gníomh seo a dhéanamh barraíocht taobh istigh de thréimhse ghairid ama, agus tá an méid sáraithe agat.\nBain triail arís as i gcionn cúpla bomaite más é do thoil é.",
        "protectedpagetext": "Tá an leathanach seo glasáilte chun coisc ar eagarthóireacht.",
        "viewsourcetext": "Is féidir foinse an leathanach seo a fheiceáil ná a cóipeáil:",
        "editinginterface": "'''Rabhadh:''' Tá tú ag athrú leathanaigh a bhfuil téacs comhéadain do na bogearraí air. Cuirfear athruithe ar an leathanach seo i bhfeidhm ar an gcomhéadan úsáideora.\nMás maith leat MediaWiki a aistriú, cuimhnigh ar [https://translatewiki.net/wiki/Main_Page?setlang=ga translatewiki.net] (tionscadal logánaithe MediaWiki) a úsáid.",
        "nocookieslogin": "Úsáideann {{SITENAME}} fianáin chun úsáideoirí a logáil isteach.\nTá fianáin díchumasaithe agat.\nCumasaigh iad agus bain triail eile as, le do thoil.",
        "nocookiesforlogin": "{{int:nocookieslogin}}",
        "noname": "Níor thug tú ainm úsáideora bailí.",
-       "loginsuccesstitle": "Logáladh isteach thú",
+       "loginsuccesstitle": "Logáilte isteach",
        "loginsuccess": "'''Tá tú logáilte isteach anois sa {{SITENAME}} mar \"<nowiki>$1</nowiki>\".'''",
-       "nosuchuser": "Níl aon úsáideoir ann leis an ainm \"$1\".\nTá ainmneacha úsáideoir cásíogair.\nCinntigh do litriú, nó [[Special:CreateAccount|bain úsáid as an foirm thíos]] chun cuntas úsáideora nua a chruthú.",
+       "nosuchuser": "Níl aon úsáideoir ann darb ainm \"$1\".\nTá ainmneacha úsáideoir cásíogair.\nSeiceáil an litriú, nó [[Special:CreateAccount|cruthaigh cuntas nua]].",
        "nosuchusershort": "Níl aon úsáideoir ann leis an ainm \"$1\". Cinntigh do litriú.",
        "nouserspecified": "Caithfidh ainm úsáideoir a shonrú.",
        "login-userblocked": "Tá an t-úsáideoir seo faoi bhac. Níl cead aige/aici logáil isteach.",
        "wrongpassword": "D'iontráil tú focal faire mícheart.<br />\nBain triail eile as.",
        "wrongpasswordempty": "Níor iontráil tú focal faire. Bain triail eile as.",
        "passwordtooshort": "Is riachtanach go bhfuil {{PLURAL:$1|carachtar amháin|$1 carachtair}} ann ar a laghad i bhfocal faire.",
-       "mailmypassword": "Seol m'fhocal faire chugam.",
+       "mailmypassword": "Focal faire a athshocrú",
        "passwordremindertitle": "Cuimneachán an fhocail faire ó {{SITENAME}}",
        "passwordremindertext": "D'iarr duine éigin (tusa de réir cosúlachta, ón seoladh IP $1) go sheolfaimis focal faire {{GRAMMAR:genitive|{{SITENAME}}}} nua  ($4).\n\"$3\" an focal faire don úsáideoir \"$2\" anois. Ba chóir duit lógail isteach anois agus d'fhocal faire a athrú.\n\nRachaidh d'fhocail faire sealadach as feidhm i gceann {{PLURAL:$5|lá amháin|$5 lae}}.",
        "noemail": "Níl aon seoladh ríomhphoist i gcuntas don úsáideoir \"$1\".",
        "search-section": "(gearradh $1)",
        "search-suggest": "An raibh $1 á lorg agat?",
        "search-interwiki-caption": "Comhthionscadail",
-       "search-interwiki-default": "$1 torthaí:",
+       "search-interwiki-default": "Torthaí ó $1:",
        "search-interwiki-more": "(níos mó)",
        "search-relatedarticle": "Gaolmhar",
        "searchrelated": "gaolmhara",
        "prefs-rc": "Athruithe is déanaí",
        "prefs-watchlist": "Liosta faire",
        "prefs-watchlist-days": "Líon na laethanta le taispeáint sa liosta faire:",
-       "prefs-watchlist-days-max": "Maximum $1 {{PLURAL:$1|day|days}}",
+       "prefs-watchlist-days-max": "$1 {{PLURAL:$1|lá}} ar a mhéad",
        "prefs-watchlist-edits": "Líon na n-athruithe le taispeáint sa liosta leathnaithe faire:",
        "prefs-watchlist-edits-max": "Uasmhéid: 1000",
        "prefs-misc": "Éagsúla",
        "savedprefs": "Sábháladh do chuid sainroghanna.",
        "timezonelegend": "Crios ama:",
        "localtime": "An t-am áitiúil:",
-       "timezoneuseserverdefault": "Úsáid am réamhshocraithe an fhreastalaí",
+       "timezoneuseserverdefault": "Úsáid am réamhshocraithe an vicí ($1)",
        "timezoneuseoffset": "Eile (cuir isteach an difear)",
        "servertime": "Am an fhreastalaí:",
        "guesstimezone": "Líon ón mbrabhsálaí",
index e6cbbcb..42b617f 100644 (file)
        "yourname": "Kullanıcı adınız",
        "yourpassword": "Parol",
        "yourpasswordagain": "Parolu enidän yaz",
-       "remembermypassword": "Parolu hatırla (en fazla $1 {{PLURAL:$1|gün|gün}} için)",
        "yourdomainname": "Domen adınız",
        "login": "Gir",
        "nav-login-createaccount": "Gir / esap yarat",
        "permissionserrors": "İzin yannışları",
        "permissionserrorstext-withaction": "Aşaadaki {{PLURAL:$1|sebep|sebepler}}ä deyni yok $2 kuvediniz:",
        "recreate-moveddeleted-warn": "'''Bak: Siz yarattınız o sayfayı angısı ilerdän silindi.'''\n\nLäazım düşünmää bu sayfayı redaktat etmää devam etmää deyni.\nSayfanın silmää jurnalı raatlık için yazılêr burada:",
-       "cantcreateaccounttitle": "Yok nicä esap yaratılsın",
        "viewpagelogs": "Bu yaprak için jurnalları göster",
        "currentrev": "Şindiki versiya",
        "currentrev-asof": "$1 sayfanın şindiki halı",
index d6b8a34..e3a2daf 100644 (file)
        "yourname": "用户名:",
        "yourpassword": "密码:",
        "yourpasswordagain": "输过道密码:",
-       "remembermypassword": "记定我𠮶密码(顶多$1{{PLURAL:$1|日|日}})",
        "yourdomainname": "倷𠮶域名:",
        "externaldberror": "外部验证数据库出错,或倷更新伓正倷𠮶外部帐户。",
        "login": "登入",
        "undo-success": "个只编辑可以拖取销。请检查吖以确定个系倷想扤𠮶,接到保存修改去完成撤销编辑。",
        "undo-failure": "半中𠮶编辑有人挭仗,个只编辑伓可以拖取销。",
        "undo-summary": "取消由[[Special:Contributions/$2|$2]] ([[User talk:$2|对话]])所修订𠮶 $1",
-       "cantcreateaccounttitle": "新开伓正帐户",
        "cantcreateaccount-text": "IP 地址伓能 ('''$1''') 新开帐户。个可能系因为经常有来自倷𠮶学堂或网络供应商 (ISP)故意𠮶破坏扤得。",
        "viewpagelogs": "眵吖个页𠮶日志",
        "nohistory": "个页冇修改历史。",
index 1cb2ad7..3a58c92 100644 (file)
        "yourname": "用戶名:",
        "yourpassword": "密碼:",
        "yourpasswordagain": "輸過道密碼:",
-       "remembermypassword": "記定我嗰密碼(頂多$1{{PLURAL:$1|日|日}})",
        "yourdomainname": "倷嗰域名:",
        "externaldberror": "外部驗證資料庫出錯,或倷更新伓正倷嗰外部帳戶。",
        "login": "登入",
        "undo-success": "箇隻編輯可以拕取銷。請檢查吖以確定箇係倷想扤嗰,接到保存修改去完成撤銷編輯。",
        "undo-failure": "半中嗰編輯有人挭仗,箇隻編輯伓可以拕取銷。",
        "undo-summary": "取消由[[Special:Contributions/$2|$2]] ([[User talk:$2|對話]])所修訂嗰 $1",
-       "cantcreateaccounttitle": "新開伓正帳戶",
        "cantcreateaccount-text": "IP 位址伓能 ('''$1''') 新開帳戶。箇可能係因為經常有來自倷嗰學堂或網絡供應商 (ISP)故意嗰破壞扤得。",
        "viewpagelogs": "眵吖箇頁嗰日誌",
        "nohistory": "箇頁冇修改歷史。",
index c658811..93fb479 100644 (file)
        "yourpasswordagain": "Ath-sgrìobh facal-faire",
        "createacct-yourpasswordagain": "Dearbhaich am facal-faire",
        "createacct-yourpasswordagain-ph": "Cuir a-steach am facal-faire a-rithist",
-       "remembermypassword": "Cuimhnich gu bheil mi air logadh a-steach air a' choimpiutair seo (suas gu $1 {{PLURAL:$1|latha|latha|làithean|latha}})",
        "userlogin-remembermypassword": "Cum air logadh a-steach mi",
        "userlogin-signwithsecure": "Cleachd ceangal tèarainte",
        "yourdomainname": "An àrainn-lìn agad:",
        "activeusers-intro": "Seo liosta dhe na cleachdaichean a rinn gnìomh air choireigin am broinn {{PLURAL:$1|an $1 latha|an $1 latha|nan $1 làithean|an $1 latha}} mu dheireadh.",
        "activeusers-count": "$1 {{PLURAL:$1|ghnìomh|ghnìomh|gnìomhan|gnìomh}} am broinn {{PLURAL:$3|an $3 latha|an $3 latha|nan $3 làithean|an $3 latha}} mu dheireadh.",
        "activeusers-from": "Seall cleachdaichean o seo a-mach:",
-       "activeusers-hidebots": "Falaich na botaichean",
-       "activeusers-hidesysops": "Falaich na rianairean",
        "activeusers-noresult": "Cha deach cleachdaiche a lorg.",
        "listgrouprights": "Ceadan nam buidhnean chleachdaichean",
        "listgrouprights-summary": "chì thu liosta dhe na buidhnean chleachdaichean a tha san uicidh seo 's na ceadan inntrigidh aca.\nDh'fhaoidte gu bheil [[{{MediaWiki:Listgrouprights-helppage}}|barrachd fiosrachaidh]] mu cheadan fa leth ann.",
        "htmlform-cloner-create": "Cuir barrachd ris",
        "htmlform-cloner-delete": "Thoir air falbh",
        "htmlform-cloner-required": "Tha luach a dhìth.",
-       "sqlite-has-fts": "$1 le taic ri lorg teacsa shlàin",
-       "sqlite-no-fts": "$1 gun taic ri lorg teacsa shlàin",
        "logentry-delete-delete": "Sguab $1 às duilleag $3",
        "logentry-delete-restore": "Dh'aisig $1 duilleag $3",
        "logentry-delete-event": "Dh'atharraich $1 an fhaicsinneachd aig $5 {{PLURAL:$5|tachartas|thachartas|tachartasan|tachartas}} an loga air $3: $4",
index 5182de0..0dfda9e 100644 (file)
        "laggedslavemode": "'''Aviso:''' A páxina pode non conter as actualizacións recentes.",
        "readonly": "Base de datos pechada",
        "enterlockreason": "Dea unha razón para o peche, incluíndo unha estimación de até cando se manterá",
-       "readonlytext": "Nestes intres a base de datos está pechada a novas entradas e outras modificacións, probablemente debido a procesos de mantemento, tras os que volverá á normalidade.\n\nO administrador de sistemas que a pechou deu esta explicación: $1",
+       "readonlytext": "Nestes intres a base de datos está pechada a novas entradas e outras modificacións, probablemente debido a procesos de mantemento, tralos que volverá á normalidade.\n\nO administrador do sistema que a pechou deu esta explicación: $1",
        "missing-article": "A base de datos non atopou o texto da páxina chamada \"$1\" $2, que debera ter atopado.\n\nNormalmente, isto está causado por seguir unha ligazón cara a unha diferenza vella ou a unha páxina que foi borrada.\n\nSe este non é o caso, poida que atopase un erro no software.\nPor favor, comuníquello a un [[Special:ListUsers/sysop|administrador]] tomando nota do enderezo URL.",
        "missingarticle-rev": "(nº de revisión: $1)",
        "missingarticle-diff": "(dif: $1, $2)",
        "readonly_lag": "A base de datos bloqueouse automaticamente mentres os servidores levan a cabo a sincronización co servidor principal",
-       "nonwrite-api-promise-error": "A cabeceira HTTP  'Promise-Non-Write-API-Action' foi enviada pero a petición foi feita a un módulo de escritura da API.",
+       "nonwrite-api-promise-error": "Enviouse a cabeceira HTTP \"Promise-Non-Write-API-Action\", pero a petición fíxose a un módulo de escritura da API.",
        "internalerror": "Erro interno",
        "internalerror_info": "Erro interno: $1",
        "internalerror-fatal-exception": "Excepción grave de tipo \"$1\"",
        "no-null-revision": "Non se puido crear a nova revisión nula para a páxina \"$1\"",
        "badtitle": "Título incorrecto",
        "badtitletext": "O título da páxina pedida non era válido, estaba baleiro ou proviña dunha ligazón interlingüística ou interwiki incorrecta.\nPoida que conteña un ou máis caracteres dos que non se poden empregar nos títulos.",
-       "title-invalid-empty": "O título de páxina solicitado está baleiro ou só contén o nome do espazo de nomes.",
+       "title-invalid-empty": "O título de páxina solicitado está baleiro ou só contén o nome dun espazo de nomes.",
        "title-invalid-utf8": "O título de páxina solicitado contén unha secuencia UTF-8 inválida.",
-       "title-invalid-interwiki": "O título da páxina solicitada contén unha ligazón interwiki que non pode usarse nos títulos.",
-       "title-invalid-talk-namespace": "O título de páxina solicitado refírese a unha páxina de conversa que pode non existir.",
+       "title-invalid-interwiki": "O título de páxina solicitado contén unha ligazón interwiki que non se pode utilizar nos títulos.",
+       "title-invalid-talk-namespace": "O título de páxina solicitado fai referencia a unha páxina de conversa que pode non existir.",
        "title-invalid-characters": "O título de páxina solicitado contén caracteres inválidos: \"$1\".",
-       "title-invalid-relative": "O título ten unha ruta relativa. Os títulos de páxina relativos (./, ../) son inválidos, porque non van ser accesibles cando se consulten co navegador do usuario.",
+       "title-invalid-relative": "O título ten unha ruta relativa. Os títulos de páxina relativos (./, ../) son inválidos, porque a miúdo non son accesibles cando se consultan desde o navegador do usuario.",
        "title-invalid-magic-tilde": "O título de páxina solicitado contén unha secuencia con tiles inválida (<nowiki>~~~</nowiki>).",
-       "title-invalid-too-long": "O título de páxina solicitado é moi longo. Non pode ser maior de {{PLURAL:$1|byte|bytes}} en codificación UTF-8.",
-       "title-invalid-leading-colon": "O título de páxina solicitado contén un punto e coma inválido ó comezo.",
+       "title-invalid-too-long": "O título de páxina solicitado é moi longo. Non pode ser maior de $1 {{PLURAL:$1|byte|bytes}} en codificación UTF-8.",
+       "title-invalid-leading-colon": "O título de páxina solicitado contén un carácter de dous puntos non permitido ao comezo.",
        "perfcached": "Esta información é da memoria caché e pode ser que non estea completamente actualizada. Hai un máximo de {{PLURAL:$1|$1 resultado dispoñible|$1 resultados dispoñibles}} na caché.",
        "perfcachedts": "Esta información é da memoria caché. Última actualización: $2 ás $3. Hai un máximo de {{PLURAL:$4|$4 resultado dispoñible|$4 resultados dispoñibles}} na caché.",
        "querypage-no-updates": "Neste momento están desactivadas as actualizacións nesta páxina. O seu contido non se modificará.",
        "viewsource": "Ver o código fonte",
        "viewsource-title": "Ver o código fonte de \"$1\"",
        "actionthrottled": "Acción limitada",
-       "actionthrottledtext": "Como medida contra os abusos, a acción que está realizando está limitada a un número determinado de veces nun periodo curto de tempo, e superou ese límite.\nInténteo de novo nuns minutos.",
+       "actionthrottledtext": "Como medida contra os abusos, ten limitada a acción que está realizando a un número determinado de veces nun período curto de tempo, e vostede superou ese límite.\nInténteo de novo nuns minutos.",
        "protectedpagetext": "Esta páxina foi protexida para evitar a edición e outras accións.",
        "viewsourcetext": "Pode ver e copiar o código fonte desta páxina.",
        "viewyourtext": "Pode ver e copiar o código fonte <strong>das súas edicións</strong> nesta páxina.",
        "mypreferencesprotected": "Non ten os permisos necesarios para editar as súas preferencias.",
        "ns-specialprotected": "Non se poden editar as páxinas no espazo de nomes \"{{ns:special}}\".",
        "titleprotected": "Este título foi protexido da creación por [[User:$1|$1]].\nO motivo achegado é <em>$2</em>.",
-       "filereadonlyerror": "Non se puido modificar o ficheiro \"$1\" porque o repositorio \"$2\" está en modo de só lectura.\n\nO administrador de sistemas que bloqueou o repositorio achegou este motivo: \"$3\".",
+       "filereadonlyerror": "Non se puido modificar o ficheiro \"$1\" porque o repositorio \"$2\" está en modo de só lectura.\n\nO administrador do sistema que bloqueou o repositorio achegou este motivo: \"$3\".",
        "invalidtitle-knownnamespace": "Título inválido co espazo de nomes \"$2\" e o texto \"$3\"",
        "invalidtitle-unknownnamespace": "Título inválido cun número de espazo de nomes, $1, descoñecido e o texto \"$2\"",
        "exception-nologin": "Non accedeu ao sistema",
        "exception-nologin-text": "Acceda ao sistema para poder realizar esa acción ou acceder a esa páxina.",
        "exception-nologin-text-manual": "Debe $1 para poder realizar esa acción ou acceder a esa páxina.",
-       "virus-badscanner": "Configuración errónea: escáner de virus descoñecido: ''$1''",
+       "virus-badscanner": "Configuración errónea: Escáner de virus descoñecido: <em>$1</em>",
        "virus-scanfailed": "fallou o escaneado (código $1)",
        "virus-unknownscanner": "antivirus descoñecido:",
        "logouttext": "'''Agora está fóra do sistema.'''\n\nTeña en conta que algunhas páxinas poden continuar aparecendo como se aínda estivese dentro do sistema, ata que limpe a caché do seu navegador.",
        "cannotlogoutnow-title": "Non se pode saír da sesión agora mesmo",
        "cannotlogoutnow-text": "Non é posible saír da sesión cando se usa $1.",
        "welcomeuser": "Reciba a nosa benvida, $1!",
-       "welcomecreation-msg": "A súa conta foi creada correctamente.\nNon esqueza personalizar as súas [[Special:Preferences|preferencias de {{SITENAME}}]].",
+       "welcomecreation-msg": "A súa conta creouse correctamente.\nNon esqueza personalizar as súas [[Special:Preferences|preferencias]] de {{SITENAME}}.",
        "yourname": "Nome de usuario:",
        "userlogin-yourname": "Nome de usuario",
        "userlogin-yourname-ph": "Insira o seu nome de usuario",
        "createacct-yourpasswordagain-ph": "Insira o contrasinal outra vez",
        "userlogin-remembermypassword": "Manter a miña conexión",
        "userlogin-signwithsecure": "Utilizar a conexión segura",
-       "cannotlogin-title": "Non se pode acceder ó sistema",
-       "cannotlogin-text": "O acceso ó sistema non está dispoñible.",
+       "cannotlogin-title": "Non se pode acceder ao sistema",
+       "cannotlogin-text": "O acceso ao sistema non está dispoñible.",
        "cannotloginnow-title": "Non se pode iniciar a sesión agora mesmo",
        "cannotloginnow-text": "Non é posible iniciar a sesión cando se usa $1.",
        "cannotcreateaccount-title": "Non se poden crear contas de usuario",
-       "cannotcreateaccount-text": "A creación directa de contas de usuario non está habilitada nesta wiki.",
+       "cannotcreateaccount-text": "A creación directa de contas de usuario non está activada neste wiki.",
        "yourdomainname": "O seu dominio:",
        "password-change-forbidden": "Non pode mudar os contrasinais neste wiki.",
        "externaldberror": "Ou ben se produciu un erro da base de datos na autenticación externa ou ben non se lle permite actualizar a súa conta externa.",
        "userlogin-resetpassword-link": "Esqueceu o contrasinal?",
        "userlogin-helplink2": "Axuda co rexistro",
        "userlogin-loggedin": "Xa accedeu ao sistema como {{GENDER:$1|$1}}.\nUtilice o formulario inferior para acceder como outro usuario.",
-       "userlogin-reauth": "Debe conectarse de novo para verificar que é {{GENDER:$1|$1}}.",
+       "userlogin-reauth": "Debe conectarse de novo para verificar que vostede é {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Crear outra conta",
        "createacct-emailrequired": "Enderezo de correo electrónico",
        "createacct-emailoptional": "Enderezo de correo electrónico (opcional)",
        "createaccountreason": "Motivo:",
        "createacct-reason": "Motivo",
        "createacct-reason-ph": "Por que crea outra conta?",
-       "createacct-reason-help": "Mensaxe que se mostra no rexistro de creación de contas",
+       "createacct-reason-help": "Mensaxe mostrada no rexistro de creación de contas",
        "createacct-submit": "Crear a conta",
        "createacct-another-submit": "Crear a conta",
        "createacct-continue-submit": "Continuar a creación da conta",
        "nocookiesnew": "A conta de usuario foi creada, pero non accedeu ao sistema.\n{{SITENAME}} para rexistrar os usuarios.\nVostede ten as cookies deshabilitadas.\nPor favor, habilíteas e logo acceda ao sistema co seu novo nome de usuario e contrasinal.",
        "nocookieslogin": "{{SITENAME}} usa cookies para rexistrar os usuarios.\nVostede ten as cookies deshabilitadas.\nPor favor, habilíteas e inténteo de novo.",
        "nocookiesfornew": "Non se creou a conta de usuario porque non puidemos confirmar a súa orixe.\nAsegúrese de que ten as cookies habilitadas, volva cargar a páxina e inténteo de novo.",
-       "createacct-loginerror": "A conta creouse correctamente, pero non se puido conectar automaticamente. Proceda ó [[Special:UserLogin|acceso manual]].",
+       "createacct-loginerror": "A conta creouse correctamente, pero non se puido conectar automaticamente. Vaia ao [[Special:UserLogin|acceso manual]].",
        "noname": "Non especificou un nome de usuario válido.",
-       "loginsuccesstitle": "Conectado",
+       "loginsuccesstitle": "Accedeu ao sistema",
        "loginsuccess": "<strong>Accedeu ao sistema de {{SITENAME}} como \"$1\".</strong>",
        "nosuchuser": "Non existe ningún usuario chamado \"$1\".\nOs nomes de usuario diferencian entre maiúsculas e minúsculas.\nVerifique a ortografía ou [[Special:CreateAccount|cree unha nova conta]].",
        "nosuchusershort": "Non existe ningún usuario chamado \"$1\".\nVerifique o nome que inseriu.",
        "wrongpassword": "O contrasinal escrito é incorrecto.\nPor favor, insira outro.",
        "wrongpasswordempty": "O campo do contrasinal estaba en branco.\nPor favor, inténteo de novo.",
        "passwordtooshort": "Os contrasinais deben conter, como mínimo, {{PLURAL:$1|1 carácter|$1 caracteres}}.",
-       "passwordtoolong": "Os contrasinais non deben ser máis longo de {{PLURAL:$1|1 carácter|$1 caracteres}}.",
-       "passwordtoopopular": "Os contrasinais escollidos máis habitualmente non poden usarse. Por favor, escolle un contrasinal máis único.",
+       "passwordtoolong": "Os contrasinais non poden ser máis longo de {{PLURAL:$1|1 carácter|$1 caracteres}}.",
+       "passwordtoopopular": "Non pode utilizar un contrasinal dos habitualmente elixidos pola xente. Por favor, escolla un contrasinal máis orixinal.",
        "password-name-match": "O seu contrasinal debe ser diferente do seu nome de usuario.",
        "password-login-forbidden": "O uso deste nome de usuario e contrasinal foi prohibido.",
        "mailmypassword": "Restablecer o contrasinal",
        "passwordremindertitle": "Novo contrasinal temporal para {{SITENAME}}",
-       "passwordremindertext": "Alguén (probablemente vostede, desde o enderezo IP $1) solicitou un novo\ncontrasinal para acceder a {{SITENAME}} ($4). Un contrasinal temporal para o usuario\n\"$2\" foi creado e fixado como \"$3\". Se esa foi a súa\nintención, necesitará acceder ao sistema e escoller un novo contrasinal agora.\nO seu contrasinal temporal caducará {{PLURAL:$5|nun día|en $5 días}}.\n\nSe foi alguén diferente o que fixo esta solicitude ou se xa se lembra do seu contrasinal\ne non o quere modificar, pode ignorar esta mensaxe e\ncontinuar a utilizar o seu contrasinal vello.",
+       "passwordremindertext": "Alguén (probablemente vostede, desde o enderezo IP $1) solicitou un novo\ncontrasinal para acceder a {{SITENAME}} ($4). Creouse un contrasinal temporal para o usuario\n\"$2\" e quedou establecido como \"$3\". Se esa foi a súa\nintención, terá que acceder ao sistema e escoller un novo contrasinal agora.\nO seu contrasinal temporal caducará {{PLURAL:$5|nun día|en $5 días}}.\n\nSe foi outra persoa a que fixo esta solicitude ou se xa se lembra do seu contrasinal\ne non o quere modificar, pode ignorar esta mensaxe e\ncontinuar a utilizar o seu contrasinal vello.",
        "noemail": "O usuario \"$1\" non posúe ningún enderezo de correo electrónico rexistrado.",
        "noemailcreate": "Ten que proporcionar un enderezo de correo electrónico válido",
        "passwordsent": "Enviouse un contrasinal novo ao enderezo de correo electrónico rexistrado de \"$1\".\nPor favor, acceda ao sistema de novo tras recibilo.",
-       "blocked-mailpassword": "O seu enderezo IP está bloqueado para editar. Tampouco se lle permite usar a función de recuperación do contrasinal para evitar abusos do sistema.",
+       "blocked-mailpassword": "O seu enderezo IP está bloqueado fronte á edición. Tampouco se lle permite usar a función de recuperación do contrasinal para evitar abusos do sistema.",
        "eauthentsent": "Envióuselle un correo electrónico de confirmación ao enderezo especificado.\nAntes de que se lle envíe calquera outro correo a esta conta terá que seguir as instrucións que aparecen nesa mensaxe para confirmar que a conta é realmente súa.",
        "throttled-mailpassword": "Enviouse un correo electrónico de restablecemento do contrasinal {{PLURAL:$1|na última hora|nas últimas $1 horas}}.\nPara evitar o abuso do sistema só se enviará unha mensaxe de restablecemento cada {{PLURAL:$1|hora|$1 horas}}.",
        "mailerror": "Produciuse un erro ao enviar o correo electrónico: $1",
-       "acct_creation_throttle_hit": "Alguén que visitou este wiki co seu enderezo IP creou {{PLURAL:$1|unha conta|$1 contas}} nos últimos ̩$2 días, que é o máximo permitido neste período de tempo.\nComo resultado, os visitantes que usen este enderezo IP non poden crear máis contas nestes intres.",
+       "acct_creation_throttle_hit": "Alguén que visitou este wiki co seu enderezo IP creou {{PLURAL:$1|unha conta|$1 contas}} nun breve período de tempo ($2), que é o máximo permitido neste período de tempo.\nComo resultado, os visitantes que usen este enderezo IP non poden crear máis contas nestes intres.",
        "emailauthenticated": "O seu enderezo de correo electrónico foi confirmado o $2 ás $3.",
        "emailnotauthenticated": "O seu enderezo de correo electrónico aínda non foi confirmado.\nNon se enviará ningunha mensaxe por ningunha das seguintes características.",
        "noemailprefs": "Especifique un enderezo de correo electrónico se quere que funcione esta opción.",
        "createacct-another-realname-tip": "O nome real é opcional.\nSe escolle dalo utilizarase para atribuír ao usuario o seu traballo.",
        "pt-login": "Acceder ao sistema",
        "pt-login-button": "Acceder ao sistema",
-       "pt-login-continue-button": "Continuar a conexión",
+       "pt-login-continue-button": "Continuar co inicio de sesión",
        "pt-createaccount": "Crear unha conta",
        "pt-userlogout": "Saír",
        "php-mail-error-unknown": "Erro descoñecido na función mail() do PHP.",
        "newpassword": "Contrasinal novo:",
        "retypenew": "Insira outra vez o novo contrasinal:",
        "resetpass_submit": "Establecer o contrasinal e acceder ao sistema",
-       "changepassword-success": "O seu contrasinal foi modificado!",
+       "changepassword-success": "Modificouse o seu contrasinal!",
        "changepassword-throttled": "Fixo demasiados intentos de acceder ao sistema.\nPor favor, agarde $1 antes de probar outra vez.",
        "botpasswords": "Contrasinais de bots",
        "botpasswords-summary": "Os <em>contrasinais de bots</em> permiten acceder a unha conta de usuario por medio da API sen usar as crecenciais de acceso da conta principal. Os dereitos de usuario dispoñibles cando se accede ao sistema cun contrasinal de bot poden estar restrinxidos.\n\nSe non sabe por que quere facer isto, probablemente signifique que non o queira facer. Ningunha persoa debería pedirlle a vostede que xere unha destas claves para entregarlla.",
        "botpasswords-label-delete": "Borrar",
        "botpasswords-label-resetpassword": "Restablecer o contrasinal",
        "botpasswords-label-grants": "Permisos aplicables:",
-       "botpasswords-help-grants": "Cada permiso dá acceso aos permisos de usuario listados que a conta xa teña. Consulte a [[Special:ListGrants|táboa de permisos]] para obter máis información.",
+       "botpasswords-help-grants": "As concesións permiten o acceso aos dereitos que xa teña a conta de usuario. A activación dunha concesión non dá acceso a ningún dereito que a súa conta de usuario non tivese doutro xeito. Consulte a [[Special:ListGrants|táboa de permisos]] para obter máis información.",
        "botpasswords-label-grants-column": "Concedido",
        "botpasswords-bad-appid": "O nome de bot \"$1\" non é válido.",
        "botpasswords-insert-failed": "Erro ao engadir o nome de bot \"$1\". Revise se xa foi engadido previamente.",
        "resetpass-abort-generic": "Unha extensión cancelou a modificación do contrasinal.",
        "resetpass-expired": "O seu contrasinal caducou. Defina un novo contrasinal para acceder.",
        "resetpass-expired-soft": "O seu contrasinal caducou e debe restablecelo. Escolla un novo contrasinal ou prema en \"{{int:authprovider-resetpass-skip-label}}\" para restablecelo máis tarde.",
-       "resetpass-validity-soft": "O seu contrasinal non é válido: $1\n\nEscolla un novo contrasinal ou prema en \"{{int:authprovider-resetpass-skip-label}}\" para restablecelo máis tarde.",
+       "resetpass-validity-soft": "O seu contrasinal non é válido: $1\n\nEscolla un novo contrasinal agora ou prema en \"{{int:authprovider-resetpass-skip-label}}\" para restablecelo máis tarde.",
        "passwordreset": "Restablecer o contrasinal",
        "passwordreset-text-one": "Encha este formulario para restablecer o seu contrasinal.",
        "passwordreset-text-many": "{{PLURAL:$1|Encha un dos campos para recibir por correo electrónico un contrasinal temporal.}}",
        "passwordreset-emaildisabled": "As funcións do correo electrónico están desactivadas neste wiki.",
        "passwordreset-username": "Nome de usuario:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-capture": "Quere ollar o correo electrónico?",
-       "passwordreset-capture-help": "Se marca esta caixa, poderá ver o correo electrónico (co contrasinal temporal) que se envía ao usuario.",
        "passwordreset-email": "Enderezo de correo electrónico:",
        "passwordreset-emailtitle": "Detalles da conta de {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguén (probablemente vostede, desde o enderezo IP $1) solicitou o restablecemento do seu\ncontrasinal de {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}\na este enderezo de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Este contrasinal temporal caducará|Estes contrasinais temporais caducarán}} {{PLURAL:$5|nun día|en $5 días}}.\nDebería acceder ao sistema e elixir un novo contrasinal agora. Se outra persoa fixo esta\nsolicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,\nignore esta mensaxe e continúe empregando o seu contrasinal vello.",
        "passwordreset-emailtext-user": "O usuario $1 solicitou o restablecemento do contrasinal de {{SITENAME}}\n($4). {{PLURAL:$3|A seguinte conta de usuario está asociada|As seguintes contas de usuarios están asociadas}}\na este enderezo de correo electrónico:\n\n$2\n\n{{PLURAL:$3|Este contrasinal temporal caducará|Estes contrasinais temporais caducarán}} {{PLURAL:$5|nun día|en $5 días}}.\nDebería acceder ao sistema e elixir un novo contrasinal agora. Se outra persoa fixo esta\nsolicitude ou se lembrou o seu contrasinal orixinal e xa non o quere cambiar,\nignore esta mensaxe e continúe empregando o seu contrasinal vello.",
        "passwordreset-emailelement": "Nome de usuario: \n$1\n\nContrasinal temporal: \n$2",
-       "passwordreset-emailsentemail": "Se esta é unha dirección de correo electrónico asociada á súa conta, entón enviarase un correo electrónico para o restablecemento do seu contrasinal.",
-       "passwordreset-emailsentusername": "Se hai unha dirección de correo electrónico asociada con este nome de usuario, entón enviarase un correo electrónico para o restablecemento do contrasinal.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|O correo de reinicialización do contrasinal foi enviado|Os correos de reinicialización do contrasinal foron enviados}}. {{PLURAL:$1|O nome de usuario e contrasinal móstrase aquí|A lista de nomes de usuarios e contrasinais móstranse aquí}}.",
-       "passwordreset-emailerror-capture2": "O envío do correo {{GENDER:$2|ó usuario|á usuaria}} fallou: $1 {{PLURAL:$3|O nome de usuario e contrasinal móstrase aquí|A lista de usuarios e contrasinais móstranse aquí}}.",
+       "passwordreset-emailsentemail": "Se este enderezo de correo electrónico está asociado á súa conta, entón enviarase un correo electrónico para o restablecemento do seu contrasinal.",
+       "passwordreset-emailsentusername": "Se hai un enderezo de correo electrónico asociado a este nome de usuario, entón enviarase un correo electrónico para o restablecemento do contrasinal.",
        "passwordreset-nocaller": "Cómpre proporcionar un chamador",
        "passwordreset-nosuchcaller": "O chamador non existe: $1",
-       "passwordreset-ignored": "A reinicialización do contrasinal non puido realizarse. Quizais non configurou o provedor?",
-       "passwordreset-invalideamil": "O enderezo de correo electrónico non é válido",
-       "passwordreset-nodata": "Non se indicou o nome de usuario ou a dirección de correo electrónico",
+       "passwordreset-ignored": "Non se puido completar o restablecemento do contrasinal. Quizais non configurou o provedor?",
+       "passwordreset-invalidemail": "O enderezo de correo electrónico non é válido",
+       "passwordreset-nodata": "Non se indicou nin un nome de usuario nin un enderezo de correo electrónico",
        "changeemail": "Cambiar ou eliminar o enderezo de correo electrónico",
-       "changeemail-header": "Encha este formulario para cambiar o seu enderezo de correo electrónico. Se vostede quere eliminar a asociación da dirección de correo electrónico da súa conta, deixe en branco a nova dirección de correo electrónico cando envíe o formulario.",
+       "changeemail-header": "Encha este formulario para cambiar o seu enderezo de correo electrónico. Se quere eliminar a asociación do enderezo de correo electrónico á súa conta, deixe en branco o novo enderezo de correo electrónico cando envíe o formulario.",
        "changeemail-no-info": "Debe rexistrarse para acceder directamente a esta páxina.",
        "changeemail-oldemail": "Enderezo de correo electrónico actual:",
        "changeemail-newemail": "Novo enderezo de correo electrónico:",
-       "changeemail-newemail-help": "Este campo debe deixarse en branco se quere eliminar o seu enderezo de correo electrónico. Non será capaz de redefinir a súa clave nin recibir mensaxes electrónicas desta wiki se elimina o correo electrónico.",
+       "changeemail-newemail-help": "Este campo debe deixarse en branco se quere eliminar o seu enderezo de correo electrónico. Non poderá restablecer o seu contrasinal se o esquece nin recibir mensaxes de correo electrónico desde este wiki se elimina o enderezo.",
        "changeemail-none": "(ningún)",
        "changeemail-password": "O seu contrasinal en {{SITENAME}}:",
        "changeemail-submit": "Cambiar o correo electrónico",
        "anoneditwarning": "<strong>Aviso:</strong> Non accedeu ao sistema. O seu enderezo IP será visible se fai algunha edición. Se <strong>[$1 accede ao sistema]</strong> ou <strong>[$2 crea unha conta]</strong>, as súas edicións serán atribuídas ao seu nome de usuario e obterá outros beneficios.",
        "anonpreviewwarning": "''Non accedeu ao sistema. Se garda a páxina, o seu enderezo IP quedará rexistrado no historial de edicións.''",
        "missingsummary": "'''Aviso:''' Esqueceu incluír o texto do campo resumo.\nSe preme en \"{{int:savearticle}}\" a súa edición gardarase sen ningunha descrición da edición.",
-       "selfredirect": "<strong>Atención:</strong> Está redirecionando esta páxina a ela mesma. Vostede pode ter especificado a páxina incorrecta para a redireción, ou pode que estea a editar a páxina incorrecta. Se preme \"{{int:savearticle}}\" de novo, crearase a redireción de tódolos xeitos.",
+       "selfredirect": "<strong>Atención:</strong> Está redirixindo esta páxina a si mesma.\nQuizais especificou incorrectamente a páxina de destino ou poida que estea a editar unha páxina errónea.\nSe preme en \"{{int:savearticle}}\" de novo, crearase a redireción de calquera xeito.",
        "missingcommenttext": "Por favor, escriba un comentario a continuación.",
-       "missingcommentheader": "<strong>Aviso:</strong> Non escribiu ningún texto no asunto deste comentario.\nSe preme sobre \"{{int:savearticle}}\", a súa edición gardarase sen el.",
+       "missingcommentheader": "<strong>Aviso:</strong> Non escribiu ningún texto no asunto deste comentario.\nSe preme en \"{{int:savearticle}}\" de novo, a súa edición gardarase sen el.",
        "summary-preview": "Vista previa do resumo:",
        "subject-preview": "Vista previa do asunto:",
        "previewerrortext": "Produciuse un erro ao intentar previsualizar os cambios.",
        "blockedtitle": "O usuario está bloqueado",
-       "blockedtext": "'''O seu nome de usuario ou enderezo IP foi bloqueado.'''\n\nO bloqueo foi realizado por $1.\nA razón que deu foi ''$2''.\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\nNon pode empregar a característica \"Enviar un correo electrónico a este usuario\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e que o seu uso non fose bloqueado.\nO seu enderezo IP actual é $3 e o ID do bloqueo é #$5.\nPor favor, inclúa eses datos nas consultas que faga.",
+       "blockedtext": "<strong>Bloqueouse o seu nome de usuario ou enderezo IP.</strong>\n\n$1 estableceu o bloqueo.\nO motivo que achegou foi <em>$2</em>.\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\nNon pode empregar a característica \"Enviar un correo electrónico a este usuario\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e que o seu uso non fose bloqueado.\nO seu enderezo IP actual é $3 e o identificador do bloqueo é #$5.\nPor favor, inclúa todos estes datos nas consultas que faga.",
        "autoblockedtext": "O seu enderezo IP foi bloqueado automaticamente porque foi empregado por outro usuario que foi bloqueado por $1.\nA razón que deu foi a seguinte:\n\n:''$2''\n\n* Inicio do bloqueo: $8\n* Caducidade do bloqueo: $6\n* Pretendeuse bloquear: $7\n\nPode contactar con $1 ou con calquera outro [[{{MediaWiki:Grouppage-sysop}}|administrador]] para discutir este bloqueo.\n\nTeña en conta que non pode empregar a característica \"Enviar un correo electrónico a este usuario\" a non ser que dispoña dun enderezo electrónico válido rexistrado nas súas [[Special:Preferences|preferencias de usuario]] e e que o seu uso non fose bloqueado.\n\nO seu enderezo IP actual é $3 e o ID do bloqueo é #$5.\nPor favor, inclúa eses datos nas consultas que faga.",
        "blockednoreason": "non se deu ningunha razón",
        "whitelistedittext": "Debe $1 para poder editar páxinas.",
        "userpage-userdoesnotexist": "A conta de usuario \"$1\" non está rexistrada.\nComprobe se desexa crear/editar esta páxina.",
        "userpage-userdoesnotexist-view": "A conta de usuario \"$1\" non está rexistrada.",
        "blocked-notice-logextract": "Este usuario está bloqueado.\nVelaquí está a última entrada do rexistro de bloqueos, por se quere consultala:",
-       "clearyourcache": "<strong>Nota:</strong> Despois de gardar, cómpre limpar a memoria caché do seu navegador para ver os cambios.\n* <strong>Firefox/Safari:</strong> Prema <em>Maiúsculas</em> á vez que en <em>Recargar</em>, ou prema en <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> nos Mac)\n* <strong>Google Chrome:</strong> Prema en <em>Ctrl-Maiús-R</em> (<em>⌘-Maiús-R</em> nos Mac)\n* <strong>Internet Explorer:</strong> Prema <em>Ctrl</em> ao tempo que fai clic en <em>Refrescar</em>, ou prema en <em>Ctrl-F5</em>\n* <strong>Opera:<strong> Vaia a  <em>Menú → Configuración</em> (<em>Opera → Preferencias</em> nun Mac) e logo a <em>Privacidade & seguridade → Limpar datos de navegación → Ficheiros e imaxes na caché</em>.",
+       "clearyourcache": "<strong>Nota:</strong> Despois de gardar, cómpre limpar a memoria caché do seu navegador para ver os cambios.\n* <strong>Firefox/Safari:</strong> Prema <em>Maiúsculas</em> á vez que en <em>Recargar</em>, ou prema en <em>Ctrl-F5</em> ou <em>Ctrl-R</em> (<em>⌘-R</em> nos Mac).\n* <strong>Google Chrome:</strong> Prema en <em>Ctrl-Maiús-R</em> (<em>⌘-Maiús-R</em> nos Mac).\n* <strong>Internet Explorer:</strong> Prema <em>Ctrl</em> ao tempo que fai clic en <em>Refrescar</em>, ou prema en <em>Ctrl-F5</em>.\n* <strong>Opera:</strong> Vaia a <em>Menú → Configuración</em> (<em>Opera → Preferencias</em> nos Mac) e logo a <em>Privacidade e seguridade → Limpar os datos de navegación → Ficheiros e imaxes na caché</em>.",
        "usercssyoucanpreview": "'''Nota:''' Use o botón \"{{int:showpreview}}\" para verificar o novo CSS antes de gardalo.",
        "userjsyoucanpreview": "<strong>Nota:</strong> Use o botón \"{{int:showpreview}}\" para verificar o novo JavaScript antes de gardalo.",
        "usercsspreview": "'''Lembre que só está vendo a vista previa do seu CSS de usuario.'''\n'''Este aínda non foi gardado!'''",
        "userinvalidcssjstitle": "<strong>Aviso:</strong> Non hai ningunha aparencia chamada \"$1\".\nLembre que as páxinas .css e .js personalizadas utilizan un título en minúsculas, como por exemplo \"{{ns:user}}:Exemplo/vector.css\" no canto de \"{{ns:user}}:Exemplo/Vector.css\".",
        "updated": "(Actualizado)",
        "note": "'''Nota:'''",
-       "previewnote": "'''Lembre que esta é só unha vista previa e que aínda non gardou os seus cambios!'''",
+       "previewnote": "<strong>Lembre que esta é só unha vista previa.</strong>\nAínda non gardou os seus cambios!",
        "continue-editing": "Ir ata a caixa de edición",
        "previewconflict": "Esta vista previa mostra o texto na área superior tal e como aparecerá se escolle gardar.",
-       "session_fail_preview": "Sentímolo! Non puidemos procesar a súa edición porque se perderon os datos de inicio da sesión.\n\nPoida que se pechase a súa sesión. <strong>Por favor, verifique que ten a sesión aberta e probe de novo.</strong>\nEn caso de que siga sen funcionar, intente [[Special:UserLogout|saír]] e volver entrar na súa conta e verifique que o seu navegador permite o uso de cookies neste sitio.",
-       "session_fail_preview_html": "Sentímolo! Non foi posible procesar a edición debido á pérdida de datos da súa sesión.\n\n<em>Como a wiki {{SITENAME}} posibilita o uso de HTML puro, a vista previa está oculta por precaución contra ataques con JavaScript.</em>\n\n<strong>Se este é un intento lexítimo de edición probe de novo, por favor</strong>. \nEn caso de que continúe sen funcionar, intente [[Special:UserLogout|saír]] e volver a entrar na súa conta, e verifique se o seu navegador permite o uso de ''cookies'' deste sitio.",
+       "session_fail_preview": "Sentímolo! Non puidemos procesar a súa edición porque se perderon os datos de inicio da sesión.\n\nPoida que se pechase a súa sesión. <strong>Por favor, comprobe que ten a sesión aberta e probe de novo.</strong>\nEn caso de que siga sen funcionar, intente [[Special:UserLogout|saír]] e volver entrar na súa conta e verifique que o seu navegador permite o uso de cookies neste sitio.",
+       "session_fail_preview_html": "Sentímolo! Non foi posible procesar a edición debido á perda dos datos da súa sesión.\n\n<em>Dado que {{SITENAME}} ten activado o uso de HTML puro, a vista previa está oculta por precaución contra ataques mediante JavaScript.</em>\n\n<strong>Se este é un intento lexítimo de edición, probe de novo.</strong>\nEn caso de que siga sen funcionar, intente [[Special:UserLogout|saír]] e volver entrar na súa conta e verifique que o seu navegador permite o uso de cookies neste sitio.",
        "token_suffix_mismatch": "'''Rexeitouse a súa edición porque o seu cliente confundiu os signos de puntuación na edición.'''\nRexeitouse a edición para evitar que se corrompa o texto do artigo.\nIsto pode acontecer porque estea a empregar un servizo de proxy anónimo defectuoso baseado na web.",
        "edit_form_incomplete": "'''Algunhas partes do formulario de edición non chegaron ao servidor; comprobe que a súa modificación está intacta e inténteo de novo.'''",
        "editing": "Editando \"$1\"",
        "nonunicodebrowser": "'''Atención: O seu navegador non soporta o Unicode.'''\nExiste unha solución que lle permite editar páxinas con seguridade: os caracteres non incluídos no ASCII aparecerán na caixa de edición como códigos hexadecimais.",
        "editingold": "'''Atención: Está editando unha revisión vella desta páxina.'''\nSe a garda, perderanse os cambios realizados tras esta revisión.",
        "yourdiff": "Diferenzas",
-       "copyrightwarning": "Por favor, teña en conta que todas as contribucións a {{SITENAME}} considéranse publicadas baixo a $2 (vexa $1 para máis detalles). Se non quere que o que escriba se edite sen piedade e se redistribúa sen límites, entón non o envíe aquí.<br />\nAo mesmo tempo, prométanos que o que escribiu é da súa autoría ou que está copiado dun recurso do dominio público ou que permite unha liberdade semellante.\n'''NON ENVÍE MATERIAL CON DEREITOS DE AUTOR SEN PERMISO!'''",
-       "copyrightwarning2": "Por favor, decátese de que todas as súas contribucións a {{SITENAME}} poden ser editadas, alteradas ou eliminadas por outras persoas. Se non quere que os seus escritos sexan editados sen piedade, non os publique aquí.<br />\nDo mesmo xeito, comprométese a que o que vostede escriba sexa da súa autoría ou copiado dunha fonte de dominio público ou recurso público semellante (vexa $1 para detalles).\n'''NON ENVÍE SEN PERMISO TRABALLOS CON DEREITOS DE COPIA!'''",
+       "copyrightwarning": "Por favor, teña en conta que todas as contribucións feitas en {{SITENAME}} se consideran publicadas baixo a $2 (consulte $1 para obter máis detalles).\nSe non quere que os seus escritos sexan editados sen piedade e redistribuídos sen límites, entón non os publique aquí.<br />\nDo mesmo xeito, comprométese a que o que vostede escriba é da súa autoría ou está copiado dun recurso de dominio público ou que procede dunha fonte libre.\n<strong>Non envíe material con dereitos de autoría sen permiso!</strong>",
+       "copyrightwarning2": "Por favor, teña en conta que todas as contribucións feitas en {{SITENAME}} poden ser editadas, alteradas ou eliminadas por outras persoas.\nSe non quere que os seus escritos sexan editados sen piedade, entón non os publique aquí.<br />\nDo mesmo xeito, comprométese a que o que vostede escriba é da súa autoría ou está copiado dun recurso de dominio público ou que procede dunha fonte libre (consulte $1 para obter máis detalles).\n<strong>Non envíe material con dereitos de autoría sen permiso!</strong>",
        "editpage-cannot-use-custom-model": "O modelo de contido desta páxina non se pode modificar.",
        "longpageerror": "'''Erro: O texto que pretende gardar ocupa {{PLURAL:$1|$1 kilobyte|$1 kilobytes}}, e existe un límite dun máximo de {{PLURAL:$2|$2 kilobyte|$2 kilobytes}}.'''\nPolo tanto, non se pode gardar.",
-       "readonlywarning": "<strong>Atención: A base de datos foi pechada para facer mantemento, polo que non vai poder gardar as súas edicións polo de agora.</strong>\nSe cadra, pode cortar e pegar o texto nun ficheiro de texto e gardalo para despois.\n\nO administrador de sistemas que a pechou deu esta explicación: $1",
+       "readonlywarning": "<strong>Atención: Pechouse a base de datos para facer mantemento, polo que non vai poder gardar as súas edicións polo de agora.</strong>\nSe cadra, pode cortar e pegar o texto nun ficheiro de texto e gardalo para despois.\n\nO administrador do sistema que a pechou deu esta explicación: $1",
        "protectedpagewarning": "'''Aviso: Esta páxina foi protexida de xeito que só os usuarios con privilexios de administrador a poidan editar.'''\nVelaquí está a última entrada no rexistro, por se quere consultala:",
        "semiprotectedpagewarning": "'''Nota:''' Esta páxina foi protexida de xeito que só os usuarios rexistrados a poidan editar.\nVelaquí está a última entrada no rexistro, por se quere consultala:",
-       "cascadeprotectedwarning": "<strong>Aviso:</strong> Esta páxina foi protexida de xeito que só a poden editar os usuarios con privilexios de administrador debido a que está transcluída {{PLURAL:$1|na seguinte páxina protexida|nas seguintes páxinas protexidas}} coa opción \"protección en serie\" activada:",
+       "cascadeprotectedwarning": "<strong>Atención:</strong> Protexeuse esta páxina de xeito que só a poden editar os usuarios con privilexios de administrador debido a que está transcluída {{PLURAL:$1|na seguinte páxina protexida|nas seguintes páxinas protexidas}} coa opción \"protección en serie\" activada:",
        "titleprotectedwarning": "'''Aviso: Esta páxina foi protexida de xeito que [[Special:ListGroupRights|só algúns usuarios]] a poidan crear.'''\nVelaquí está a última entrada no rexistro, por se quere consultala:",
        "templatesused": "{{PLURAL:$1|Modelo usado|Modelos usados}} nesta páxina:",
        "templatesusedpreview": "{{PLURAL:$1|Modelo usado|Modelos usados}} nesta vista previa:",
        "template-semiprotected": "(semiprotexido)",
        "hiddencategories": "Esta páxina forma parte {{PLURAL:$1|dunha categoría oculta|de $1 categorías ocultas}}:",
        "edittools": "<!-- O texto que apareza aquí mostrarase por debaixo dos formularios de edición e envío. -->",
-       "nocreatetext": "{{SITENAME}} ten restrinxida a posibilidade de crear páxinas novas.\nPode volver e editar unha páxina que xa existe ou, se non, [[Special:UserLogin|rexistrarse ou crear unha conta]].",
+       "nocreatetext": "{{SITENAME}} ten restrinxida a posibilidade de crear páxinas novas.\nPode volver e editar unha páxina que xa existe ou ben [[Special:UserLogin|acceder ao sistema ou crear unha conta]].",
        "nocreate-loggedin": "Non ten os permisos necesarios para crear páxinas novas.",
        "sectioneditnotsupported-title": "A edición de seccións non está soportada",
        "sectioneditnotsupported-text": "A edición de seccións non está soportada nesta páxina.",
        "permissionserrors": "Erro de permisos",
        "permissionserrorstext": "Non ten os permisos necesarios para facelo {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
        "permissionserrorstext-withaction": "Non ten os permisos necesarios para $2, {{PLURAL:$1|pola seguinte razón|polas seguintes razóns}}:",
-       "contentmodelediterror": "Non pode editar esta revisión porque o seu modelo de contido é <code>$1</code>, o cal difire do modelo de contido actual da páxina <code>$2</code>.",
+       "contentmodelediterror": "Non pode editar esta revisión porque o seu modelo de contido é \"<code>$1</code>\", o cal difire do modelo de contido \"<code>$2</code>\", que é o actual da páxina.",
        "recreate-moveddeleted-warn": "'''Atención: Vai volver crear unha páxina que xa foi eliminada anteriormente.'''\n\nDebería considerar se é apropiado continuar a editar esta páxina.\nVelaquí están o rexistro de borrados e mais o de traslados desta páxina, por se quere consultalos:",
        "moveddeleted-notice": "Esta páxina foi borrada.\nA continuación pódese ver o rexistro de borrados e traslados desta páxina, por se quere consultalos.",
-       "moveddeleted-notice-recent": "Sentímolo, esta página foi borrada recentemente (dentro das últimas 24 horas).\nO rexistro de borrado e traslado da páxina amósanse abaixo como referencia.",
+       "moveddeleted-notice-recent": "Sentímolo, borrouse esta páxina recentemente (nas últimas 24 horas).\nVelaquí están o rexistro de borrados e traslados da páxina, por se os quere consultar.",
        "log-fulllog": "Ver o rexistro completo",
        "edit-hook-aborted": "A edición foi abortada polo asociador.\nEste non deu ningunha explicación.",
        "edit-gone-missing": "Non se pode actualizar a páxina.\nSemella que foi borrada.",
        "invalid-content-data": "Datos de contido inválidos",
        "content-not-allowed-here": "O contido \"$1\" non está permitido na páxina \"[[$2]]\"",
        "editwarning-warning": "Deixar esta páxina pode causar a perda de calquera cambio feito.\nSe accedeu ao sistema, pode desactivar esta mensaxe de advertencia na sección \"{{int:prefs-editing}}\" das súas preferencias.",
-       "editpage-invalidcontentmodel-title": "Modelo de contido non válido",
-       "editpage-invalidcontentmodel-text": "O modelo de contido \"$1\" non é válido.",
+       "editpage-invalidcontentmodel-title": "O modelo de contido non está soportado",
+       "editpage-invalidcontentmodel-text": "O modelo de contido \"$1\" non está soportado.",
        "editpage-notsupportedcontentformat-title": "Formato de contido non admitido",
        "editpage-notsupportedcontentformat-text": "O formato de contido $1 non é compatible co modelo de contido $2.",
        "content-model-wikitext": "texto wiki",
        "content-json-empty-object": "Obxecto baleiro",
        "content-json-empty-array": "Matriz baleira",
        "deprecated-self-close-category": "Páxinas que usan etiquetas HTML de auto-pechado non válidas",
-       "deprecated-self-close-category-desc": "Páxinas que conteñen unha etiqueta HTML de auto-pechado non válida, como <code>&lt;b/></code> ou <code>&lt;span/></code>. O comportamento destas etiquetas vai cambiar para gardar a consistencia coa especificación HTML5, polo que o seu uso no texto wiki está desbotado.",
-       "duplicate-args-warning": "<strong>Advertencia:</strong> [[:$1]] está chamando a [[:$2]] con máis dun valor para o parámetro \"$3\". Só se usará o último valor proporcionado.",
+       "deprecated-self-close-category-desc": "A páxina contén algunha etiqueta HTML de auto-pechado non válida, como <code>&lt;b/></code> ou <code>&lt;span/></code>. O comportamento destas etiquetas vai cambiar axiña para gardar a consistencia coa especificación HTML5, polo que cómpre desbotar o seu uso no texto wiki.",
+       "duplicate-args-warning": "<strong>Atención:</strong> \"[[:$1]]\" está chamando a \"[[:$2]]\" con máis dun valor para o parámetro \"$3\". Só se usará o último valor proporcionado.",
        "duplicate-args-category": "Páxinas con argumentos duplicados nas chamadas aos modelos",
        "duplicate-args-category-desc": "Esta páxina contén as chamadas aos modelos que utilizan argumentos duplicados, como <code><nowiki>{{exemplo|bar=1|bar=2}}</nowiki></code> ou <code><nowiki>{{exemplo|bar|1=baz}}</nowiki></code>.",
        "expensive-parserfunction-warning": "'''Aviso:''' Esta páxina contén demasiadas chamadas a funcións analíticas custosas.\n\nDebe ter menos {{PLURAL:$2|dunha chamada|de $2 chamadas}}, e agora hai $1.",
        "undo-summary": "Desfíxose a edición $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]])",
        "undo-summary-username-hidden": "Desfíxose a edición $1 dun usuario agochado",
        "cantcreateaccount-text": "A creación de contas desde este enderezo IP ('''$1''') foi bloqueada por [[User:$3|$3]].\n\nA razón dada por $3 foi ''$2''",
-       "cantcreateaccount-range-text": "O usuario [[User:$3|$3]] bloqueou a creación de contas desde enderezos IP no rango <strong>$1</strong>, no que se inclúe o seu enderezo IP (<strong>$4</strong>).\n\nA razón que deu $3 foi <em>$2</em>.",
+       "cantcreateaccount-range-text": "O usuario [[User:$3|$3]] bloqueou a creación de contas desde enderezos IP no rango <strong>$1</strong>, no que se atopa o seu enderezo IP (<strong>$4</strong>).\n\nA razón que deu $3 foi <em>$2</em>.",
        "viewpagelogs": "Ver os rexistros desta páxina",
        "nohistory": "Esta páxina non posúe ningún historial de edicións.",
        "currentrev": "Revisión actual",
        "history-feed-title": "Historial de revisións",
        "history-feed-description": "Historial de revisións desta páxina no wiki",
        "history-feed-item-nocomment": "$1 o $2",
-       "history-feed-empty": "A páxina solicitada non existe.\nPuido borrarse ou moverse a outro nome.\nProbe a [[Special:Search|buscar no wiki]] para atopar as páxinas relacionadas.",
+       "history-feed-empty": "A páxina solicitada non existe.\nPoida que se borrase do wiki ou que se trasladase a outro nome.\nProbe a [[Special:Search|buscar no wiki]] para atopar as páxinas novas relevantes.",
        "history-edit-tags": "Editar as etiquetas das revisións seleccionadas",
        "rev-deleted-comment": "(resumo de edición eliminado)",
        "rev-deleted-user": "(nome de usuario eliminado)",
        "rows": "Filas:",
        "columns": "Columnas:",
        "searchresultshead": "Procurar",
-       "stub-threshold": "Límite superior de tamaño para o formato das ligazóns cara bosquexos ($1):",
+       "stub-threshold": "Límite superior de tamaño para o formato das ligazóns cara bosquexos ($1):",
        "stub-threshold-sample-link": "exemplo",
        "stub-threshold-disabled": "Desactivado",
        "recentchangesdays": "Número de días a mostrar nos cambios recentes:",
        "prefs-help-recentchangescount": "Isto inclúe os cambios recentes, os historiais e mais os rexistros.",
        "prefs-help-watchlist-token2": "Esta é a clave secreta da fonte de novas web para a súa lista de vixilancia.\nCalquera persoa que a saiba poderá ler a súa lista de vixilancia; non comparta esta clave.\n[[Special:ResetTokens|Prema aquí se necesita restablecela]].",
        "savedprefs": "Gardáronse as súas preferencias.",
-       "savedrights": "Gardáronse os permisos de {{GENDER:$1|$1}}.",
+       "savedrights": "Gardáronse os dereitos de {{GENDER:$1|usuario|usuaria}} de $1.",
        "timezonelegend": "Fuso horario:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar a hora do servidor por defecto ($1)",
        "prefs-help-variant": "A variante ou ortografía preferida na que mostrar o contido das páxinas deste wiki.",
        "yournick": "Sinatura:",
        "prefs-help-signature": "Os comentarios feitos nas páxinas de conversa deben asinarse con catro tiles (\"<nowiki>~~~~</nowiki>\"), que se converterán na súa sinatura con data e hora.",
-       "badsig": "Sinatura non válida; comprobe o código HTML utilizado.",
+       "badsig": "A sinatura non é válida.\nComprobe as etiquetas HTML.",
        "badsiglength": "A súa sinatura é demasiado longa.\nHa de ter menos {{PLURAL:$1|dun carácter|de $1 caracteres}}.",
        "yourgender": "Cal das seguintes oracións referidas a vostede é a máis axeitada?",
        "gender-unknown": "Ao facer mención á súa persoa, o software empregará verbas de xénero neutro sempre que sexa posible",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Non ten os permisos necesarios para editar os dereitos de usuario noutros wikis.",
        "userrights-nodatabase": "A base de datos \"$1\" non existe ou non é local.",
-       "userrights-nologin": "Debe [[Special:UserLogin|acceder ao sistema]] cunta conta de administrador para asignar dereitos de usuario.",
-       "userrights-notallowed": "Non dispón dos permisos necesarios para asignar ou retirar dereitos de usuario.",
        "userrights-changeable-col": "Os grupos que pode cambiar",
        "userrights-unchangeable-col": "Os grupos que non pode cambiar",
        "userrights-conflict": "Hai un conflito na modificación dos dereitos de usuario! Por favor, revíseo e confirme os seus cambios.",
-       "userrights-removed-self": "Retirou os seus propios dereitos. Polo tanto, xa non ten acceso a esta páxina.",
        "group": "Grupo:",
        "group-user": "Usuarios",
        "group-autoconfirmed": "Usuarios autoconfirmados",
        "right-siteadmin": "Pechar e abrir a base de datos",
        "right-override-export-depth": "Exportar páxinas incluíndo as páxinas ligadas ata unha profundidade de 5",
        "right-sendemail": "Enviar correos electrónicos a outros usuarios",
-       "right-passwordreset": "Ver os correos electrónicos de restablecemento de contrasinais",
        "right-managechangetags": "Crear e (des)activar [[Special:Tags|etiquetas]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] xunto coas modificacións propias",
        "right-changetags": "Engadir e quitar [[Special:Tags|etiquetas]] arbitrarias a revisións individuais e entradas do rexistro",
        "grant-basic": "Dereitos básicos",
        "grant-viewdeleted": "Ver ficheiros e páxinas eliminados",
        "grant-viewmywatchlist": "Ver a súa lista de vixilancia",
-       "grant-viewrestrictedlogs": "Ver as entradas de rexistro confidenciais",
+       "grant-viewrestrictedlogs": "Ver as entradas de rexistro restrinxidas",
        "newuserlogpage": "Rexistro de creación de usuarios",
        "newuserlogpagetext": "Este é un rexistro de creación de contas de usuario.",
        "rightslog": "Rexistro de dereitos de usuario",
        "uploadstash-badtoken": "A acción fallou, probablemente porque caducou a información de acceso. Por favor, inténteo de novo.",
        "uploadstash-errclear": "Fallou o borrado de ficheiros.",
        "uploadstash-refresh": "Actualizar a lista de ficheiros",
-       "uploadstash-thumbnail": "ver miniatura",
+       "uploadstash-thumbnail": "ver miniatura",
        "uploadstash-exception": "Imposible gardar a subida na reserva ($1): \"$2\".",
        "invalid-chunk-offset": "Desprazamento inválido do fragmento",
        "img-auth-accessdenied": "Acceso rexeitado",
        "http-bad-status": "Houbo un problema durante a solicitude HTTP: $1 $2",
        "upload-curl-error6": "Non se puido acceder ao enderezo URL",
        "upload-curl-error6-text": "Non se puido acceder ao enderezo URL especificado.\nComprobe que ese enderezo URL é correcto e que o sitio está activo.",
-       "upload-curl-error28": "Rematou o tempo de espera",
+       "upload-curl-error28": "Rematou o tempo de espera da subida",
        "upload-curl-error28-text": "O sitio tardou demasiado en responder.\nPor favor, comprobe que está activo, agarde un anaco e inténteo de novo.\nTamén pode reintentalo cando haxa menos actividade.",
        "license": "Licenza:",
        "license-header": "Licenza",
        "filerevert-defaultcomment": "Volveuse á versión do $1 ás $2 ($3)",
        "filerevert-submit": "Reverter",
        "filerevert-success": "Reverteuse \"'''[[Media:$1|$1]]'''\" á [$4 versión do $2 ás $3].",
-       "filerevert-badversion": "Non existe unha versión local anterior deste ficheiro coa data e hora indicadas.",
-       "filerevert-identical": "A versión actual do ficheiro é igual á seleccionada.",
+       "filerevert-badversion": "Non existe ningunha versión local anterior deste ficheiro coa data e hora indicadas.",
+       "filerevert-identical": "A versión actual do ficheiro é idéntica á seleccionada.",
        "filedelete": "Borrar \"$1\"",
        "filedelete-legend": "Eliminar un ficheiro",
        "filedelete-intro": "Está a piques de eliminar o ficheiro \"'''[[Media:$1|$1]]'''\" xunto con todo o seu historial.",
        "apisandbox-jsonly": "É preciso activar o JavaScript para usar a zona de probas.",
        "apisandbox-api-disabled": "API está desactivado neste sitio.",
        "apisandbox-intro": "Use esta páxina para experimentar co <strong>servizo web da API de MediaWiki</strong>.\nConsulte a [[mw:API:Main page| documentación da API]] para obter máis información sobre o uso da API. Exemplo: [https://www.mediawiki.org/wiki/API#A_simple_example obter o contido dunha páxina de inicio]. Seleccione unha acción para ollar máis exemplos.\n\nTeña en conta que, aínda que esta é unha páxina de probas, as accións que realice nesta páxina poden modificar o wiki.",
-       "apisandbox-fullscreen": "Expandir panel",
+       "apisandbox-fullscreen": "Expandir panel",
        "apisandbox-fullscreen-tooltip": "Expande o panel da zona de probas para encher a pantalla do navegador.",
        "apisandbox-unfullscreen": "Mostrar a páxina",
-       "apisandbox-unfullscreen-tooltip": "Reduce o panel da zona de probas, así as ligazóns de navegación MediaWiki están dispoñibles.",
+       "apisandbox-unfullscreen-tooltip": "Reduce o panel da zona de probas para que as ligazóns de navegación de MediaWiki estean dispoñibles.",
        "apisandbox-submit": "Facer a solicitude",
        "apisandbox-reset": "Limpar",
        "apisandbox-retry": "Reintentar",
-       "apisandbox-loading": "Cargando información para módulo de API \"$1\"...",
-       "apisandbox-load-error": "Houbo un erro mentres se cargaba a información do módulo API \"$1\": $2",
-       "apisandbox-no-parameters": "O módulo de API non ten parámetros.",
+       "apisandbox-loading": "Cargando a información para módulo \"$1\" da API...",
+       "apisandbox-load-error": "Produciuse un erro mentres se cargaba a información do módulo \"$1\" da API: $2",
+       "apisandbox-no-parameters": "Este módulo da API non ten parámetros.",
        "apisandbox-helpurls": "Ligazóns de axuda",
        "apisandbox-examples": "Exemplos",
        "apisandbox-dynamic-parameters": "Parámetros adicionais",
-       "apisandbox-dynamic-parameters-add-label": "Engadir parámetro:",
+       "apisandbox-dynamic-parameters-add-label": "Engadir un parámetro:",
        "apisandbox-dynamic-parameters-add-placeholder": "Nome do parámetro",
        "apisandbox-dynamic-error-exists": "Xa existe un parámetro co nome \"$1\".",
        "apisandbox-deprecated-parameters": "Parámetros obsoletos",
-       "apisandbox-fetch-token": "Auto-enchido do identificador",
+       "apisandbox-fetch-token": "Encher automaticamente o identificador",
        "apisandbox-submit-invalid-fields-title": "Algúns campos non son válidos",
        "apisandbox-submit-invalid-fields-message": "Por favor, amañe os campos marcados e inténteo de novo.",
        "apisandbox-results": "Resultados",
        "apisandbox-sending-request": "Enviando a petición á API...",
        "apisandbox-loading-results": "Recibindo os resultados da API...",
-       "apisandbox-results-error": "Houbo un erro mentres se cargaba a resposta á consulta da API: $1.",
+       "apisandbox-results-error": "Produciuse un erro mentres se cargaba a resposta da petición á API: $1.",
        "apisandbox-request-url-label": "URL da solicitude:",
        "apisandbox-request-time": "Duración da solicitude: {{PLURAL:$1|$1 ms}}",
-       "apisandbox-results-fixtoken": "Correxir identificador e reenviar",
-       "apisandbox-results-fixtoken-fail": "Erro ó recuperar o identificador \"$1\".",
-       "apisandbox-alert-page": "Os campos nesta páxina non son válidos.",
+       "apisandbox-results-fixtoken": "Corrixir o identificador e reenviar",
+       "apisandbox-results-fixtoken-fail": "Erro ao recuperar o identificador \"$1\".",
+       "apisandbox-alert-page": "Os campos desta páxina non son válidos.",
        "apisandbox-alert-field": "O valor deste campo non é válido.",
        "apisandbox-continue": "Continuar",
        "apisandbox-continue-clear": "Limpar",
-       "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuará] a última petición; {{int:apisandbox-continue-clear}} limpará os parámetros relativos á continuación.",
+       "apisandbox-continue-help": "\"{{int:apisandbox-continue}}\" [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuará] a última petición; \"{{int:apisandbox-continue-clear}}\" limpará os parámetros relativos á continuación.",
+       "apisandbox-param-limit": "Indicar <kbd>max</kbd> para usar o límite máximo.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Tódolos espazos de nomes)",
+       "apisandbox-multivalue-all-values": "$1 (Tódolos valores)",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Procurar fontes bibliográficas",
        "booksources-search": "Procurar",
-       "booksources-text": "A continuación aparece unha lista de ligazóns cara a outros sitios web que venden libros novos e usados, neles tamén pode obter máis información sobre as obras que está a buscar:",
-       "booksources-invalid-isbn": "O ISBN inserido parece non ser válido; comprobe que non haxa erros ao copialo da fonte orixinal.",
+       "booksources-text": "A continuación aparece unha lista de ligazóns cara a outros sitios web que venden libros novos e usados; neles tamén pode obter máis información sobre as obras que está a buscar:",
+       "booksources-invalid-isbn": "O ISBN inserido semella non ser válido; comprobe que non se producisen erros ao copialo da fonte orixinal.",
        "magiclink-tracking-rfc": "Páxinas que usan ligazóns máxicas RFC",
        "magiclink-tracking-rfc-desc": "Esta páxina utiliza ligazóns máxicas RFC. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para descubrir como facer a migración.",
        "magiclink-tracking-pmid": "Páxinas que usan ligazóns máxicas PMID",
        "magiclink-tracking-isbn": "Páxinas que usan ligazóns máxicas ISBN",
        "magiclink-tracking-isbn-desc": "Esta páxina utiliza ligazóns máxicas ISBN. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] para descubrir como facer a migración.",
        "specialloguserlabel": "Executante:",
-       "speciallogtitlelabel": "Obxectivo (título ou {{ns:user}}:nome de usuario):",
+       "speciallogtitlelabel": "Obxectivo (título ou \"{{ns:user}}:nome de usuario\" para un usuario):",
        "log": "Rexistros",
        "logeventslist-submit": "Mostrar",
        "all-logs-page": "Todos os rexistros públicos",
        "logempty": "Non se atopou ningún elemento relacionado no rexistro.",
        "log-title-wildcard": "Procurar os títulos que comecen con este texto",
        "showhideselectedlogentries": "Mostrar/agochar as entradas do rexistro seleccionadas",
-       "log-edit-tags": "Editar as etiquetas das entradas do registro seleccionadas",
+       "log-edit-tags": "Editar as etiquetas das entradas de rexistro seleccionadas",
        "checkbox-select": "Seleccionar: $1",
        "checkbox-all": "Todos",
        "checkbox-none": "Ningún",
        "activeusers-intro": "Esta é unha lista cos usuarios que tiveron algún tipo de actividade {{PLURAL:$1|no último día|nos últimos $1 días}}.",
        "activeusers-count": "$1 {{PLURAL:$1|acción|accións}} {{PLURAL:$3|no último día|nos últimos $3 días}}",
        "activeusers-from": "Mostrar os usuarios que comecen por:",
-       "activeusers-groups": "Mostrar os usuarios que pertencen ós grupos:",
+       "activeusers-groups": "Mostrar os usuarios que pertencen aos grupos:",
+       "activeusers-excludegroups": "Excluír ós usuarios que pertenzan ós grupos:",
        "activeusers-noresult": "Non se atopou ningún usuario.",
-       "activeusers-submit": "Mostrar usuarios activos",
+       "activeusers-submit": "Mostrar os usuarios activos",
        "listgrouprights": "Dereitos dun usuario segundo o seu grupo",
        "listgrouprights-summary": "A seguinte lista mostra os grupos de usuario definidos neste wiki, cos seus dereitos de acceso asociados.\nSe quere máis información acerca dos dereitos individuais, pode atopala [[{{MediaWiki:Listgrouprights-helppage}}|aquí]].",
        "listgrouprights-key": "Lenda:\n* <span class=\"listgrouprights-granted\">Dereito concedido</span>\n* <span class=\"listgrouprights-revoked\">Dereito revogado</span>",
        "listgrouprights-namespaceprotection-namespace": "Espazo de nomes",
        "listgrouprights-namespaceprotection-restrictedto": "Dereito(s) que permite(n) ao usuario editar",
        "listgrants": "Permisos",
-       "listgrants-summary": "Esta é unha lista de permisos cos seus accesos asoaciados aos permisos de usuario. Os usuarios poden autorizar aplicacións para usar a súa conta, pero con permisos limitados baseados nos permisos que o usuario dá á aplicación. Porén, unha aplicación que actúa no lugar do usuario non pode empregar permisos que o propio usuario non posúe.\nPode ver máis información sobre dereitos individuais [[{{MediaWiki:Listgrouprights-helppage}}|aquí]].",
+       "listgrants-summary": "Esta é unha lista de permisos cos seus accesos asociados aos permisos de usuario. Os usuarios poden autorizar aplicacións para que usen a súa conta, pero con acceso limitado en función dos permisos que o usuario concede á aplicación. Porén, unha aplicación que actúa no nome dun usuario non pode empregar permisos que o propio usuario non posúe.\nPode obter máis información sobre os dereitos individuais [[{{MediaWiki:Listgrouprights-helppage}}|nesta páxina]].",
        "listgrants-grant": "Outorgar",
        "listgrants-rights": "Dereitos",
        "trackingcategories": "Categorías de seguimento",
        "hidden-category-category-desc": "A categoría contén a palabra máxica <code><nowiki>__HIDDENCAT__</nowiki></code>, que impide que se mostre por defecto na caixa de categorías das páxinas.",
        "trackingcategories-nodesc": "Non hai ningunha descrición dispoñible.",
        "trackingcategories-disabled": "A categoría está desactivada",
-       "mailnologin": "Non existe enderezo para o envío",
+       "mailnologin": "Non hai enderezo de envío",
        "mailnologintext": "Debe [[Special:UserLogin|acceder ao sistema]] e ter rexistrado un enderezo de correo electrónico válido nas súas [[Special:Preferences|preferencias]] para enviar correos electrónicos a outros usuarios.",
        "emailuser": "Enviar un correo electrónico a {{GENDER:{{BASEPAGENAME}}|este usuario|esta usuaria}}",
        "emailuser-title-target": "Enviar un correo electrónico a {{GENDER:$1|este usuario|esta usuaria}}",
        "defemailsubject": "Correo electrónico do usuario $1 de {{SITENAME}}",
        "usermaildisabled": "O correo electrónico do usuario está desactivado",
        "usermaildisabledtext": "Non pode enviar correos electrónicos a outros usuarios deste wiki",
-       "noemailtitle": "Sen enderezo de correo electrónico",
+       "noemailtitle": "Non hai enderezo de correo electrónico",
        "noemailtext": "Este usuario non especificou un enderezo de correo electrónico válido.",
        "nowikiemailtext": "Este usuario elixiu non recibir correos electrónicos doutros usuarios.",
        "emailnotarget": "O nome de usuario do destinatario non existe ou é incorrecto.",
        "emailsubject": "Asunto:",
        "emailmessage": "Mensaxe:",
        "emailsend": "Enviar",
-       "emailccme": "Enviar unha copia da mensaxe para min.",
+       "emailccme": "Enviar unha copia da mensaxe ao meu enderezo de correo electrónico.",
        "emailccsubject": "Copia da súa mensaxe para $1: $2",
        "emailsent": "Mensaxe enviada",
        "emailsenttext": "A súa mensaxe de correo electrónico foi enviada.",
-       "emailuserfooter": "Este correo electrónico foi {{GENDER:$1|enviado}} por $1 a {{GENDER:$2|$2}} mediante a función \"{{int:emailuser}}\" en {{SITENAME}}.",
+       "emailuserfooter": "$1 {{GENDER:$1|enviou}} este correo electrónico a {{GENDER:$2|$2}} mediante a función \"{{int:emailuser}}\" de {{SITENAME}}.",
        "usermessage-summary": "Mensaxe deixada polo sistema.",
        "usermessage-editor": "Editor das mensaxes do sistema",
        "watchlist": "Lista de vixilancia",
        "watchnologin": "Non accedeu ao sistema",
        "addwatch": "Engadir á lista vixilancia",
        "addedwatchtext": "A páxina \"[[:$1]]\" e mais a súa conversa foron engadidas á súa [[Special:Watchlist|lista de vixilancia]].",
-       "addedwatchtext-talk": "\"[[:$1]]\" xunto coa súa páxina asociada foron engadidas á túa [[Special:Watchlist|lista de vixilancia]].",
+       "addedwatchtext-talk": "\"[[:$1]]\" e a súa páxina asociada engadíronse á súa [[Special:Watchlist|lista de vixilancia]].",
        "addedwatchtext-short": "A páxina \"$1\" foi engadida á súa lista de vixilancia.",
        "removewatch": "Eliminar da lista de vixilancia",
        "removedwatchtext": "A páxina \"[[:$1]]\" e mais a súa conversa foron eliminadas da súa [[Special:Watchlist|lista de vixilancia]].",
-       "removedwatchtext-talk": "\"[[:$1]]\" xunto coa súa páxina asociada foron eliminadas da túa [[Special:Watchlist|lista de vixilancia]].",
+       "removedwatchtext-talk": "\"[[:$1]]\" e a súa páxina asociada elimináronse da súa [[Special:Watchlist|lista de vixilancia]].",
        "removedwatchtext-short": "A páxina \"$1\" foi eliminada da súa lista de vixilancia.",
        "watch": "Vixiar",
        "watchthispage": "Vixiar esta páxina",
        "wlshowlast": "Mostrar as últimas $1 horas e os últimos $2 días",
        "watchlist-hide": "Agochar",
        "watchlist-submit": "Mostrar",
-       "wlshowtime": "Periodo de tempo a amosar:",
+       "wlshowtime": "Período de tempo a mostrar:",
        "wlshowhideminor": "edicións menores",
        "wlshowhidebots": "bots",
        "wlshowhideliu": "usuarios rexistrados",
        "deletepage": "Borrar a páxina",
        "confirm": "Confirmar",
        "excontent": "o contido era: \"$1\"",
-       "excontentauthor": "o contido era: \"$1\", e o único editor foi \"[[Special:Contributions/$2|$2]]\" ([[User talk:$2|conversa]])",
+       "excontentauthor": "o contido era \"$1\", e o único editor foi [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]])",
        "exbeforeblank": "o contido antes do baleirado era: \"$1\"",
        "delete-confirm": "Borrar \"$1\"",
        "delete-legend": "Borrar",
        "historywarning": "<strong>Atención:</strong> A páxina que está a piques de borrar ten un historial con $1 {{PLURAL:$1|revisión|revisións}}:",
        "historyaction-submit": "Mostrar",
-       "confirmdeletetext": "Está a piques de borrar de xeito permanente unha páxina ou imaxe con todo o seu historial na base de datos.\nPor favor, confirme que é realmente a súa intención, que comprende as consecuencias e que está obrando de acordo coas regras [[{{MediaWiki:Policy-url}}|da política e normas]].",
+       "confirmdeletetext": "Está a piques de borrar de xeito permanente unha páxina con todo o seu historial.\nPor favor, confirme que é realmente a súa intención, que comprende as consecuencias e que está obrando de acordo coas [[{{MediaWiki:Policy-url}}|políticas]].",
        "actioncomplete": "Completouse a acción",
        "actionfailed": "Fallou a acción",
        "deletedtext": "Borrouse a páxina \"$1\".\nNo $2 pode ver unha lista cos borrados máis recentes.",
        "rollbacklinkcount-morethan": "reverter máis de $1 {{PLURAL:$1|edición|edicións}}",
        "rollbackfailed": "Houbo un erro ao reverter as edicións",
        "rollback-missingparam": "Faltan parámetros obrigatorios na solicitude.",
-       "rollback-missingrevision": "Non se poden cargar datos da revisión.",
+       "rollback-missingrevision": "Non se poden cargar os datos da revisión.",
        "cantrollback": "Non se pode desfacer a edición; o último colaborador é o único autor desta páxina.",
        "alreadyrolled": "Non se pode desfacer a edición en \"[[:$1]]\" feita por [[User:$2|$2]] ([[User talk:$2|conversa]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); alguén máis editou ou desfixo os cambios desta páxina.\n\nA última edición fíxoa [[User:$3|$3]] ([[User talk:$3|conversa]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "O resumo de edición foi: <em>$1</em>.",
        "revertpage": "Desfixéronse as edicións de [[Special:Contributions/$2|$2]] ([[User talk:$2|conversa]]); cambiado á última versión feita por [[User:$1|$1]]",
        "revertpage-nouser": "Desfixéronse as edicións dun usuario agochado; cambiado á última versión feita por {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "Desfixéronse as edicións de $1;\nvolveuse á última edición, feita por $2.",
-       "rollback-success-notify": "Modificacións anuladas por $1; restaurado á última revisión de $2. [$3 Mostrar os cambios]",
+       "rollback-success-notify": "Revertéronse as edicións de $1;\nrestaurouse a última revisión de $2. [$3 Mostrar os cambios]",
        "sessionfailure-title": "Erro de sesión",
        "sessionfailure": "Parece que hai un problema co rexistro da súa sesión;\nesta acción cancelouse como precaución fronte ao secuestro de sesións.\nPrema no botón \"atrás\", volva cargar a páxina da que proviña e inténteo de novo.",
-       "changecontentmodel": "Cambiar o modelo do contido dunha páxina",
-       "changecontentmodel-legend": "Cambiar o modelo do contido",
+       "changecontentmodel": "Cambiar o modelo de contido dunha páxina",
+       "changecontentmodel-legend": "Cambiar o modelo de contido",
        "changecontentmodel-title-label": "Título da páxina",
        "changecontentmodel-model-label": "Novo modelo de contido",
        "changecontentmodel-reason-label": "Motivo:",
        "changecontentmodel-submit": "Cambiar",
-       "changecontentmodel-success-title": "O modelo de contido foi modificado",
-       "changecontentmodel-success-text": "O tipo de contido de [[:$1]] foi modificado.",
-       "changecontentmodel-cannot-convert": "O contido en [[:$1]] non pode converterse ó tipo de $2.",
-       "changecontentmodel-nodirectediting": "O modelo de contido $1 non permite a modificación directa",
+       "changecontentmodel-success-title": "Modificouse o modelo de contido",
+       "changecontentmodel-success-text": "Modificouse o tipo de contido de \"[[:$1]]\".",
+       "changecontentmodel-cannot-convert": "O contido de \"[[:$1]]\" non se pode converter ao tipo \"$2\".",
+       "changecontentmodel-nodirectediting": "O modelo de contido \"$1\" non permite a modificación directa",
        "changecontentmodel-emptymodels-title": "Non hai modelos de contido dispoñibles",
-       "changecontentmodel-emptymodels-text": "O contido de [[:$1]] non pode converterse a ningún tipo.",
-       "log-name-contentmodel": "Rexistro de cambios de modelo de contido",
+       "changecontentmodel-emptymodels-text": "O contido de \"[[:$1]]\" non se pode converter a ningún tipo.",
+       "log-name-contentmodel": "Rexistro de cambios no modelo de contido",
        "log-description-contentmodel": "Eventos relacinados cos modelos de contido dunha páxina",
-       "logentry-contentmodel-new": "$1 {{GENDER:$2|creou}} a páxina $3 usando un modelo de contido non predeterminado \"$5\"",
-       "logentry-contentmodel-change": "$1 {{GENDER:$2|cambiou}} o modelo de contido da páxina $3 de \"$4\" a \"$5\"",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|creou}} a páxina \"$3\" usando o modelo de contido non predeterminado \"$5\"",
+       "logentry-contentmodel-change": "$1 {{GENDER:$2|cambiou}} o modelo de contido da páxina \"$3\" de \"$4\" a \"$5\"",
        "logentry-contentmodel-change-revertlink": "reverter",
        "logentry-contentmodel-change-revert": "reverter",
        "protectlogpage": "Rexistro de proteccións",
        "modifiedarticleprotection": "modificou o nivel de protección de \"[[$1]]\"",
        "unprotectedarticle": "eliminou a protección de \"[[$1]]\"",
        "movedarticleprotection": "cambiou as características da protección de \"[[$2]]\" a \"[[$1]]\"",
-       "protectedarticle-comment": "{{GENDER:$2|Protexido}} \"[[$1]]\"",
-       "modifiedarticleprotection-comment": "{{GENDER:$2|Cambiado o nivel de protección}} para \"[[$1]]\"",
-       "unprotectedarticle-comment": "{{GENDER:$2|Eliminada a protección}} para \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Protexo}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Cambio o nivel de protección}} de \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Elimino a protección}} de \"[[$1]]\"",
        "protect-title": "Cambiar o nivel de protección de \"$1\"",
        "protect-title-notallowed": "Ollar o nivel de protección de \"$1\"",
        "prot_1movedto2": "moveu \"[[$1]]\" a \"[[$2]]\"",
        "protectcomment": "Motivo:",
        "protectexpiry": "Caducidade:",
        "protect_expiry_invalid": "O tempo de duración da protección non é válido.",
-       "protect_expiry_old": "O momento de remate da protección corresponde ao pasado.",
+       "protect_expiry_old": "A data de caducidade da protección corresponde ao pasado.",
        "protect-unchain-permissions": "Desbloquear as opcións de protección adicionais",
-       "protect-text": "Aquí é onde pode ver e cambiar os niveis de protección da páxina chamada \"'''$1'''\".",
-       "protect-locked-blocked": "Non pode modificar os niveis de protección mentres exista un bloqueo. Velaquí a configuración actual da páxina  '''$1''':",
-       "protect-locked-dblock": "Os niveis de protección non se poden modificar debido a un bloqueo da base de datos activa.\nVelaquí a configuración actual da páxina '''$1''':",
-       "protect-locked-access": "A súa conta non dispón de permisos para mudar os niveis de protección.\nVelaquí a configuración actual da páxina '''$1''':",
+       "protect-text": "Aquí pode ver e modificar o nivel de protección da páxina \"<strong>$1</strong>\".",
+       "protect-locked-blocked": "Non pode modificar o nivel de protección durante un bloqueo.\nVelaquí está a configuración actual da páxina \"<strong>$1</strong>\":",
+       "protect-locked-dblock": "Os niveis de protección non se poden modificar debido a un bloqueo activo da base de datos.\nVelaquí está a configuración actual da páxina \"<strong>$1</strong>\":",
+       "protect-locked-access": "A súa conta non dispón dos permisos necesarios para modificar os niveis de protección.\nVelaquí está a configuración actual da páxina \"<strong>$1</strong>\":",
        "protect-cascadeon": "Esta páxina está protexida actualmente porque está transcluída {{PLURAL:$1|na seguinte páxina, que foi protexida|nas seguintes páxinas, que foron protexidas}} coa opción \"protección en serie\" activada.\nOs cambios no nivel de protección desta páxina non afectarán á protección en serie.",
        "protect-default": "Permitir a todos os usuarios",
        "protect-fallback": "Permitir só aos usuarios con permisos de \"$1\"",
        "sp-contributions-username": "Enderezo IP ou nome de usuario:",
        "sp-contributions-toponly": "Mostrar só as últimas revisións",
        "sp-contributions-newonly": "Mostrar só as edicións que crearon páxinas",
-       "sp-contributions-hideminor": "Ocultar edicións menores",
+       "sp-contributions-hideminor": "Agochar as edicións pequenas",
        "sp-contributions-submit": "Procurar",
        "whatlinkshere": "Páxinas que ligan con esta",
        "whatlinkshere-title": "Páxinas que ligan con \"$1\"",
        "whatlinkshere-hideredirs": "$1 as redireccións",
        "whatlinkshere-hidetrans": "$1 as inclusións",
        "whatlinkshere-hidelinks": "$1 as ligazóns",
-       "whatlinkshere-hideimages": "$1 ligazóns ao ficheiro",
+       "whatlinkshere-hideimages": "$1 as ligazóns ao ficheiro",
        "whatlinkshere-filters": "Filtros",
        "whatlinkshere-submit": "Ir",
        "autoblockid": "Bloqueo automático nº$1",
        "unblock-hideuser": "Non pode desbloquear o usuario porque o seu nome foi agochado.",
        "ipb_cant_unblock": "Erro: Non se atopa o identificador do bloqueo $1. Posiblemente xa foi desbloqueado.",
        "ipb_blocked_as_range": "Erro: O enderezo IP $1 non está bloqueado directamente e non se pode desbloquear. Porén, está bloqueado por estar no rango $2, que si se pode desbloquear.",
-       "ip_range_invalid": "Rango IP non válido.",
+       "ip_range_invalid": "Rango de enderezos IP non válido.",
        "ip_range_toolarge": "Non están permitidos os rangos de bloqueo maiores que /$1.",
        "proxyblocker": "Bloqueador de proxy",
        "proxyblockreason": "O seu enderezo IP foi bloqueado porque é un proxy aberto.\nPor favor, contacte co seu fornecedor de acceso á Internet ou co seu soporte técnico e informe deste grave problema de seguridade.",
        "allmessages": "Mensaxes do sistema",
        "allmessagesname": "Nome",
        "allmessagesdefault": "Texto predeterminado",
-       "allmessagescurrent": "Texto actual",
-       "allmessagestext": "Esta é unha lista de todas as mensaxes dispoñibles no espazo de nomes MediaWiki.\nPor favor, visite a páxina de [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation localización de MediaWiki] e [https://translatewiki.net translatewiki.net] se quere contribuír á localización xenérica de MediaWiki.",
+       "allmessagescurrent": "Texto actual da mensaxe",
+       "allmessagestext": "Esta é unha lista de todas as mensaxes dispoñibles no espazo de nomes MediaWiki.\nPor favor, visite a páxina de [https://www.mediawiki.org/wiki/Special:MyLanguage/Localisation localización] e [https://translatewiki.net translatewiki.net] se quere contribuír á localización xenérica de MediaWiki.",
        "allmessagesnotsupportedDB": "Esta páxina non está dispoñible porque '''$wgUseDatabaseMessages''' está desactivado.",
        "allmessages-filter-legend": "Filtrar",
        "allmessages-filter": "Filtrar por estado de personalización:",
        "import-interwiki-text": "Seleccione o wiki e o título da páxina que queira importar.\nAs datas das revisións e os nomes dos editores manteranse.\nTodas as importacións doutros wikis poden consultarse no [[Special:Log/import|rexistro de importacións]].",
        "import-interwiki-sourcewiki": "Wiki de orixe:",
        "import-interwiki-sourcepage": "Páxina de orixe:",
-       "import-interwiki-history": "Copiar todas as versións que hai no historial desta páxina",
+       "import-interwiki-history": "Copiar todas as revisións do historial desta páxina",
        "import-interwiki-templates": "Incluír todos os modelos",
        "import-interwiki-submit": "Importar",
        "import-mapping-default": "Importar aos lugares predeterminados",
        "import-revision-count": "$1 {{PLURAL:$1|revisión|revisións}}",
        "importnopages": "Non hai páxinas para importar.",
        "imported-log-entries": "{{PLURAL:$1|Importouse unha entrada|Importáronse $1 entradas}} do rexisto.",
-       "importfailed": "A importación fallou: $1",
-       "importunknownsource": "Fonte de importación descoñecida",
+       "importfailed": "Fallou a importación: <nowiki>$1</nowiki>",
+       "importunknownsource": "Descoñécese o tipo de fonte de importación",
        "importcantopen": "Non se pode abrir o ficheiro importado",
        "importbadinterwiki": "Ligazón interwiki incorrecta",
-       "importsuccess": "A importación rematou!",
+       "importsuccess": "Rematou a importación!",
        "importnosources": "Non se defininiu ningún wiki desde o que importar e os envíos directos dos historiais están desactivados.",
-       "importnofile": "Non se enviou ningún ficheiro de importación.",
-       "importuploaderrorsize": "Fallou o envío do ficheiro de importación. O ficheiro é máis grande que o tamaño de envío permitido.",
-       "importuploaderrorpartial": "Fallou o envío do ficheiro de importación. O ficheiro só se enviou parcialmente.",
-       "importuploaderrortemp": "Fallou o envío do ficheiro de importación. Falta un cartafol temporal.",
-       "import-parse-failure": "Fallo de análise da importación de XML",
-       "import-noarticle": "Ningunha páxina para importar!",
+       "importnofile": "Non se subiu ningún ficheiro de importación.",
+       "importuploaderrorsize": "Fallou o envío do ficheiro de importación.\nO ficheiro é máis grande que o tamaño de envío permitido.",
+       "importuploaderrorpartial": "Fallou o envío do ficheiro de importación.\nO ficheiro só se enviou parcialmente.",
+       "importuploaderrortemp": "Fallou o envío do ficheiro de importación.\nFalta un cartafol temporal.",
+       "import-parse-failure": "Fallo na análise da importación dos datos XML",
+       "import-noarticle": "Non hai ningunha páxina para importar!",
        "import-nonewrevisions": "Non se importou ningunha revisión (xa estaban todas presentes ou saltáronse por erros).",
        "xml-error-string": "$1 na liña $2, columna $3 (byte $4): $5",
        "import-upload": "Cargar datos XML",
-       "import-token-mismatch": "Perda de datos da sesión.\n\nA súa sesión puido ser pechada. <strong>Por favor, verifique se aínda está conectado e probe de novo</strong>. \nEn caso de que continúe sen funcionar, intente [[Special:UserLogout|saír]] e volver a entrar na súa conta, e verifique se o seu navegador permite o uso de ''cookies'' deste sitio.",
+       "import-token-mismatch": "Perda dos datos da sesión.\n\nPoida que se pechase a súa sesión. <strong>Por favor, comprobe que ten a sesión aberta e probe de novo.</strong>\nEn caso de que siga sen funcionar, intente [[Special:UserLogout|saír]] e volver entrar na súa conta e verifique que o seu navegador permite o uso de cookies neste sitio.",
        "import-invalid-interwiki": "Non se pode importar desde o wiki escificado.",
        "import-error-edit": "Non foi posible importar a páxina \"$1\" porque non ten os permisos necesarios para editala.",
        "import-error-create": "Non foi posible importar a páxina \"$1\" porque non ten os permisos necesarios para creala.",
        "import-logentry-upload-detail": "{{PLURAL:$1|Importouse $1 revisión|Importáronse $1 revisións}}",
        "import-logentry-interwiki-detail": "{{PLURAL:$1|Importouse $1 revisión|Importáronse $1 revisións}} desde $2",
        "javascripttest": "Proba de JavaScript",
-       "javascripttest-pagetext-unknownaction": "Acción descoñecida \"$1\".",
+       "javascripttest-pagetext-unknownaction": "Descoñécese a acción \"$1\".",
        "javascripttest-qunit-intro": "Bótelle unha ollada á [$1 documentación das probas] en mediawiki.org.",
        "tooltip-pt-userpage": "A súa páxina de {{GENDER:|usuario|usuaria}}",
        "tooltip-pt-anonuserpage": "A páxina de usuario do enderezo IP desde o que está a editar",
        "tooltip-pt-preferences": "{{GENDER:|As súas}} preferencias",
        "tooltip-pt-watchlist": "A lista de páxinas cuxas modificacións está a seguir",
        "tooltip-pt-mycontris": "Lista das súas contribucións",
-       "tooltip-pt-anoncontribs": "Unha lista de modificacións feitas desde esta dirección IP",
+       "tooltip-pt-anoncontribs": "Unha lista das modificacións feitas desde este enderezo IP",
        "tooltip-pt-login": "Recoméndaselle rexistrarse, se ben non é obrigatorio",
        "tooltip-pt-logout": "Saír ao anonimato",
        "tooltip-pt-createaccount": "Recoméndaselle crear unha conta e acceder ao sistema, se ben non é obrigatorio",
        "tooltip-ca-protect": "Protexer esta páxina",
        "tooltip-ca-unprotect": "Cambiar a protección desta páxina",
        "tooltip-ca-delete": "Eliminar esta páxina",
-       "tooltip-ca-undelete": "Restaurar as edicións feitas nesta páxina antes de que fose eliminada",
+       "tooltip-ca-undelete": "Restaurar as edicións feitas nesta páxina antes de que fose borrada",
        "tooltip-ca-move": "Mover esta páxina",
        "tooltip-ca-watch": "Engadir esta páxina á lista de vixilancia",
        "tooltip-ca-unwatch": "Eliminar esta páxina da lista de vixilancia",
        "tooltip-ca-nstab-template": "Ver o modelo",
        "tooltip-ca-nstab-help": "Ver a páxina de axuda",
        "tooltip-ca-nstab-category": "Ver a páxina da categoría",
-       "tooltip-minoredit": "Marcar isto coma unha edición pequena",
+       "tooltip-minoredit": "Marcar isto como unha edición pequena",
        "tooltip-save": "Gravar os seus cambios",
        "tooltip-publish": "Publicar os seus cambios",
        "tooltip-preview": "Vista previa dos seus cambios; por favor, úsea antes de gravalos!",
        "patrol-log-page": "Rexistro de revisións patrulladas",
        "patrol-log-header": "Este é un rexistro das revisións patrulladas.",
        "log-show-hide-patrol": "$1 o rexistro de patrullas",
-       "log-show-hide-tag": "$1 rexistro de etiquetas",
-       "deletedrevision": "A revisión vella $1 foi borrada.",
+       "log-show-hide-tag": "$1 o rexistro de etiquetas",
+       "confirm-markpatrolled-button": "Aceptar",
+       "confirm-markpatrolled-top": "Quere marcar a revisión $3 de \"$2\" como patrullada?",
+       "deletedrevision": "Revisión vella e borrada de \"$1\"",
        "filedeleteerror-short": "Erro ao eliminar o ficheiro: $1",
        "filedeleteerror-long": "Atopáronse erros ao eliminar o ficheiro:\n\n$1",
        "filedelete-missing": "Non se pode eliminar o ficheiro \"$1\" porque non existe.",
        "svg-long-error": "Ficheiro SVG non válido: $1",
        "show-big-image": "Ficheiro orixinal",
        "show-big-image-preview": "Tamaño desta vista previa: $1.",
-       "show-big-image-preview-differ": "Tamaño desta revisión $3 do ficheiro $2: $1.",
+       "show-big-image-preview-differ": "Tamaño desta vista previa en $3 do ficheiro en formato $2: $1.",
        "show-big-image-other": "{{PLURAL:$2|Outra resolución|Outras resolucións}}: $1.",
        "show-big-image-size": "$1 × $2 píxeles",
        "file-info-gif-looped": "en bucle",
        "newimages-legend": "Filtro",
        "newimages-label": "Nome do ficheiro (ou parte del):",
        "newimages-showbots": "Mostrar as cargas feitas por bots",
-       "newimages-hidepatrolled": "Ocultar as subas verificadas",
-       "noimages": "Non hai imaxes para ver.",
-       "gallery-slideshow-toggle": "Intercambiar miniaturas",
+       "newimages-hidepatrolled": "Agochar as subidas patrulladas",
+       "noimages": "Non hai imaxes que mostrar.",
+       "gallery-slideshow-toggle": "Intercambiar as miniaturas",
        "ilsubmit": "Procurar",
        "bydate": "por data",
        "sp-newimages-showfrom": "Mostrar os novos ficheiros comezando polo $1 ás $2",
        "exif-imagelength": "Alto",
        "exif-bitspersample": "Bits por compoñente",
        "exif-compression": "Esquema de compresión",
-       "exif-photometricinterpretation": "Composición do píxel",
+       "exif-photometricinterpretation": "Composición de píxeles",
        "exif-orientation": "Orientación",
        "exif-samplesperpixel": "Número de compoñentes",
        "exif-planarconfiguration": "Disposición dos datos",
        "exif-stripoffsets": "Localización dos datos da imaxe",
        "exif-rowsperstrip": "Número de filas por tira",
        "exif-stripbytecounts": "Bytes por tira comprimida",
-       "exif-jpeginterchangeformat": "Distancia ao inicio (SOI) do JPEG",
+       "exif-jpeginterchangeformat": "Desprazamento do SOI do JPEG",
        "exif-jpeginterchangeformatlength": "Bytes de datos JPEG",
-       "exif-whitepoint": "Coordenadas cromáticas de referencia do branco",
+       "exif-whitepoint": "Cromacidade do punto branco",
        "exif-primarychromaticities": "Cromacidades primarias",
        "exif-ycbcrcoefficients": "Coeficientes da matriz de transformación do espazo de cores",
        "exif-referenceblackwhite": "Par de valores de referencia branco e negro",
        "exif-relatedsoundfile": "Ficheiro de son relacionado",
        "exif-datetimeoriginal": "Data e hora de xeración do ficheiro",
        "exif-datetimedigitized": "Data e hora de dixitalización",
-       "exif-subsectime": "DataHora subsegundos",
-       "exif-subsectimeoriginal": "DataHoraOrixinal subsegundos",
-       "exif-subsectimedigitized": "DataHoraDixitalización subsegundos",
+       "exif-subsectime": "Subsegundo da data e hora",
+       "exif-subsectimeoriginal": "Subsegundo da data e hora orixinais",
+       "exif-subsectimedigitized": "Subsegundo da data e hora de dixitalización",
        "exif-exposuretime": "Tempo de exposición",
        "exif-exposuretime-format": "$1 segundos ($2)",
        "exif-fnumber": "Número f",
        "exif-exposureprogram": "Programa de exposición",
        "exif-spectralsensitivity": "Sensibilidade espectral",
-       "exif-isospeedratings": "Relación da velocidade ISO",
+       "exif-isospeedratings": "Relación de velocidade ISO",
        "exif-shutterspeedvalue": "Velocidade de obturación APEX",
        "exif-aperturevalue": "Apertura APEX",
        "exif-brightnessvalue": "Brillo APEX",
-       "exif-exposurebiasvalue": "Corrección da exposición",
+       "exif-exposurebiasvalue": "Corrección da exposición mediante APEX",
        "exif-maxaperturevalue": "Máxima apertura do diafragma",
        "exif-subjectdistance": "Distancia do suxeito",
        "exif-meteringmode": "Modo de medida da exposición",
        "exif-sensingmethod": "Tipo de sensor",
        "exif-filesource": "Fonte do ficheiro",
        "exif-scenetype": "Tipo de escena",
-       "exif-customrendered": "Procesamento da imaxe personalizado",
+       "exif-customrendered": "Procesamento de imaxe personalizado",
        "exif-exposuremode": "Modo de exposición",
        "exif-whitebalance": "Balance de brancos",
        "exif-digitalzoomratio": "Valor do zoom dixital",
        "exif-saturation": "Saturación",
        "exif-sharpness": "Nitidez",
        "exif-devicesettingdescription": "Descrición da configuración do dispositivo",
-       "exif-subjectdistancerange": "Distancia ao suxeito",
+       "exif-subjectdistancerange": "Rango de distancia ao suxeito",
        "exif-imageuniqueid": "ID único da imaxe",
        "exif-gpsversionid": "Versión da etiqueta GPS",
        "exif-gpslatituderef": "Latitude norte ou sur",
        "exif-gpstrack": "Dirección do movemento",
        "exif-gpsimgdirectionref": "Referencia para a dirección da imaxe",
        "exif-gpsimgdirection": "Dirección da imaxe",
-       "exif-gpsmapdatum": "Usados datos xeodésicos de enquisas",
+       "exif-gpsmapdatum": "Datos xeodésicos usados",
        "exif-gpsdestlatituderef": "Referencia para a latitude do destino",
        "exif-gpsdestlatitude": "Latitude do destino",
        "exif-gpsdestlongituderef": "Referencia para a lonxitude do destino",
        "exif-gpsdestlongitude": "Lonxitude do destino",
-       "exif-gpsdestbearingref": "Referencia para a coordenada de destino",
-       "exif-gpsdestbearing": "Coordenada de destino",
+       "exif-gpsdestbearingref": "Referencia para a orientación de destino",
+       "exif-gpsdestbearing": "Orientación de destino",
        "exif-gpsdestdistanceref": "Referencia para a distancia ao destino",
        "exif-gpsdestdistance": "Distancia ao destino",
        "exif-gpsprocessingmethod": "Nome do método de procesamento GPS",
        "exif-orientation-6": "Rotada 90° en sentido antihorario",
        "exif-orientation-7": "Rotada 90° en sentido horario e volteada verticalmente",
        "exif-orientation-8": "Rotada 90° en sentido horario",
-       "exif-planarconfiguration-1": "Formato de paquete de píxeles",
-       "exif-planarconfiguration-2": "Formato de planos",
+       "exif-planarconfiguration-1": "formato de paquete de píxeles",
+       "exif-planarconfiguration-2": "formato de planos",
        "exif-colorspace-65535": "Sen calibrar",
-       "exif-componentsconfiguration-0": "non hai",
+       "exif-componentsconfiguration-0": "non existe",
        "exif-exposureprogram-0": "Sen definir",
        "exif-exposureprogram-1": "Manual",
        "exif-exposureprogram-2": "Programa normal",
        "exif-exposureprogram-3": "Prioridade da apertura",
-       "exif-exposureprogram-4": "Prioridade da obturación",
+       "exif-exposureprogram-4": "Prioridade do obturador",
        "exif-exposureprogram-5": "Programa creativo (preferencia pola profundidade de campo)",
-       "exif-exposureprogram-6": "Programa de acción (preferencia por unha velocidade de exposición máis rápida)",
+       "exif-exposureprogram-6": "Programa de acción (preferencia por unha velocidade do obturador máis rápida)",
        "exif-exposureprogram-7": "Modo retrato (para primeiros planos co fondo desenfocado)",
        "exif-exposureprogram-8": "Modo paisaxe (para paisaxes co fondo enfocado)",
        "exif-subjectdistance-value": "$1 metros",
        "exif-meteringmode-0": "Descoñecido",
        "exif-meteringmode-1": "Media",
-       "exif-meteringmode-2": "Ponderado no centro",
-       "exif-meteringmode-3": "Un punto",
-       "exif-meteringmode-4": "Varios puntos",
-       "exif-meteringmode-5": "Patrón de medición",
+       "exif-meteringmode-2": "Media ponderada no centro",
+       "exif-meteringmode-3": "Puntual",
+       "exif-meteringmode-4": "Multipuntual",
+       "exif-meteringmode-5": "Patrón",
        "exif-meteringmode-6": "Parcial",
        "exif-meteringmode-255": "Outro",
        "exif-lightsource-0": "Descoñecida",
        "exif-lightsource-9": "Bo tempo",
        "exif-lightsource-10": "Tempo anubrado",
        "exif-lightsource-11": "Sombra",
-       "exif-lightsource-12": "Fluorescente luz de día (D 5700 – 7100K)",
-       "exif-lightsource-13": "Fluorescente branco día (N 4600 – 5400K)",
-       "exif-lightsource-14": "Fluorescente branco frío (W 3900 – 4500K)",
+       "exif-lightsource-12": "Fluorescente de luz de día (D 5700 – 7100K)",
+       "exif-lightsource-13": "Fluorescente de branco diurno (N 4600 – 5400K)",
+       "exif-lightsource-14": "Fluorescente de branco frío (W 3900 – 4500K)",
        "exif-lightsource-15": "Fluorescente branco (WW 3200 – 3700K)",
        "exif-lightsource-17": "Luz estándar A",
        "exif-lightsource-18": "Luz estándar B",
        "exif-sensingmethod-2": "Sensor da área de cor dun chip",
        "exif-sensingmethod-3": "Sensor da área de cor de dous chips",
        "exif-sensingmethod-4": "Sensor da área de cor de tres chips",
-       "exif-sensingmethod-5": "Sensor secuencial da área de cor",
-       "exif-sensingmethod-7": "Sensor trilineal",
-       "exif-sensingmethod-8": "Sensor secuencial da liña de cor",
+       "exif-sensingmethod-5": "Sensor da área de cor secuencial",
+       "exif-sensingmethod-7": "Sensor trilinear",
+       "exif-sensingmethod-8": "Sensor da cor linear secuencial",
        "exif-filesource-3": "Cámara fotográfica dixital",
        "exif-scenetype-1": "Unha imaxe fotografada directamente",
        "exif-customrendered-0": "Procesamento normal",
        "exif-customrendered-1": "Procesamento personalizado",
        "exif-exposuremode-0": "Exposición automática",
        "exif-exposuremode-1": "Exposición manual",
-       "exif-exposuremode-2": "Compensación de exposición automática",
+       "exif-exposuremode-2": "Compensación automática da exposición",
        "exif-whitebalance-0": "Balance de brancos automático",
        "exif-whitebalance-1": "Balance de brancos manual",
        "exif-scenecapturetype-0": "Estándar",
        "exif-subjectdistancerange-0": "Descoñecida",
        "exif-subjectdistancerange-1": "Macro",
        "exif-subjectdistancerange-2": "Primeiro plano",
-       "exif-subjectdistancerange-3": "Paisaxe",
+       "exif-subjectdistancerange-3": "Vista distante",
        "exif-gpslatitude-n": "Latitude norte",
        "exif-gpslatitude-s": "Latitude sur",
        "exif-gpslongitude-e": "Lonxitude leste",
        "confirmemail_body_set": "Alguén, probablemente vostede, desde o enderezo IP $1,\nestableceu este enderezo de correo electrónico como o da conta \"$2\" en {{SITENAME}}.\n\nPara confirmar que realmente esta conta lle pertence a vostede e activar\nas características do correo electrónico en {{SITENAME}}, abra esta ligazón no seu navegador:\n\n$3\n\nSe a conta *non* é súa, siga estoutra ligazón\npara cancelar a confirmación do enderezo de correo electrónico:\n\n$5\n\nO código de confirmación caduca o $6 ás $7.",
        "confirmemail_invalidated": "A confirmación do enderezo de correo electrónico foi cancelada",
        "invalidateemail": "Cancelar a confirmación do correo electrónico",
-       "notificationemail_subject_changed": "A dirección de correo rexistrada en {{SITENAME}} foi modificada",
-       "notificationemail_subject_removed": "A dirección de correo rexistrada en {{SITENAME}} foi eliminada",
-       "notificationemail_body_changed": "Alguén, probablemente vostede, dende a dirección IP $1, cambiou a dirección de correo electrónico da conta \"$2\" a \"$3\" en {{SITENAME}}.\n\nSe non foi vostede, contacte cun administrador inmediatamente.",
-       "notificationemail_body_removed": "Alguén, probablemente vostede, dende a dirección IP $1, eliminou a dirección de correo electrónico da conta \"$2\" en {{SITENAME}}.\n\nSe non foi vostede, contacte cun administrador inmediatamente.",
+       "notificationemail_subject_changed": "Modificouse o enderezo de correo electrónico rexistrado en {{SITENAME}}",
+       "notificationemail_subject_removed": "Eliminouse o enderezo de correo electrónico rexistrado en {{SITENAME}}",
+       "notificationemail_body_changed": "Alguén, probablemente vostede, dende o enderezo IP $1,\ncambiou o enderezo de correo electrónico da conta \"$2\" a \"$3\" en {{SITENAME}}.\n\nSe non foi vostede, contacte cun administrador inmediatamente.",
+       "notificationemail_body_removed": "Alguén, probablemente vostede, dende o enderezo IP $1,\neliminou o enderezo de correo electrónico da conta \"$2\" en {{SITENAME}}.\n\nSe non foi vostede, contacte cun administrador inmediatamente.",
        "scarytranscludedisabled": "[A transclusión interwiki está desactivada]",
        "scarytranscludefailed": "[Fallou a busca do modelo \"$1\"]",
        "scarytranscludefailed-httpstatus": "[Fallou a busca do modelo \"$1\": HTTP $2]",
        "scarytranscludetoolong": "[O enderezo URL é demasiado longo]",
        "deletedwhileediting": "'''Aviso:''' Esta páxina foi borrada despois de que comezase a editala!",
-       "confirmrecreate": "O usuario [[User:$1|$1]] ([[User talk:$1|conversa]]) {{GENDER:$1|borrou}} esta páxina despois de que vostede comezara a editala, dando o seguinte motivo:\n: <em>$2</em>\nPor favor, confirme que realmente quere recrear esta páxina.",
-       "confirmrecreate-noreason": "O usuario [[User:$1|$1]] ([[User talk:$1|conversa]]) {{GENDER:$1|borrou}} esta páxina despois de que vostede comezara a editala. Por favor, confirme que realmente quere recrear esta páxina.",
+       "confirmrecreate": "O usuario [[User:$1|$1]] ([[User talk:$1|conversa]]) {{GENDER:$1|borrou}} esta páxina despois de que vostede comezase a editala, achegando o seguinte motivo:\n: <em>$2</em>\nPor favor, confirme que realmente quere recrear esta páxina.",
+       "confirmrecreate-noreason": "O usuario [[User:$1|$1]] ([[User talk:$1|conversa]]) {{GENDER:$1|borrou}} esta páxina despois de que vostede comezase a editala. Por favor, confirme que realmente quere recrear esta páxina.",
        "recreate": "Recrear",
        "confirm_purge_button": "Aceptar",
        "confirm-purge-top": "Quere limpar a memoria caché desta páxina?",
        "confirm-unwatch-button": "Aceptar",
        "confirm-unwatch-top": "Quere eliminar esta páxina da lista de vixilancia?",
        "confirm-rollback-button": "Aceptar",
-       "confirm-rollback-top": "Reverter as edicións desta páxina?",
+       "confirm-rollback-top": "Quere reverter as edicións desta páxina?",
        "colon-separator": ":&#32;",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← páxina anterior",
        "version-variables": "Variables",
        "version-antispam": "Prevención contra spam",
        "version-other": "Outros",
-       "version-mediahandlers": "Executadores de multimedia",
+       "version-mediahandlers": "Manipuladores de ficheiros multimedia",
        "version-hooks": "Asociadores",
        "version-parser-extensiontags": "Etiquetas das extensións do analizador",
-       "version-parser-function-hooks": "Asociadores da función do analizador",
+       "version-parser-function-hooks": "Asociadores das funcións do analizador",
        "version-hook-name": "Nome do asociador",
        "version-hook-subscribedby": "Subscrito por",
        "version-version": "($1)",
        "version-software": "Software instalado",
        "version-software-product": "Produto",
        "version-software-version": "Versión",
-       "version-entrypoints": "Enderezos URL de punto de entrada",
+       "version-entrypoints": "Enderezos URL do punto de entrada",
        "version-entrypoints-header-entrypoint": "Punto de entrada",
        "version-entrypoints-header-url": "URL",
        "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Ruta dos artigos]",
        "version-libraries-license": "Licenza",
        "version-libraries-description": "Descrición",
        "version-libraries-authors": "Autores",
-       "redirect": "Redirixir por nome de ficheiro, usuario, páxina, modificación ou identificador de rexistro",
-       "redirect-summary": "Esta páxina especial redirixe cara a un ficheiro (dado o nome), unha páxina (dado o ID da páxina ou o dunha revisión) ou unha páxina de usuario (dado o ID dun usuario), ou unha entrada do rexistro (dada polo ID do rexistro). Utilización: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]] ou [[{{#Special:Redirect}}/user/101]], ou [[{{#Special:Redirect}}/logid/186]].",
+       "redirect": "Redirixir por nome de ficheiro, ID de usuario, ID de páxina, ID de revisión ou ID de rexistro",
+       "redirect-summary": "Esta páxina especial redirixe cara a un ficheiro (dado o nome), unha páxina (dado o ID da páxina ou o dunha revisión), unha páxina de usuario (dado o ID dun usuario) ou unha entrada do rexistro (dada o ID do rexistro). Utilización: [[{{#Special:Redirect}}/file/Example.jpg]], [[{{#Special:Redirect}}/page/64308]], [[{{#Special:Redirect}}/revision/328429]], [[{{#Special:Redirect}}/user/101]] ou [[{{#Special:Redirect}}/logid/186]].",
        "redirect-submit": "Continuar",
        "redirect-lookup": "Procurar:",
        "redirect-value": "Valor:",
-       "redirect-user": "ID de usuario",
-       "redirect-page": "ID de páxina",
+       "redirect-user": "Identificador de usuario",
+       "redirect-page": "Identificador de páxina",
        "redirect-revision": "Revisión de páxina",
        "redirect-file": "Nome de ficheiro",
        "redirect-logid": "Identificador de rexistro",
        "tags-deactivate": "desactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|modificación|modificacións}}",
        "tags-manage-no-permission": "Non ten os permisos necesarios para modificar etiquetas.",
-       "tags-manage-blocked": "Non pode acceder á interface de modificación de etiquetas mentres estea bloqueado.",
+       "tags-manage-blocked": "Non pode acceder á interface de modificación de etiquetas mentres estea {{GENDER:$1|bloqueado|bloqueada}}.",
        "tags-create-heading": "Crear unha nova etiqueta",
        "tags-create-explanation": "Por defecto, as etiquetas creadas recentemente poderán ser empregadas polos usuarios e os bots.",
        "tags-create-tag-name": "Nome da etiqueta:",
        "tags-deactivate-not-allowed": "Non é posible reactivar a páxina \"$1\".",
        "tags-deactivate-submit": "Desactivar",
        "tags-apply-no-permission": "Non ten permisos para aplicar etiquetas de cambios xunto cos seus tus cambios.",
-       "tags-apply-blocked": "Non pode aplicar os cambios das etiquetas cos seus cambios mentras estea bloqueado.",
+       "tags-apply-blocked": "Non pode aplicar os cambios nas etiquetas nin as súas modificacións mentras estea {{GENDER:$1|bloqueado|bloqueada}}.",
        "tags-apply-not-allowed-one": "A etiqueta \"$1\" non se puede aplicar manualmente.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta non se pode|As seguintes etiquetas non se poden}} aplicar manualmente: $1",
        "tags-update-no-permission": "Non ten permisos para engadir ou quitar etiquetas de cambio das revisións individuais ou das entradas do rexistro.",
-       "tags-update-blocked": "Non pode engadir nin quitar de modificación etiquetas mentras estea bloqueado.",
+       "tags-update-blocked": "Non pode engadir nin eliminar etiquetas mentras estea {{GENDER:$1|bloqueado|bloqueada}}.",
        "tags-update-add-not-allowed-one": "A etiqueta \"$1\" non se pode engadir manualmente.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta non se pode|As seguintes etiquetas non se poden}} engadir manualmente: $1",
        "tags-update-remove-not-allowed-one": "A etiqueta \"$1\" non se pode eliminar.",
        "htmlform-user-not-exists": "\"<strong>$1</strong>\" non existe.",
        "htmlform-user-not-valid": "\"<strong>$1</strong>\" non é un nome de usuario válido.",
        "logentry-delete-delete": "$1 {{GENDER:$2|borrou}} a páxina \"$3\"",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|eliminou}} a redirección $3 sobreescribíndoa",
        "logentry-delete-restore": "$1 {{GENDER:$2|restaurou}} a páxina \"$3\"",
        "logentry-delete-event": "$1 {{GENDER:$2|mudou}} a visibilidade {{PLURAL:$5|dunha entrada|de $5 entradas}} do rexistro de $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|mudou}} a visibilidade {{PLURAL:$5|dunha revisión|de $5 revisións}} da páxina \"$3\": $4",
        "expand_templates_generate_xml": "Mostrar a árbore de análise XML",
        "expand_templates_generate_rawhtml": "Mostrar o HTML en bruto",
        "expand_templates_preview": "Vista previa",
-       "expand_templates_preview_fail_html": "<em>Dado que o código HTML puro está activado en {{SITENAME}} e produciuse unha perda dos datos da sesión, a vista previa está oculta como precaución contra ataques mediante código JavaScript.</em>\n\n<strong>Se este é un intento lexítimo de acceso á vista previa, inténteo de novo.</strong>\nSe segue sen funcionar, probe a [[Special:UserLogout|saír]] e volver a entrar coa súa conta, e revise que o seu navegador permite o uso de \"cookies\" deste sitio.",
+       "expand_templates_preview_fail_html": "<em>Dado que o código HTML puro está activado en {{SITENAME}} e se produciu unha perda dos datos da sesión, a vista previa está oculta como precaución contra ataques mediante código JavaScript.</em>\n\n<strong>Se este é un intento lexítimo de acceso á vista previa, probe de novo.</strong>\nEn caso de que siga sen funcionar, intente [[Special:UserLogout|saír]] e volver entrar na súa conta e verifique que o seu navegador permite o uso de cookies neste sitio.",
        "expand_templates_preview_fail_html_anon": "<em>Dado que o código HTML puro está activado en {{SITENAME}} e produciuse unha perda dos datos da sesión, a vista previa está oculta como precaución contra ataques mediante código JavaScript.</em>\n\n<strong>Se este é un intento lexítimo de acceso á vista previa, probe a [[Special:UserLogout|saír]] e volver a entrar coa súa conta.</strong>",
        "expand_templates_input_missing": "Necesita proporcionar polo menos algún texto de entrada.",
        "pagelanguage": "Cambiar a lingua da páxina",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "a páxina aínda non existe",
        "mw-widgets-titleinput-description-redirect": "redirección cara a $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Engadir unha categoría...",
        "sessionmanager-tie": "Non pode combinar peticións múltiples de tipos de autenticación: $1.",
        "sessionprovider-generic": "sesións $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesións baseadas nas cookies",
        "log-action-filter-contentmodel-change": "Cambio de modelo de contido",
        "log-action-filter-contentmodel-new": "Creación de páxins cun modelo de contido non estándar",
        "log-action-filter-delete-delete": "Borrado de páxinas",
+       "log-action-filter-delete-delete_redir": "Sobreescritura de redirección",
        "log-action-filter-delete-restore": "Restauración de páxinas",
        "log-action-filter-delete-event": "Borrado de rexistros",
        "log-action-filter-delete-revision": "Borrado de revisión",
        "usercssispublic": "Lembre: As subpáxinas CSS non deberían conter datos confidenciais porque outros usuarios poden velos.",
        "restrictionsfield-badip": "Enderezo IP ou rango de IP non válido: $1",
        "restrictionsfield-label": "Rangos de IP permitidos:",
-       "restrictionsfield-help": "Un único enderezo IP ou rango CIDR por liña. Para habilitalos todos, utilice<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Erro: $1",
-       "edit-error-long": "Erros:\n\n$1"
+       "restrictionsfield-help": "Un único enderezo IP ou rango CIDR por liña. Para habilitalos todos, utilice<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 2dc66a3..4e4e804 100644 (file)
        "yourpasswordagain": "رمزه دۊمارته بنويس",
        "createacct-yourpasswordagain": "رمزه تأىيد بکۊن",
        "createacct-yourpasswordagain-ph": "هندئه رمزه بنويس",
-       "remembermypassword": "رمزه (تا حدأکثر $1 {{PLURAL:$1|رۊز|رۊزؤن}}) اي وبمجˇ مئن ىاد بدأر.",
        "userlogin-remembermypassword": "مره دۊيرين بمأ بدأر",
        "cannotloginnow-title": "هسأ دۊيرين أمأ منين",
        "cannotloginnow-text": "وختي $1 کاردره، نشأنه دۊيرين أمأن.",
        "categories": "جرگه'ن",
        "listusers-noresult": "هيچ کارگيري پىدا نۊبؤ.",
        "activeusers": "فعال کارگيرؤنˇ ليست",
-       "activeusers-hidesysops": "کيا'نه جيگا دأن",
        "activeusers-noresult": "هيچ کارگيري پىدا نۊبؤ.",
        "listgrouprights": "کارگيري پأره دسفأرسؤن",
        "listgrouprights-group": "پأره",
index d4040cb..a12ef51 100644 (file)
        "yourpasswordagain": "गुपीत उतर परतें टायप करात",
        "createacct-yourpasswordagain": "गुपीतउतराची खात्री कर",
        "createacct-yourpasswordagain-ph": "गुपितउतर परत घालात",
-       "remembermypassword": "ह्या ब्राउजराचेर म्हजें लॉग इन याद दवरात (चडांतचड $1 {{PLURAL:$1|दिस|दिसां}} खातीर)",
        "userlogin-remembermypassword": "म्हजें सत्र चालू दवर",
        "userlogin-signwithsecure": "सुरक्षित कनेक्शन वापर",
        "yourdomainname": "तुमचो डोमेन:",
index 975cb88..a3d9b83 100644 (file)
        "yourpasswordagain": "Gupit utor porot boroi:",
        "createacct-yourpasswordagain": "Gupitutrachi khatri kor",
        "createacct-yourpasswordagain-ph": "Gupitutor porot boroi",
-       "remembermypassword": "Hea internet browseran mhojem sotrachem ugdas dovor (chodan chod $1 {{PLURAL:$1|disak|disank}})",
        "userlogin-remembermypassword": "Mhojem sotr chalu dovor",
        "userlogin-signwithsecure": "Surokxit onubondh vapor",
        "yourdomainname": "Tuzo domain:",
index 2aa61b6..1006cc8 100644 (file)
@@ -35,7 +35,7 @@
        "tog-enotifminoredits": "Lawoli surel olo wa'u to'u lo'ubawa ngo'idi halaamani wawu berkas",
        "tog-enotifrevealaddr": "Popobilohe alamati lo surel ola'u to surel lopo'ota",
        "tog-shownumberswatching": "Popobilohe jumula lo ta he'awasiyalo",
-       "tog-oldsig": "Pali lo ulu'u masatiya",
+       "tog-oldsig": "Pali lo ulu'umu masatiya",
        "tog-fancysig": "Popopasiya pali lo'ulu'u odelo tuladuwiki (diyalu tuwawu pranala otomatis)",
        "tog-uselivepreview": "Popohunawa mopobilohu langsung",
        "tog-forceeditsummary": "Popo'eelawa wa'u wonu dosi monguba diipo otuwa",
@@ -52,7 +52,7 @@
        "tog-showhiddencats": "Popobilehe kategori u hewanto'a",
        "tog-norollbackdiff": "Japopobilohe u beda yilapato pilopohalingo",
        "tog-useeditwarning": "Popo'ingatiya wa'u wonu molola halaman he'ubalo wonu dipo tilahu",
-       "tog-prefershttps": "Layito momake koneksi amaani wonu mo maso log",
+       "tog-prefershttps": "Layito momake koneksi aamani wonu tumuwato log",
        "underline-always": "Layito",
        "underline-never": "Dila ta",
        "underline-default": "Alipo meyalo browser dudelo",
        "category-file-count-limited": "Woluwo {{PLURAL:$1|berkas|S1 berkas}} to delomo kategori.",
        "listingcontinuesabbrev": "wumb",
        "index-category": "Halaman to indeks",
-       "noindex-category": "Haalaman dila to indeks",
+       "noindex-category": "Halaman diila to indeks",
        "broken-file-category": "Halaamani wolo pranala berkas ma lorusa",
        "about": "Tomimbihu",
        "article": "Tuwango halaman",
        "newwindow": "hu'owa to janela bohu",
        "cancel": "Batali",
        "moredotdotdot": "Uweewo",
-       "morenotlisted": "Daputari boti dipo ganapu",
+       "morenotlisted": "Daputari boti kira-kira diipo ganapu",
        "mypage": "Halaamani",
        "mytalk": "Lo'iya",
        "anontalk": "Bisala",
        "invalidtitle-knownnamespace": "Judul u ja sah wolo huwali tanggulo \"$2\" wawu teks \"$3\"",
        "exception-nologin": "Diipo tilumuwoto log",
        "exception-nologin-text": "Toduwolo tumuwoto log alihu mowali mokalaja to halaman botiye meyalo huhutu botiye.",
-       "exception-nologin-text-manual": "Toduwolo tumuwoto alihu mowali mohutu halaman meyalo huhutu uweewo.",
+       "exception-nologin-text-manual": "Toduwoolo $1 tumuwoto alihu mowali mohutu halaman meyalo uweewo.",
        "virus-badscanner": "Tilala konfigurasi: pemindai virus ja iloonuhe: ''$1''",
        "virus-scanfailed": "Pemindaian ja lowali (kode $1)",
        "virus-unknownscanner": "antivirus ja'otaawa",
        "loginlanguagelabel": "Bahasa: $1",
        "pt-login": "Tumuwoto log",
        "pt-login-button": "Tumuwoto log",
+       "pt-login-continue-button": "Turusi tumuwoto log",
        "pt-createaccount": "Mohutu akun",
        "pt-userlogout": "Lumuwalo log",
        "botpasswords-label-create": "Mohutu",
        "searchprofile-everything-tooltip": "Mololohe nga'amila tuwango situs (wolo halaman polo'iyalo)",
        "searchprofile-advanced-tooltip": "Mololohu to huwali lo tanggulo biasa",
        "search-result-size": "$1 ({{PLURAL:$2|1 tahe|$2 tahe}})",
-       "search-redirect": "(mopobale $1)",
+       "search-redirect": "(pilobale lonto $1)",
        "search-section": "(tayadu) $1",
        "search-suggest": "Patujumu yito:$1",
        "searchall": "nga'amila",
index 06bfece..99c0a74 100644 (file)
        "yourpasswordagain": "Ἀνατυπῶσαι σύνθημα:",
        "createacct-yourpasswordagain": "Ἐπιβεβαιώσειν σῆμα",
        "createacct-yourpasswordagain-ph": "Παρέχειν σῆμα πάλιν",
-       "remembermypassword": "Μίμνῃσκε ἐνθάδε συνδεῖσθαι (μέγιστον $1 {{PLURAL:$1|ἡμέρα|ἡμέραι}})",
        "userlogin-remembermypassword": "Διατήρησις συνδέσεως",
        "yourdomainname": "Ὁ τομεύς σου:",
        "externaldberror": "Συνέβη εἴτε σφάλμα τι πιστοποιήσεως τῆς βάσεως δεδομένων εἴτε οὐκ ἔξεστί σοι ἐνημεροῦν τὸν ἐξωτερικὸν λογισμόν σου.",
        "undo-failure": "Ἀδύνατος ἡ μεταστροφὴ λόγῳ ἀντικρουομένων ἐνδιαμέσων μεταγραφῶν.",
        "undo-norev": "Ἀδύνατος ἡ μεταστροφὴ τῆσδε τῆς μεταγραφῆς λόγῳ μὴ ὑπάρξεως ἢ προτέρας διαγραφῆς ταύτης.",
        "undo-summary": "Ἀναίρεσις μεταγραφῆς $1 ὑπὸ τὸν/τὴν [[Special:Contributions/$2|$2]] ([[User talk:$2|Διάλεξις]])",
-       "cantcreateaccounttitle": "Μὴ δυνατὴ ἡ ποίησις λογισμοῦ",
        "viewpagelogs": "Ὁρᾶν καταλόγους διὰ ταύτην τὴν δέλτον",
        "nohistory": "Οὐκ ἔστι ἱστορικὸν μεταγραφῶν διὰ τήνδε τὴν δέλτον.",
        "currentrev": "Τὸ νῦν",
        "activeusers": "Κατάλογος ἐνεργῶν χρωμένων",
        "activeusers-count": "$1 {{PLURAL:$1|μεταγραφή|μεταγραφαὶ}} κατὰ {{PLURAL:$3|τὴν πρόσφατον ἡμέραν|τὰς προσφάτους $3 ἡμέρας}}",
        "activeusers-from": "Δεικνύειν χρωμένους ἐκκινήσει ἐκ:",
-       "activeusers-hidebots": "Κρύπτειν αὐτόματα",
-       "activeusers-hidesysops": "Κρύπτειν ἐπιτρόπους",
        "activeusers-noresult": "Οὐδεὶς χρώμενος εὑρέθη.",
        "listgrouprights": "Δικαιώματα ὁμάδος χρωμένου",
        "listgrouprights-group": "Ὁμάς",
index 7639217..4a3207f 100644 (file)
        "activeusers-intro": "Des isch e Lischt vu Benutzer, wu irgedebis bearbeitet hän {{PLURAL:$1|am letschte Tag|in dr letschte $1 Täg}}.",
        "activeusers-count": "$1 {{PLURAL:$1|Aktion|Aktione}} {{PLURAL:$3|am letschte Tag|in dr letschte $3 Täg}}",
        "activeusers-from": "Zeig Benutzer ab:",
-       "activeusers-hidebots": "Bötli uusblände",
-       "activeusers-hidesysops": "Ammanne (Administratore) uusblände",
        "activeusers-noresult": "Kei Benutzer gfunde.",
        "listgrouprights": "Benutzergruppe-Rächt",
        "listgrouprights-summary": "Des isch e Liste vu dr Benutzergruppe, wu in däm Wiki definiert sin, un dr Rächt, wu dermit verbunde sin.\nZuesätzligi Informatione iber einzelni Rächt git s [[{{MediaWiki:Listgrouprights-helppage}}|doo]].",
        "feedback-external-bug-report-button": "E technischi Ufgab yreiche",
        "feedback-dialog-title": "Rückmäldig gä",
        "feedback-dialog-intro": "Du chasch ds eifache Formular unde bruuche, für’ne Rückmäldig z gä. Dy Kommentar chunt zäme mit dym Benutzernamen uf d Syte «$1».",
-       "feedback-error-title": "Fähler",
        "feedback-error1": "Fäälermäldig: Unbekannts Ergebniss vo de API",
        "feedback-error2": "Fääler: Bearbeitig fehlgschlo",
        "feedback-error3": "Fäälermäldig: Kei Antwort vo de API",
index d9da88d..458d0e5 100644 (file)
        "activeusers-intro": "છેલ્લા  $1 {{PLURAL:$1|દિવસ|દિવસો}}માં જે સભ્યોએ કંઈક યોગદાન કર્યું હોય તેમની યાદી.",
        "activeusers-count": "$1 {{PLURAL:$1|ફેરફાર|ફેરફારો}} છેલ્લા {{PLURAL:$3|દિવસ |$3 દિવસો }}માં",
        "activeusers-from": "આનાથી શરૂ થતા સભ્યો દર્શાવો:",
-       "activeusers-hidebots": "બોટને છુપાવો",
-       "activeusers-hidesysops": "પ્રબંધકો છુપાવો",
        "activeusers-noresult": "કોઇ સક્રીય સભ્ય ન મળ્યો",
        "listgrouprights": "સભ્ય જૂથ ના હક્કો",
        "listgrouprights-summary": "નીચે આ વિકિ પર વ્યાખ્યાયિત સભ્ય જૂથોની યાદી, તેમની સાથે સંકળાયેલા હક્કો સાથે આપી છે.\nવ્યક્તિગત હક્કો માટે [[{{MediaWiki:Listgrouprights-helppage}}|વધારાની માહિતી]].",
        "dberr-usegoogle": "તેસમયા દરમ્યાન તમે ગુગલ દ્વારા શોધી શકો",
        "dberr-outofdate": "આપણી માહિતી સંબંધી તેમની સૂચિ કાલાતિત હોઇ શકે.",
        "dberr-cachederror": "વિનંતિ કરેલ પાનાની આ એક સંગ્રહીત પ્રત માત્ર છે અને તે અધ્યતન ન પણ હોય.",
-       "htmlform-invalid-input": "તમારા અમુક ઉમેરા માંઅમુક તકલીફ છે",
+       "htmlform-invalid-input": "તમારા અમુક ઉમેરામાં ક્ષતિઓ છે.",
        "htmlform-select-badoption": "તમે બતાવેલ વિકલ્પ અવૈધ છે",
        "htmlform-int-invalid": "તમે લખેલ વિકલ્પ અંક નથી",
        "htmlform-float-invalid": "તમે લખેલ વિકલ્પ અંક નથી",
index c1757c9..7c47068 100644 (file)
        "yourname": "Dt'ennym ymmydeyr:",
        "yourpassword": "Fockle yn arrey:",
        "yourpasswordagain": "Aascreeu dt'ockle arrey:",
-       "remembermypassword": "Cooinnee m'ockle arrey (rish wheesh as $1 {{PLURAL:$1|laa|laa|laa|laaghyn}})",
        "login": "Log stiagh",
        "nav-login-createaccount": "Log stiagh / croo coontys",
        "userlogin": "Log stiagh / croo coontys",
        "passwordreset-email": "Enmys post-L:",
        "passwordreset-emailelement": "Ennym ymmydeyr: \n$1\n\nFockle arrey shallidagh: \n$2",
        "passwordreset-emailsentemail": "Ta post-l cur gys cooinaghtyn er ny chur dhyt.",
-       "passwordreset-emailsent-capture": "Ta post-l cur gys cooinaghtyn er ny chur dhyt, as eshyn heese.",
-       "passwordreset-emailerror-capture": "Ta post-l cur gys cooinaghtyn er ny chur dhyt, as eshyn heese, agh cha rosh eh yn ymmydeyr: $1",
        "changeemail-none": "(gyn)",
        "bold_sample": "Clou trome",
        "bold_tip": "Clou trome",
        "permissionserrorstext-withaction": "Cha nel kiart ayd $2, er {{PLURAL:$1|y fa|y fa|y fa|ny faghyn}} heese:",
        "recreate-moveddeleted-warn": "'''Raaue: T’ou aachroo duillag as eh er ve scrysst hannah hene.'''\n\nBy chair dhyt smooinagh vel eh kiart goll er oai lesh reaghey yn duillag shoh.<br />\nTa lioar ny scryssaghyn magh kiarit ayns shoh rere dty chaays hene:",
        "editwarning-warning": "My faagys oo y duillag, hed caghlaaghyn erbee er coayl, foddee.\nMy t'ou uss loggalt stiagh, foddee oo lhiettal y raaue shoh 'sy tosheeaghtyn ayd, 'sy rheynn \"Reaghey\".",
-       "cantcreateaccounttitle": "Cha nod coontys y chroo",
        "viewpagelogs": "Jeeagh er ny lioaryn cooishyn son y duillag shoh",
        "currentrev": "Aavriwnys roie",
        "currentrev-asof": "Aavriwnys s'noa er $1",
index 2de6b59..5dcfbd5 100644 (file)
        "yourpasswordagain": "E kikokiko hou i ka ʻōlelo hūnā:",
        "createacct-yourpasswordagain": "E hōʻoia i ka ʻōlelo hūnā",
        "createacct-yourpasswordagain-ph": "E kikokiko hou i ka ʻōlelo hūnā",
-       "remembermypassword": "Hoʻomanaʻo iaʻu ma kēia lolo uila (no ka palena nui o $1 {{PLURAL:$1|lā|mau lā}})",
        "userlogin-remembermypassword": "Hoʻomanaʻo iaʻu",
        "login": "ʻEʻe",
        "nav-login-createaccount": "ʻEʻe / Kāinoa",
index 944b0bb..2610768 100644 (file)
        "views": "צפיות",
        "toolbox": "כלים",
        "tool-link-userrights": "שינוי הרשאות ה{{GENDER:$1|משתמש|משתמשת}}",
+       "tool-link-userrights-readonly": "צפייה בהרשאות ה{{GENDER:$1|משתמש|משתמשת}}",
        "tool-link-emailuser": "שליחת דוא\"ל ל{{GENDER:$1|משתמש|משתמשת}}",
        "userpage": "צפייה בדף המשתמש",
        "projectpage": "צפייה בדף המיזם",
        "passwordreset-emaildisabled": "שירותי הדוא\"ל בוטלו באתר ויקי זה.",
        "passwordreset-username": "שם משתמש:",
        "passwordreset-domain": "תחום:",
-       "passwordreset-capture": "לצפות בדוא\"ל הנשלח?",
-       "passwordreset-capture-help": "אם תסמנו תיבה זו, הדואר האלקטרוני (יחד עם הסיסמה הזמנית) יוצג לכם במקביל לשליחתו למשתמש.",
        "passwordreset-email": "כתובת דוא\"ל:",
        "passwordreset-emailtitle": "פרטי חשבון ב{{grammar:תחילית|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "מישהו (ככל הנראה אתם, מכתובת ה־IP מספר $1) ביקש איפוס של\nהסיסמה שלכם ב{{grammar:תחילית|{{SITENAME}}}} ($4). {{PLURAL:$3|חשבון המשתמש הבא שייך|חשבונות המשתמש הבאים שייכים}}\nלכתובת הדואר האלקטרוני הזאת:\n\n$2\n\n{{PLURAL:$3|סיסמה זמנית זו תפקע|סיסמאות זמניות אלה יפקעו}} תוך {{PLURAL:$5|יום|יומיים|$5 ימים}}.\nעליכם להיכנס ולבחור סיסמה חדשה עכשיו. אם מישהו אחר ביצע בקשה זו, או שנזכרתם בסיסמתכם\nהמקורית ואינכם רוצים עוד לשנות אותה, באפשרותכם להתעלם מהודעה זו ולהמשיך להשתמש בסיסמה\nהישנה.",
        "passwordreset-emailelement": "שם משתמש:\n$1\n\nסיסמה זמנית:\n$2",
        "passwordreset-emailsentemail": "אם כתובת הדואר האלקטרוני הזאת משויכת לחשבון שלך, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
        "passwordreset-emailsentusername": "אם יש כתובת דואר אלקטרוני שמשויכת לשם המשתמש הזה, אז יישלח דואר אלקטרוני לאיפוס הסיסמה.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|דוא\"ל איפוס הסיסמה נשלח|הודעות דוא\"ל של איפוס הסיסמה נשלחו}}. {{PLURAL:$1|שם המשתמשים והסיסמה מוצגים|רשימה של שמות המשתמשים והסיסמאות מוצגת}} כאן.",
-       "passwordreset-emailerror-capture2": "לא ניתן היה לשלוח דוא\"ל ל{{GENDER:$2|משתמש|משתמשת}}: $1 {{PLURAL:$3|שם המשתמש והסיסמה מוצגים|רשימה של שמות המשתמשים והסיסמאות מוצגת}} כאן.",
        "passwordreset-nocaller": "לא סופק הקורא הנדרש",
        "passwordreset-nosuchcaller": "הקורא אינו קיים: $1",
        "passwordreset-ignored": "איפוס הסיסמה לא בוצע. ייתכן שלא הוגדר ספק.",
-       "passwordreset-invalideamil": "כתובת דוא\"ל לא תקינה",
+       "passwordreset-invalidemail": "כתובת דוא\"ל לא תקינה",
        "passwordreset-nodata": "לא סופק שם משתמש או כתובת דוא\"ל",
        "changeemail": "שינוי או הסרת כתובת דוא\"ל",
        "changeemail-header": "יש למלא את הטופס הזה כדי לשנות את כתובת הדוא\"ל שלך. אם ברצונך להימנע משיוך כתובת דוא\"ל כלשהי לחשבון שלך, יש להשאיר את שדה כתובת הדוא\"ל החדשה ריק בעת שליחת הטופס.",
        "prefs-help-recentchangescount": "ההעדפה הזאת כוללת את דף השינויים האחרונים, דפי היסטוריית גרסאות ויומנים.",
        "prefs-help-watchlist-token2": "זהו המפתח הסודי להזנה של רשימת המעקב שלך.\nכל מי שיודע אותו יכול לקרוא את רשימת המעקב שלך, לכן אין לשתף אותו.\nבמקרה הצורך, אפשר [[Special:ResetTokens|לאפס את האסימון]].",
        "savedprefs": "ההעדפות שלך נשמרו.",
-       "savedrights": "×\94×\94רש×\90×\95ת ×©×\9c {{GENDER:$1|×\94×\9eשת×\9eש|×\94×\9eשת×\9eשת}} \"$1\" נשמרו.",
+       "savedrights": "ק×\91×\95צ×\95ת {{GENDER:$1|×\94×\9eשת×\9eש|×\94×\9eשת×\9eשת}} ×©×\9c \"$1\" נשמרו.",
        "timezonelegend": "אזור זמן:",
        "localtime": "שעה מקומית:",
        "timezoneuseserverdefault": "ברירת המחדל של האתר ($1)",
        "prefswarning-warning": "ביצעת שינויים בהעדפות שלך, והם עדיין לא נשמרו.\nעזיבת דף זה ללא לחיצה על \"$1\" תגרום לכך שההעדפות שלך לא יעודכנו.",
        "prefs-tabs-navigation-hint": "טיפ: ניתן להשתמש במקשי החצים הימני והשמאלי כדי לנווט בין הלשוניות ברשימת הלשוניות.",
        "userrights": "ניהול הרשאות משתמש",
-       "userrights-lookup-user": "× ×\99×\94×\95×\9c ×§×\91×\95צ×\95ת משתמש",
+       "userrights-lookup-user": "×\91×\97×\99רת משתמש",
        "userrights-user-editname": "שם משתמש:",
-       "editusergroup": "ער×\99×\9bת ×\94ק×\91×\95צ×\95ת ×©×\9c ×\94{{GENDER:$1|×\9eשת×\9eש}}",
+       "editusergroup": "×\98×¢×\99נת ×§×\91×\95צ×\95ת ×\94×\9eשת×\9eש",
        "editinguser": "שינוי ההרשאות של {{GENDER:$1|המשתמש|המשתמשת}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "עריכת קבוצות משתמש",
        "saveusergroups": "שמירת הקבוצות של ה{{GENDER:$1|משתמש|משתמשת}}",
        "userrights-reason": "סיבה:",
        "userrights-no-interwiki": "אין לך הרשאה לערוך הרשאות משתמש באתרים אחרים.",
        "userrights-nodatabase": "בסיס הנתונים $1 אינו קיים או אינו מקומי.",
-       "userrights-nologin": "עליכם [[Special:UserLogin|להיכנס לחשבון]] עם הרשאות מתאימות כדי לשנות הרשאות של משתמשים.",
-       "userrights-notallowed": "אין לך הרשאה להוסיף או להסיר הרשאות של משתמשים.",
        "userrights-changeable-col": "{{PLURAL:$1|קבוצה|קבוצות}} שבאפשרותך לשנות",
        "userrights-unchangeable-col": "{{PLURAL:$1|קבוצה|קבוצות}} שאין באפשרותך לשנות",
        "userrights-conflict": "התנגשות בין שינויי הרשאות משתמש! אנא בִּדקו את השינויים שלכם ואשרו אותם.",
-       "userrights-removed-self": "הסרת את הרשאות המשתמש של עצמך. לכן אין לך כעת אפשרות לגשת לדף זה.",
        "group": "קבוצה:",
        "group-user": "משתמשים",
        "group-autoconfirmed": "משתמשים ותיקים",
        "right-siteadmin": "נעילה וביטול נעילה של בסיס הנתונים",
        "right-override-export-depth": "ייצוא דפים כולל הדפים המקושרים (עד עומק של 5 דפים)",
        "right-sendemail": "שליחת דואר אלקטרוני למשתמשים אחרים",
-       "right-passwordreset": "צפייה בדואר אלקטרוני של איפוס סיסמה",
        "right-managechangetags": "יצירה, הפעלה וביטול של [[Special:Tags|תגיות]]",
        "right-applychangetags": "החלת [[Special:Tags|תגיות]] יחד עם שינויים",
        "right-changetags": "הוספה והסרה של [[Special:Tags|תגיות]] לגרסאות ולרשומות יומן",
        "apisandbox-continue": "המשך",
        "apisandbox-continue-clear": "ניקוי",
        "apisandbox-continue-help": "\"{{int:apisandbox-continue}}\" [https://www.mediawiki.org/wiki/API:Query#Continuing_queries ימשיך] את הבקשה האחרונה; \"{{int:apisandbox-continue-clear}}\" ינקה את הפרמטרים הקשורים להמשך.",
+       "apisandbox-param-limit": "יש לכתוב <kbd>max</kbd> כדי להשתמש בערך המרבי האפשרי.",
+       "apisandbox-multivalue-all-namespaces": "$1 (כל מרחבי השם)",
+       "apisandbox-multivalue-all-values": "$1 (כל הערכים)",
        "booksources": "משאבי ספרות חיצוניים",
        "booksources-search-legend": "חיפוש משאבי ספרות חיצוניים",
        "booksources-isbn": "מסת\"ב (ISBN):",
        "activeusers-count": "{{PLURAL:$1|פעולה אחת|$1 פעולות}} ב{{PLURAL:$3|יום האחרון|יומיים האחרונים|־$3 הימים האחרונים}}",
        "activeusers-from": "הצגת משתמשים החל מ:",
        "activeusers-groups": "הצגת משתמשים השייכים לקבוצות:",
+       "activeusers-excludegroups": "הסתרת משתמשים השייכים לקבוצות:",
        "activeusers-noresult": "לא נמצאו משתמשים.",
        "activeusers-submit": "הצגת משתמשים פעילים",
        "listgrouprights": "רשימת הרשאות לקבוצה",
        "tags-deactivate": "ביטול הפעלה",
        "tags-hitcount": "{{PLURAL:$1|שינוי אחד|$1 שינויים}}",
        "tags-manage-no-permission": "אין לך הרשאה לנהל תגיות שינויים.",
-       "tags-manage-blocked": "×\9c×\90 × ×\99ת×\9f ×\9c× ×\94×\9c ×ª×\92×\99×\95ת ×©×\99× ×\95×\99×\99×\9d ×\91עת ×\97ס×\99×\9e×\94.",
+       "tags-manage-blocked": "×\90×\99× ×\9a ×\9e×\95רש×\94 ×\9c× ×\94×\9c ×ª×\92×\99×\95ת ×©×\99× ×\95×\99×\99×\9d ×\9b×\90שר ×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש {{GENDER:$1|ש×\9c×\9a}} ×\97ס×\95×\9d.",
        "tags-create-heading": "יצירת תגית חדשה",
        "tags-create-explanation": "כברירת מחדל, תגיות חדשות שנוצרות יהיו זמינות לשימושם של משתמשים ובוטים.",
        "tags-create-tag-name": "שם התגית:",
        "tags-deactivate-not-allowed": "לא ניתן לבטל את הפעלת התגית \"$1\".",
        "tags-deactivate-submit": "ביטול הפעלה",
        "tags-apply-no-permission": "אין לך הרשאה להחיל תגיות שינויים יחד עם השינויים שלך.",
-       "tags-apply-blocked": "×\9c×\90 × ×\99ת×\9f ×\9c×\94×\97×\99×\9c ×ª×\92×\99×\95ת ×©×\99× ×\95×\99×\99×\9d ×\99×\97×\93 ×¢×\9d ×\94ש×\99× ×\95×\99×\99×\9d ×©×\9c×\9a ×\91עת ×\97ס×\99×\9e×\94.",
+       "tags-apply-blocked": "×\90×\99× ×\9a ×\9e×\95רש×\94 ×\9c×\94×\97×\99×\9c ×ª×\92×\99×\95ת ×©×\99× ×\95×\99×\99×\9d ×\99×\97×\93 ×¢×\9d ×\94ש×\99× ×\95×\99×\99×\9d ×©×\9c×\9a ×\9b×\90שר ×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש {{GENDER:$1|ש×\9c×\9a|ש×\9c×\9a}} ×\97ס×\95×\9d.",
        "tags-apply-not-allowed-one": "לא ניתן להחיל את התגית \"$1\" ידנית.",
        "tags-apply-not-allowed-multi": "לא ניתן להחיל את {{PLURAL:$2|התגית הבאה|התגיות הבאות}} ידנית: $1",
        "tags-update-no-permission": "אין לך הרשאה להוסיף או להסיר תגיות שינויים לגרסאות מסוימות או לרשומות יומן.",
-       "tags-update-blocked": "×\9c×\90 × ×\99ת×\9f ×\9c×\94×\95ס×\99×£ ×\90×\95 ×\9c×\94ס×\99ר ×ª×\92×\99×\95ת ×©×\99× ×\95×\99×\99×\9d ×\91עת ×\97ס×\99×\9e×\94.",
+       "tags-update-blocked": "×\90×\99× ×\9a ×\9e×\95רש×\94 ×\9c×\94×\95ס×\99×£ ×\90×\95 ×\9c×\94ס×\99ר ×ª×\92×\99×\95ת ×©×\99× ×\95×\99×\99×\9d ×\9b×\90שר ×\97ש×\91×\95×\9f ×\94×\9eשת×\9eש {{GENDER:$1|ש×\9c×\9a|ש×\9c×\9a}} ×\97ס×\95×\9d.",
        "tags-update-add-not-allowed-one": "לא ניתן להוסיף את התגית \"$1\" ידנית.",
        "tags-update-add-not-allowed-multi": "לא ניתן להוסיף את {{PLURAL:$2|התגית הבאה|התגיות הבאות}} ידנית: $1",
        "tags-update-remove-not-allowed-one": "לא ניתן להסיר את התגית \"$1\".",
        "htmlform-user-not-exists": "<strong>$1</strong> אינו קיים.",
        "htmlform-user-not-valid": "<strong>$1</strong> אינו שם משתמש תקין.",
        "logentry-delete-delete": "$1 {{GENDER:$2|מחק|מחקה}} את הדף $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|מחק|מחקה}} את ההפניה $3 באמצעות דריסה",
        "logentry-delete-restore": "$1 {{GENDER:$2|שחזר|שחזרה}} את הדף $3",
        "logentry-delete-event": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|פעולת יומן|$5 פעולות יומן}} של $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|שינה|שינתה}} את מצב התצוגה של {{PLURAL:$5|גרסה|$5 גרסאות}} בדף $3: $4",
        "mw-widgets-dateinput-no-date": "לא נבחר תאריך",
        "mw-widgets-titleinput-description-new-page": "הדף עדיין לא קיים",
        "mw-widgets-titleinput-description-redirect": "הפניה ל{{GRAMMAR:תחילית|$1}}",
+       "mw-widgets-categoryselector-add-category-placeholder": "הוספת קטגוריה...",
        "sessionmanager-tie": "לא ניתן לצרף מספר סוגי אימות זהות: $1.",
        "sessionprovider-generic": "התחברויות של $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "התחברויות המבוססות על עוגיות",
        "log-action-filter-contentmodel-change": "שינויים במודל התוכן של דפים קיימים",
        "log-action-filter-contentmodel-new": "יצירות של דפים עם מודל תוכן שונה מברירת המחדל",
        "log-action-filter-delete-delete": "מחיקות של דפים",
+       "log-action-filter-delete-delete_redir": "דריסות של הפניות",
        "log-action-filter-delete-restore": "שחזורים של דפים מחוקים",
        "log-action-filter-delete-event": "מחיקות של פעולות יומן",
        "log-action-filter-delete-revision": "מחיקות של גרסאות",
        "usercssispublic": "שימו לב: משתמשים אחרים יכולים לצפות בדפי ה־CSS שלכם, ולכן אין לכלול בהם מידע סודי.",
        "restrictionsfield-badip": "כתובת או טווח כתובות IP בלתי תקין: $1",
        "restrictionsfield-label": "טווחי כתובות IP מותרים:",
-       "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "שגיאה: $1",
-       "edit-error-long": "שגיאות:\n\n$1"
+       "restrictionsfield-help": "כתובת IP אחת או טווח CIDR אחד בשורה. כדי לאפשר את הכול, ניתן להשתמש ב:<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 3c7cc5b..42dd00e 100644 (file)
        "tog-enotifminoredits": "छोटे परिवर्तनों के लिए भी मुझे ईमेल भेजें",
        "tog-enotifrevealaddr": "अधिसूचना ईमेल में मेरा ईमेल पता दर्शायें",
        "tog-shownumberswatching": "ध्यान रखने वाले सदस्यों की संख्या दिखायें",
-       "tog-oldsig": "वर्तमान हस्ताक्षर:",
+       "tog-oldsig": "à¤\86पà¤\95ा à¤µà¤°à¥\8dतमान à¤¹à¤¸à¥\8dताà¤\95à¥\8dषर:",
        "tog-fancysig": "हस्ताक्षर का विकिपाठ के समान मानें (बिना स्वचालित कड़ी के)",
        "tog-uselivepreview": "सजीवन झलक का उपयोग करें",
        "tog-forceeditsummary": "यदि सम्पादन सारांश ना दिया गया हो तो मुझे सूचित करें",
        "category-file-count-limited": "इस श्रेणी में निम्नलिखित {{PLURAL:$1|फ़ाइल है।|फ़ाइलें हैं।}}",
        "listingcontinuesabbrev": "जारी",
        "index-category": "सूचीबद्ध पृष्ठ",
-       "noindex-category": "असूचीबद्ध पृष्ठों",
+       "noindex-category": "असूचीबद्ध पृष्ठ",
        "broken-file-category": "टूटी हुई फ़ाइल कड़ियों वाले पृष्ठ",
        "about": "के बारे में",
        "article": "सामग्री लेख",
        "newwindow": "(नई विंडो में खुलता है)",
        "cancel": "रद्द करें",
        "moredotdotdot": "और...",
-       "morenotlisted": "यह सूची पूर्ण नहीं है।",
+       "morenotlisted": "शायद à¤¯à¥\87 सूची पूर्ण नहीं है।",
        "mypage": "पृष्ठ",
        "mytalk": "वार्ता",
        "anontalk": "वार्ता",
        "talk": "चर्चा",
        "views": "दर्शाव",
        "toolbox": "उपकरण",
+       "tool-link-userrights": "{{GENDER:$1|सदस्य}} समूह बदलें",
+       "tool-link-userrights-readonly": "{{GENDER:$1|सदस्य}} समूह देखें",
+       "tool-link-emailuser": "इस {{GENDER:$1|सदस्य}} को ई-मेल करें।",
        "userpage": "सदस्य पृष्ठ देखें",
        "projectpage": "परियोजना पृष्ठ देखें",
        "imagepage": "फ़ाइल पृष्ठ देखें",
        "createacct-yourpasswordagain-ph": "कूटशब्द पुनः लिखें",
        "userlogin-remembermypassword": "मुझे लॉग्ड इन रखें",
        "userlogin-signwithsecure": "सुरक्षित कनेक्शन का प्रयोग करें",
+       "cannotlogin-title": "अभी प्रवेश नहीं हो रहा",
+       "cannotlogin-text": "प्रवेश संभव नहीं है",
        "cannotloginnow-title": "अभी प्रवेश नहीं हो रहा है",
        "cannotloginnow-text": "$1 का उपयोग करते समय प्रवेश नहीं हो सकता है।",
+       "cannotcreateaccount-title": "खाता नहीं खोल सकते",
+       "cannotcreateaccount-text": "सीधे खाता बनाना इस विकि में सक्रिय नहीं है।",
        "yourdomainname": "आपका डोमेन:",
        "password-change-forbidden": "आप इस विकि पर कूटशब्द नहीं बदल सकते हैं।",
        "externaldberror": "या तो प्रमाणिकरण डाटाबेस में त्रुटि हुई है या फिर आपको अपना बाह्य खाता अपडेट करने की अनुमति नहीं है।",
        "noemail": "\"$1\" सदस्य के लिये कोई भी ई-मेल पता दर्ज नहीं किया गया है।",
        "noemailcreate": "आपको वैध ई-मेल पता देने होगा।",
        "passwordsent": "\"$1\" के ई-मेल पते पर एक नया कूटशब्द भेज दिया गया है।\nई-मेल पाने बाद कृपया दुबारा लॉग इन करें।",
-       "blocked-mailpassword": "à¤\86पà¤\95à¥\87 à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¥\87 à¤\95à¥\8b à¤¸à¤®à¥\8dपादन à¤\95रनà¥\87 à¤¸à¥\87 à¤\85वरà¥\81दà¥\8dध à¤\95र à¤¦à¤¿à¤¯à¤¾ à¤\97या à¤¹à¥\88, à¤\94र à¤\97लत à¤\87सà¥\8dतà¥\87माल à¤°à¥\8bà¤\95नà¥\87 à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤\95à¥\82à¤\9fशबà¥\8dद à¤ªà¥\81नà¤\83 à¤ªà¥\8dरापà¥\8dति à¤\95à¥\80 à¤¸à¥\81विधा à¤\87स à¤\86à¤\87॰पà¥\80 पर बंद कर दी गई है।",
+       "blocked-mailpassword": "à¤\86पà¤\95à¥\87 à¤\86à¤\87॰पà¥\80 à¤ªà¤¤à¥\87 à¤\95à¥\8b à¤¸à¤®à¥\8dपादन à¤\95रनà¥\87 à¤¸à¥\87 à¤\85वरà¥\81दà¥\8dध à¤\95र à¤¦à¤¿à¤¯à¤¾ à¤\97या à¤¹à¥\88, à¤\94र à¤\97लत à¤\87सà¥\8dतà¥\87माल à¤°à¥\8bà¤\95नà¥\87 à¤\95à¥\87 à¤²à¤¿à¤¯à¥\87 à¤\95à¥\82à¤\9fशबà¥\8dद à¤ªà¥\81नà¤\83 à¤ªà¥\8dरापà¥\8dति à¤\95à¥\80 à¤¸à¥\81विधा à¤\87स à¤\86à¤\88॰ à¤ªà¥\80॰ पर बंद कर दी गई है।",
        "eauthentsent": "दर्ज किये हुए ई-मेल पते पर एक सत्यापन ई-मेल भेजा दिया गया है।\nआपको उस ई-मेल में दिये हुए निर्देशों के अनुसार ई-मेल पते का सत्यापन करना होगा, उसके पश्चात ही यहाँ से कोई दूसरा ई-मेल भेजा जाएगा।",
        "throttled-mailpassword": "पिछले {{PLURAL:$1|एक घंटे|$1 घंटों}} के दरमियान एक कूटशब्द स्मरण-पत्र भेजा जा चुका है।\nदुरुपयोग से बचाव के लिए हर {{PLURAL:$1|एक घंटे|$1 घंटों}} में एक कूटशब्द स्मरण-पत्र ही भेजा जाता है।",
        "mailerror": "ई-मेल भेजने में त्रुटि: $1",
        "passwordreset-emaildisabled": "इस विकि पर ई-मेल सुविधा अक्षम कर दी गयी है।",
        "passwordreset-username": "सदस्यनाम:",
        "passwordreset-domain": "डोमेन:",
-       "passwordreset-capture": "परिणामस्वरूप बना ई-मेल देखें?",
-       "passwordreset-capture-help": "अगर आप इस चेकबॉक्स को टिक करते हैं तो ई-मेल (अस्थायी कूटशब्द के साथ) आप को दिखया जाएगा और सदस्य को भेजा भी जयेगा।",
        "passwordreset-email": "ई-मेल पता:",
        "passwordreset-emailtitle": "{{SITENAME}} पर खाते का विवरण",
        "passwordreset-emailtext-ip": "किसी ने (शायद आपने ही, $1 आइ॰पी पते से) {{SITENAME}} ($4) पर अपने {{PLURAL:$3|कूटशब्द|कूटशब्दों}} को रीसेट करने का अनुरोध किया है। इस ई-मेल पते से निम्न {{PLURAL:$3|खाता जुड़ा है|खाते जुड़े हैं}}:\n\n$2\n\n{{PLURAL:$3|यह|ये}} अस्थायी कूटशब्द {{PLURAL:$5|एक दिन|$5 दिनों}} के बाद काम नहीं करेंगे। आपको लॉग इन करके एक नया कूटशब्द अभी चुन लेना चाहिए। यदि यह अनुरोध किसी और ने किया है, या फिर आपको अपना मूल कूटशब्द याद आ गया है, और आप {{PLURAL:$3|अपना|अपने}} कूटशब्द नहीं बदलना चाहते, आप इस संदेश को अनदेखा कर के अपने पुराने कूटशब्द का प्रयोग जारी रख सकते हैं।",
        "passwordreset-emailelement": "सदस्यनाम: \n$1\n\nअस्थायी कूटशब्द: \n$2",
        "passwordreset-emailsentemail": "यदि आपका यह ईमेल आपके खाते के साथ जोड़ा गया है तो पासवर्ड बदलने का ईमेल इसमें भेज दिया गया है।",
        "passwordreset-emailsentusername": "यदि कोई ईमेल इस खाते से जुड़ी है तो पासवर्ड आपके ईमेल में भेज दिया जाएगा।",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|सदस्य}} को ईमेल भेजना विफल : $1 {{PLURAL:$3|सदस्य नाम और पासवर्ड|सदस्य नाम और पासवर्ड की सूची}} नीचे दिया गया है।",
-       "passwordreset-invalideamil": "अवैध ईमेल पता",
+       "passwordreset-invalidemail": "अवैध ईमेल पता",
        "changeemail": "ई-मेल पता परिवर्तित करें",
        "changeemail-header": "अपना ईमेल पता परिवर्तन हेतु इसे पूरा करें। यदि आप अपना वर्तमान ईमेल पता हटाना चाहते हैं, तो इसे खाली छोड़ दें और इसे भेजें।",
        "changeemail-no-info": "इस पृष्ठ का सीधे प्रयोग करने के लिए आपको लॉग इन करना होगा।",
        "userrights-reason": "कारण:",
        "userrights-no-interwiki": "आपको अन्य विकियों पर सदस्य अधिकार बदलने की अनुमति नहीं हैं।",
        "userrights-nodatabase": "डाटाबेस $1 या तो मौजूद नहीं है या फिर स्थानीय नहीं है।",
-       "userrights-nologin": "सदस्य अधिकार बदलने के लिये प्रबंधक खाते से [[Special:UserLogin|लॉग इन]] किया हुआ होना आवश्यक है।",
-       "userrights-notallowed": "आपके पास सदस्य अधिकार जोड़ने या हटाने की अनुमति नहीं है।",
        "userrights-changeable-col": "समूह जिन्हें आप बदल सकते हैं",
        "userrights-unchangeable-col": "समूह जिन्हें आप नहीं बदल सकते हैं",
        "userrights-conflict": "सदस्य अधिकार बदलावों में अंतर्विरोध! कृपया अपने बदलाव जाँचें और पुनः सुनिश्चित करें।",
-       "userrights-removed-self": "आपने सफलतापूर्वक अपने अधिकार हटा दिए हैं। अतः आप अब यह पृष्ठ नहीं देख सकते हैं।",
        "group": "समूह:",
        "group-user": "सदस्य",
        "group-autoconfirmed": "स्वतः स्थापित सदस्य",
        "right-siteadmin": "डाटाबेस को ताला लगायें या खोलें",
        "right-override-export-depth": "पृष्ठ निर्यात करें, पाँच स्तर की गहराई तक जुड़े हुए पृष्ठों समेत",
        "right-sendemail": "अन्य सदस्यों को ई-मेल भेजें",
-       "right-passwordreset": "कूटशब्द रीसेट ई-मेल देखें",
        "right-managechangetags": "डेटाबेस से [[Special:Tags|चिप्पियाँ]] बनायें और हटायें",
        "right-applychangetags": "प्रयोग में लाइये [[Special:Tags|tags]] किसी के बदलाव के साथ।",
        "right-changetags": "जमा करो और हटाओ स्वतंत्र [[Special:Tags|टैग]] व्यक्तिगत अवतरणों और लॉग प्रविक्तियों पर",
        "grant-group-high-volume": "उच्च कार्य गतिविधि करें",
        "grant-group-customization": "पसंद और तय",
        "grant-group-administration": "प्रबंधकीय कार्य करें",
+       "grant-group-private-information": "अपने बारे में निजी जानकारी देखें",
        "grant-group-other": "अन्य गतिविधि",
        "grant-blockusers": "प्रतिबंधित और अप्रतिबंधित करना",
        "grant-createaccount": "खाता बनाएँ",
        "grant-highvolume": "अत्यधिक तेजी से सम्पादन",
        "grant-oversight": "सदस्य को छुपाना और अवतरण हटाना",
        "grant-patrol": "पृष्ठों को जांचा हुआ चिन्हित करना",
+       "grant-privateinfo": "निजी जानकारी देखें",
        "grant-protect": "पृष्ठों को सुरक्षित व असुरक्षित करना",
        "grant-rollback": "पृष्ठ से सम्पादन वापस लेना",
        "grant-sendemail": "अन्य सदस्यों को ई-मेल भेजें",
        "rightslogtext": "यह सदस्य अधिकारों में हुए बदलावों की सूची है।",
        "action-read": "इस पृष्ठ को पढ़ने",
        "action-edit": "इस पृष्ठ को सम्पादित करने",
-       "action-createpage": "पà¥\83षà¥\8dठ à¤¬à¤¨à¤¾à¤¨à¥\87",
-       "action-createtalk": "वारà¥\8dता à¤ªà¥\83षà¥\8dठ à¤¬à¤¨à¤¾à¤¨à¥\87",
+       "action-createpage": "à¤\87स à¤ªà¤¨à¥\8dनà¥\87 à¤\95à¥\8b à¤¬à¤¨à¤¾à¤¯à¥\87à¤\82",
+       "action-createtalk": "à¤\87स à¤µà¤¾à¤°à¥\8dता à¤ªà¤¨à¥\8dनà¥\87 à¤\95à¥\8b à¤¬à¤¨à¤¾à¤¯à¥\87à¤\82",
        "action-createaccount": "यह सदस्य खाता खोलने",
        "action-autocreateaccount": "स्वतः ही बाहरी सदस्य खाता बनायें",
        "action-history": "इस पृष्ठ का इतिहास देखने",
        "action-managechangetags": "डेटाबेस से चिप्पि बनायें और हटायें",
        "action-applychangetags": "अपमे बदलाव के साथ टैग जोड़ें।",
        "action-changetags": "जमा करें और हटाएँ स्वतंत्र टैग व्यक्तिगत अवतरणों और लॉग प्रविक्तियों पर",
+       "action-purge": "पृष्ठ ताजा करें",
        "nchanges": "$1 {{PLURAL:$1|बदलाव}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|अंतिम बार देखने के बाद से}}",
        "enhancedrc-history": "इतिहास",
        "upload-foreign-cant-upload": "यह विकि अन्य फ़ाइल संग्रह में अपलोड हेतु तय नहीं किया गया है।",
        "upload-dialog-title": "फ़ाइल डालें",
        "upload-dialog-button-cancel": "रद्द करें",
+       "upload-dialog-button-back": "पीछे",
        "upload-dialog-button-done": "पूर्ण हुआ",
        "upload-dialog-button-save": "सहेजें",
        "upload-dialog-button-upload": "डालें",
        "apisandbox-results-fixtoken-fail": "टोकन \"$1\" डालने में विफल",
        "apisandbox-alert-page": "इस पृष्ठ के जगह अमान्य है।",
        "apisandbox-alert-field": "जगह में डाला गया जानकारी अमान्य है।",
+       "apisandbox-continue": "जारी रखें",
+       "apisandbox-continue-clear": "खाली करें",
+       "apisandbox-multivalue-all-namespaces": "$1 (सभी नामस्थान)",
+       "apisandbox-multivalue-all-values": "$1 (सभी मूल्य)",
        "booksources": "पुस्तकों के स्रोत",
        "booksources-search-legend": "पुस्तकों के स्रोत खोजें",
        "booksources-isbn": "आइ॰एस॰बी॰एन:",
        "activeusers-intro": "यह सक्रिय सदस्यों की सूची है जिन्होंने पिछले $1 {{PLURAL:$1|दिन|दिनों}} में कुछ गतिविधि करी है।",
        "activeusers-count": "$1 {{PLURAL:$1|कार्य}} पिछले $3 {{PLURAL:$3|दिन|दिनों}} में",
        "activeusers-from": "इस अक्षर से शुरू होने वाले सदस्य दिखाएँ:",
-       "activeusers-hidebots": "बॉट छुपाएँ",
-       "activeusers-hidesysops": "प्रबंधक छुपाएँ",
        "activeusers-noresult": "कोई सदस्य नहीं मिले।",
        "activeusers-submit": "सक्रिय सदस्यों को दिखायें",
        "listgrouprights": "सदस्य समूह अधिकार",
        "rollbacklinkcount": "$1 {{PLURAL:$1|सम्पादन}} वापिस लें",
        "rollbacklinkcount-morethan": "$1 से अधिक {{PLURAL:$1|सम्पादन}} वापिस लें",
        "rollbackfailed": "वापिस लेना असफल रहा",
+       "rollback-missingrevision": "अवतरण डाटा दिखाने में असमर्थ।",
        "cantrollback": "पुराने अवतरण को पूर्ववत नहीं कर सकते हैं;\nइस पृष्ठ का अन्तिम योगदानकर्ता इस लेख का एकमात्र लेखक है।",
        "alreadyrolled": "[[User:$2|$2]] ([[User talk:$2|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]) द्वारा किए गए  [[:$1]] के पिछले संपादन को वापिस पुरानी स्थिति पर नहीं लाया जा सकता है;\nकिसी और ने इस बीच या तो इस पृष्ठ को फिर से संपादित कर दिया है या पहले ही पृष्ठ पुरानी स्थिति पर लाया जा चुका है।\n\nइस पृष्ठ का अन्तिम संपादन [[User:$3|$3]] ([[User talk:$3|वार्ता]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]) ने किया है।",
        "editcomment": "संपादन सारांश था: <em>$1</em>।",
        "sp-contributions-username": "आईपी पता या सदस्यनाम:",
        "sp-contributions-toponly": "केवल उन सम्पादनों को दिखाएँ जो नवीनतम संशोधन हैं",
        "sp-contributions-newonly": "केवल वे सम्पादन दिखाएँ जिनसे पृष्ठ निर्मित हुए हों",
+       "sp-contributions-hideminor": "छोटे सम्पादन छुपाएँ",
        "sp-contributions-submit": "खोजें",
        "whatlinkshere": "यहाँ के हवाले कहाँ कहाँ हैं",
        "whatlinkshere-title": "$1 से जुड़े हुए पृष्ठ",
        "pageinfo-article-id": "पृष्ठ आइ॰डी",
        "pageinfo-language": "पृष्ठ सामग्री भाषा",
        "pageinfo-content-model": "पृष्ठ सामग्री का नमूना",
+       "pageinfo-content-model-change": "बदलें",
        "pageinfo-robot-policy": "सर्च इंजन बॉट द्वारा अनुक्रमण",
        "pageinfo-robot-index": "अनुमतित",
        "pageinfo-robot-noindex": "नहीं अनुमतित",
        "pageinfo-category-pages": "पृष्ठ संख्या",
        "pageinfo-category-subcats": "उपश्रेणियों की संख्या",
        "pageinfo-category-files": "फ़ाइलों की संख्या",
+       "pageinfo-user-id": "सदस्य पता",
        "markaspatrolleddiff": "जाँचा हुआ चिन्हित करें",
        "markaspatrolledtext": "इस पृष्ठ को जाँचा हुआ चिन्हित करें",
        "markaspatrolledtext-file": "इस फ़ाइल संस्करण को जांचा हुआ चिन्हित करें",
        "patrol-log-header": "यह परीक्षित अवतरणों की लॉग है।",
        "log-show-hide-patrol": "परीक्षण लॉग $1",
        "log-show-hide-tag": "$1 टैग लॉग",
+       "confirm-markpatrolled-button": "ठीक है",
        "deletedrevision": "पुराना अवतरण $1 हटा दिया",
        "filedeleteerror-short": "फ़ाईल हटानेमें समस्या: $1",
        "filedeleteerror-long": "फ़ाईल हटानेमें आईं समस्यायें:\n\n$1",
        "htmlform-cloner-create": "अधिक जोड़ें",
        "htmlform-cloner-delete": "हटाएँ",
        "htmlform-cloner-required": "कम से कम एक मूल्य की आवश्यकता है।",
+       "htmlform-date-placeholder": "वववव-मम-दद",
+       "htmlform-time-placeholder": "घघ:मम:सस",
+       "htmlform-datetime-placeholder": "वववव-मम-दद हह:मम:सस",
        "htmlform-title-badnamespace": "[[:$1]] अभी \"{{ns:$2}}\" नामस्थान में नहीं है।",
        "htmlform-title-not-creatable": "\"$1\" निर्माण करने लायक शीर्षक नहीं है।",
        "htmlform-title-not-exists": "$1 नहीं बना है।",
        "feedback-thanks": "धन्यवाद! आपकी प्रतिक्रिया पृष्ठ में नियुक्त किया गया है \"[ $2  $1 ]\"।",
        "feedback-thanks-title": "धन्यवाद!",
        "feedback-useragent": "सदस्य कर्ता:",
-       "searchsuggest-search": "खोज",
+       "searchsuggest-search": "खोजें {{SITENAME}}",
        "searchsuggest-containing": "...से युक्त",
        "api-error-autoblocked": "आपका आईपी पता अपने आप अवरोधित हो गया, क्योंकि यह किसी अवरोधित सदस्य द्वारा उपयोग किया गया था।",
        "api-error-badaccess-groups": "आपको इस विकि के लिए फ़ाइलें अपलोड करने की अनुमति नहीं है.",
        "mw-widgets-dateinput-placeholder-day": "DD-MM-YYYY",
        "mw-widgets-titleinput-description-new-page": "पृष्ठ अभी मौजूद नहीं है",
        "mw-widgets-titleinput-description-redirect": "$1 को अनुप्रेषित",
+       "mw-widgets-categoryselector-add-category-placeholder": "श्रेणी जोड़ें...",
        "sessionmanager-tie": "एक साथ कई अनुरोध को नहीं मिला सकता: $1",
        "sessionprovider-generic": "$1 सत्र",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "कुकी-आधारित सत्र",
        "log-action-filter-delete-restore": "पृष्ठ न हटाना",
        "log-action-filter-delete-event": "पृष्ठ हटाने का लॉग",
        "log-action-filter-delete-revision": "अवतरण हटाना",
+       "log-action-filter-import-interwiki": "अंतरविकि आयात",
+       "log-action-filter-import-upload": "एक्सएमएल अपलोड द्वारा आयात",
        "log-action-filter-managetags-create": "चिप्पि निर्मित",
        "log-action-filter-newusers-create": "अज्ञात सदस्य द्वारा निर्मित",
        "log-action-filter-newusers-create2": "पंजीकृत सदस्य द्वारा निर्मित",
index 9197873..f694e21 100644 (file)
        "yourpasswordagain": "Password fir se type karo:",
        "createacct-yourpasswordagain": "Aapan password ke confirm karo",
        "createacct-yourpasswordagain-ph": "Hame lagged in rahan do",
-       "remembermypassword": "Ii computer pe hamaar login yaad rakho (jaada se jaada $1 {{PLURAL:$1|din|din}} talak)",
        "userlogin-remembermypassword": "Secure connection ke kaam me lao",
        "userlogin-signwithsecure": "Secure connection ke kaam me lao",
        "yourdomainname": "Aap ke domain:",
        "passwordreset-emailelement": "Sadasya ke naam: \n$1\n\nKuchh din ke khatir password: \n$2",
        "passwordreset-emailsentemail": "Agar ii email aap ke account se associated hai tab ek password reset email ke bheja jaai.",
        "passwordreset-emailsentusername": "Agar ii email aap ke username se associated hai tab ek password reset email ke bheja jaai.",
-       "passwordreset-emailsent-capture": "Ek password yaad karae waala e-mail, jiske niche dekhawa jaawe hae, ke bhej dewa gais hae.",
-       "passwordreset-emailerror-capture": "Ek password yaad karae waala e-mail ke banawa gais hae, jiske niche dekhawa jaawe hae, lekin jiske {{GENDER:$2|user}} ke lage bheje nai jawa sake hae: $1",
        "changeemail": "E-mail address ke badlo, nai to, hatao",
        "changeemail-header": "Aapan email ke badle ke khatir ii form ke bharo. Agar aap koi email ke aapan account se nai associate kare mangtaa hai tab form ke submit kare ke time email address ke blank chhorr do.",
-       "changeemail-passwordrequired": "Ii badlao ke confirm kare ke khatir aap ke aapan password ke enter kare ke parri.",
        "changeemail-no-info": "Ii panna ke sidha dekhe ke khaatir, aap ke login kare ke parri.",
        "changeemail-oldemail": "Abhi ke E-mail address:",
        "changeemail-newemail": "Nawaa E-mail address:",
        "undo-nochange": "Janae hae ki badlao ke pahile delete kar dewa gais hae.",
        "undo-summary": "$1 badlao [[Special:Contributions/$2|$2]] se, ke pahile jaise karo ([[User talk:$2|Talk]])",
        "undo-summary-username-hidden": "Hidden sadasya ke badalo $1 ke pahile jaise karo",
-       "cantcreateaccounttitle": "Account nai banae sakta hai",
        "cantcreateaccount-text": "Ii IP address ('''$1''') se nawaa account banae ke [[User:$3|$3]] block kar diis hai.\n\nIske kaaran, jon ki $3 diis hai, ''$2'' hai",
        "cantcreateaccount-range-text": "Nawaa account banae ke IP addresses range <strong>$1</strong>, jisme aap ke IP address (<strong>$4</strong>) hae, ke[[User:$3|$3]] block kar diis hae.\n\n$3 ke kaaran hae <em>$2</em>",
        "viewpagelogs": "Ii panna ke suchi dekho",
        "activeusers-intro": "Ii suchi uu sadasya ke hae jon ki pahile {{PLURAL:$1|din|din}} me kuchh karin hae.",
        "activeusers-count": "$1 haali ke {{PLURAL:$1|badlao}} pichhle {{PLURAL:$3|din}} me",
        "activeusers-from": "Sadasya jon ki hian se suruu hoe hai ke dekhao:",
-       "activeusers-hidebots": "Bots ke lukao",
-       "activeusers-hidesysops": "Administrator log ke lukao",
        "activeusers-noresult": "koi sadasya ke pawa nai gais hai.",
        "listgrouprights": "Sadasya  ke group adhikar",
        "listgrouprights-summary": "Niche likha hai ek suchi hai groups ke jon ki ii wiki me defined hai, aapan  associated access rights ke saathe\n[[{{MediaWiki:Listgrouprights-helppage}}|additional information]] individual rights ke baare me sait hoi.",
        "htmlform-cloner-create": "Aur add karo",
        "htmlform-cloner-delete": "Remove karo",
        "htmlform-cloner-required": "Kamti se kamti ek value ke jaruri hae",
-       "sqlite-has-fts": "$1 with full-text search support",
-       "sqlite-no-fts": "$1 without full-text search support",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleted}} panna $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|restored}} panna $3",
        "logentry-delete-event": "$1 {{GENDER:$2|changed}} visibility of {{PLURAL:$5|a log event|$5 log events}} on $3: $4",
index 0869b55..59ff3f2 100644 (file)
        "userlogin-yourname-ph": "Ipasulod ang imo nga ngalan-taggamit",
        "yourpassword": "Kontra-senyas:",
        "yourpasswordagain": "Suliton ang kontra-senyas:",
-       "remembermypassword": "Dumdumon ang akon pagsulod sa sini nga brawser (para sa indi magsobra $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})",
        "yourdomainname": "Imo dominyo",
        "password-change-forbidden": "Indi ka mahimo nga makailis sang pasword sa sini nga wiki.",
        "externaldberror": "Mahimo nga may ara sang sala sa pagpamatood sang database ukon wala ka sa lugar nga magbag-o sang imo pang-guha nga akawnt.",
        "passwordreset-emailtext-user": "Ang manuggamit nga si $1 sa {{SITENAME}} nagpangabay sang pahanumdom sang mga detalye sang imo akawnt para sa {{SITENAME}} \n($4). Ang masunod nga {{PLURAL:$3|akawnt|mga akawnt}} sang manuggamit may kabahin sa sini nga adres sang e-mail:\n\n$2\n\n{{PLURAL:$3|Ang ini nga temporaryo nga pasword|Ang mga ini nga temporaryo nga pasword}} indi na magamit sa {{PLURAL:$5|isa ka adlaw|$5 ka adlaw}}.\nKinahanglan mo nga magsulod kag magpili sang bag-o nga pasword subong. Kon lain nga tawo ang nagbuhat sini\nnga pagpangabay, ukon nadumduman mo na ang imo pasword, kag indi mo na kinahanglan nga ini\npaga-ilisan, mahimo mo nga pabay-an ang ini nga pahanumdom kag magpadayon sa paggamit sang imo daan nga pasword.",
        "passwordreset-emailelement": "Gamit-pangalan: \n$1\n\nTemporaryo nga pasword: \n$2",
        "passwordreset-emailsentemail": "May pahanumdom nga e-mail nga ginpadala.",
-       "passwordreset-emailsent-capture": "May e-mail nga nagapahanumdum, nga ginapakita sa idalom.",
-       "passwordreset-emailerror-capture": "May e-mail nga nagapahanumdom nga ginbuhat, nga ginapakita sa idalom, apang ang pagpadala sa manuggamit indi madinalag-on: $1",
        "changeemail": "Ilisan ang E-mail adres",
        "changeemail-header": "Ilisan ang e-mail adres sang akawnt",
        "changeemail-no-info": "Kinahanglan nga nakasulod ka agod nga makadtoan ang ini nga panid sing derecho.",
        "undo-failure": "Ang pag-ilis indi na maliwat pa tungod sang nagakonplikto nga mga pang-tunga nga pag-ilis.",
        "undo-norev": "Ang pag-ilis indii na maliwat pa tungod kay ini wala naga-eksister ukon ginpanas na.",
        "undo-summary": "Liwaton ang pagbag-o sang $1 sa [[Special:Contributions/$2|$2]] ([[User talk:$2|$2]])",
-       "cantcreateaccounttitle": "Indi mabuhat ang akawnt",
        "cantcreateaccount-text": "Ang pagbuhat sang akawnt sang sini nga adres sang IP ('''$1''') ginpunggan ni [[User:$3|$3]].\n\nAng rason nga ginhatag ni $3 amo ang ''$2''",
        "viewpagelogs": "Tan-awon ang mga log para sa sini nga pahina",
        "nohistory": "Wala sang kasaysayan sang pag-ilis sang sini nga panid.",
index 7d15d79..62a131b 100644 (file)
        "passwordreset-emaildisabled": "Funkcija e-pošte je onemogućena na ovom wikiju.",
        "passwordreset-username": "Suradničko ime:",
        "passwordreset-domain": "Domena:",
-       "passwordreset-capture": "Pogledati krajnju poruku?",
-       "passwordreset-capture-help": "Ako označite ovu kućicu, e-poruka s privremenom lozinkom će biti prikazana i poslana korisniku.",
        "passwordreset-email": "E-mail adresa:",
        "passwordreset-emailtitle": "Pojedinosti o računu na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Netko (vjerojatno Vi, s IP adrese $1) zatražio je podsjetnik za Vaše detalje računa\nza {{SITENAME}} ($4). Sljedeći {{PLURAL:$3|račun suradnika je|računi suradnika su}}\npovezani s ovom e-mail adresom:\n\n$2\n\n{{PLURAL:$3|Ova privremena zaporka|Ove privremene zaporke}} će isteći u {{PLURAL:$5|jedan dan|$5 dana}}.\nTrebate se prijaviti i odabrati novu zaporku. Ukoliko je netko drugi napravio ovaj\nzahtjev, ili ako ste se sjetili Vaše izvorne zaporke, a više je ne želite promijeniti, \nmožete zanemariti ovu poruku i nastavite koristiti staru zaporku.",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate dopuštenje za uređivanje suradničkih prava na drugim wikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalno dostupna.",
-       "userrights-nologin": "Morate se [[Special:UserLogin|prijaviti]] s administratorskim računom da bi mogli dodijeliti suradnička prava.",
-       "userrights-notallowed": "Vaš trenutačni suradnički račun nema ovlasti mijenjanja suradničkih prava.",
        "userrights-changeable-col": "Skupine koje možete promijeniti",
        "userrights-unchangeable-col": "Skupine koje ne možete promijeniti",
        "userrights-conflict": "Sukob promjene suradničkih prava! Molimo provjerite i potvrdite svoje promjene.",
-       "userrights-removed-self": "Uspješno ste uklonili svoja vlastita prava. Kao takvi, više niste u mogućnosti pristupiti ovoj stranici.",
        "group": "Skupina:",
        "group-user": "Suradnici",
        "group-autoconfirmed": "automatski potvrđeni suradnici",
        "right-siteadmin": "Zaključavanje i otključavanje baze podataka",
        "right-override-export-depth": "Izvezi stranice uključujući i povezane stranice do dubine od 5",
        "right-sendemail": "Slanje e-pošte drugim suradnicima",
-       "right-passwordreset": "Vidi poruku e-pošte o ponovnom postavljanju lozinke",
        "grant-group-email": "Pošalji e-mail",
        "grant-blockusers": "Blokiraj i odblokiraj korisnike",
        "grant-createaccount": "Otvori račune",
        "booksources-search": "Traži",
        "booksources-text": "Ovdje je popis vanjskih poveznica na internetskim stranicama koje prodaju nove i rabljene knjige, ali mogu sadržavati i ostale podatke o knjigama koje tražite:",
        "booksources-invalid-isbn": "Čini se da dani ISBN nije valjan; provjerite greške kopirajući iz izvornika.",
+       "magiclink-tracking-isbn": "Stranice s čarobnim ISBN poveznicama",
+       "magiclink-tracking-isbn-desc": "Ova stranica rabi čarobne ISBN poveznice. Za njihovu migraciju vidi [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "specialloguserlabel": "Suradnik:",
        "speciallogtitlelabel": "Cilj (naslov ili suradnik):",
        "log": "Evidencije",
        "pageinfo-robot-index": "Stranicu je moguće indeksirati",
        "pageinfo-robot-noindex": "Indeksiranje stranice onemogućeno",
        "pageinfo-watchers": "Broj pratitelja stranice",
+       "pageinfo-visiting-watchers": "Broj suradnika pratitelja ove stranice koji su posjetili nedavne promjene",
        "pageinfo-few-watchers": "Manje od $1 {{PLURAL:$1|suradnika koji prate ovu stranicu|suradnika koji prate ovu stranicu}}",
        "pageinfo-redirects-name": "Broj preusmjeravanja na ovu stranicu",
        "pageinfo-subpages-name": "Podstranice",
        "patrol-log-page": "Evidencija pregledavanja promjena",
        "patrol-log-header": "Ovo su evidencije ophođenih izmjena.",
        "log-show-hide-patrol": "$1 evidenciju patroliranja",
+       "confirm-markpatrolled-button": "U redu",
+       "confirm-markpatrolled-top": "Označiti izmjenu $3 stranice $2 pregledanom?",
        "deletedrevision": "izbrisana stara inačica $1",
        "filedeleteerror-short": "Pogrješka u brisanju datoteke: $1",
        "filedeleteerror-long": "Dogodila se pogrješka prilikom brisanja datoteke:\n\n$1",
        "confirm-watch-top": "Dodajte ovu stranicu na Vaš popis praćenih stranica",
        "confirm-unwatch-button": "U redu",
        "confirm-unwatch-top": "Ukloni ovu stranicu s popisa praćenja?",
+       "confirm-rollback-button": "U redu",
+       "confirm-rollback-top": "Ukloniti uređivanja na ovoj stranici?",
        "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← prethodna slika",
        "imgmultipagenext": "sljedeća slika →",
index 70d984b..6bc52f5 100644 (file)
        "yourpasswordagain": "Passwort repetiere:",
        "createacct-yourpasswordagain": "Passwort bestätiche",
        "createacct-yourpasswordagain-ph": "Geb das Passwort erneit ren",
-       "remembermypassword": "Mit dem Browser dauerhaft oongemeldet bleiwe (maximal $1 {{PLURAL:$1|Tooch|Tooche}})",
        "userlogin-remembermypassword": "Oongemeldt bleiwe",
        "userlogin-signwithsecure": "Sichre Verbinnung verwenne",
        "yourdomainname": "Dein Domain:",
        "passwordreset-emailtext-user": "Benutzer $1 bei {{SITENAME}} hot en Zurücksetzung von dein Passwort bei {{SITENAME}} oongefordert ($4). {{PLURAL:$3|Das follichend Benutzerkonto ist|Die follichend Benutzerkonte sind}} mit der E-Mail-Adress verknüpft:\n\n$2\n\n{{PLURAL:$3|Das temporär Passwort looft|Die temporäre Passwörter loofe}} innerhalb von {{PLURAL:$5|em Tooch|$5 Tooche}} ab. Du sollst dich oonmelde und en neies Passwort vergewe. Falls jemand annres die Oonfroch getäticht hot orrer du dich wieder an den ursprüngliches Passwort erinnre kannst und das net ännre möchst, kannst du die Nachricht ignoriere und weiterhin dein altes Passwort benutze.",
        "passwordreset-emailelement": "Benutzernoome: \n$1\n\nTemporäres Passwort: \n$2",
        "passwordreset-emailsentemail": "En Passwortzurücksetzung-E-Mail woard versandt.",
-       "passwordreset-emailsent-capture": "En Passwortzurücksetzung-E-Mail woard versandt, die unne oongezeicht weard.",
-       "passwordreset-emailerror-capture": "Die unne oongezeichte Passwortzurücksetzungs-E-Mail woard generiert, awer der Versand an {{GENDER:$2|den Benutzer|die Benutzrin}} ist gescheitert: $1",
        "changeemail": "E-Mail-Adress ännre",
        "changeemail-header": "E-Mail-Adress ännre",
        "changeemail-no-info": "Du musst dich oonmelde, um uff die Seit direkt zuzugreife.",
        "undo-nochange": "Anscheinnd woard die Beoorbeitung schon rückgängich gemacht.",
        "undo-summary": "Ändrung $1 von [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) rückgängich gemacht.",
        "undo-summary-username-hidden": "Ännrung $1 von en versteckte Benutzer rückgängich gemacht.",
-       "cantcreateaccounttitle": "Das Benutzerkonto kann net erstellt sin",
        "cantcreateaccount-text": "Die Erstellung von en Benutzerkonto raus von der IP-Adresse '''($1)''' woor doorrich [[User:$3|$3]] gesperrt.\n\nGrund der Sperr: ''$2''",
        "cantcreateaccount-range-text": "Das Erstell von Benutzerkonte von IP-Adressen im Bereich <strong>$1</strong>, wo dein IP-Adress (<strong>$4</strong>) enthält, woor von [[User:$3|$3]] gesperrt.\n\nDer oongebne Grund von $3 laut: <em>$2</em>",
        "viewpagelogs": "Logbücher von der Seit oonzeiche",
        "activeusers-intro": "Das ist en List von Benutzer, wo innerhalleb {{PLURAL:$1|vom letzte Tooch|von der letzte $1 Tooch}} Aktivitäte uffwies.",
        "activeusers-count": "$1 {{PLURAL:$1|Aktion|Aktione}} in den {{PLURAL:$3|letzte 24 Stunne|vergangene $3 Tooche}}",
        "activeusers-from": "Zeich Benutzer ab:",
-       "activeusers-hidebots": "Bots ausblende",
-       "activeusers-hidesysops": "Administratore ausblende (verstecke)",
        "activeusers-noresult": "Kene Benutzer gefund.",
        "listgrouprights": "Benutzergrupperechte",
        "listgrouprights-summary": "Das ist ein List vom in dem Wiki definierte Benutzergruppe und ehre damit verbündne Rechte.\nZusätzliche Informatione üwer einzelne Rechte könne [[{{MediaWiki:Listgrouprights-helppage}}|hier]] gefund sin.",
        "htmlform-cloner-create": "Weitre dozu tun",
        "htmlform-cloner-delete": "Entferne",
        "htmlform-cloner-required": "Es ist minschtens en Weart erforderlich.",
-       "sqlite-has-fts": "Version $1 mit Unnerstützung für die Volltextsuch",
-       "sqlite-no-fts": "Version $1 ohne Unnerstützung für die Volltextsuch",
        "logentry-delete-delete": "$1 {{GENDER:$2|löschte}} Seit $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|stellte}} Seit $3 wieder her",
        "logentry-delete-event": "$1 {{GENDER:$2|ännerte}}  die Sichtbarkeit {{PLURAL:$5|von ein Logbucheintrooch|von $5 Logbucheinträch}} uff $3: $4",
        "feedback-bugornote": "Soweit du ganz detalhiert en technisches Problem beschreiben möchst, meld bittschön [$1 en Fehler].\nAnnerfalls kannst du ooch das do unne stehende ganz enfache Formular benutze. Dein Kommentar weard, zusammer mit deinem Benutzernoome und der Version von der von dir verwenndt Webbrowsers sowie Betriebssystems, uff der Seit \"[$3 $2]\" hinzugefücht.",
        "feedback-cancel": "Abbreche",
        "feedback-close": "Erledicht (fertich)",
-       "feedback-error-title": "Fehler",
        "feedback-error1": "Fehler: Unbekanntes Ergebnis von der API",
        "feedback-error2": "Fehler: Beoorbeitung gescheitert",
        "feedback-error3": "Fehler: Ken Antwort von der API",
index 007eada..558b166 100644 (file)
        "yourpasswordagain": "Hesło znowa zapodać:",
        "createacct-yourpasswordagain": "Hesło wobkrućić",
        "createacct-yourpasswordagain-ph": "Zapodaj hesło hišće raz",
-       "remembermypassword": "Na tutym ličaku přizjewjeny wostać (za maksimalnje $1 {{PLURAL:$1|dźeń|dnjej|dny|dnjow}})",
        "userlogin-remembermypassword": "Přizjewjeny wostać",
        "userlogin-signwithsecure": "Wěsty zwisk wužiwać",
        "yourdomainname": "Twoja domejna:",
        "activeusers-intro": "To je lisćina wužiwarjow, kotřiž běchu aktiwni za {{PLURAL:$1|posledni dźeń|poslednjej $1 dnjej|poslednje $1 dny|poslednich $1 dnjow}}:",
        "activeusers-count": "$1 {{PLURAL:$1|akcija|akciji|akcije|akcijow}} w {{PLURAL:$3|zańdźenej dnju|zańdźenymaj $3 dnjomaj|zańdźenych $3 dnjach}}",
        "activeusers-from": "Wužiwarjow zwobraznić, započinajo z:",
-       "activeusers-hidebots": "Boćiki schować",
-       "activeusers-hidesysops": "Administratorow schować",
        "activeusers-noresult": "Žani wužiwarjo namakani.",
        "listgrouprights": "Prawa wužiwarskeje skupiny",
        "listgrouprights-summary": "Slěduje lisćina wužiwarskich skupinow na tutej wikiju z jich wotpowědnymi přistupnymi prawami. Tu móžeš [[{{MediaWiki:Listgrouprights-helppage}}|dalše informacije]] wo jednotliwych prawach namakać.",
        "htmlform-cloner-create": "Wjace přidać",
        "htmlform-cloner-delete": "Wotstronić",
        "htmlform-cloner-required": "Znjamjeńša jedna hódnota je trěbna.",
-       "sqlite-has-fts": "$1 połnotekstowe pytanje podpěruje.",
-       "sqlite-no-fts": "$1 połnotekstowe pytanje njepodpěruje",
        "logentry-delete-delete": "$1 je stronu $3 {{GENDER:$1|zhašał|zhašała}}",
        "logentry-delete-restore": "$1 je stronu $3 {{GENDER:$1wobnowił|wobnowiła}}",
        "logentry-delete-event": "$1 je widźomnosć {{PLURAL:$5|protokoloweho zapiska|$5 protokoloweju zapiskow|$5 protokolowych zapiskow}} na $3 {{GENDER:$2|změnił|změniła}}: $4",
        "feedback-close": "Dokónčeny",
        "feedback-external-bug-report-button": "Techniski nadawk zapodać",
        "feedback-dialog-title": "Komentar pósłać",
-       "feedback-error-title": "Zmylk",
        "feedback-error1": "Zmylk: Njepřipóznaty wuslědk wot API",
        "feedback-error2": "Zmylk: Wobdźěłanje je so njeporadźiło",
        "feedback-error3": "Zmylk: Žana wotmołwa wot API",
index 17df2d7..edb8a7c 100644 (file)
        "yourpasswordagain": "Mete mopas ou an ankò :",
        "createacct-yourpasswordagain": "Konfime modpas la",
        "createacct-yourpasswordagain-ph": "Rantre modpas la ankò",
-       "remembermypassword": "Sonje mopas mwen an nan òdinatè mwen an (pou yon maximum de $1 {{PLURAL:$1|jou|jou}})",
        "userlogin-remembermypassword": "Pa dekonekte m",
        "userlogin-signwithsecure": "Sèvi ak yon koneksyon sekirize",
        "yourdomainname": "Domèn ou an",
index 0b91499..ce3aaba 100644 (file)
        "passwordreset-nocaller": "A hívó megadása kötelező",
        "passwordreset-nosuchcaller": "A hívó nem létezik: $1",
        "passwordreset-ignored": "A jelszó-visszaállítás nem lett kezelve. Talán nincs konfigurálva szolgáltató?",
-       "passwordreset-invalideamil": "Érvénytelen e-mail cím",
+       "passwordreset-invalidemail": "Érvénytelen e-mail cím",
        "passwordreset-nodata": "Se felhasználónevet, sem e-mail-címet nem adtál meg",
        "changeemail": "E-mail cím megváltoztatása vagy eltávolítása",
        "changeemail-header": "Töltsd ki ezt az űrlapot az e-mail-címed megváltoztatásához. Ha nem szeretnél semmilyen e-mail-címet kapcsolni a fiókodhoz, hagyd üresen az új e-mail-cím mezőjét az űrlap elküldésekor.",
index 4408039..ea3fd1e 100644 (file)
@@ -27,7 +27,8 @@
                        "Aram1985",
                        "KeepingCalm",
                        "Macofe",
-                       "Kareyac"
+                       "Kareyac",
+                       "Irus"
                ]
        },
        "tog-underline": "ընդգծել հղումները՝",
@@ -55,7 +56,7 @@
        "tog-enotifminoredits": "էլ-փոստով տեղեկացնել նաև էջերի չնչին խմբագրումների մասին",
        "tog-enotifrevealaddr": "Ցույց տալ իմ էլ-փոստի հասցեն ծանուցման նամակներում",
        "tog-shownumberswatching": "Ցույց տալ հսկող մասնակիցների թիվը",
-       "tog-oldsig": "Ընթացիկ ստորագրությունը՝",
+       "tog-oldsig": "Ձեր ընթացիկ ստորագրությունը՝",
        "tog-fancysig": "Ստորագրությունը վիքիտեքստի տեսքով (առանց ավտոմատ հղման)",
        "tog-uselivepreview": "Օգտագործել անմիջական նախադիտում",
        "tog-forceeditsummary": "Նախազգուշացնել խմբագրման ամփոփումը դատարկ թողնելու դեպքում",
@@ -72,7 +73,7 @@
        "tog-showhiddencats": "Ցուցադրել թաքնված կատեգորիաները",
        "tog-norollbackdiff": "Չցուցադրել տարբերությունները հետ գլորելուց հետո",
        "tog-useeditwarning": "Զգուշացնել ինձ, երբ ես լքում եմ խմբագրման էջը առանց կատարած փոփոխությունները հիշելու։",
-       "tog-prefershttps": "Õ\84Õ¸Ö\82Õ¿Ö\84 Õ£Õ¸Ö\80Õ®Õ¥Õ¬Õ¸Ö\82Ö\81 Õ°Õ¥Õ¿Õ¸, Õ´Õ«Õ·Õ¿ Õ£Õ¸Ö\80Õ®Õ¡Õ®Õ¥Õ¬ Õ¡Õ¶Õ¾Õ¶Õ¿Õ¡Õ¶Õ£ Õ´Õ«Õ¡Ö\81Õ¸Ö\82Õ´Õ«Ö\81 (HTTPS)",
+       "tog-prefershttps": "Õ\84Õ«Õ·Õ¿ Ö\85Õ£Õ¿Õ¡Õ£Õ¸Ö\80Õ®Õ¥Ö\84 Õ¡Õ¶Õ¾Õ¿Õ¡Õ¶Õ£ Õ´Õ«Õ¡Ö\81Õ¸Ö\82Õ´ Õ°Õ¡Õ´Õ¡Õ¯Õ¡Ö\80Õ£Õ¸Ö\82Õ´ Õ¶Õ¥Ö\80Õ¯Õ¡ÕµÕ¡Ö\81Õ¶Õ¥Õ¬Õ¸Ö\82Ö\81 Õ°Õ¥Õ¿Õ¸",
        "underline-always": "Միշտ",
        "underline-never": "Երբեք",
        "underline-default": "Դիտարկչի կամ թեմայի լռելյայն ոճով",
        "newwindow": "(բացվում է նոր պատուհանում)",
        "cancel": "Չեղարկել",
        "moredotdotdot": "Ավելին...",
-       "morenotlisted": "Ô±ÕµÕ½ Ö\81Õ¡Õ¶Õ¯Õ¶ Õ¡Õ¾Õ¡Ö\80Õ¿Õ¸Ö\82Õ¶ Õ¹Õ§Ö\89",
+       "morenotlisted": "Ô±ÕµÕ½ Ö\81Õ¸Ö\82Ö\81Õ¡Õ¯Õ¨ Õ¯Õ¡Ö\80Õ¸Õ² Õ§ Õ¬Õ«Õ¶Õ¥Õ¬ Õ©Õ¥Ö\80Õ«",
        "mypage": "Էջ",
        "mytalk": "Քննարկում",
        "anontalk": "Քննարկում",
        "badarticleerror": "Տվյալ գործողությունը չի կարող կատարվել այս էջում։",
        "cannotdelete": "Չհաջողվեց ջնջել «$1» էջը կամ ֆայլը։\nՀավանաբար այն արդեն ջնջվել է մեկ այլ մասնակցի կողմից։",
        "cannotdelete-title": "Հնարավոր չէ ջնջել $1 էջը",
+       "delete-hook-aborted": "Խմբագրել չեղյալ է.\nԼրացուցիչ պարզաբանումներ չի դրվել.",
+       "no-null-revision": "Չի հաջողվել ստեղծել նոր զրոյական правку համար էջը \"$1\"",
        "badtitle": "Անընդունելի անվանում",
        "badtitletext": "Հարցված էջի անվանումը անընդունելի է, դատարկ է կամ սխալ միջ-լեզվական կամ ինտերվիքի անվանում է։ Հնարավոր է, որ այն պարունակում է անթույլատրելի սիմվոլներ։",
        "title-invalid-empty": "Էջի հայցվող վերնագիրը դատարկ է կամ պարունակում է միայն անվանատարածքի անունը։",
+       "title-invalid-utf8": "Հարցումն ստացած անունը էջը պարունակում է կրում սխալ հաջորդականությունը նիշ UTF-8.",
        "perfcached": "Ստորև տվյալները պահուստավորված են և հնարավոր է չարտացոլեն վերջին փոփոխությունները։ Առավելագույն {{PLURAL:$1|արդյունք|$1 արդյունք}} է հասանելի քեշում։",
        "perfcachedts": "Հետևյալ տվյալները վերցված են քեշից և վերջին անգամ թարմացվել են $1։ A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.",
        "querypage-no-updates": "Այս էջի փոփոխությունները ներկայումս արգելված են։ Այստեղի տվյալները այժմ չեն թարմացվի։",
        "userlogin-signwithsecure": "Օգտագործել անվտանգ միացում",
        "cannotloginnow-title": "Այժմ դուրս գալ անհնար է",
        "cannotloginnow-text": "$1 օգտագործելիս դուրս գալն անհնար է:",
+       "cannotcreateaccount-title": "Անհնար է ստեղծել հաշիվներ",
+       "cannotcreateaccount-text": "Հաշիվների ուղղակի ստեղծումը ներառված է այս վիքիյում",
        "yourdomainname": "Ձեր դոմենը՝",
        "password-change-forbidden": "Այս վիքիում չեք կարող փոխել գաղտնաբառ։",
        "externaldberror": "Տեղի է ունեցել վավերացման արտաքին տվյալների բազայի սխալ, կամ դուք չունեք բավարար իրավունքներ ձեր արտաքին հաշվի փոփոխման համար։",
        "login": "Մտնել համակարգ",
+       "login-security": "Հաստատեք Ձեր ինքնությունը",
        "nav-login-createaccount": "Մտնել / Գրանցվել",
        "userlogin": "Մտնել / Գրանցվել",
        "userloginnocreate": "Մտնել",
        "userlogin-resetlink": "Մոռացե՞լ եք Ձեր հաշվի տվյալները։",
        "userlogin-resetpassword-link": "Մոռացե՞լ եք գաղտնաբառը",
        "userlogin-helplink2": "Մուտք գործելու օգնություն",
+       "userlogin-loggedin": "Դուք արդեն մտել է որպես {{GENDER:$1|$1}}.\nՕգտագործեք ստորև բերված ձևը մուտք գործելու համար այլ հաշից",
+       "userlogin-reauth": "Դուք պետք է կրկին համակարգ մուտք գործեք  հաստատելու որ դուք դուք եք {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Ստեղծել այլ հաշիվ",
        "createacct-emailrequired": "Էլ–փոստի հասցե",
        "createacct-emailoptional": "Էլ–փոստի հասցե (ոչ պարտադիր)",
        "createacct-reason-ph": "Ինչո՞ւ եք փորձում ստեղծել մեկ այլ հաշիվ",
        "createacct-submit": "Ստեղծել ձեր հաշիվը",
        "createacct-another-submit": "Ստեղծել հաշիվ",
+       "createacct-continue-submit": "Շարունակել ստեղծել հաշիվ",
+       "createacct-another-continue-submit": "Շարունակել ստեղծել հաշիվ",
        "createacct-benefit-heading": "{{SITENAME}}՝ ստեղծվում է ձեր պես մարդկանց կողմից։",
        "createacct-benefit-body1": "{{PLURAL:$1|խմբագրում}}",
        "createacct-benefit-body2": "{{PLURAL:$1|էջ}}",
        "createacct-benefit-body3": "վերջերս ակտիվ {{PLURAL:$1|մասնակից}}",
        "badretype": "Ձեր մուտքագրած գաղտնաբառերը չեն համընկնում։",
+       "usernameinprogress": "Տվյալ մասնակցի համար հաշվի ստեղծումը  արդեն իրականացվում է:\nԽնդրում ենք սպասել:",
        "userexists": "Այս մասնակցի անունը արդեն զբաղված է։ Խնդրում ենք ընտրել մեկ այլ անուն։",
        "loginerror": "Մուտքի սխալ",
        "createacct-error": "Հաշվի ստեղծման սխալ",
        "newarticle": "(Նոր)",
        "newarticletext": "Դուք հղվել եք դեռևս գոյություն չունեցող էջի։ \nՆոր էջ ստեղծելու համար ստորև գտնվող խմբագրման դաշտում ավելացրեք տեքստ, այնուհետև սեղմեք '''Հիշել էջը''' (այցելեք [$1 օգնության էջը]՝ մանրամասն տեղեկությունների համար)։ \n\nԵթե դուք սխալմամբ եք այստեղ հայտնվել, ապա սեղմեք ձեր դիտարկչի '''հետ''' (back) կոճակը։",
        "anontalkpagetext": "----\n''Այս քննարկման էջը պատկանում է անանուն մասնակցին, որը դեռ չի ստեղծել մասնակցային հաշիվ կամ չի մտել համակարգ մասնակցի անունով։''\nԱյդ իսկ պատճառով օգտագործվում է թվային IP-հասցեն։\nՆման IP-հասցեից կարող են օգտվել մի քանի մասնակիցներ։\nԵթե դուք անանուն մասնակից եք, բայց կարծում եք, որ ուրիշներին վերաբերող դիտողությունները արվում են ձեր հասցեով, ապա խնդրում ենք պարզապես [[Special:CreateAccount|գրանցվել]] կամ [[Special:UserLogin|մտնել համակարգ]], որպեսզի հետագայում ձեզ չշփոթեն այլ անանուն մասնակիցների հետ։",
-       "noarticletext": "Ներկայումս այս էջում որևէ տեքստ չկա։\nԴուք կարող եք [[Special:Search/{{PAGENAME}}|որոնել այս անվանումը]] այլ էջերում, <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} որոնել համապատասխան տեղեկամատյանները] կամ [{{fullurl:{{FULLPAGENAME}}|action=edit}} ստեղծել նոր էջ այս անվանմամբ]</span>։",
+       "noarticletext": "Այս պահին տեքստը: այս էջում բացակայում է:\nԴուք կարող եք [[Special:Search/{{PAGENAME}}|գտնել հիշատակում այս անվանումը]] այլ էջերում,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} գտնել համապատասխան գրառումներ տեղեկամատյանները]\nկամ'[{{fullurl:{{FULLPAGENAME}}|action=edit}} ստեղծել էջ այս անվանմամբ]\"'</span>.",
        "noarticletext-nopermission": "Ներկայումս այս էջում որևէ տեքստ չկա։\nԴուք կարող եք [[Special:Search/{{PAGENAME}}|որոնել այս անվանունը]] այլ էջերում կամ <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} որոնել այն տեղեկամատյաններում]</span>։ Դուք չունեք թույլտվություն ստեղծել այս էջը։",
        "userpage-userdoesnotexist": "«<nowiki>$1</nowiki>» անվանմամբ մասնակից գոյություն չունի։\nԽնդրում ենք հավաստիանալ նրանում, թե արդյոք ուզում եք ստեղծել/խմբագրել այս էջը։",
        "userpage-userdoesnotexist-view": "«$1» անվանմամբ գրանցված մասնակից չկա։",
        "defaultmessagetext": "Լռելյան տեքստը",
        "editwarning-warning": "Այս էջը լքելով դուք կարող եք կորցնել ձեր կատարած փոփոխությունները։\nԵթե դուք գրանցված եք համակարգում, կարող եք անջատել այս նախազգուշացումը ձեր նախընրությունների «{{int:prefs-editing}}» բաժնում։",
        "content-model-wikitext": "վիքիտեքստ",
+       "content-model-text": "պարզ տեքստ",
        "content-model-javascript": "ՋավաՍկրիպտ",
        "content-model-css": "ՍիԷսԷս",
+       "content-json-empty-object": "Դատարկ օբյեկտ",
        "duplicate-args-category": "Կաղապարներում կրկնվող արգումենտներով էջեր",
        "undo-success": "Խմբագրումը կարող է հետ շրջվել։ Ստուգեք տարբերակների համեմատությունը ստորև, որպեսզի համոզվեք, որ դա է ձեզ հետաքրքրող փոփոխությունը և մատնահարեք «Հիշել էջը»՝ գործողությունն ավարտելու համար։",
        "undo-failure": "Խմբագրումը չի կարող հետ շրջվել միջանկյալ խմբագրումների ընդհարման պատճառով։",
        "searchprofile-advanced-tooltip": "Որոնել նշված անվանատարածքներում",
        "search-result-size": "$1 ({{PLURAL:$2|1 բառ|$2 բառ}})",
        "search-result-category-size": "{{PLURAL:$1|անդամ}} ({{PLURAL:$2|ենթակատեգորիա}}, {{PLURAL:$3|նիշք}})",
-       "search-redirect": "(վերահղում $1)",
+       "search-redirect": "(վերահղում $1-ից)",
        "search-section": "(բաժին $1)",
        "search-suggest": "Գուցե նկատի ունե՞ք՝ $1",
        "search-interwiki-caption": "Կից նախագծեր",
        "prefs-timeoffset": "Ժամային տարբերություն",
        "prefs-advancedediting": "Ընդլայնված ընրանքներ",
        "prefs-editor": "Խմբագիր",
+       "prefs-preview": "Նախադիտել",
        "prefs-advancedrc": "Ընդլայնված ընրանքներ",
        "prefs-advancedrendering": "Ընդլայնված ընրանքներ",
        "prefs-advancedsearchoptions": "Ընդլայնված ընրանքներ",
        "right-writeapi": "API գրի օգտագործումը",
        "right-delete": "Էջերի ջնջում",
        "right-rollback": "Արագ հետ գլորել տվյալ էջը վերջին անգամ խմբագրած մասնակցի խմբագրումները",
+       "grant-group-email": "Ուղարկել էլ. նամակ",
        "grant-createaccount": "Ստեղծել հաշիվներ",
        "grant-createeditmovepage": "Ստեղծել․ խմբագրել և տեղափոխել էջեր",
+       "grant-basic": "Հիմնական իրավունքներ",
        "newuserlogpage": "Մասնակիցների գրանցման տեղեկամատյան",
        "newuserlogpagetext": "Սա նոր մասնակիցների գրանցման տեղեկամատյանն է.",
        "rightslog": "Մասնակցի իրավունքների տեղեկամատյան",
        "whatlinkshere-prev": "{{PLURAL:$1|նախորդ|նախորդ $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|հաջորդ|հաջորդ $1}}",
        "whatlinkshere-links": "← հղումներ",
-       "whatlinkshere-hideredirs": "$1 վերահղում",
-       "whatlinkshere-hidetrans": "$1 Õ¶Õ¥Ö\80Õ¡Õ¼Õ¸Ö\82Õ´Õ¶Õ¥Ö\80Õ¨",
-       "whatlinkshere-hidelinks": "$1 հղում",
+       "whatlinkshere-hideredirs": "$1 վերահղումներ",
+       "whatlinkshere-hidetrans": "$1 Õ¶Õ¥Ö\80Õ¡Õ¼Õ¥Õ¬Õ¸Ö\82",
+       "whatlinkshere-hidelinks": "$1 հղումներ",
        "whatlinkshere-hideimages": "$1 նիշքային հղումներ",
        "whatlinkshere-filters": "Զտիչներ",
        "whatlinkshere-submit": "Գնալ առաջ",
        "ipbother": "Այլ ժամկետ.",
        "ipboptions": "2 ժամ:2 hours,1 օր:1 day,3 օր:3 days,1 շաբաթ:1 week,2 շաբաթ:2 weeks,1 ամիս:1 month,3 ամիս:3 months,6 ամիս:6 months,1 տարի:1 year,անժամկետ:infinite",
        "ipbhidename": "Թաքցնել մասնակցի անունը արգելափակման տեղեկամատյանից, գործող արգելափակումների ցանկից և մասնակիցների ցանկից։",
-       "ipbwatchuser": "Մասնակցի էջն ու քննարկման էջն ավելացնել հսկացանկում",
+       "ipbwatchuser": "Ավելացնել հսկացանկում մասնակցի էջն ու քննարկման էջն",
        "ipb-disableusertalk": "Արգելել մասնակցին խմբագրել իր քննարկման էջն արգելափակման ընթացքում",
        "badipaddress": "Սխալ IP-հասցե",
        "blockipsuccesssub": "Արգելափակումը կատարված է",
        "markedaspatrollednotify": "Այս փոփոխությունը $1 էջում նշվել է ստուգված",
        "markedaspatrollederrornotify": "Ստուգված նշել չհաջողվեց։",
        "patrol-log-page": "Պարեկման տեղեկամատյան",
+       "confirm-markpatrolled-button": "Լավ",
        "deletedrevision": "Ջնջված է հին տարբերակը $1",
        "filedeleteerror-short": "Նիշքի ջնջման սխալ. $1",
        "filedeleteerror-long": "Տեղի են ունեցել սխալներ նիշքի ջնջման ընթացքում.\n\n$1",
        "tags-activate-submit": "Ակտիվացնել",
        "tags-deactivate-reason": "Պատճառ՝",
        "tags-deactivate-submit": "Ապաակտիվացնել",
+       "tags-update-blocked": "Դուք չեք կարող ավելացնել կամ հեռացնել թեգեր, քանի դեռ {{GENDER:$1|դուք}} արգելափակված եք",
        "comparepages": "Համեմատել էջեր",
        "compare-page1": "Էջ 1",
        "compare-page2": "Էջ 2",
        "feedback-close": "Արված է",
        "feedback-message": "Հաղորդագրություն․",
        "feedback-subject": "Թեմա.",
-       "searchsuggest-search": "Որոնել",
+       "searchsuggest-search": "Որոնել {{SITENAME}} կայքում",
        "duration-seconds": "$1 {{PLURAL:$1|վայրկյան}}",
        "duration-minutes": "$1 {{PLURAL:$1|րոպե}}",
        "duration-hours": "$1 {{PLURAL:$1|ժամ}}",
        "special-characters-group-khmer": "Կխմեր",
        "special-characters-title-endash": "ո գծիկ (en dash)",
        "special-characters-title-emdash": "ա գծիկ (em dash)",
-       "special-characters-title-minus": "հանածի նշան"
+       "special-characters-title-minus": "հանածի նշան",
+       "authmanager-create-from-login": "Հաշիվ ստեղծելու համար, խնդրում ենք լրացնել ստորև դաշտերը"
 }
index 716b82e..baaaab2 100644 (file)
        "views": "Representationes",
        "toolbox": "Instrumentos",
        "tool-link-userrights": "Modificar le gruppos del {{GENDER:$1|usator|usatrice}}",
+       "tool-link-userrights-readonly": "Vider gruppos de {{GENDER:$1|usator}}",
        "tool-link-emailuser": "Inviar e-mail a iste {{GENDER:$1|usator|usatrice}}",
        "userpage": "Vider pagina del usator",
        "projectpage": "Vider pagina de projecto",
        "botpasswords-label-delete": "Deler",
        "botpasswords-label-resetpassword": "Reinitialisar le contrasigno",
        "botpasswords-label-grants": "Concessiones applicabile:",
-       "botpasswords-help-grants": "Cata concession da accesso al derectos de usator listate que un conto de usator jam ha. Vide le [[Special:ListGrants|tabula de concessiones]] pro plus information.",
+       "botpasswords-help-grants": "Concessiones permitte accesso a derectos jam detenite per tu conto de usator. Activar un concession hic non forni accesso a alcun derecto que tu conto de usator non haberea alteremente. Vide le [[Special:ListGrants|tabula de concessiones]] pro plus information.",
        "botpasswords-label-grants-column": "Concedite",
        "botpasswords-bad-appid": "Le nomine del robot \"$1\" non es valide.",
        "botpasswords-insert-failed": "Le addition del nomine de robot \"$1\" ha fallite. Esque illo ha jam essite addite?",
        "passwordreset-emaildisabled": "Le functionalitate de e-mail ha essite disactivate in iste wiki.",
        "passwordreset-username": "Nomine de usator:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-capture": "Vider le e-mail resultante?",
-       "passwordreset-capture-help": "Si tu marca iste quadrato, le e-mail (con le contrasigno temporari) non solmente essera inviate al usator, ma anque monstrate a te.",
        "passwordreset-email": "Adresse de e-mail:",
        "passwordreset-emailtitle": "Detalios del conto in {{SITENAME}}",
        "passwordreset-emailtext-ip": "Un persona (probabilemente tu, ab le adresse IP $1) requestava le reinitialisation de tu\ncontrasigno de {{SITENAME}} ($4). Le {{PLURAL:$3|conto|contos}} de usator sequente es\nassociate con iste adresse de e-mail:\n\n$2\n\nIste {{PLURAL:$3|contrasigno|contrasignos}} temporari expirara post {{PLURAL:$5|un die|$5 dies}}.\nTu deberea ora aperir session e eliger un nove contrasigno. Si un altere persona faceva iste\nrequesta, o si tu te ha rememorate tu contrasigno original e non plus\nvole cambiar lo, tu pote ignorar iste message e continuar a usar le ancian\ncontrasigno.",
        "passwordreset-emailelement": "Nomine de usator: \n$1\n\nContrasigno temporari: \n$2",
        "passwordreset-emailsentemail": "Si iste adresse es associate a tu conto, alora un e-mail pro reinitialisar le contrasigno essera inviate.",
        "passwordreset-emailsentusername": "Si il ha un adresse de e-mail associate a iste conto, alora un e-mail pro reinitialisar le contrasigno essera inviate.",
-       "passwordreset-emailsent-capture2": "Le {{PLURAL:$1|message|messages}} de e-mail pro reinitialisation de contrasigno ha essite inviate. Le {{PLURAL:$1|nomine de usator e contrasigno|lista de nomines de usator e contrasignos}} es monstrate hic.",
-       "passwordreset-emailerror-capture2": "Le invio de e-mail al {{GENDER:$2|usator}} ha fallite: $1 Le {{PLURAL:$3|nomine de usator e contrasigno|lista de nomines de usator e contrasignos}} es monstrate hic.",
        "passwordreset-nocaller": "Un appellator debe esser fornite",
        "passwordreset-nosuchcaller": "Appellator non existe: $1",
        "passwordreset-ignored": "Le reinitialisation del contrasigno non ha essite realisate. Es possibile que nulle fornitor ha essite configurate?",
-       "passwordreset-invalideamil": "Adresse de e-mail invalide",
+       "passwordreset-invalidemail": "Adresse de e-mail invalide",
        "passwordreset-nodata": "Ni un nomine de usator ni un adresse de e-mail ha essite fornite",
        "changeemail": "Cambiar o remover adresse de e-mail",
        "changeemail-header": "Completa iste formulario pro cambiar tu adresse de e-mail. Si tu vole remover le association de omne adresse de e-mail ab tu conto, lassa le campo pro le nove adresse de e-mail vacue quando tu submitte le formulario.",
        "prefs-help-recentchangescount": "Isto include modificationes recente, historias de paginas, e registros.",
        "prefs-help-watchlist-token2": "Isto es le clave secrete pro le syndication web de tu observatorio.\nOmne persona qui lo cognosce pote leger tu observatorio, dunque, non divide lo.\n[[Special:ResetTokens|Clicca hic pro reinitialisar lo]].",
        "savedprefs": "Tu preferentias ha essite confirmate.",
-       "savedrights": "Le derectos de usator de {{GENDER:$1|$1}} ha essite salveguardate.",
+       "savedrights": "Le gruppos de usator de {{GENDER:$1|$1}} ha essite salveguardate.",
        "timezonelegend": "Fuso horari:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar le valor predefinite del wiki ($1)",
        "prefswarning-warning": "To ha facite modificationes in tu preferentias que non ha ancora essite confirmate. Si tu quita iste pagina sin cliccar sur \"$1\", tu preferentias non essera cambiate.",
        "prefs-tabs-navigation-hint": "Consilio: Tu pote usar le claves de sagitta sinistre e dextre pro navigar inter le schedas in le lista.",
        "userrights": "Gestion de derectos de usator",
-       "userrights-lookup-user": "Gerer gruppos de usatores",
+       "userrights-lookup-user": "Selige un usator",
        "userrights-user-editname": "Entra un nomine de usator:",
-       "editusergroup": "Modificar gruppos de {{GENDER:$1|usator}}",
+       "editusergroup": "Cargar gruppos de usator",
        "editinguser": "Cambia le derectos del {{GENDER:$1|usator}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modificar gruppos de usatores",
        "saveusergroups": "Salveguardar gruppos de {{GENDER:$1|usator}}",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Tu non ha le permission de modificar le derectos de usatores in altere wikis.",
        "userrights-nodatabase": "Le base de datos $1 non existe o non es local.",
-       "userrights-nologin": "Tu debe [[Special:UserLogin|aperir un session]] con un conto de administrator pro poter assignar derectos de usator.",
-       "userrights-notallowed": "Tu non ha le permission de adder o remover derectos de usator.",
        "userrights-changeable-col": "Gruppos que tu pote modificar",
        "userrights-unchangeable-col": "Gruppos que tu non pote modificar",
        "userrights-conflict": "Conflicto inter cambiamentos de derectos de usator! Per favor revide e confirma tu cambiamentos.",
-       "userrights-removed-self": "Tu ha removite tu proprie derectos. In consequentia, tu non plus pote acceder a iste pagina.",
        "group": "Gruppo:",
        "group-user": "Usatores",
        "group-autoconfirmed": "Usatores autoconfirmate",
        "right-siteadmin": "Blocar e disblocar le base de datos",
        "right-override-export-depth": "Exportar paginas includente paginas ligate usque a un profunditate de 5",
        "right-sendemail": "Inviar e-mail a altere usatores",
-       "right-passwordreset": "Vider le e-mails pro reinitialisar le contrasigno",
        "right-managechangetags": "Crear e (de)activar [[Special:Tags|etiquettas]]",
        "right-applychangetags": "Applicar [[Special:Tags|etiquettas]] al proprie modificationes",
        "right-changetags": "Adder e remover qualcunque [[Special:Tags|etiquettas]] sur individual versiones e entratas de registro",
        "grant-basic": "Derectos de base",
        "grant-viewdeleted": "Vider files e paginas delite",
        "grant-viewmywatchlist": "Vider le proprie observatorio",
+       "grant-viewrestrictedlogs": "Vider entratas de registro confidential",
        "newuserlogpage": "Registro de creation de usatores",
        "newuserlogpagetext": "Isto es un registro de creation de usatores.",
        "rightslog": "Registro de derectos de usator",
        "apisandbox-continue": "Continuar",
        "apisandbox-continue-clear": "Rader",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuara] le ultime requesta; {{int:apisandbox-continue-clear}} radera le parametros relative al continuation.",
+       "apisandbox-param-limit": "Scribe <kbd>max</kbd> pro usar le limite maxime.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Tote le spatios de nomines)",
+       "apisandbox-multivalue-all-values": "$1 (Tote le valores)",
        "booksources": "Fontes de libros",
        "booksources-search-legend": "Cercar fontes de libros",
        "booksources-search": "Cercar",
        "booksources-text": "Infra es un lista de ligamines a altere sitos que vende libros nove e usate, e pote etiam haber altere informationes super libros que tu cerca:",
        "booksources-invalid-isbn": "Le ISBN date non pare esser valide; verifica que tu non ha facite errores copiante lo del fonte original.",
+       "magiclink-tracking-rfc": "Paginas usante ligamines magic RFC",
+       "magiclink-tracking-rfc-desc": "Iste pagina usa ligamines magic RFC. Vide [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] pro saper como migrar.",
+       "magiclink-tracking-pmid": "Paginas usante ligamines magic PMID",
+       "magiclink-tracking-pmid-desc": "Iste pagina usa ligamines magic PMID. Vide [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] pro saper como migrar.",
+       "magiclink-tracking-isbn": "Paginas usante ligamines magic ISBN",
+       "magiclink-tracking-isbn-desc": "Iste pagina usa ligamines magic ISBN. Vide [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] pro saper como migrar.",
        "specialloguserlabel": "Executor:",
        "speciallogtitlelabel": "Objectivo (titulo o {{ns:user}}:nomine de usator):",
        "log": "Registros",
        "activeusers-intro": "Isto es un lista de usatores que habeva alcun typo de activitate intra le ultime $1 {{PLURAL:$1|die|dies}}.",
        "activeusers-count": "$1 {{PLURAL:$1|action|actiones}} in le ultime {{PLURAL:$3|die|$3 dies}}",
        "activeusers-from": "Presentar usatores a partir de:",
-       "activeusers-hidebots": "Celar bots",
-       "activeusers-hidesysops": "Celar administratores",
+       "activeusers-groups": "Monstrar usatores pertinente a gruppos:",
+       "activeusers-excludegroups": "Excluder usatores pertinente a gruppos:",
        "activeusers-noresult": "Nulle usator trovate.",
        "activeusers-submit": "Monstrar usatores active",
        "listgrouprights": "Derectos del gruppos de usatores",
        "modifiedarticleprotection": "cambiava nivello de protection de \"[[$1]]\"",
        "unprotectedarticle": "removeva le protection de \"[[$1]]\"",
        "movedarticleprotection": "displaciava le configurationes de protection ab \"[[$2]]\" verso \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Protegeva}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Cambiar nivello de protection}} pro \"[[$1]]\"",
+       "unprotectedarticle-comment": "{{GENDER:$2|Removeva le protection}} de \"[[$1]]\"",
        "protect-title": "Cambiar nivello de protection de \"$1\"",
        "protect-title-notallowed": "Vider nivello de protection de \"$1\"",
        "prot_1movedto2": "displaciava [[$1]] verso [[$2]]",
        "movelogpagetext": "Infra es un lista de paginas renominate.",
        "movesubpage": "{{PLURAL:$1|Subpagina|Subpaginas}}",
        "movesubpagetext": "Iste pagina ha $1 {{PLURAL:$1|subpagina, le qual|subpaginas, le quales}} se monstra infra.",
+       "movesubpagetalktext": "Le pagina de discussion correspondente ha $1 {{PLURAL:$1|subpagina|subpaginas}} monstrate infra.",
        "movenosubpage": "Iste pagina non ha subpaginas.",
        "movereason": "Motivo:",
        "revertmove": "reverter",
        "pageinfo-category-pages": "Numero de paginas",
        "pageinfo-category-subcats": "Numero de subcategorias",
        "pageinfo-category-files": "Numero de files",
+       "pageinfo-user-id": "ID de usator",
        "markaspatrolleddiff": "Marcar como patruliate",
        "markaspatrolledtext": "Marcar iste pagina como patruliate",
        "markaspatrolledtext-file": "Marcar iste version del file como patruliate",
        "patrol-log-header": "Isto es un registro de versiones patruliate.",
        "log-show-hide-patrol": "$1 le registro de versiones patruliate",
        "log-show-hide-tag": "$1 registro de etiquettas",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Marcar le version $3 de $2 como patruliate?",
        "deletedrevision": "Deleva le ancian version $1",
        "filedeleteerror-short": "Error durante le deletion del file: $1",
        "filedeleteerror-long": "Se incontrava errores durante le deletion del file:\n\n$1",
        "tags-deactivate": "disactivar",
        "tags-hitcount": "$1 {{PLURAL:$1|modification|modificationes}}",
        "tags-manage-no-permission": "Tu non ha le permission de gerer le etiquettas de modification.",
-       "tags-manage-blocked": "Tu non pote gerer etiquettas de cambiamento durante que tu es blocate.",
+       "tags-manage-blocked": "Tu non pote gerer etiquettas de cambiamento durante que {{GENDER:$1|tu}} es blocate.",
        "tags-create-heading": "Crear un nove etiquetta",
        "tags-create-explanation": "Per configuration predefinite, le etiquettas novemente create essera disponibile pro le uso per usatores e robots.",
        "tags-create-tag-name": "Nomine del etiquetta:",
        "tags-deactivate-not-allowed": "Non es possibile disactivar le etiquetta \"$1\".",
        "tags-deactivate-submit": "Disactivar",
        "tags-apply-no-permission": "Tu non ha le permission de adjunger etiquettas de cambiamento a tu cambiamentos.",
-       "tags-apply-blocked": "Tu non pote applicar etiquettas de cambiamento con tu cambiamentos durante que tu es blocate.",
+       "tags-apply-blocked": "Tu non pote applicar etiquettas de cambiamento con tu cambiamentos durante que {{GENDER:$1|tu}} es blocate.",
        "tags-apply-not-allowed-one": "Non es permittite applicar le etiquetta \"$1\" manualmente.",
        "tags-apply-not-allowed-multi": "Le sequente {{PLURAL:$2|etiquetta|etiquettas}} non es autorisate a esser manualmente applicate: $1",
        "tags-update-no-permission": "Tu non ha le permission de adder o remover etiquettas de cambiamento sur individual versiones o entratas de registro.",
-       "tags-update-blocked": "Tu non pote adder o remover etiquettas de cambiamento durante que tu es blocate.",
+       "tags-update-blocked": "Tu non pote adder o remover etiquettas de cambiamento durante que {{GENDER:$1|tu}} es blocate.",
        "tags-update-add-not-allowed-one": "Non es permittite adjunger le etiquetta \"$1\" manualmente.",
        "tags-update-add-not-allowed-multi": "Le sequente {{PLURAL:$2|etiquetta|etiquettas}} non es autorisate a esser manualmente adjungite: $1",
        "tags-update-remove-not-allowed-one": "Non es permittite remover le etiquetta \"$1\".",
        "htmlform-user-not-exists": "<strong>$1</strong> non existe.",
        "htmlform-user-not-valid": "<strong>$1</strong> non es un nomine de usator valide.",
        "logentry-delete-delete": "$1 {{GENDER:$2|deleva}} le pagina $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|deleva}} le redirection $3 superscribente lo",
        "logentry-delete-restore": "$1 {{GENDER:$2|restaurava}} le pagina $3",
        "logentry-delete-event": "$1 {{GENDER:$2|cambiava}} le visibilitate de {{PLURAL:$5|un entrata|$5 entratas}} de registro in $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|cambiava}} le visibilitate de {{PLURAL:$5|un version|$5 versiones}} del pagina $3: $4",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "pagina non existe ancora",
        "mw-widgets-titleinput-description-redirect": "redirection a $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Adder un categoria…",
        "sessionmanager-tie": "Impossibile combinar plure typos de authentication de requesta: $1.",
        "sessionprovider-generic": "sessiones $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessiones basate sur cookies",
        "log-action-filter-contentmodel-change": "Cambio de modello de contento",
        "log-action-filter-contentmodel-new": "Creation de pagina con modello de contento non standard",
        "log-action-filter-delete-delete": "Deletion de pagina",
+       "log-action-filter-delete-delete_redir": "Superscriptura de redirection",
        "log-action-filter-delete-restore": "Restauration de pagina",
        "log-action-filter-delete-event": "Deletion de registro",
        "log-action-filter-delete-revision": "Deletion de version",
        "authmanager-authn-autocreate-failed": "Le creation automatic de un conto local ha fallite: $1",
        "authmanager-change-not-supported": "Le credentiales fornite non pote esser cambiate perque nihil los usarea.",
        "authmanager-create-disabled": "Le creation de contos es disactivate.",
-       "authmanager-create-from-login": "Pro crear tu conto, completa le campos hic infra.",
+       "authmanager-create-from-login": "Pro crear tu conto, completa le campos.",
        "authmanager-create-not-in-progress": "Nulle creation de conto es in curso, o le datos del session ha essite perdite. Per favor, recomencia ab initio.",
        "authmanager-create-no-primary": "Le credentiales fornite non pote esser usate pro crear un conto.",
        "authmanager-link-no-primary": "Le credentiales fornite non pote esser usate pro ligar un conto.",
index 69ad3b6..f47a949 100644 (file)
@@ -49,7 +49,8 @@
                        "Mbrt",
                        "Beeyan",
                        "Bonaditya",
-                       "Irus"
+                       "Irus",
+                       "Presidenvolksraad"
                ]
        },
        "tog-underline": "Garis bawahi pranala:",
        "createacct-yourpasswordagain-ph": "Masukkan lagi kata sandi",
        "userlogin-remembermypassword": "Biarkan saya tetap masuk",
        "userlogin-signwithsecure": "Gunakan server aman",
-       "cannotlogin-title": "Tidak dapat masuk",
-       "cannotlogin-text": "Login ini tidak mungkin.",
+       "cannotlogin-title": "Tidak dapat log masuk",
+       "cannotlogin-text": "Log masuk tidak mungkin.",
        "cannotloginnow-title": "Tidak dapat masuk log saat ini",
        "cannotloginnow-text": "Masuk log tidak memungkinkan ketika menggunakan $1.",
        "cannotcreateaccount-title": "Akun tak dapat dibuat",
        "passwordreset-emaildisabled": "Fitur surel telah dinonaktifkan pada wiki ini.",
        "passwordreset-username": "Nama pengguna:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Lihat surel yang dihasilkan?",
-       "passwordreset-capture-help": "Jika Anda mencentang kotak ini, surel (dengan kata sandi sementara) akan ditampilkan ke Anda dan juga dikirim ke pengguna.",
        "passwordreset-email": "Alamat surel:",
        "passwordreset-emailtitle": "Detail akun di {{SITENAME}}",
        "passwordreset-emailtext-ip": "Seseorang (mungkin Anda, dari alamat IP $1) meminta pengingat\ndetail akun untuk {{SITENAME}} ($4). {{PLURAL:$3|Akun|Akun-akun}} berikut\nterkait dengan alamat surel ini:\n\n$2\n\n{{PLURAL:$3|Sandi sementara}} berikut akan kedaluwarsa dalam {{PLURAL:$5|$5 hari}}.\nAnda harus masuk dan memilih sandi baru sekarang. Jika orang lain membuat\npermintaan ini atau jika Anda ingat sandi asli dan tidak lagi\ningin mengubahnya, Anda dapat mengabaikan pesan ini dan terus menggunakan sandi lama.",
        "passwordreset-emailelement": "Nama pengguna: \n$1\n\nSandi sementara: \n$2",
        "passwordreset-emailsentemail": "Jika alamat surel ini berkaitan dengan akun Anda, maka surel untuk menyetel ulang kata sandi akan dikirim.",
        "passwordreset-emailsentusername": "Jika ada alamat surel yang berkaitan dengan nama pengguna ini, maka surel untuk menyetel ulang kata sandi akan dikirim.",
-       "passwordreset-emailsent-capture2": "Pemulihan kata sandi {{PLURAL:$1|surel|surel}} telah dikirim. {{PLURAL:$1|Nama pengguna dan kata sandi|Daftar nama pengguna dan kata sandi}} ditampilkan di bawah.",
-       "passwordreset-emailerror-capture2": "Pengiriman surel kepada {{GENDER:$2|pengguna}} gagal: $1 {{PLURAL:$3|Nama pengguna dan kata sandi|Daftar nama pengguna dan kata sandi}} ditampilkan di bawah.",
        "passwordreset-nocaller": "Pemanggil harus diberikan",
        "passwordreset-nosuchcaller": "Pemanggil tidak ada: $1",
        "passwordreset-ignored": "Pemulihan kata sandi tidak tertangani. Mungkin penyedia tidak diatur?",
-       "passwordreset-invalideamil": "Alamat surel tidak sah",
+       "passwordreset-invalidemail": "Alamat surel tidak sah",
        "passwordreset-nodata": "Nama pengguna ataupun alamat surel tidak diberikan",
        "changeemail": "Ubah atau hapus alamat surel",
        "changeemail-header": "Lengkapi formulir ini untuk mengubah alamat surel Anda. Jika Anda ingin menghapus seluruh alamat surel yang berkaitan dengan akun Anda, kosongkan alamat surel ketika mengirim formulir.",
        "savearticle": "Simpan halaman",
        "savechanges": "Simpan perubahan",
        "publishpage": "Terbitkan halaman",
+       "publishchanges": "Terbitkan perubahan",
        "preview": "Pratayang",
        "showpreview": "Lihat pratayang",
        "showdiff": "Lihat perubahan",
        "userrights-reason": "Alasan:",
        "userrights-no-interwiki": "Anda tidak memiliki hak untuk mengubah hak pengguna di wiki yang lain.",
        "userrights-nodatabase": "Basis data $1 tidak ada atau bukan lokal.",
-       "userrights-nologin": "Anda harus [[Special:UserLogin|masuk log]] dengan menggunakan akun pengurus untuk dapat mengubah hak pengguna.",
-       "userrights-notallowed": "AkunAnda tidak berhak untuk menambahkan atau membuang hak pengguna.",
        "userrights-changeable-col": "Kelompok yang dapat Anda ubah",
        "userrights-unchangeable-col": "Kelompok yang tidak dapat Anda ubah",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Konflik perubahan hak pengguna! Silakan tinjau ulang dan konfirmasi perubahan Anda.",
-       "userrights-removed-self": "Anda telah mencabut hak-hak Anda sendiri. Anda tidak bisa lagi mengakses halaman ini.",
        "group": "Kelompok:",
        "group-user": "Pengguna",
        "group-autoconfirmed": "Pengguna terkonfirmasi otomatis",
        "right-siteadmin": "Mengunci dan membuka kunci basis data",
        "right-override-export-depth": "Ekspor halaman termasuk halaman-halaman terkait hingga kedalaman 5",
        "right-sendemail": "Mengirim surel ke pengguna lain",
-       "right-passwordreset": "Lihat surel pengaturulangan kata sandi",
        "right-managechangetags": "Buat dan matikan [[Special:Tags|tag]]",
        "right-applychangetags": "Terapkan [[Special:Tags|tags]] bersamaan dengan perubahan pengguna",
        "right-changetags": "Tambah dan hapus [[Special:Tags|tag]] arbitrari pada revisi masing-masing dan entri log",
        "upload-http-error": "Kesalahan HTTP terjadi: $1",
        "upload-copy-upload-invalid-domain": "Unggahan salinan tidak tersedia dari domain ini.",
        "upload-foreign-cant-upload": "Wiki ini tidak diatur untuk mengunggah berkas ke gudang penyimpangan asing.",
-       "upload-dialog-disabled": "Upload file menggunakan dialog ini dinonaktifkan pada wiki ini.",
+       "upload-dialog-disabled": "Unggah berkas menggunakan dialog ini dinonaktifkan pada wiki ini.",
        "upload-dialog-title": "Unggah berkas",
        "upload-dialog-button-cancel": "Batalkan",
+       "upload-dialog-button-back": "Kembali",
        "upload-dialog-button-done": "Selesai",
        "upload-dialog-button-save": "Simpan",
        "upload-dialog-button-upload": "Unggah",
        "apisandbox-results-fixtoken-fail": "Gagal mendapatkan token \"$1\".",
        "apisandbox-alert-page": "Kolom dalam halaman ini tidak valid.",
        "apisandbox-alert-field": "Nilai dalam kolom ini tidak valid.",
+       "apisandbox-continue": "Lanjutkan",
+       "apisandbox-continue-clear": "Kosongkan",
        "booksources": "Sumber buku",
        "booksources-search-legend": "Cari di sumber buku",
        "booksources-isbn": "ISBN:",
index 53a910d..62abac0 100644 (file)
        "yourname": "Nómine de usator:",
        "yourpassword": "Parol-clave:",
        "yourpasswordagain": "Parol-clave denov:",
-       "remembermypassword": "Memorar mi parol-clave in ti navigator (por un maxim de $1 {{PLURAL:$1|die|dies}})",
        "yourdomainname": "Tui dominia:",
        "login": "Aperter session",
        "nav-login-createaccount": "Crear un conto o intrar",
index f379ef2..81b98c5 100644 (file)
        "yourname": "Áhà ọ'bànifé:",
        "yourpassword": "Okwúngáfè:",
        "yourpasswordagain": "Detuari mkpurụ okwu ejị a gafẹ:",
-       "remembermypassword": "Chetá edemede éjim a banyé na orunótuá (nke ukwu nke rürü {{PLURAL:$1|chi|chi}} $1)",
        "yourdomainname": "Obí gi:",
        "login": "Banyé",
        "nav-login-createaccount": "Banyé / ké buwá",
        "content-model-wikitext": "wikitext",
        "parser-template-loop-warning": "Etemete àtụ dị: [[$1]]",
        "undo-summary": "Emekwàlà orübà $1 shí [[Special:Contributions/$2|$2]] ([[User talk:$2|talk]])",
-       "cantcreateaccounttitle": "Enwéghịkị ke buwá",
        "viewpagelogs": "Zi ndetu ncheta màkà ihü a",
        "nohistory": "Ákíkó mbu màkà orü àdíghị màkà ihüá.",
        "currentrev": "Kuwaria nke ubüwạ",
        "listusers-submit": "Zi",
        "listusers-noresult": "Ọ hügị ọ'bànifé.",
        "listusers-blocked": "(kwàchịrị)",
-       "activeusers-hidebots": "Zonari bot",
-       "activeusers-hidesysops": "Zonari ndi íshí",
        "activeusers-noresult": "Ọ hügị ọ'bànifé.",
        "listgrouprights-group": "Ọtú",
        "listgrouprights-rights": "Nkwènyé",
index 46a2e24..904956e 100644 (file)
        "botpasswords-label-resetpassword": "Isaad manen ti kontrasenias",
        "botpasswords-label-grants": "Dagiti sagut a maipakat:",
        "botpasswords-help-grants": "Ti tunggal maysa a sagut ket mangited iti panagserrek kadagiti nailista a karbengan nga addan iti pakabilangan ti agar-aramat. Kitaen ti [[Special:ListGrants|tabla dagiti sagut]] para iti adu pay a pakaammo.",
-       "botpasswords-label-restrictions": "Dagiti panangigawid iti panagusar:",
        "botpasswords-label-grants-column": "Naisaguten",
        "botpasswords-bad-appid": "Saan nga umisu ti nagan ti bot iti \"$1\".",
        "botpasswords-insert-failed": "Napaay iti pananginayon ti nagan ti bot iti \"$1\". Nainayon kadi idin?",
        "passwordreset-nocaller": "Nasken a maited ti maysa nga agtawtawag",
        "passwordreset-nosuchcaller": "Awan ti agtawtawag: $1",
        "passwordreset-ignored": "Saan a natengngel ti panangisaad manen ti kontrasenias. Mabalin a saan a nakompigura ti mangited?",
-       "passwordreset-invalideamil": "Imbalido nga adres ti esurat",
+       "passwordreset-invalidemail": "Imbalido nga adres ti esurat",
        "passwordreset-nodata": "Saan a naited ti nagan ti agar-aramat wenno maysa nga adres ti esurat",
        "changeemail": "Sukatan wenno ikkaten ti adres ti esurat",
        "changeemail-header": "Kompletuen daytoy a porma tapno masukatan ti adres ti esuratmo. No kayatmo a maikkat ti pannakainaig iti ania man nga adres ti esurat manipud iti pakabilangam, ibati a blanko ti baro nga adres ti esurat no ited ti porma.",
        "activeusers-intro": "Daytoy ti listaan dagiti agar-aramat nga adda inar-aramid iti kaunegan dagiti napalabas a $1 {{PLURAL:$1|nga aldaw|nga al-aldaw}}.",
        "activeusers-count": "$1 a {{PLURAL:$1|tignay|tigtignay}} iti napalabas {{PLURAL:$3|nga aldaw|a $3 nga al-aldaw}}",
        "activeusers-from": "Iparang dagiti agar-aramat a mangrugi iti:",
-       "activeusers-hidebots": "Ilemmeng dagiti bot",
-       "activeusers-hidesysops": "Ilemmeng dagiti administrador",
        "activeusers-noresult": "Awan ti nasarakan nga agar-aramat.",
        "activeusers-submit": "Ipakita dagiti aktibo nga agar-aramat",
        "listgrouprights": "Dagiti karbengan ti grupo ti agar-aramat",
        "feedback-bugornote": "No sisasagakan nga agibaga ti teknikal a pakirut a naisalaysay pangngaasi nga [$1 ireporta ti parikut].\nNupay kasta, mausarmo ti nalaka a porma dita baba. Ti komentario nga itedmo ket mainayon iti panid \"[$3 $2], a mairaman ti naganmo nga agar-aramat ken no ania ti pagbasabasa nga us-sarem.",
        "feedback-cancel": "Ukasen",
        "feedback-close": "Nalpasen",
-       "feedback-error-title": "Biddut",
        "feedback-error1": "Biddut: Saan a malasin dagiti nagbanagan manipud ti API",
        "feedback-error2": "Biddut: Napaay ti panagurnos",
        "feedback-error3": "Biddut: Awan ti sungbat manipud ti API",
index d735991..4184353 100644 (file)
        "yourpasswordagain": "Юхаязде къайладIоагIа:",
        "createacct-yourpasswordagain": "Бакъйе пароль",
        "createacct-yourpasswordagain-ph": "Кхы цхьаькхаза Iочуязъе пароль",
-       "remembermypassword": "ДагайоагIаш хилийта са дагара йоазув укх компьютер тӀа (цхьан $1 {{PLURAL:$1|дийнахь}})",
        "userlogin-remembermypassword": "Система чу виса",
        "yourdomainname": "Хьа нана-цIа:",
        "login": "Чувала/яла",
index 02312cc..a6344cc 100644 (file)
        "activeusers-intro": "Þetta er listi yfir notendur sem hafa verið virkir {{PLURAL:$1|síðasta|síðustu}} $1 {{PLURAL:$1|dag|daga}}.",
        "activeusers-count": "$1 {{PLURAL:$1|aðgerð|aðgerðir}} á {{PLURAL:$3|síðasta $3 degi|síðustu $3 dögum}}",
        "activeusers-from": "Sýna notendur sem byrja á:",
-       "activeusers-hidebots": "Fela vélmenni",
-       "activeusers-hidesysops": "Fela möppudýr",
        "activeusers-noresult": "Enginn notandi fannst.",
        "activeusers-submit": "Sýna virka notendur",
        "listgrouprights": "Notandahópréttindi",
index 8831843..724e86f 100644 (file)
        "views": "Visite",
        "toolbox": "Strumenti",
        "tool-link-userrights": "Modifica gruppi {{GENDER:$1|utente}}",
+       "tool-link-userrights-readonly": "Visualizza gruppi {{GENDER:$1|utente}}",
        "tool-link-emailuser": "Invia una email a questo {{GENDER:$1|utente}}",
        "userpage": "Visualizza la pagina utente",
        "projectpage": "Visualizza la pagina di servizio",
        "passwordreset-emaildisabled": "Le funzionalità di posta elettronica sono state disabilitate su questa wiki.",
        "passwordreset-username": "Nome utente:",
        "passwordreset-domain": "Dominio:",
-       "passwordreset-capture": "Visualizzare il contenuto del messaggio e-mail?",
-       "passwordreset-capture-help": "Se si seleziona questa casella, l'indirizzo e-mail (con la password temporanea), verrà mostrato a voi, oltre ad essere inviato all'utente.",
        "passwordreset-email": "Indirizzo email:",
        "passwordreset-emailtitle": "Dettagli dell'utente su {{SITENAME}}",
        "passwordreset-emailtext-ip": "Qualcuno (probabilmente tu, con indirizzo IP $1) ha richiesto l'invio di una nuova password per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associato|Gli utenti associati}} a questo indirizzo email sono:\n\n$2\n\n{{PLURAL:$3|Questa password temporanea scadrà|Queste password temporanee scadranno}} dopo {{PLURAL:$5|un giorno|$5 giorni}}.\nDovresti accedere e scegliere una nuova password ora. \n\nSe non sei stato tu a fare la richiesta, o se ti sei ricordato la password originale e non vuoi più cambiarla, puoi ignorare questo messaggio e continuare ad utilizzare la tua vecchia password.",
        "passwordreset-emailelement": "Nome utente: \n$1\n\nPassword temporanea: \n$2",
        "passwordreset-emailsentemail": "Se questo indirizzo di posta elettronica è associato con la tua utenza, allora verrà inviata una email per reimpostare la password.",
        "passwordreset-emailsentusername": "Se c'è un indirizzo di posta elettronica associato con questo nome utente, allora verrà inviata una email per reimpostare la password.",
-       "passwordreset-emailsent-capture2": "L'email di reimpostazione della password {{PLURAL:$1|è stata inviata|sono state inviate}}. {{PLURAL:$1|Il nome|L'elenco di nomi}} utente e password è mostrato qui.",
-       "passwordreset-emailerror-capture2": "Invio di email {{GENDER:$2|all'utente}} non riuscito: $1. {{PLURAL:$3|Il nome|L'elenco di nomi}} utente e password è mostrato qui.",
        "passwordreset-nocaller": "Un chiamante deve essere fornito",
        "passwordreset-nosuchcaller": "Chiamante non esiste: $1",
        "passwordreset-ignored": "La reimpostazione della password non è stata gestita. Forse nessun provider è configurato?",
-       "passwordreset-invalideamil": "Indirizzo di posta elettronica non valido",
+       "passwordreset-invalidemail": "Indirizzo di posta elettronica non valido",
        "passwordreset-nodata": "Non è stato fornito né un nome utente né un indirizzo di posta elettronica",
        "changeemail": "Modifica o rimuovi indirizzo di posta elettronica",
        "changeemail-header": "Completa questo modulo per cambiare il tuo indirizzo email. Se vuoi rimuovere l'associazione di qualsiasi indirizzo email dalla tua utenza, lascia il nuovo indirizzo email vuoto quando invii il modulo.",
        "prefs-help-recentchangescount": "Comprende ultime modifiche, cronologie e registri.",
        "prefs-help-watchlist-token2": "Questa è la chiave segreta per il feed web dei tuoi osservati speciali.\nChiunque la conosce sarà in grado di leggere i tuoi osservati speciali, per cui non condividerla. [[Special:ResetTokens|Clicca qui se hai bisogno di reimpostarla]].",
        "savedprefs": "Le preferenze sono state salvate.",
-       "savedrights": "I diritti utente di {{GENDER:$1|$1}} sono stati salvati.",
+       "savedrights": "I gruppi utente di {{GENDER:$1|$1}} sono stati salvati.",
        "timezonelegend": "Fuso orario:",
        "localtime": "Ora locale:",
        "timezoneuseserverdefault": "Usa ora predefinita del wiki ($1)",
        "prefswarning-warning": "Hai fatto modifiche alle tue preferenze che non sono state ancora salvate.\nSe esci da questa pagina senza cliccare \"$1\" le preferenze non verranno aggiornate.",
        "prefs-tabs-navigation-hint": "Suggerimento: è possibile utilizzare i tasti freccia sinistra e destra per spostarsi tra le schede nell'elenco delle schede.",
        "userrights": "Gestione dei permessi degli utenti",
-       "userrights-lookup-user": "Gestione dei gruppi utente",
+       "userrights-lookup-user": "Seleziona un utente",
        "userrights-user-editname": "Inserire il nome utente:",
-       "editusergroup": "Modifica gruppi {{GENDER:$1|utente}}",
+       "editusergroup": "Modifica gruppi utente",
        "editinguser": "Modifica in corso dei diritti dell'{{GENDER:$1|utente}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Modifica gruppi utente",
        "saveusergroups": "Salva gruppi {{GENDER:$1|utente}}",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Non si dispone dei permessi necessari per modificare i diritti degli utenti su altri siti.",
        "userrights-nodatabase": "Il database $1 non esiste o non è un database locale.",
-       "userrights-nologin": "Per assegnare diritti agli utenti è necessario [[Special:UserLogin|effettuare l'accesso]] come amministratore.",
-       "userrights-notallowed": "Non disponi dell'autorizzazione per aggiungere o rimuovere i permessi utente.",
        "userrights-changeable-col": "Gruppi modificabili",
        "userrights-unchangeable-col": "Gruppi non modificabili",
        "userrights-conflict": "Conflitto di modifica dei diritti utente! Controlla e conferma le tue modifiche.",
-       "userrights-removed-self": "Hai rimosso i tuoi diritti. E quindi, non sarai più in grado di accedere a questa pagina.",
        "group": "Gruppo:",
        "group-user": "Utenti",
        "group-autoconfirmed": "Utenti autoconvalidati",
        "right-siteadmin": "Blocca e sblocca il database",
        "right-override-export-depth": "Esporta le pagine includendo le pagine collegate fino ad una profondità di 5",
        "right-sendemail": "Invia email ad altri utenti",
-       "right-passwordreset": "Vede i messaggi di reimpostazione della password",
        "right-managechangetags": "Crea e attiva/disattiva le [[Special:Tags|etichette]]",
        "right-applychangetags": "Applica delle [[Special:Tags|etichette]] alle proprie modifiche",
        "right-changetags": "Aggiunge e rimuove specifiche [[Special:Tags|etichette]] su singole versioni o voci di registro",
        "apisandbox-alert-field": "Il valore di questo campo non è valido.",
        "apisandbox-continue": "Continua",
        "apisandbox-continue-clear": "Pulisci",
+       "apisandbox-param-limit": "Inserisci <kbd>max</kbd> per utilizzare il limite massimo.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Tutti i namespace)",
+       "apisandbox-multivalue-all-values": "$1 (Tutti i valori)",
        "booksources": "Fonti librarie",
        "booksources-search-legend": "Ricerca di fonti librarie",
        "booksources-isbn": "Codice ISBN:",
        "activeusers-count": "$1 {{PLURAL:$1|azione|azioni}} {{PLURAL:$3|nell'ultimo giorno|negli ultimi $3 giorni}}",
        "activeusers-from": "Mostra gli utenti a partire da:",
        "activeusers-groups": "Visualizza gli utenti appartenenti ai gruppi:",
+       "activeusers-excludegroups": "Escludi gli utenti appartenenti ai gruppi:",
        "activeusers-noresult": "Nessun utente risponde ai criteri impostati.",
        "activeusers-submit": "Mostra utenti attivi",
        "listgrouprights": "Diritti del gruppo utente",
        "patrol-log-header": "Di seguito sono elencate le verifiche delle modifiche.",
        "log-show-hide-patrol": "$1 registro delle modifiche verificate",
        "log-show-hide-tag": "$1 registro delle etichette",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Segna versione $3 di $2 come verificata?",
        "deletedrevision": "Cancellata la vecchia versione di $1.",
        "filedeleteerror-short": "Errore nella cancellazione del file: $1",
        "filedeleteerror-long": "Si sono verificati degli errori nel tentativo di cancellare il file:\n\n$1",
        "tags-deactivate": "disattiva",
        "tags-hitcount": "$1 {{PLURAL:$1|modifica|modifiche}}",
        "tags-manage-no-permission": "Non si dispone dei permessi necessari per gestire le etichette di modifica.",
-       "tags-manage-blocked": "Non puoi gestire le etichette alle modifiche mentre sei bloccato.",
+       "tags-manage-blocked": "Non puoi gestire le etichette alle modifiche mentre sei {{GENDER:$1|bloccato|bloccata}}.",
        "tags-create-heading": "Crea un nuovo tag",
        "tags-create-explanation": "Per impostazione predefinita, i tag appena creati saranno disponibili per l'utilizzo di utenti e bot.",
        "tags-create-tag-name": "Nome del tag:",
        "tags-deactivate-not-allowed": "Non è possibile disattivare il tag \"$1\".",
        "tags-deactivate-submit": "Disattiva",
        "tags-apply-no-permission": "Non disponi dell'autorizzazione per applicare la modifica di tag insieme con le tue modifiche.",
-       "tags-apply-blocked": "Non puoi applicare le etichette alle modifiche mentre sei bloccato.",
+       "tags-apply-blocked": "Non puoi applicare le etichette alle modifiche mentre sei {{GENDER:$1|bloccato|bloccata}}.",
        "tags-apply-not-allowed-one": "L'etichetta \"$1\" non può essere applicata manualmente.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|La seguente etichetta non può essere applicata|Le seguenti etichette non possono essere applicate}}  manualmente: $1",
        "tags-update-no-permission": "Non si dispone dei permessi necessari per aggiungere o rimuovere le etichette di modifica dalle singole versioni o voci di registro.",
-       "tags-update-blocked": "Non puoi aggiungere o rimuovere le etichette alle modifiche mentre sei bloccato.",
+       "tags-update-blocked": "Non puoi aggiungere o rimuovere le etichette alle modifiche mentre sei {{GENDER:$1|bloccato|bloccata}}.",
        "tags-update-add-not-allowed-one": "Il tag \"$1\" non può essere aggiunto manualmente.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Il seguente tag non può essere aggiunto|I seguenti tag non possono essere aggiunti}} manualmente: $1",
        "tags-update-remove-not-allowed-one": "Il tag \"$1\" non può essere rimosso.",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "questa pagina non esiste ancora",
        "mw-widgets-titleinput-description-redirect": "reindirizzamento a $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Aggiungi una categoria...",
        "sessionmanager-tie": "Non è possibile combinare più tipi di richieste di autenticazione: $1.",
        "sessionprovider-generic": "sessioni $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessioni basate su cookie",
        "usercssispublic": "Ricorda: le sottopagine CSS non devono contenere dati riservati poichè sono visualizzabili da altri utenti.",
        "restrictionsfield-badip": "Indirizzo IP o intervallo non valido: $1",
        "restrictionsfield-label": "Intervalli IP consentiti:",
-       "restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Errore: $1",
-       "edit-error-long": "Errori:\n\n$1"
+       "restrictionsfield-help": "Un indirizzo IP o intervallo CIDR per linea. Per consentire tutto, utilizza<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 27fe191..6148fb4 100644 (file)
@@ -73,7 +73,8 @@
                        "Waiesu",
                        "Matma Rex",
                        "組曲師",
-                       "Foresttttttt"
+                       "Foresttttttt",
+                       "ネイ"
                ]
        },
        "tog-underline": "リンクの下線:",
        "botpasswords-label-delete": "削除",
        "botpasswords-label-resetpassword": "パスワードをリセット",
        "botpasswords-label-grants": "該当する権限群",
-       "botpasswords-help-grants": "各権限群は、一覧にある利用者権限で現在の利用者アカウントが既に有している権限を付与します。詳細については、[[Special:ListGrants|権限群の表]]をご覧ください。",
+       "botpasswords-help-grants": "権限群は、現在の利用者アカウントが既に有している権限を付与します。ここで権限群を付与しても、あなたの利用者アカウントが有していない権限を付与しません。詳しくは[[Special:ListGrants|権限群の表]]をご覧ください。",
        "botpasswords-label-grants-column": "付与",
        "botpasswords-bad-appid": "ボット「$1」は有効ではありません。",
        "botpasswords-insert-failed": "ボット「$1」の追加に失敗しました。既に追加されていないか確認してください。",
        "botpasswords-updated-body": "利用者「$2」のボット名「$1」のためのパスワードが更新されました。",
        "botpasswords-deleted-title": "ボット用パスワードが削除されました",
        "botpasswords-deleted-body": "利用者「$2」のボット名「$1」のためのパスワードが削除されました。",
-       "botpasswords-newpassword": "<strong>$1</strong> 用の新しいパスワードは <strong>$2</strong> です。 <em>後で参照するために、この情報を控えておいてください</em>",
+       "botpasswords-newpassword": "<strong>$1</strong>用の新しいパスワードは<strong>$2</strong>です。<em>後で参照するために、この情報を控えておいてください。</em><br />(古いボットの制約などでログイン名と利用者名が同じでなければならない場合は、<strong>$3</strong>を利用者名とし、<strong>$4</strong>をパスワードとしてください。)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider が有効ではありません。",
        "botpasswords-invalid-name": "指定された利用者名には、ボット用パスワードの区切りである「$1」 が含まれていません。",
        "botpasswords-not-exist": "利用者「$1」はボット「$2」のパスワードを所持していません。",
        "passwordreset-emaildisabled": "メール機能は、このウィキでは無効化されています。",
        "passwordreset-username": "利用者名:",
        "passwordreset-domain": "ドメイン:",
-       "passwordreset-capture": "お送りするメールの内容を表示しますか?",
-       "passwordreset-capture-help": "このボックスにチェックを入れると、利用者に送信されるメールの内容 (仮パスワードを含む) をあなたも閲覧できます。",
        "passwordreset-email": "メールアドレス:",
        "passwordreset-emailtitle": "{{SITENAME}}上のアカウントの詳細",
        "passwordreset-emailtext-ip": "誰か (おそらくあなた、IP アドレス $1) が {{SITENAME}} ($4)\nでのパスワードを再設定するよう申請しました。\n以下の利用者{{PLURAL:$3|アカウント|アカウント群}}がこのメールアドレスと紐付けられています。\n\n$2\n\n{{PLURAL:$3|この仮パスワード|これらの仮パスワード}}は {{PLURAL:$5|$5 日|$5 日間}}で有効期限が切れます。\nあなたはすぐにログインして新しいパスワードを設定する必要があります。\nこれが他の誰かによる申請である場合、あるいはあなたが自分の元のパスワードを\n覚えていてそれを変更したくない場合には、このメッセージを無視して以前のパスワードを\n使用し続けることができます。",
        "passwordreset-emailelement": "利用者名: \n$1\n\n仮パスワード: \n$2",
        "passwordreset-emailsentemail": "このメールアドレスがあなたのアカウントに関連付けられている場合は、パスワードリセットのメールが送信されます。",
        "passwordreset-emailsentusername": "この利用者名に関連付けられたメールアドレスがある場合は、パスワードリセットのメールが送信されます。",
-       "passwordreset-emailsent-capture2": "パスワードリセットの{{PLURAL:$1|メール}}が送信されました。{{PLURAL:$1|利用者名とパスワード|利用者名とパスワードの一覧}}は以下のとおりです。",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|利用者}}へのメール送信に失敗しました: $1{{PLURAL:$3|利用者名とパスワード|利用者名とパスワードの一覧}}は以下のとおりです。",
        "passwordreset-ignored": "パスワードのリセットが処理されませんでした。プロバイダーが設定されていない可能性があります。",
-       "passwordreset-invalideamil": "無効なメールアドレスです",
+       "passwordreset-invalidemail": "無効なメールアドレスです",
        "changeemail": "メールアドレスの変更または除去",
        "changeemail-header": "あなたのメールアドレスを変更するには、このフォームを完成させます。もし、あなたのアカウントから任意のメールアドレスの関連付けを削除したい場合は、フォームの送信時に、新しいメールアドレスを空白のままにします。",
        "changeemail-no-info": "このページに直接アクセスするためにはログインしている必要があります。",
        "userrights-reason": "理由:",
        "userrights-no-interwiki": "他ウィキ上における利用者権限の編集権限は、ありません。",
        "userrights-nodatabase": "データベース$1は存在しないか、ローカル上にありません。",
-       "userrights-nologin": "利用者権限を付与するには、管理者アカウントで[[Special:UserLogin|ログイン]]する必要があります。",
-       "userrights-notallowed": "あなたには利用者権限を追加/除去する権限がありません。",
        "userrights-changeable-col": "変更できるグループ",
        "userrights-unchangeable-col": "変更できないグループ",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "利用者権限の変更が競合しています! 変更内容を確認してください。",
-       "userrights-removed-self": "あなた自身の権限を除去しました。そのため、このページにはもうアクセスできません。",
        "group": "グループ:",
        "group-user": "登録利用者",
        "group-autoconfirmed": "自動承認された利用者",
        "right-siteadmin": "データベースをロックおよびロック解除",
        "right-override-export-depth": "リンク先ページを5階層まで含めて書き出す",
        "right-sendemail": "他の利用者にメールを送信",
-       "right-passwordreset": "パスワード再設定メールを閲覧",
        "right-managechangetags": "[[Special:Tags|タグ]]の作成、有効化および無効化",
        "right-applychangetags": "自分の編集に[[Special:Tags|タグ]]を適用する",
        "right-changetags": "個々の版と記録項目の任意の[[Special:Tags|タグ]]の追加と削除",
        "right-deletechangetags": "データベースから[[Special:Tags|タグ]]を削除します",
        "grant-group-email": "メールの送信",
        "grant-group-customization": "カスタマイズと個人設定",
-       "grant-group-private-information": "君の個人情報にアクセスする。",
+       "grant-group-private-information": "あなたの個人情報にアクセスする",
        "grant-group-other": "その他の活動",
        "grant-blockusers": "利用者をブロックおよびブロック解除",
        "grant-createaccount": "アカウントを作成",
        "patrol-log-header": "以下は巡回された版の記録です。",
        "log-show-hide-patrol": "巡回記録を$1",
        "log-show-hide-tag": "タグ記録を$1",
+       "confirm-markpatrolled-top": "ページ$2の$3の版を巡回済みにマークしますか?",
        "deletedrevision": "古い版 $1 を削除しました",
        "filedeleteerror-short": "ファイルの削除エラー: $1",
        "filedeleteerror-long": "ファイルの削除中にエラーが発生しました:\n\n$1",
        "exif-compression-6": "JPEG (旧式)",
        "exif-copyrighted-true": "著作権あり",
        "exif-copyrighted-false": "著作権情報未設定",
-       "exif-photometricinterpretation-0": "黒と白 (白が0)",
+       "exif-photometricinterpretation-0": "黒と白(白が0です)",
        "exif-photometricinterpretation-1": "黒と白(黒が0)",
        "exif-photometricinterpretation-9": "CIE L*a*b* (ICC エンコード)",
        "exif-photometricinterpretation-10": "CIE L*a*b* (ITU エンコード)",
        "tags-deactivate": "無効化",
        "tags-hitcount": "$1 {{PLURAL:$1|回の変更}}",
        "tags-manage-no-permission": "変更タグを管理する権限がありません。",
-       "tags-manage-blocked": "ブロックされているため、変更タグを管理できません",
+       "tags-manage-blocked": "{{GENDER:$1|あなた}}はブロックされているため、変更タグを管理できません。",
        "tags-create-heading": "新しいタグを作成",
        "tags-create-explanation": "既定では、新しく作られたタグは利用者とボットによる使用が可能となります。",
        "tags-create-tag-name": "タグ名:",
        "tags-deactivate-not-allowed": "タグ「$1」は無効化できません。",
        "tags-deactivate-submit": "無効化",
        "tags-apply-no-permission": "あなたには変更と同時に変更タグを適応する権限がありません。",
-       "tags-apply-blocked": "ブロックされているため、変更タグの変更を適用できません。",
+       "tags-apply-blocked": "{{GENDER:$1|あなた}}はブロックされているため、変更タグを適用できません。",
        "tags-apply-not-allowed-one": "タグ \"$1\" の手動適用は認められていません。",
        "tags-apply-not-allowed-multi": "以下の {{PLURAL:$2|タグ}} は手動適用が認められていません: $1",
        "tags-update-no-permission": "あなたには個々の版または記録項目のタグの追加または除去を行う権限がありません。",
-       "tags-update-blocked": "ブロックされているため、変更タグを追加または除去できません。",
+       "tags-update-blocked": "{{GENDER:$1|あなた}}はブロックされているため、変更タグの追加と除去ができません。",
        "tags-update-add-not-allowed-one": "タグ \"$1\" の手動追加は認められていません。",
        "tags-update-add-not-allowed-multi": "以下の {{PLURAL:$2|タグ}} は手動追加が認められていません: $1",
        "tags-update-remove-not-allowed-one": "タグ \"$1\" の除去は認められていません。",
        "htmlform-date-placeholder": "YYYY-MM-DD",
        "htmlform-time-placeholder": "HH:MM:SS",
        "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
-       "htmlform-date-invalid": "君が入力した値は識別できない日付です。YYYY-MM-DD形式で試してください。",
+       "htmlform-date-invalid": "あなたが入力した日付を識別できませんでした。YYYY-MM-DD形式で試してください。",
        "htmlform-title-badnamespace": "[[:$1]]は、\"{{ns:$2}}\"名前空間にありません。",
        "htmlform-title-not-creatable": "\"$1\" は、作成可能なページ名では、ありません。",
        "htmlform-title-not-exists": "$1 は存在しません。",
        "authmanager-authn-autocreate-failed": "ローカルアカウントの自動作成が失敗しました: $1",
        "authmanager-change-not-supported": "一切利用されないであろう情報のため、指定された証明情報を変更することはできません。",
        "authmanager-create-disabled": "アカウントの作成は禁止されています。",
-       "authmanager-create-from-login": "アカウントを作成するには、以下の入力欄に記入してください。",
+       "authmanager-create-from-login": "アカウントを作成するには、入力欄に記入してください。",
        "authmanager-create-not-in-progress": "アカウントの作成が行われていない、またはセッションデータが失われました。最初からやり直してください。",
        "authmanager-create-no-primary": "指定された証明情報は、アカウントの作成に使用できませんでした。",
        "authmanager-link-no-primary": "指定された証明情報は、アカウントの関連付けに使用できませんでした。",
        "usercssispublic": "注意: CSS のサブページは第三者が閲覧可能なため、機微な情報を含めないでください。",
        "restrictionsfield-badip": "無効な IP アドレス、またはその範囲: $1",
        "restrictionsfield-label": "許可する IP の範囲:",
-       "restrictionsfield-help": "一行につき、単一の IP アドレス、もしくは CIDR による範囲。全帯域からの接続を許可する場合は<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "エラー: $1",
-       "edit-error-long": "エラー:\n\n\n\n$1"
+       "restrictionsfield-help": "一行につき、単一の IP アドレス、もしくは CIDR による範囲。全帯域からの接続を許可する場合は<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 38a261f..2b14bfc 100644 (file)
        "yourpasswordagain": "Ritaip paaswod:",
        "createacct-yourpasswordagain": "Kanfoerm paaswod",
        "createacct-yourpasswordagain-ph": "Enta paaswod agen",
-       "remembermypassword": "Memba mi lagiin pan dis brouza (fi a maximom a $1 {{PLURAL:$1|die|die}})",
        "userlogin-remembermypassword": "Kip mi lagiin‎",
        "yourdomainname": "Yu domien:",
        "externaldberror": "Aida aatentikieshan dietabies era okor ar yu no lou fi opdiet yu extoernal akount.",
        "permissionserrorstext-withaction": "Yu no ab no poermishan fi $2, fi di falarin {{PLURAL:$1|riizn|riizndem}}:",
        "moveddeleted-notice": "Dis piej eh diliit.\nDi diliishan ah muuv lag fi di piej provaid biluo fi refrans.‎",
        "edit-conflict": "Hedit kanflik: $1",
-       "cantcreateaccounttitle": "Cyannat mek di hakkount",
        "viewpagelogs": "Vyuu lagdem fi dis piej",
        "currentrev-asof": "Lietis rivijan az av $1",
        "revisionasof": "Rivijan az av $1",
index 57d4099..48cf4aa 100644 (file)
        "yourpasswordagain": "Djentast adgångskode:",
        "createacct-yourpasswordagain": "Bekräft adgångskode",
        "createacct-yourpasswordagain-ph": "Intast adgångskode idjen",
-       "remembermypassword": "Husk min brugenaun i denn browser (hyest $1 {{PLURAL:$1|daw}})",
        "userlogin-remembermypassword": "Husk mej",
        "userlogin-signwithsecure": "Brug siker forbinjels",
        "yourdomainname": "Det domænnaun:",
index f4e4631..c1c62c3 100644 (file)
        "passwordreset-emaildisabled": "Fitur layang elektronik wis dipateni ing wiki iki.",
        "passwordreset-username": "Jeneng panganggo:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Delok layang èlèktronik sing diasilaké?",
-       "passwordreset-capture-help": "Yèn Sampéyan nyentang kothak iki, layang èlèktronik (mawa tembung sandhi sawetara) bakal ditampilaké nèng Sampéyan lan uga dikirim nèng panganggo.",
        "passwordreset-email": "Alamat layang èlèktronik:",
        "passwordreset-emailtitle": "Rincian akun nèng {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ana uwong (mbok menawa Sampéyan, mawa angka IP $1) njaluk ganti tembung sandhiné Sampéyan ana ing {{SITENAME}} ($4). {{PLURAL:$3|Rèkèning|Rèkèning-rèkèning}} ngisor iki magepokan karo padunungané layang èlèktronik iki:\n\n$2\n\n{{PLURAL:$3|Tembung sandhi sawetara iki}} bakal kedaluwarsa ing {{PLURAL:$5|sak dina|$5 dina}}.\nSampéyan kudu mlebu log lan milih siji tembung sandhi anyar saiki. Yèn wong liya sing njaluk iki, utawa yèn Sampéyan jebul wis kèlingan tembung sandhiné sing lawas saéngga ora ana niyat kanggo ngganti, Sampéyan bisa ngejaraké wara-wara iki lan bacutaké nganggo tembung sandhiné lawas Sampéyan.",
        "showhideselectedversions": "Tampilaké/dhelikaké révisi kapilih",
        "editundo": "wurung",
        "diff-empty": "(Ora ana bedane)",
-       "diff-multi-sameuser": "({{PLURAL:$1|Saowahan madya|$1 owahan madya}} déning panganggo sing padha ora dituduhaké)",
+       "diff-multi-sameuser": "({{PLURAL:$1|$1 owahan antara}} déning naraguna sing padha ora katuduhaké)",
        "diff-multi-manyusers": "({{PLURAL:$1Siji rèvisi sedhengan|$1 rèvisi sedhengan}} déning luwih saka $2 {{PLURAL:$2|panganggo|panganggo}} ora dituduhaké)",
        "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",
        "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-nologin": "Panjenengan kudu [[Special:UserLogin|mlebu log]] mawa nganggo akun utawa rékening pangurus supaya bisa ngowahi hak panganggo.",
-       "userrights-notallowed": "Sampéyan ora nduwé idin kanggo nambah utawa nyuda hak-hak panganggo.",
        "userrights-changeable-col": "Grup sing bisa panjenengan owahi",
        "userrights-unchangeable-col": "Grup sing ora bisa diowahi panjenengan",
        "userrights-conflict": "Konflik pangowahan hak-hak panganggo! Tulung ditinjau maneh lan konfirmasi Pangowahan sampeyan.",
-       "userrights-removed-self": "Sampeyan wis berhasil ngilangake hak-hak sampeyan. Nuli, sampeyan ora isa ngakses kaca niki malih.",
        "group": "Golongan:",
        "group-user": "Para panganggo",
        "group-autoconfirmed": "Panganggo sing otomatis didhedhes (dikonfirmasi)",
        "right-siteadmin": "Kunci lan buka kunci basis data",
        "right-override-export-depth": "Èkspor kaca klebu kaca kagandhèng nganti tataran/''depth'' 5",
        "right-sendemail": "Ngirim layang listrik (e-mail) menyang panganggo liya",
-       "right-passwordreset": "Delok layang èlèktronik panyetèlulangan tembung sandhi",
        "grant-group-email": "Kirim layang élèktronik",
        "grant-createaccount": "Gawé akun",
        "grant-createeditmovepage": "Gawé, besut, lan lih kaca",
        "activeusers-intro": "Iki daptar panganggo sing katon lakuné ing $1 {{PLURAL:$1|dina|dina}} kapungkur.",
        "activeusers-count": "$1 {{PLURAL:$1|suntingan|suntingan}} ing {{PLURAL:$3|dina|$3 dina}} pungkasan",
        "activeusers-from": "Tampilna panganggo wiwit saka:",
-       "activeusers-hidebots": "Delikna bot",
-       "activeusers-hidesysops": "Delikna pangurus",
        "activeusers-noresult": "Naraguna ora ana.",
        "listgrouprights": "Hak-hak grup panganggo",
        "listgrouprights-summary": "Ing ngisor iki kapacak dhaftar grup panganggo sing didéfinisi ing wiki iki, kanthi hak-hak aksès gandhèngané.\nInformasi tambahan perkara hak-hak individual bisa ditemokaké ing [[{{MediaWiki:Listgrouprights-helppage}}|kéné]].",
index 38d9bdb..a2fd8c9 100644 (file)
        "passwordreset-nocaller": "გამომძახებელი უნდა იყოს მიწოდებული",
        "passwordreset-nosuchcaller": "გამომძახებელი არ არსებობს: $1",
        "passwordreset-ignored": "პაროლის გაუქმება არ იქნა შესრულებული. შეიძლება კონფიგურაციაში პროვაიდერი არ იყო გათვალისწინებული?",
-       "passwordreset-invalideamil": "ელ-ფოსტის არასწორი მისამართი",
+       "passwordreset-invalidemail": "ელ-ფოსტის არასწორი მისამართი",
        "passwordreset-nodata": "არც მომხმარებლის სახელი და არც ელ-ფოსტის მისამართი არ იყო მოწოდებული",
        "changeemail": "ელ-ფოსტის მისამართის შეცვლა ან წაშლა",
        "changeemail-header": "შეავსეთ ეს ფორმა მეილის შესაცვლელად. თუ გსურთ თქვენი ანგარიში არ იყოს დაკავშირებული არცერთ მეილთან, ახალი მეილის მისამართის ველი დატოვეთ ცარიელი.",
        "activeusers-intro": "ეს არის მომხმარებელთა სია, რომელთაც აქვს წვლილი უკანასკნელი $1 {{PLURAL:$1|დღის|დღის}} განმავლობაში.",
        "activeusers-count": "$1 {{PLURAL:$1|მოქმედება|მოქმედება}} {{PLURAL:$3|დღის|$3 დღის}} განმავლობაში.",
        "activeusers-from": "მომხმარებელთა ჩვენება, დაწყებული:",
-       "activeusers-hidebots": "რობოტების დამალვა",
-       "activeusers-hidesysops": "ადმინისტრატორების დამალვა",
        "activeusers-noresult": "მომხმარებლები არ არიან ნაპოვნი.",
        "activeusers-submit": "აქტიური მომხმარებლების ჩვენება",
        "listgrouprights": "მომხმარებელთა ჯგუფების უფლებები",
index 0dba198..3397906 100644 (file)
        "yourname": "Paydalanıwshı atı:",
        "yourpassword": "Parol:",
        "yourpasswordagain": "Paroldi qayta kiritin':",
-       "remembermypassword": "Menin' kirgenimdi usı kompyuterde saqlap qal (en' ko'bi menen $1 {{PLURAL:$1|ku'nge|ku'nge}} shekem)",
        "yourdomainname": "Sizin' domen:",
        "login": "Kiriw",
        "nav-login-createaccount": "Kiriw / akkaunt jaratıw",
        "moveddeleted-notice": "Bul bet o'shirilgen.\nTo'mende mag'lıwmat ushın bettin' o'shiriw ha'm ko'shiriw jurnalı ko'rsetilgen.",
        "edit-conflict": "O'zgerislerdegi konflikt.",
        "parser-template-loop-warning": "Shablonlarda qaytalanıw tabıldı: [[$1]]",
-       "cantcreateaccounttitle": "Akkaunt jaratılmadı",
        "cantcreateaccount-text": "[[User:$3|$3]] usı IP adresten ('''$1''') akkaunt jaratıwın blokladı.\n\n$3 keltirilgen sebebi: ''$2''",
        "viewpagelogs": "Usı bettin' jurnalın ko'riw",
        "nohistory": "Bul bettin' o'zgertiw tariyxı joq.",
index cd5ff53..3faa3a8 100644 (file)
        "yourpasswordagain": "Ɛiwed ssekcem awal n tbaḍnit",
        "createacct-yourpasswordagain": "Sergeg awal n uɛeddi",
        "createacct-yourpasswordagain-ph": "Sekcem awal n uɛeddi tikelt nniḍen",
-       "remembermypassword": "Cfu ɣef wawal n tbaḍnit inu di uselkim-agi (i afellay n $1 {{PLURAL:$1|ass|ussan}})",
        "userlogin-remembermypassword": "Eǧǧ taɣimit inu turmidt",
        "userlogin-signwithsecure": "Seqdec tuqqna yettwaḥerzen",
        "yourdomainname": "Taɣult inek",
        "passwordreset-emailtext-user": "Aseqdac $1 ɣef {{SITENAME}} yessutered awennez n awal n uɛaddi i {{SITENAME}} ($4). {{PLURAL:$3|Amiḍan n useqdac agi yeqqen|imiḍanen n iseqdacen agi qqenen}} s tansa e-mail agi :\n\n$2\n\n{{PLURAL:$3|Awal n uɛaddi uɛḍil agi ad i aff tasewti-s|Awalen n uɛaddi uɛḍilen agi ad affen taseweti nsen}} deg {{PLURAL:$5|yiwen ass|$5 ussan}}. Ilaq tura ad qqeneḍ dɣa ad freneḍ awal n uɛaddi amaynut. Lukan mačči d kečč/kem i xedmen asuter agi, naɣ tecfiḍ tura i awal n uɛaddi inek/inem, tzemreḍ ad eǧǧeḍ izen agi.",
        "passwordreset-emailelement": "Isem n useqdac : \n$1\n\nAwal n uɛddi akudan : \n$2",
        "passwordreset-emailsentemail": "Tirawt n uwennez n awal n uɛaddi tetwaceggaɛ.",
-       "passwordreset-emailsent-capture": "Tirawt n uwennez n awal n uɛaddi tetwaceggaɛ, ẓeṛ-itt ddaw agi.",
-       "passwordreset-emailerror-capture": "Tirawt n uwennez n awal n uɛaddi t-arewed, ẓeṛ-itt ddaw agi, lamaɛna aceggaɛ i {{GENDER:$2|umseqdac}} yefkad anezri : $1",
        "changeemail": "Beddel tansa n e-mail",
        "changeemail-header": "Beddel tansa n e-mail n umiḍan",
        "changeemail-no-info": "Ilaq ad qqeneḍ iwakken ad ẓṛeḍ asebter agi.",
        "undo-norev": "Abeddel ur yezmer ara ad yetwekkes acku ulac-itt naɣ tetwekkes yakan",
        "undo-summary": "Ssefsu tasiwelt $1 sɣur [[Special:Contributions/$2|$2]] ([[User talk:$2|Meslay]])",
        "undo-summary-username-hidden": "Semmewet tacaggart $1 sɣur amseqdac yeffren",
-       "cantcreateaccounttitle": "Ur yezmir ara ad yexleq isem n wemseqdac",
        "cantcreateaccount-text": "Asnulfu n umiḍan seg tansa IP (<b>$1</b>) tekyef sɣur [[User:$3|$3]].\n\nTaɣẓint n $3 : ''$2''",
        "cantcreateaccount-range-text": "Asnulfu n umiḍan seg tansiwin IP deg tagrumma <strong>$1</strong>, i sseddan tansa inek/inem IP (<strong>$4</strong>), twawḥelen sɣur [[User:$3|$3]].\n\nTaɣẓint i-d yefka/tefka $3 : <em>$2</em>",
        "viewpagelogs": "Ẓer aɣmis n usebter-agi",
        "activeusers-intro": "Wagi d umuɣ n iseqdacen yexedmen armud deg {{PLURAL:$1|ass agi aneggaru|$1 ussan agi ineggura}}.",
        "activeusers-count": "$1 {{PLURAL:$1|tigawt|tigawin}} deg {{PLURAL:$3|ass aneggaru|$3 ussan ineggura}}",
        "activeusers-from": "Ssken iseqdacen seg :",
-       "activeusers-hidebots": "Ffer iṛubuten",
-       "activeusers-hidesysops": "Ffer inedbalen",
        "activeusers-noresult": "Ur yufi aseqdac.",
        "listgrouprights": "Izerfan n igrawen n iseqdacen",
        "listgrouprights-summary": "Asebter agi yesɛa yiwen umuɣ n igrawen i sengelen deg wiki agi dɣa izerfan n wadduf i qqenen.\nZemrent ad ilint [[{{MediaWiki:Listgrouprights-helppage}}|tilɣa nniḍen]] ɣef izerfan n yiwen.",
        "htmlform-no": "Ala",
        "htmlform-yes": "Ih",
        "htmlform-chosen-placeholder": "Fren taxtiṛit",
-       "sqlite-has-fts": "$1 s anadi deg uḍris ummid yezmer",
-       "sqlite-no-fts": "$1 war anadi deg uḍris ummid yezmer",
        "logentry-delete-delete": "$1 {{GENDER:$2|yemḥa}} asebtar $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|yerred|terred}} asebtar $3",
        "logentry-delete-event": "$1 {{GENDER:$2|yebeddel|tebeddel}} tabanit {{PLURAL:$5|n tadyant n uɣmis|n $5 tidyanin n uɣmis}} ɣef $3: $4",
index ffff096..9dd1e0d 100644 (file)
        "yourname": "Уи цӀэр:",
        "yourpassword": "Пэролыр:",
        "yourpasswordagain": "Иджыри зэ пэролыр:",
-       "remembermypassword": "Сызэрихьэр компьютерым щыIыгъын (махуэу $1 {{PLURAL:$1|щIимыгъуу|щIимыгъуу}})",
        "yourdomainname": "Уи доменыр:",
        "externaldberror": "Щэуэгъуэ хъуа, аутентификациэ щекӀуэкӀым иэ апхуэдиз пӀалъэ уиӀу щыткъым, уи нэкугъуэ аккаунтыр зэпхъуэкӀын.",
        "login": "Системэм зыкъегъэцIыхуын",
        "undo-failure": "Гъэтэрэзыгъуэр хэхыжа хъунукъым, гъэтэрэзыгъуэхэм я зэпхыгъуэр зэремыкӀуэкӀыфым щхьэкӀэ",
        "undo-norev": "Гъэтэрэзыгъуэр хэхыжа хъунукъым зэрщымыӀэм щхьэкӀэ иэ хэхыжагъыху щытщ.",
        "undo-summary": "Гъэтэрэзыгъуэ хэхыжыныр $1 цӀыхухэт [[Special:Contributions/$2|$2]] ([[User talk:$2|тепсэлъыхьыгъуэ]])",
-       "cantcreateaccounttitle": "Аккаунтыр щӀыфынукъым",
        "cantcreateaccount-text": "Аккаунт щӀыныр мы IP-адресыкӀэ (<b>$1</b>) триубыдауэ щытщ [[User:$3|цӀыхухэт $3]].\n\n$3 ар зтеухуауэ къитхыр: ''$2''",
        "viewpagelogs": "Мы напэкӀуэцIым щхьэкӀэ тхылъыр гъэлъэгъуэн",
        "nohistory": "Мы напэкӀуэцӀым и зэхъуэкӀыгъуэхэм я тхыдэ иӀэкъым.",
index b01984c..9275e71 100644 (file)
        "yourpasswordagain": "کلمۂ شناخت(پاسورڈو)دوبارہ نیویشے",
        "createacct-yourpasswordagain": "کلمۂ اجازتو تصدیق کورے",
        "createacct-yourpasswordagain-ph": "پاس ورڈو وا داخل کورے",
-       "remembermypassword": "ھیہ براوزیرا مہ داخلِ نوشتگی معلوماتن یاد لاکھے (زیاتاری زیات $1 {{PLURAL:$1|بس|بسان}} بچے)",
        "userlogin-remembermypassword": "مہ داخل بہچاوے",
        "yourdomainname": "تہ ڈومین",
        "password-change-forbidden": "تتے ھیہ ویکیپیڈیا تان پاس روڈو تبدیل کوریکو اختیار نیکی",
        "listusers-noresult": "ھیہ صارف ملاو نو ہوئے",
        "activeusers": "متحرک صارفینان فہرست",
        "activeusers-from": "مطلوبہ حرفاری شروع باک صفحاتن نمائش:",
-       "activeusers-hidebots": "کھوشت خود کار صارف",
-       "activeusers-hidesysops": "کھوشت منتظمان",
        "activeusers-noresult": "ھیہ صارف ملاو نو ہوئے",
        "listgrouprights-group": "گروہ",
        "listgrouprights-rights": "اختیارات",
index b2a514f..5f62837 100644 (file)
        "yourname": "قاتىسۋشى اتىڭىز:",
        "yourpassword": "قۇپىييا ٴسوزىڭىز:",
        "yourpasswordagain": "قۇپىييا ٴسوزدى قايتالاڭىز:",
-       "remembermypassword": "مەنىڭ كىرگەنىمدى بۇل كومپيۋتەردە ۇمىتپا (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "yourdomainname": "جەلى ۇيشىگىڭىز:",
        "externaldberror": "وسى ارادا نە شەتتىك راستاۋ دەرەكقورىندا قاتە بولدى, نەمەسە شەتتىك تىركەلگىڭىزدى جاڭالاۋ رۇقساتى جوق.",
        "login": "كىرۋ",
        "undo-failure": "بۇل وڭدەمە جوققا شىعارىلمايدى, سەبەبى ارادا قاقتىعىستى وڭدەمەلەر بار.",
        "undo-norev": "بۇل وڭدەمە جوققا شىعارىلمايدى, سەبەبى بۇل جوق نەمەسە جويىلعان.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User_talk:$2|تالقىلاۋى]]) ىستەگەن ٴنومىر $1 نۇسقاسىن جوققا شىعاردى",
-       "cantcreateaccounttitle": "جاڭا تىركەلگى جاسالمادى",
        "cantcreateaccount-text": "بۇل IP جايدان ('''$1''') جاڭا تىركەلگى جاساۋىن [[User:$3|$3]] بۇعاتتاعان.\n\n$3 كەلتىرىلگەن سەبەبى: ''$2''",
        "viewpagelogs": "بۇل بەت ٴۇشىن جۋرنال وقىيعالارىن قاراۋ",
        "nohistory": "مىندا بۇل بەتتىنىڭ تۇزەتۋ تارىيحى جوق.",
index c464d50..590caf6 100644 (file)
@@ -23,7 +23,7 @@
        "tog-hideminor": "Жуықтағы өзгерістерден шағын өңдемелерді жасыру",
        "tog-hidepatrolled": "Тексерілген өңдеулерді жуықтағы өзгерістер тізімінде көрсетпеу",
        "tog-newpageshidepatrolled": "Тексерілген беттерді жаңа беттер тізімінде жасыру",
-       "tog-hidecategorization": "Беттерді санаттауларды жасыру",
+       "tog-hidecategorization": "Беттедің санатталуын жасыру",
        "tog-extendwatchlist": "Бақылау тізімді ұлғайтып барлық өзгерістерді көрсету, ең соңғыларды ғана емес",
        "tog-usenewrc": "Жуықтағы өзгерістер және бақылау тізімінде беті бойынша өзгерістерді топтау",
        "tog-numberheadings": "Мазмұн тақырыптарын автоматты нөмірлеу",
@@ -54,7 +54,7 @@
        "tog-watchlisthideliu": "Бақылау тізіміндегі кірген қатысушылардың өңдеулерін көрсетпеу",
        "tog-watchlisthideanons": "Бақылау тізіміндегі аноним қатысушылардың өңдеулерін көрсетпеу",
        "tog-watchlisthidepatrolled": "Бақылау тізімінде тексерілген өңдеулерді көрсетпеу",
-       "tog-watchlisthidecategorization": "Беттерді санаттауларды жасыру",
+       "tog-watchlisthidecategorization": "Беттедің санатталуын жасыру",
        "tog-ccmeonemails": "Басқа қатысушыға жіберген хатымның есесін өзіме жөнелту",
        "tog-diffonly": "Нұсқалар айырмашылықтарының астында бет мағлұматын көрсетпеу",
        "tog-showhiddencats": "Жасырын санаттарды көрсету",
        "passwordreset-emaildisabled": "E-mail мүмкіндігі бұл уикиде өшірілген.",
        "passwordreset-username": "Қатысушы аты:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Келген хатты қарау керек пе?",
-       "passwordreset-capture-help": "Егер Сіз берілген белгішені қондырсаңыз, қатысушыға жіберілетін уақытша құпия сөз жазылған хат көрсетіледі.",
        "passwordreset-email": "Е-поштаның мекен-жайы:",
        "passwordreset-emailtitle": "{{SITENAME}} тіркелгісі туралы анықтама",
        "passwordreset-emailtext-ip": "Әлде кім (мүмкін сіз болуыңыз, $1 IP адресінен) {{SITENAME}} сайтында ($4) құпия сөзді өзгертуге өтініш білдірді. Мына қатысушы {{PLURAL:$3|аккаунты|аккаунттары}} осы электронды почта қатысты:\n\n$2\n\n{{PLURAL:$3|Бұл уақытша құпия сөз|Бұл уақытша құпия сөздер}} {{PLURAL:$5|бір күнде|$5 күнде}}уақыты аяқталады.\nСіз кіруіңіз және жаңа құпия сөзді таңдауыңыз керек. Егер бұл өтінішті басқа біреу жасаса, немесе сіз  бұрынғы құпия сөзіңізді еске түсірсеңіз және құпия сөзді ауыстыруды қаламасаңыз, сіз бұл хабарламаны ескермей және бұрынғы құпия сөзді қолдана беруіңізге болады.",
        "passwordreset-emailtext-user": "$1 есімді қатысушы {{SITENAME}} сайтында ($4) құпия сөзді өзгертуге өтініш білдірді. Мына қатысушы {{PLURAL:$3|аккаунт|аккаунттар}} осы електронды почта қатысты:\n\n$2\n\n{{PLURAL:$3|Бұл уақытша құпия сөз|Бұл уақытша құпия сөздер}} {{PLURAL:$5|бір күнде|$5 күнде}}уақыты аяқталады.\nСіз кіруіңіз және жаңа құпия сөзді таңдауыңыз керек. Егер бұл өтінішті басқа біреу жасаса, немесе сіз  бұрынғы құпия сөзіңізді еске түсірсеңіз, және құпия сөзді ауыстыруды қаламасаңыз, сіз бұл хабарламаны ескермей және бұрыңғы құпия сөзді қолдана беруіңізге болады.",
        "passwordreset-emailelement": "Қатысушы есімі: \n$1\n\nУақытша құпия сөз: \n$2",
        "passwordreset-emailsentemail": "Бұл email мекенжайы тіркелгіңізге байланысқан, сол себепті құпия сөзді өзгерту электронды пошта арқылы жөнелтіледі.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|email has|emails have}}үшін құпия сөздің қалпына келтіру хабарламасы жіберілді. {{PLURAL:$1|username and password|list of usernames and passwords}} мында көрсетілген.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|user}}-мен электронды поштамен хабарласу нәтижесіз қалды: $1 The {{PLURAL:$3|username and password|list of usernames and passwords}} мында көрсетілген.",
        "changeemail": "Е-пошта мекенжайын өзгерту немесе аластау",
        "changeemail-header": "Е-пошта мекен-жайының өзгертілуі",
        "changeemail-no-info": "Бұл бетке тікелей ену үшін жүйеге кіруіңіз керек.",
        "userrights-reason": "Себебі:",
        "userrights-no-interwiki": "Басқа уикилердегі қатысушы құқықтарын өңдеуге рұқсатыңыз жоқ.",
        "userrights-nodatabase": "$1 дерекқоры жоқ не жергілікті емес.",
-       "userrights-nologin": "Қатысушы құқықтарын тағайындау үшін әкімші тіркелгісімен [[Special:UserLogin|кіруіңіз]] жөн.",
-       "userrights-notallowed": "Сізге қатысушы құқықтарын қосуға немесе алып тастауға рұқсат берілмеген.",
        "userrights-changeable-col": "Өзгерте алатын топтар",
        "userrights-unchangeable-col": "Өзгерте алмайтын топтар",
        "userrights-conflict": "Қатысушы құқықтарының қақтығысы! Өзгертулеріңізді қайта қарап шығыңыз және құптаңыз.",
-       "userrights-removed-self": "Өзіңіздің құқықтарыңызды алып тастадыңыз.  Осылайша бұл бетке бұдан былай қатынай алмайсыз.",
        "group": "Топ:",
        "group-user": "Қатысушылар",
        "group-autoconfirmed": "Өздіктіқұпталған қатысушылар",
        "right-siteadmin": "Дерекқорды құлыптау және құлыптауын өшіру",
        "right-override-export-depth": "Тереңдігі 5-тен жоғары сілтенген бетттерді қамти беттерді экспорттау",
        "right-sendemail": "Басқа қатысушыларға е-пошта жіберу",
-       "right-passwordreset": "Өзгерген құпия сөз арқылы хабарламаларды шолу",
        "right-managechangetags": "[[Special:Tags|Тегтерді]] дерекқордан бастау және жою",
        "right-applychangetags": "[[Special:Tags|Тегтерді]] бір өзгерісімен қолдану",
        "right-changetags": "Кез келген [[Special:Tags|тегті]] жеке нұсқалардан және журнал жазбаларынан аластау және қосу",
        "booksources-search": "Іздеу",
        "booksources-text": "Төменде жаңа және қолданған кітаптар сататын тораптарының сілтемелері тізімделген және ізделген кітаптар туралы қосымша ақпарат болуы мүмкін:",
        "booksources-invalid-isbn": "Берілген ISBN жарамды болып көрінубеуі мүмкін; бастапқы қайнар көзінен еселеуде пайда болған қателерді тексеріңіз.",
+       "magiclink-tracking-isbn": "ISBN сиқырлы сілтемелері қолданылған беттер",
        "specialloguserlabel": "Орындаушы:",
        "speciallogtitlelabel": "Нысана (атауы немесе қатысушының {{ns:user}}:қатысушы есімі):",
        "log": "Журналдар",
        "trackingcategories-msg": "Санатты қадағалау",
        "trackingcategories-name": "Хабарлама атауы",
        "trackingcategories-desc": "Санаттарды қосу шарттары",
-       "restricted-displaytitle-ignored": "Еленбеген көретілетін атауларымен беттер",
+       "restricted-displaytitle-ignored": "Еленбеген көрcетілетін атауларымен беттер",
        "noindex-category-desc": "Бұл бет роботтар арқылы индекстелмеген, себебі онда <code><nowiki>__NOINDEX__</nowiki></code> деген сиқырлы сөзі бар және бұл жалауша рұқсат етілген есім кеңістігінде орналасқан.",
        "index-category-desc": "Бұл бетте <code><nowiki>__INDEX__</nowiki></code> деген код бар (және бұл жалауша рұқсат етілген есім кеңістігінде орналасқан), демек мұнда қалыпты жағдайда роботтар арқылы индекстелмейді.",
        "post-expand-template-inclusion-category-desc": "Беттің мөлшері барлық үлгілерді кеңейткен соң мынадан <code>$wgMaxArticleSize</code> үлкенірек болады, сондықтан біраз үлгілер кеңейтілмейді.",
        "feedback-thanks": "Рахмет! Сіздің кері байланысыңыз \"[$2 $1]\" бетіне қойылды.",
        "feedback-thanks-title": "Рақмет!",
        "feedback-useragent": "Қатысушы агент:",
-       "searchsuggest-search": "Іздеу",
+       "searchsuggest-search": "{{SITENAME}} жобасынан іздеу",
        "searchsuggest-containing": "қамтылуда...",
        "api-error-badaccess-groups": "Сізге бұл уикиге файл жүктеуге рұқсат етілмеген.",
        "api-error-badtoken": "Ішкі қате: Жаман байрақша",
index 39773cc..7ea4dfd 100644 (file)
@@ -5,7 +5,8 @@
                        "GaiJin",
                        "Kaztrans",
                        "아라",
-                       "Macofe"
+                       "Macofe",
+                       "Zpizza"
                ]
        },
        "tog-underline": "Siltemeniñ astın sız:",
        "yourname": "Qatıswşı atıñız:",
        "yourpassword": "Qupïya söziñiz:",
        "yourpasswordagain": "Qupïya sözdi qaýtalañız:",
-       "remembermypassword": "Meniñ kirgenimdi bul komp′ywterde umıtpa (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "yourdomainname": "Jeli üýşigiñiz:",
        "externaldberror": "Osı arada ne şettik rastaw derekqorında qate boldı, nemese şettik tirkelgiñizdi jañalaw ruqsatı joq.",
        "login": "Kirw",
        "undo-failure": "Bul öñdeme joqqa şığarılmaýdı, sebebi arada qaqtığıstı öñdemeler bar.",
        "undo-norev": "Bul öñdeme joqqa şığarılmaýdı, sebebi bul joq nemese joýılğan.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User_talk:$2|talqılawı]]) istegen nömir $1 nusqasın joqqa şığardı",
-       "cantcreateaccounttitle": "Jaña tirkelgi jasalmadı",
        "cantcreateaccount-text": "Bul IP jaýdan ('''$1''') jaña tirkelgi jasawın [[User:$3|$3]] buğattağan.\n\n$3 keltirilgen sebebi: ''$2''",
        "viewpagelogs": "Bul bet üşin jwrnal oqïğaların qaraw",
        "nohistory": "Mında bul bettiniñ tüzetw tarïxı joq.",
        "userrights-reason": "Sebebi:",
        "userrights-no-interwiki": "Basqa wïkïlerdegi paýdalanwşı quqıqtarın öñdewge ruqsatıñız joq.",
        "userrights-nodatabase": "$1 derekqorı joq ne jergilikti emes.",
-       "userrights-nologin": "Qatıswşı quqıqtarın tağaýındaw üşin äkimşi tirkelgisimen [[{{#special:Userlogin}}|kirwiñiz]] jön.",
-       "userrights-notallowed": "Qatıswşı quqıqtarın tağaýındaw üşin tirkelgiñizde ruqsat joq.",
        "userrights-changeable-col": "Özgerte alatın toptar",
        "userrights-unchangeable-col": "Özgerte almaýtın toptar",
        "group": "Top:",
        "listusersfrom": "Mına qatıswşıdan bastap körsetw:",
        "listusers-submit": "Körset",
        "listusers-noresult": "Qatıswşı tabılğan joq.",
+       "activeusers-excludegroups": "Toptarğa jatatın paydalanwşılardı qospaw:",
        "listgrouprights": "Qatıswşı tobı quqıqtarı",
        "listgrouprights-summary": "Kelesi tizimde bul wïkïde tağaýındalğan qatıswşı quqıqtarı (baýlanıstı qatınaw quqıqtarımen birge) körsetiledi.\nJeke quqıqtar twralı köbirek aqparattı [[{{MediaWiki:Listgrouprights-helppage}}|mında]] taba alasız.",
        "listgrouprights-group": "Top",
index 282444d..89564eb 100644 (file)
        "yourpasswordagain": "វាយពាក្យសម្ងាត់ម្តងទៀត៖",
        "createacct-yourpasswordagain": "អះអាង​ពាក្យ​សម្ងាត់",
        "createacct-yourpasswordagain-ph": "បញ្ចូលពាក្យសម្ងាត់ម្ដងទៀត",
-       "remembermypassword": "ចងចាំកំណត់ឈ្មោះចូលរបស់ខ្ញុំក្នុងកុំព្យូទ័រនេះ (សំរាប់រយៈពេលយូរបំផុត $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}})",
        "userlogin-remembermypassword": "រក្សាស្ថានភាពកត់ឈ្មោះចូលរបស់ខ្ញុំ",
        "userlogin-signwithsecure": "ប្រើការតភ្ជាប់មានសុវត្ថិភាព",
        "yourdomainname": "ដូម៉ែនរបស់អ្នក៖",
        "activeusers-intro": "នេះជាបញ្ជីរាយនាមអ្នកប្រើប្រាស់ដែលមានសកម្មភាពក្នុងរូបភាពណាមួយក្នុងរយៈពេល $1 {{PLURAL:$1|ថ្ងៃ|ថ្ងៃ}}ចុងក្រោយ។",
        "activeusers-count": "{{PLURAL:$1|សកម្មភាព|សកម្មភាព}}ចំនួន$1 ក្នុងរយៈពេល{{PLURAL:$3|១ថ្ងៃ|$3 ថ្ងៃ}}ចុងក្រោយ",
        "activeusers-from": "បង្ហាញអត្តនាមផ្ដើមដោយ៖",
-       "activeusers-hidebots": "លាក់រូបយន្ត",
-       "activeusers-hidesysops": "លាក់អភិបាល",
        "activeusers-noresult": "អ្នកប្រើប្រាស់​រកមិនឃើញ​។​",
        "listgrouprights": "សិទ្ធិនិងក្រុមអ្នកប្រើប្រាស់",
        "listgrouprights-summary": "ខាងក្រោមនេះជាបញ្ជីរាយឈ្មោះក្រុមអ្នកប្រើប្រាស់ដែលបានកំណត់ជាមួយនឹងសិទ្ធិរបស់គេនៅលើវិគីនេះ។ មាន[[{{MediaWiki:Listgrouprights-helppage}}|ព័ត៌មានបន្ថែម]] អំពីសិទ្ធិផ្ទាល់ខ្លួន។",
index 02c14f6..98b103f 100644 (file)
@@ -62,7 +62,9 @@
                        "Ellif",
                        "HDNua",
                        "Ykhwong",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Tursetic",
+                       "Jerrykim306"
                ]
        },
        "tog-underline": "링크에 밑줄:",
        "tog-diffonly": "편집 차이를 비교할 때 문서 내용을 보지 않기",
        "tog-showhiddencats": "숨은 분류 보이기",
        "tog-norollbackdiff": "되돌리기 후 차이를 보지 않기",
-       "tog-useeditwarning": "바꾼 내용을 저장하지 않고 편집 페이지를 벗어날 때 내게 경고하기",
+       "tog-useeditwarning": "바꾼 내용을 저장하지 않고 편집 페이지를 벗어날 때 내게 알리기",
        "tog-prefershttps": "로그인하는 동안 항상 보안 연결 사용",
        "underline-always": "항상",
        "underline-never": "항상 치지 않기",
        "views": "보기",
        "toolbox": "도구",
        "tool-link-userrights": "{{GENDER:$1|사용자}} 그룹 변경",
+       "tool-link-userrights-readonly": "{{GENDER:$1|사용자}} 그룹을 보기",
        "tool-link-emailuser": "이 {{GENDER:$1|사용자}}에게 이메일 보내기",
        "userpage": "사용자 문서 보기",
        "projectpage": "프로젝트 문서 보기",
        "passwordreset-emaildisabled": "이 위키에서 이메일 기능이 비활성화되어 있습니다.",
        "passwordreset-username": "사용자 이름:",
        "passwordreset-domain": "도메인:",
-       "passwordreset-capture": "발송 결과 이메일을 보시겠습니까?",
-       "passwordreset-capture-help": "이 상자에 체크하면 이메일이 발송된 즉시 임시 비밀번호가 담긴 이메일을 볼 수 있습니다.",
        "passwordreset-email": "이메일 주소:",
        "passwordreset-emailtitle": "{{SITENAME}} 계정에 대한 자세한 정보",
        "passwordreset-emailtext-ip": "당신일 수도 있는 $1 IP 주소를 사용하는 사용자가 {{SITENAME}} ($4)의 비밀번호 재설정을 요청하였습니다.\n이 이메일 주소와 연관된 사용자 {{PLURAL:$3|계정}}의 목록입니다:\n\n$2\n\n{{PLURAL:$3|이 임시 비밀번호}}는 {{PLURAL:$5|1일|$5일}} 후에 만료됩니다.\n이 비밀번호로 로그인한 후 비밀번호를 바꾸십시오. 만약 당신이 아닌 다른 사람이 요청하였거나,\n원래의 비밀번호를 기억해냈다면, 이 메시지를 무시하고\n이전의 비밀번호를 계속 사용할 수 있습니다.",
        "passwordreset-emailelement": "사용자 이름: \n$1\n\n임시 비밀번호: \n$2",
        "passwordreset-emailsentemail": "당신의 계정과 연결된 이메일 주소가 있다면, 비밀번호 재설정 메일이 전해질 것입니다.",
        "passwordreset-emailsentusername": "이 사용자 이름과 연결된 이메일 주소가 있다면 비밀번호 초기화 이메일이 전송됩니다.",
-       "passwordreset-emailsent-capture2": "비밀번호 재설정 이메일을 보냈습니다. {{PLURAL:$1|사용자 이름과 비밀번호는|사용자 이름과 비밀번호의 목록은}} 아래에 나타납니다.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|사용자}} 이메일 보내기 실패: $1 {{PLURAL:$3|사용자 이름과 비밀번호가|사용자 이름과 비밀번호의 목록이}} 아래에 나타납니다.",
        "passwordreset-nocaller": "호출자를 지정해야 합니다",
        "passwordreset-nosuchcaller": "호출자가 존재하지 않습니다: $1",
        "passwordreset-ignored": "비밀번호 재설정을 처리하지 못했습니다. 제공자가 구성되지 않았기 때문일 수 있습니다.",
-       "passwordreset-invalideamil": "잘못된 이메일 주소",
+       "passwordreset-invalidemail": "잘못된 이메일 주소",
        "passwordreset-nodata": "사용자 이름이나 이메일 주소가 지정되지 않았습니다",
        "changeemail": "이메일 주소를 바꾸거나 제거하기",
        "changeemail-header": "이메일 주소를 바꾸려면 이 양식을 채우세요. 계정에서 이메일 연동을 취소하고 싶다면 양식을 제출할 때 새 이메일 주소를 공란으로 두세요.",
        "prefs-help-recentchangescount": "이 설정은 최근 바뀜, 문서 역사와 기록에 적용됩니다.",
        "prefs-help-watchlist-token2": "내 주시문서 목록의 웹 피드의 비밀 키입니다.\n이 키를 알고 있는 사람은 내 주시문서 목록을 읽을 수 있으니 이 키를 공유하지 마세요.\n필요하다면 [[Special:ResetTokens|이 키를 재설정할 수 있습니다]].",
        "savedprefs": "설정을 저장했습니다.",
-       "savedrights": "$1의 사용자 권한이 저장되었습니다.",
+       "savedrights": "{{GENDER:$1|$1}}의 사용자 그룹이 저장되었습니다.",
        "timezonelegend": "시간대:",
        "localtime": "현지 시각:",
        "timezoneuseserverdefault": "위키 기본값 사용 ($1)",
        "prefswarning-warning": "사용자 환경 설정에서 바뀐 것이 아직 저장되어 있지 않습니다.\n사용자 환경 설정에서 \"$1\"을 클릭하지 않고 이 페이지를 떠나면 바뀌지 않습니다.",
        "prefs-tabs-navigation-hint": "팁: 탭 목록에서 탭 사이를 둘러보려면 왼쪽과 오른쪽 화살표 키를 사용할 수 있습니다.",
        "userrights": "사용자 권한 관리",
-       "userrights-lookup-user": "사용자 권한 관리",
+       "userrights-lookup-user": "사용자 선택",
        "userrights-user-editname": "사용자 이름 입력:",
-       "editusergroup": "{{GENDER:$1|사용자}} 그룹 편집",
+       "editusergroup": "사용자 그룹 불러오기",
        "editinguser": "<strong>[[User:$1|$1]]</strong> $2 {{GENDER:$1|사용자}}의 권한 바꾸기",
        "userrights-editusergroup": "사용자 그룹 편집",
        "saveusergroups": "{{GENDER:$1|사용자}} 권한 저장",
        "userrights-reason": "이유:",
        "userrights-no-interwiki": "다른 위키의 사용자 권한을 바꿀 권한이 없습니다.",
        "userrights-nodatabase": "데이터베이스 $1이 존재하지 않거나 로컬에 있지 않습니다.",
-       "userrights-nologin": "사용자의 권한을 바꾸기 위해서는 반드시 관리자 계정으로 [[Special:UserLogin|로그인]]해야 합니다.",
-       "userrights-notallowed": "다른 사용자의 권한을 추가하거나 제거할 권한이 없습니다.",
        "userrights-changeable-col": "바꿀 수 있는 권한",
        "userrights-unchangeable-col": "바꿀 수 없는 권한",
        "userrights-conflict": "사용자 권한 바꾸기가 충돌합니다! 바뀜을 검토하고 확인하세요.",
-       "userrights-removed-self": "자신의 권한을 제거했습니다. 따라서 더 이상 이 문서에 접근할 수 없습니다.",
        "group": "그룹:",
        "group-user": "사용자",
        "group-autoconfirmed": "자동 인증된 사용자",
        "right-autoconfirmed": "IP 기반의 속도 제한에 영향을 받지 않음",
        "right-bot": "봇의 편집으로 취급",
        "right-nominornewtalk": "토론 문서에서 사소한 편집으로 새 메시지 알림을 보내지 않기",
-       "right-apihighlimits": "API ì\83\81í\95\9c ì\83\81ì\8a¹",
+       "right-apihighlimits": "API ì¿¼ë¦¬ì\97\90ì\84\9c ë\8d\94 ë\86\92ì\9d\80 ì \9cí\95\9c ì\82¬ì\9a©",
        "right-writeapi": "쓰기 API 사용",
        "right-delete": "문서 삭제",
        "right-bigdelete": "문서 역사가 긴 문서를 삭제",
        "right-siteadmin": "데이터베이스를 잠그거나 잠금 해제",
        "right-override-export-depth": "5단계로 링크된 문서를 포함하여 문서를 내보내기",
        "right-sendemail": "다른 사용자에게 이메일 보내기",
-       "right-passwordreset": "비밀번호 재설정 이메일을 보기",
        "right-managechangetags": "데이터베이스에서 [[Special:Tags|태그]]를 만들거나 지우기",
        "right-applychangetags": "자신이 편집할 때 [[Special:Tags|태그]]를 적용하기",
        "right-changetags": "문서의 특정 판과 특정 기록 항목에 임의의 [[Special:Tags|태그]]를 추가하거나 제거하기",
        "apisandbox-alert-field": "이 필드의 값이 유효하지 않습니다.",
        "apisandbox-continue": "계속",
        "apisandbox-continue-clear": "지우기",
+       "apisandbox-param-limit": "최대 한계치를 사용하려면 <kbd>max</kbd>를 입력하십시오.",
+       "apisandbox-multivalue-all-namespaces": "$1 (모든 이름공간)",
+       "apisandbox-multivalue-all-values": "$1 (모든 값)",
        "booksources": "책 찾기",
        "booksources-search-legend": "책 원본 검색",
        "booksources-isbn": "ISBN:",
        "booksources-search": "검색",
        "booksources-text": "아래의 목록은 새 책이나 중고 책을 판매하는 바깥 사이트로, 원하는 책의 정보를 얻을 수 있습니다.",
        "booksources-invalid-isbn": "입력한 ISBN이 올바르지 않은 것으로 보입니다. 원본과 대조해 문제가 있는지 확인해보세요.",
+       "magiclink-tracking-rfc": "RFC 매직 링크를 사용하는 문서",
+       "magiclink-tracking-rfc-desc": "이 문서는 RFC 매직 링크를 사용합니다. 이관 방법을 보려면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org]를 참조하십시오.",
+       "magiclink-tracking-pmid": "PMID 매직 링크를 사용하는 문서",
+       "magiclink-tracking-pmid-desc": "이 문서는 PMID 매직 링크를 사용합니다. 이관 방법을 보려면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org]를 참조하십시오.",
+       "magiclink-tracking-isbn": "ISBN 매직 링크를 사용하는 문서",
+       "magiclink-tracking-isbn-desc": "이 문서는 ISBN 매직 링크를 사용합니다. 이관 방법을 보려면 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org]를 참조하십시오.",
        "specialloguserlabel": "작업 수행자:",
        "speciallogtitlelabel": "대상 (사용자계정에 대한 제목 또는 {{ns:user}}:사용자이름):",
        "log": "기록 목록",
        "activeusers-count": "마지막 {{PLURAL:$3|$3일}} 사이의 {{PLURAL:$1|활동}} $1회",
        "activeusers-from": "다음으로 시작하는 사용자를 보기:",
        "activeusers-groups": "그룹에 속한 사용자 표시:",
+       "activeusers-excludegroups": "그룹에 속한 사용자 제외:",
        "activeusers-noresult": "사용자를 찾을 수 없습니다.",
        "activeusers-submit": "활동하고 있는 사용자 보이기",
        "listgrouprights": "사용자 권한 목록",
        "modifiedarticleprotection": "님이 \"[[$1]]\" 문서의 보호 설정을 바꿨습니다",
        "unprotectedarticle": "\"[[$1]]\" 문서를 보호 해제했습니다",
        "movedarticleprotection": "님이 문서의 보호 설정을 \"[[$2]]\"에서 \"[[$1]]\"(으)로 이동했습니다",
+       "protectedarticle-comment": "\"[[$1]]\" 문서를 {{GENDER:$2|보호했습니다}}",
+       "modifiedarticleprotection-comment": "\"[[$1]]\" 문서의 {{GENDER:$2|보호 수준을 변경했습니다}}",
+       "unprotectedarticle-comment": "\"[[$1]]\" 문서의 {{GENDER:$2|보호를 해제했습니다}}",
        "protect-title": "\"$1\" 보호하기",
        "protect-title-notallowed": "\"$1\" 문서의 보호 수준 보기",
        "prot_1movedto2": "[[$1]] 문서를 [[$2]] 문서로 이동함",
        "patrol-log-header": "문서 점검에 대한 기록입니다.",
        "log-show-hide-patrol": "점검 기록을 $1",
        "log-show-hide-tag": "태그 기록을 $1",
+       "confirm-markpatrolled-button": "확인",
+       "confirm-markpatrolled-top": "$2의 $3 판을 점검한 것으로 표시하시겠습니까?",
        "deletedrevision": "예전 $1 판이 삭제되었습니다.",
        "filedeleteerror-short": "파일 삭제 오류: $1",
        "filedeleteerror-long": "파일을 삭제하는 도중 오류가 발생했습니다:\n\n$1",
        "tags-deactivate": "비활성화",
        "tags-hitcount": "$1개 {{PLURAL:$1|바뀜}}",
        "tags-manage-no-permission": "태그를 변경할 권한이 없습니다.",
-       "tags-manage-blocked": "차단된 상태에서는 변경 태그를 관리할 수 없습니다.",
+       "tags-manage-blocked": "{{GENDER:$1|당신이}} 차단된 상태에서는 변경 태그를 관리할 수 없습니다.",
        "tags-create-heading": "태그 생성",
        "tags-create-explanation": "기본적으로 새로 생성된 태그는 사용자와 봇이 사용할 수 있습니다.",
        "tags-create-tag-name": "태그 이름:",
        "tags-deactivate-not-allowed": "\"$1\" 태그를 비활성화할 수 없습니다.",
        "tags-deactivate-submit": "비활성화",
        "tags-apply-no-permission": "사용자의 변경 사항과 변경 태그를 적용할 권한이 없습니다.",
-       "tags-apply-blocked": "차단된 상태에서는 사용자의 변경 사항과 변경 태그를 적용할 수 없습니다.",
+       "tags-apply-blocked": "{{GENDER:$1|당신이}} 차단된 상태에서는 사용자의 변경 사항과 변경 태그를 적용할 수 없습니다.",
        "tags-apply-not-allowed-one": "\"$1\" 태그를 수동으로 추가하는 것은 허용되지 않습니다.",
        "tags-apply-not-allowed-multi": "다음 {{PLURAL:$2|태그를}} 수동으로 추가하는 것은 허용되지 않습니다: $1",
        "tags-update-no-permission": "태그를 문서 판이나 로그 기록에서 추가하거나 삭제할 권한이 없습니다.",
-       "tags-update-blocked": "차단된 상태에서는 변경 태그를 추가하거나 제거할 수 없습니다.",
+       "tags-update-blocked": "{{GENDER:$1|당신이}} 차단된 상태에서는 변경 태그를 추가하거나 제거할 수 없습니다.",
        "tags-update-add-not-allowed-one": "\"$1\" 태그를 수동으로 추가하는 것은 허용되지 않습니다.",
        "tags-update-add-not-allowed-multi": "다음 {{PLURAL:$2|태그는}} 수동으로 추가하는 것이 허용되지 않습니다: $1",
        "tags-update-remove-not-allowed-one": "\"$1\" 태그를 제거하는 것은 허용되지 않습니다.",
        "mw-widgets-dateinput-no-date": "선택된 날짜 없음",
        "mw-widgets-titleinput-description-new-page": "문서가 존재하지 않습니다",
        "mw-widgets-titleinput-description-redirect": "$1 문서로 넘겨주기",
+       "mw-widgets-categoryselector-add-category-placeholder": "분류 추가...",
        "sessionmanager-tie": "여러 요청 인증 유형 결합할 수 없습니다: $1.",
        "sessionprovider-generic": "$1 세션",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "쿠키 기반 세션",
        "authmanager-authn-autocreate-failed": "로컬 계정 자동 생성 실패: $1",
        "authmanager-change-not-supported": "지정된 자격 증명을 사용하고 있는 곳이 없어서 변경할 수 없습니다.",
        "authmanager-create-disabled": "계정 만들기가 금지되어 있습니다.",
-       "authmanager-create-from-login": "ê³\84ì \95ì\9d\84 ë§\8cë\93\9c려면, ì¹¸ë\93¤을 채워 주십시오.",
+       "authmanager-create-from-login": "ê³\84ì \95ì\9d\84 ë§\8cë\93¤ë ¤ë©´ ë¹\88칸을 채워 주십시오.",
        "authmanager-create-not-in-progress": "계정 만들기가 진행 중이 아니거나 세션 데이터를 분실했습니다. 처음부터 다시 시작해 주십시오.",
        "authmanager-create-no-primary": "제공된 자격 증명은 계정 생성에 쓰일 수 없습니다.",
        "authmanager-link-no-primary": "제공된 자격 증명은 계정을 연결하는 데 쓰일 수 없습니다.",
        "usercssispublic": "주목해 주십시오: CSS의 하위 문서들은 다른 사용자들이 볼 수 있기 때문에 기밀 데이터를 포함해서는 안 됩니다.",
        "restrictionsfield-badip": "유효하지 않은 IP 주소나 대역: $1",
        "restrictionsfield-label": "허용된 IP 대역:",
-       "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "오류: $1",
-       "edit-error-long": "오류:\n\n$1"
+       "restrictionsfield-help": "줄 단위의 하나의 IP 주소 또는 CIDR 대역입니다. 모든 곳에 적용하려면, 다음을 사용하세요<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 18976ba..557bc61 100644 (file)
        "yourpasswordagain": "Паролну джангыдан джаз:",
        "createacct-yourpasswordagain": "Паролну бегит",
        "createacct-yourpasswordagain-ph": "Паролну энтда бир кере джаз",
-       "remembermypassword": "Бу компьютерде мени тергеў джазыўуму сакълаб тур (эм кёб: $1 {{PLURAL:$1|бир кюн|кюн}})",
        "userlogin-remembermypassword": "Системада туруу",
        "userlogin-signwithsecure": "Джакъланнган байлам",
        "yourdomainname": "Сизни доменигиз:",
        "passwordreset-emailtitle": "{{SITENAME}} сайтдагъы тергеу джазыуну юсюнден билгиле",
        "passwordreset-emailelement": "Къошулуучуну аты: \n$1\n\nБолджаллы пароль: \n$2",
        "passwordreset-emailsentemail": "Пароль бла e-mail ийилди.",
-       "passwordreset-emailsent-capture": "Ийилген пароль эсгертиу e-mail тюбюрекде берилибди.",
-       "passwordreset-emailerror-capture": "Пароль эсгертиу e-mail генерация этилди (тюбюрекде берилибди), аны {{GENDER:$2|къошулуучугъа}} ашырыу джетишимсиз болду, чурум: $1",
        "changeemail": "Электрон почтаны адресин ауушдур",
        "changeemail-header": "Электрон почтаны адресин ауушдуруу",
        "changeemail-no-info": "Бу бетни кёрюр ючюн сиз системагъа тергеу джазыуугъуз (аккаунтугъуз) бла кирирге керексиз.",
        "undo-failure": "Бир-бирине келишмегени себебли, тюрлениу ызына алынамады.",
        "undo-norev": "Болмагъаны неда кетерилгени ючюн, тюрлениу ызына алыналлыкъ тюлдю.",
        "undo-summary": "$1 тюрлениу [[Special:Contributions/$2|$2]] ([[User talk:$2|сюзюу]]) ызына алынды.",
-       "cantcreateaccounttitle": "Акууант къурар мадар джокъду",
        "cantcreateaccount-text": "Бу IP-адресден ('''$1''') хайырланыучу къошулуу, [[User:$3|$3]] джанындан тыйылгъанды.\n\n\n$3 джанындан берилген сылтау: ''$2''",
        "viewpagelogs": "Бу бетни журналларына къара",
        "nohistory": "Бу бетни тюрлениулерини тарихи джокъду.",
        "activeusers-intro": "Бу, ахыр $1 {{PLURAL:$1|1=кюнде|кюнде}} къаллайда болсун ишлетме кёргюзген къошлуучуланы тизмесиди.",
        "activeusers-count": "Ахыр {{PLURAL:$3|1=кюнде|$3 кюнде}} $1 {{PLURAL:$1|1=тюрлендириу|тюрлендириу}}",
        "activeusers-from": "Бу бла башланнган къошлуучуланы кёргюз:",
-       "activeusers-hidebots": "Ботланы джашыр",
-       "activeusers-hidesysops": "Администраторланы джашыр",
        "activeusers-noresult": "Къошлуучу табылмады.",
        "listgrouprights": "Къошулуучуланы къауумуну хакълары",
        "listgrouprights-summary": "Тюбюндеги бу викиде танылгъан къошулуучу къауумланы эмда аланы хакъларыны тизмеси.\nЭнчи хакъла бла байламлы [[{{MediaWiki:Listgrouprights-helppage}}|асламыракъ билги]] болургъа болур.",
        "htmlform-chosen-placeholder": "Вариантны сайлагъыз",
        "htmlform-cloner-create": "Энтда къош",
        "htmlform-cloner-delete": "Кетер",
-       "sqlite-has-fts": "$1 толу текст излеуню хайырландыргъан",
-       "sqlite-no-fts": "$1 толу текст излеуню хайырландыра билмеген",
        "logentry-delete-delete": "$3 бетни $1 {{GENDER:$2|кетерди}}",
        "logentry-delete-restore": "$3 бетни $1 {{GENDER:$2|ызына салды}}",
        "revdelete-content-hid": "ичиндегиси джашырылыбды",
index 3586530..7d67c36 100644 (file)
        "yourpasswordagain": "Noch ens dat Passwood",
        "createacct-yourpasswordagain": "Noch ens dat Paßwoot",
        "createacct-yourpasswordagain-ph": "Jivv_et Paßwoot norrens en!",
-       "remembermypassword": "Op Duur aanmelde (hält {{PLURAL:$1|för eine Daach|bes op $1 Dääsch|bloß för hück}})",
        "userlogin-remembermypassword": "Op Duur enlogge",
        "userlogin-signwithsecure": "Verschlößeld enlogge",
        "cannotloginnow-title": "Ennlogge jeiht jrahd nit",
        "botpasswords-label-resetpassword": "Paßwoot neu säze",
        "botpasswords-label-grants": "Aanwändba Rääschte:",
        "botpasswords-help-grants": "Jehde Ennwellejong deihjd e Räsch wigger jävve, wad enem Metmaacher övver singe Zohjang alld zohschteihjt.\nLoor op de Sigg met de [[Special:ListGrants|Tabäll met de Rääschde un Enwellejonge]], wann De mih weße wells.",
-       "botpasswords-label-restrictions": "Beschränkonge:",
        "botpasswords-label-grants-column": "Zohjelohße",
        "botpasswords-bad-appid": "„$1“ es keine jölltejje Nahme för ene Bot.",
        "botpasswords-insert-failed": "Kunnt keine Bot mem Nahme „$1“ derbei donn. Wohr velleijsch ald doh.",
        "passwordreset-emailerror-capture2": "{{GENDER:$2|Däm|Däm|Däm Metmaacher|Dä|Däm}} $1 en <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> ze scheke hät nit jeflupp: {{PLURAL:$3|Dä Nahme vum Metmaacher un dat Paßwood|Di Leß met dä Nahme un Paßwööter|Nix weed}} heh noh aanjezeijsch.",
        "passwordreset-nocaller": "Entärne Fähler: Ene Oprohfer moß aanjejovve sin.",
        "passwordreset-nosuchcaller": "Entärne Fähler: Dä Oprohfer „$1“ känne mer nit.",
-       "passwordreset-invalideamil": "Dat es en onjöltejje Addräß fö de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
+       "passwordreset-invalidemail": "Dat es en onjöltejje Addräß fö de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i>",
        "passwordreset-nodata": "Keine Metmaacher_Nahme un kein Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> es aanjejovve woode.",
        "changeemail": "Donn en Adräß för de <i lang=\"en\">e-mail</i> ändere udder fott schmiiße",
        "changeemail-header": "Donn heh dat Fommulaa ußfölle, öm Ding Adräß för de <i lang=\"en\" xml:lang=\"en\" dir=\"ltr\" title=\"„de eläktrohnesche Poß“\">e-mail</i> ze ändere. Wann De en Adräß loß wähde wells, maach dat Fäld läddesch, ih dat De dat Fommolaa loß scheks.",
        "activeusers-intro": "Dat heh es en Leß met dä Metmaacher, di {{PLURAL:$1|zick jäßtere|en de läzde $1 Dääsch|hück}} ööhnsjät jemaat han.",
        "activeusers-count": "{{PLURAL:$1|ein Änderong|$1 Änderonge|kein Änderonge}} {{PLURAL:$3|aam lezde Daach|en de lezte $3 Dääsch|hück}}",
        "activeusers-from": "Donn de Metmaacher zeije aff:",
-       "activeusers-hidebots": "De Bots fott lohße",
-       "activeusers-hidesysops": "De Wiki_Köbesse fott lohße",
        "activeusers-noresult": "Kein Metmaacher jefonge.",
        "activeusers-submit": "Lohß jonn!",
        "listgrouprights": "Metmaacher_Jroppe-Rääschte",
        "htmlform-title-not-exists": "$1 jidd_et nit.",
        "htmlform-user-not-exists": "<strong>$1</strong> jidd_et nit.",
        "htmlform-user-not-valid": "<strong>$1</strong> es keine jöltejje Nahme för ene Metmaacher.",
-       "sqlite-has-fts": "Version $1 (un kann en janze Täxte söhke)",
-       "sqlite-no-fts": "Version $1 (kann ävver nit en janze Täxte söhke)",
        "logentry-delete-delete": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di Sigg „$3“ fottjeschmeße.",
        "logentry-delete-restore": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät di vörmohls fottjeschmeße Sigg „$3“ wider zeröck jehollt.",
        "logentry-delete-event": "{{GENDER:$2|Dä|Dat|Dä Metmaacher|De|Dat}} $1 hät för {{PLURAL:$5|eine Logboochendraach|$5 Logboochendrääsh|keine Logboochendraach}} vun dä Sigg „$3“ $4.",
        "feedback-external-bug-report-button": "Donne ene Fähler mällde, ene Wonsch för en Verbäßerong ennreische, udder anndere täschneche Idee opbränge.",
        "feedback-dialog-title": "En Rökmäldong jävve",
        "feedback-dialog-intro": "Dat Fommolaa kam_mer för en Rökmäldong bruche. Di kütt zesamme met Dingem Metmaacher_Nahme op di Sigg „$1“.",
-       "feedback-error-title": "Fähler",
        "feedback-error1": "Fähler: dat <i lang=\"en\">API</i> säät jät, wat mer nit kenne",
        "feedback-error2": "Fähler: de Sigg ze ändere es donävve jejange",
        "feedback-error3": "Fähler: dat <i lang=\"en\">API</i> joov kein Antwoot",
index 073f2a3..dcc8529 100644 (file)
@@ -37,6 +37,7 @@
        "tog-watchdefault": "Rûpelên min guhertin û dosyeyên min barkirin, têxe nav lîsteya min a şopandinê",
        "tog-watchmoves": "Rûpel û dosyeyên ku ez navên wan diguherînim, têxe nav lîsteya min a şopandinê",
        "tog-watchdeletion": "Rûpel û dosyeyên min jêbirin, têxe nav lîsteya min a şopandinê",
+       "tog-watchuploads": "Dosyeyên ku ez bar dikim tevlî lîsteya min a şopandinê bike",
        "tog-minordefault": "Her guhertinekê weke guhertineke biçûk nîşan bide",
        "tog-previewontop": "Pêşdîtina gotarê li jorî cihê guherandinê nîşan bide",
        "tog-previewonfirst": "Li cem guherandinê hertim yekemîn pêşdîtinê nîşan bide",
        "newwindow": "(di pencereyeke din de wê were nîşandan)",
        "cancel": "Betal bike",
        "moredotdotdot": "Bêhtir...",
-       "morenotlisted": "Ev lîste nehatiye temamkirin.",
+       "morenotlisted": "Dibe ku ev lîste neqediyaye.",
        "mypage": "Rûpela min",
        "mytalk": "Gotûbêja min",
        "anontalk": "Gotûbêj",
        "nocookiesnew": "Hesabê bikarhêner hatibû çêkirin, lê te xwe qeyd nekiriye. {{SITENAME}} ji bo qeydkirina bikarhêneran cookie'yan bikartîne. Te bikaranîna cookie'yan girtiye. Xêra xwe cookie'yan qebûl bike, piştre bi navê bikarhêner û şîfreya xwe têkeve.",
        "nocookieslogin": "Ji bo qeydkirina bikarhêneran {{SITENAME}} \"cookies\" bikartîne. Te fonksîyona \"cookies\" girtîye. Xêra xwe kerema xwe \"cookies\" gengaz bike û careke din biceribîne.",
        "noname": "Navê ku te nivîsand ne derbasdar e.",
-       "loginsuccesstitle": "Têketin serkevtî bû!",
+       "loginsuccesstitle": "Tu têketî",
        "loginsuccess": "Tu niha di {{SITENAME}} de tomarkirî yî wek \"$1\".",
        "nosuchuser": "Bikarhênerê bi navê \"$1\" tune. Navê rast binivîse an bi vê formê <b>hesabekî nû çêke</b>. (Ji bo hevalên nû \"Têkeve\" çênabe!)",
        "nosuchusershort": "Li vê derê ne bikarhênerek bi navî \"$1\" heye. Li nivîsandinê xwe seke.",
        "retypenew": "Şîfreya nû careke din binîvîse",
        "resetpass_submit": "Şîfreyê pêkbîne û têkeve",
        "changepassword-success": "Şîfreya te hate guhertandin!",
+       "botpasswords": "Şîfreyên bot",
        "botpasswords-label-appid": "Navê bot:",
        "botpasswords-label-create": "Çêke",
        "botpasswords-label-update": "Rojane bike",
        "passwordreset-emailtitle": "Hûragahiyên hesab li ser {{SITENAME}}",
        "passwordreset-emailelement": "Navê bikarhêner:\n$1\n\nŞîfreya niha:\n$2",
        "passwordreset-emailsentemail": "E-nameyeke bibîrxistinê hate şandin.",
-       "passwordreset-invalideamil": "Navnîşana enameyê ya nederbasdar",
+       "passwordreset-invalidemail": "Navnîşana enameyê ya nederbasdar",
        "changeemail": "Navnîşana enameya xwe biguherîne an rabike",
        "changeemail-oldemail": "Navnîşana e-nameya niha:",
        "changeemail-newemail": "Navnîşana e-nameya nû:",
        "searchprofile-images-tooltip": "Li pelan bigere",
        "searchprofile-everything-tooltip": "Di hemû naverokada bigere (tevî gotûbêja)",
        "search-result-size": "$1 ({{PLURAL:$2|peyvek|$2 peyv}})",
-       "search-redirect": "(beralîkirin $1)",
+       "search-redirect": "(beralîkirina ji $1)",
        "search-section": "(beş $1)",
        "search-category": "(kategorî $1)",
        "search-file-match": "(bi naveroka dosye re lê te)",
        "userrights-reason": "Sedem:",
        "userrights-no-interwiki": "Mafê te ji bo guherandina mafên bikarhênerên di Wîkiyên din de nîne.",
        "userrights-nodatabase": "Danegeh $1 nîne an ne ya vir e.",
-       "userrights-nologin": "Ji bo guherandina mafên bikarhêneran, divê tu bi hesabê rêveber [[Special:UserLogin|têkevî]].",
-       "userrights-notallowed": "Account'a te mafê xwe tune ye ji bo guherandina mafên bikarhêneran.",
        "userrights-changeable-col": "Komên ku tu dikarî biguherînî",
        "userrights-unchangeable-col": "Komên ku tu nikarî biguherînî",
        "group": "Kom:",
        "statistics-pages": "Rûpel",
        "statistics-pages-desc": "Hemû rûpelên di vê wîkiyê de, bi hemû rûpelên gotûbêj, beralîkirin, hwd.",
        "statistics-files": "Wêneyên barkirî",
+       "statistics-edits": "Hejmara guherandinên rûpelan ji avabûna {{SITENAME}} heta niha",
        "statistics-users": "[[Special:ListUsers|Bikarhênerên tomarkirî]]",
        "statistics-users-active": "Bikarhênerên çalak",
        "pageswithprop-submit": "Biçe",
        "protectedtitles-submit": "Sernavan nîşan bide",
        "listusers": "Lîsteya bikarhêneran",
        "listusers-editsonly": "Tenê bikarhênerên bi guherrandinan nîşan bide",
+       "listusers-creationsort": "Li gorî dema çêkirina hesab parzûn bike",
        "usercreated": "di $1 de, li $2 hate çêkirin",
        "newpages": "Rûpelên nû",
        "newpages-submit": "Nîşan bide",
        "listusers-blocked": "(hate astengkirin)",
        "activeusers": "Lîsteya bikarhênerên çalak",
        "activeusers-from": "Li bikarhênerên bi vê dest pê dikin bigere:",
-       "activeusers-hidebots": "Bot'an veşêre",
-       "activeusers-hidesysops": "Rêveberan veşêre",
        "activeusers-noresult": "Tu bikarhêner nehate dîtin.",
        "activeusers-submit": "Bikarhênerên çalak nîşan bide",
        "listgrouprights": "Mafên koma bikarhêner",
        "wlshowlast": "Guhertinên berî $1 saetan, $2 rojan, ya  nîşan bide",
        "watchlist-hide": "Veşêre",
        "watchlist-submit": "Nîşan bide",
+       "wlshowhideminor": "guherandinên biçûk",
        "wlshowhidebots": "bot",
        "wlshowhideliu": "bikarhênerên tomarkirî",
        "wlshowhideanons": "bikarhênerên bênav",
        "sp-contributions-userrights": "birêvebirina mafên bikarhêneran",
        "sp-contributions-search": "Li beşdariyan bigere",
        "sp-contributions-username": "Navnîşana IP'yê an jî navê bikarhêner:",
+       "sp-contributions-newonly": "Tenê rûpelên hatine çêkirin nîşan bide",
+       "sp-contributions-hideminor": "Guherandinên biçûk veşêre",
        "sp-contributions-submit": "Lêgerîn",
        "whatlinkshere": "Girêdanên li ser vê rûpelê",
        "whatlinkshere-title": "Rûpelan, yê berve $1 tên",
        "pageinfo-header-properties": "Taybetmendiyên rûpelê",
        "pageinfo-display-title": "Sernavê nîşan bide",
        "pageinfo-language": "Zimanê naveroka rûpelê",
-       "pageinfo-watchers": "Hejmara kesên dişopînin",
+       "pageinfo-watchers": "Hejmara şopînerên rûpelê",
        "pageinfo-redirects-name": "Hejmara beralîkirinên ber bi vê rûpelê ve",
        "pageinfo-subpages-name": "Binrûpelên vê rûpelê",
        "pageinfo-firsttime": "Dema çêkirina rûpelê",
        "markedaspatrolled": "Wek sererastkirî tê nîşandan",
        "markedaspatrolledtext": "Guherandina rûpelê wek serrastkirî tê nîşandan.",
        "patrol-log-page": "Têketina kontrolkirinê",
+       "confirm-markpatrolled-button": "Baş e",
        "deletedrevision": "Guhertoya berê $1 hate jêbirin.",
        "filedelete-missing": "Dane \"$1\" nikare were jêbirin, ji ber ku ew tune ye.",
        "filedelete-current-unregistered": "Daneya \"$1\" li sîstemê tune ye.",
        "imagelisttext": "Jêr lîsteyek ji $1 file'an heye, duxrekirin $2.",
        "newimages-summary": "Ev rûpela taybet dosyeyên ku herî dawî hatine barkirin, nîşan dide.",
        "newimages-legend": "Parzûn",
+       "newimages-showbots": "Barkirinên ji aliyê botan nîşan bide",
        "noimages": "Ne tiştek tê dîtin.",
        "ilsubmit": "Lêgerîn",
        "bydate": "li gor dîrokê",
index 6b316da..e4f1e44 100644 (file)
        "yourpasswordagain": "Jynnskrifewgh agas ger tremena arta:",
        "createacct-yourpasswordagain": "Afydhyewgh an ger tremena",
        "createacct-yourpasswordagain-ph": "Entrewgh an ger tremena arta",
-       "remembermypassword": "Perthi kov a'm omgelmi war an jynn amontya-ma (rag $1 {{PLURAL:$1|dydh}} dhe'n moyha)",
        "userlogin-remembermypassword": "Perthi kov a'm omgelmi",
        "userlogin-signwithsecure": "Devnydhya junyans diogel",
        "yourdomainname": "Agas tiredh:",
        "passwordreset-email": "Trigva ebost:",
        "passwordreset-emailtitle": "Manylyon agas akont war {{SITENAME}}",
        "passwordreset-emailsentemail": "Ebost dassettya ger tremena re beu danvenys.",
-       "passwordreset-emailsent-capture": "Ebost dassettya ger tremena re beu danvenys, hag y hyllir y weles a-woles.",
        "changeemail": "Chanjya trigva ebost",
        "changeemail-header": "Chanjya trigva ebost an akont",
        "changeemail-oldemail": "Agas trigva ebost a-lemmyn:",
        "editwarning-warning": "Mar kesowgh an folen ma, hwi a allsa kelli chanjyow gwrys genowgh.\nMars owgh hwi omgelmys, hwi a yll diallosegi an gwarnyans ma yn tregh \"{{int:prefs-editing}}\" agas dewisyow.",
        "undo-success": "Y hyllir diswul an chanj-ma.\nCheckyewgh mar pleg an kehevelyans a-woles rag gwirya bos hemma an pyth a vynnowgh, hag ena gwithewgh an chanjyow a-woles rag gorfenna diswul an chanj.",
        "undo-summary": "Amendyans $1 gans [[Special:Contributions/$2|$2]] ([[User talk:$2|keskows]]) diswrys",
-       "cantcreateaccounttitle": "Ny yllir gwruthyl an akont",
        "viewpagelogs": "Gweles kovnotennow an folen ma",
        "currentrev": "Amendyans diwettha",
        "currentrev-asof": "An amendyans diwettha a-dhia $1",
        "activeusers": "Rol a dhevnydhyoryon vyw",
        "activeusers-intro": "Hemm yw rol a dhevnydhyoryon re wrug gwrians war an wiki-ma y'n $1 {{PLURAL:$1|jydh|dydh}} diwettha.",
        "activeusers-count": "$1 {{PLURAL:$1|wrians|gwrians}} y'n {{PLURAL:$3|jydh|$3 dydh}} diwettha",
-       "activeusers-hidebots": "Kudha botow",
-       "activeusers-hidesysops": "Kudha menystroryon",
        "listgrouprights-members": "(rol eseli)",
        "emailuser": "Ebostya an devnydhyer-ma",
        "defemailsubject": "Ebost danvenys dre {{SITENAME}} gans an devnydhyer \"$1\"",
index ee793ef..171a911 100644 (file)
        "listusers-blocked": "(obstructus)",
        "activeusers": "Index usorum activorum",
        "activeusers-count": "{{PLURAL:$1|una recensio {{PLURAL:$3|hodie|his $3 diebus}} facta|$1 recensiones {{PLURAL:$3|hodie|his $3 diebus}} factae}}",
-       "activeusers-hidebots": "Celare automata",
-       "activeusers-hidesysops": "Celare magistratus",
        "activeusers-noresult": "Nullus usor inventus.",
        "listgrouprights": "Gregum usorum potestates",
        "listgrouprights-group": "Grex",
index 4f3f53a..db6cd9f 100644 (file)
        "yourpasswordagain": "Entra de muevo el kóddiche:",
        "createacct-yourpasswordagain": "Konfirme contrasenya",
        "createacct-yourpasswordagain-ph": "Eskrive la kontrasenya de muevo",
-       "remembermypassword": "Acódrate de mi entrada de kullaneador en este navigador (por un maksimum de {{PLURAL:$1|día|días}})",
        "yourdomainname": "Tu dominyo:",
        "password-change-forbidden": "No se puede kambiar contrasenyas en este viki.",
        "login": "Entrar",
        "post-expand-template-inclusion-category": "Hojas con sovrecarga de şablones",
        "post-expand-template-argument-warning": "'''Aviso:''' Esta oja tiene kuanto menos un kampo enel xablon muy lungo.\nEste o estos kampos no van ser amostrados",
        "post-expand-template-argument-category": "Ojas ke tienen xablones kon parametros no uzados",
-       "cantcreateaccounttitle": "No se puede krear el kuento",
        "viewpagelogs": "Ver los registros de esta hoja",
        "currentrev": "Enderechamiento d'al cavo",
        "currentrev-asof": "Enderechamiento dalcavo de $2 a las $3 la ora",
        "linksearch-line": "Atamiento para $1 en la hoja $2",
        "listusers-submit": "Amostrar",
        "listusers-noresult": "No se topo usuario",
-       "activeusers-hidebots": "Eskonder bots",
        "activeusers-noresult": "No se toparon usuario.",
        "listgrouprights": "Derechos del grupo de usuario",
        "listgrouprights-group": "Grupo",
index 8857967..887e84b 100644 (file)
        "views": "Affichagen",
        "toolbox": "Geschirkëscht",
        "tool-link-userrights": "{{GENDER:$1|Benotzer}}gruppen änneren",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Benotzer}}gruppe weisen",
        "tool-link-emailuser": "{{GENDER:$1|Dëser Benotzerin|Dësem Benotzer}} eng Mail schécken",
        "userpage": "Benotzersäit",
        "projectpage": "Meta-Text",
        "botpasswords-label-delete": "Läschen",
        "botpasswords-label-resetpassword": "D'Passwuert zrécksetzen",
        "botpasswords-label-grants": "Applikabel Rechter:",
-       "botpasswords-help-grants": "All Berechtegung gëtt Zougang op déi Benotzerrechter déi e Benotzerkont schonn huet. Kuckt d'[[Special:ListGrants|Tabell vun de Berechtigunge]] fir méi Informatiounen.",
+       "botpasswords-help-grants": "Berechtegunge ginn Zougang op déi Benotzerrechter déi Äre Benotzerkont schonn huet. D'Aktivéiere vun enger Berechtegung hei gëtt Iech keen Zougang op Rechter déi Äre Benotzerkont net scho souwisou huet. Kuckt d'[[Special:ListGrants|Tabell vun de Berechtigunge]] fir méi Informatiounen.",
        "botpasswords-label-grants-column": "Accordéiert",
        "botpasswords-bad-appid": "Den Numm vum Bot \"$1\" ass net valabel.",
        "botpasswords-insert-failed": "De Botnumm \"$1\" konnt net dobäigesat ginn. Gouf e schonn derbäigesat?",
        "passwordreset-emaildisabled": "D'E-Mail-Funktioune goufen op dëser Wiki ausgeschalt.",
        "passwordreset-username": "Benotzernumm:",
        "passwordreset-domain": "Domaine:",
-       "passwordreset-capture": "D'Mail kucken?",
-       "passwordreset-capture-help": "Wann Dir dës Këscht ukräizt, gëtt de Mail (mam temporäre Passwuert) Iech gewisen an dem Benotzer geschéckt.",
        "passwordreset-email": "E-Mail-Adress:",
        "passwordreset-emailtitle": "Detailer vum Benotzerkont op{{SITENAME}}",
        "passwordreset-emailtext-ip": "Iergendee mat der IP-Adress $1, wahrscheinlech Dir selwer, huet d'Zrécksetze vun Ärem Passwuert op {{SITENAME}} gefrot ($4). {{PLURAL:$3|De Benotzerkont ass|D'Benutzerkonte si}} mat dëser E-Mail-Adress verbonn:\n\n$2\n\n{{PLURAL:$3|Dëst temporärt Passwuert leeft|Dës temporär Passwierder lafe}} bannent {{PLURAL:$5|engem Dag|$5 Deeg}} of.\nDir sollt Iech aloggen an een neit Passwuert festleeën. Wann een Aneren déi Ufro gemaach huet oder Dir Iech erëm un Äert Passwuert erënnere kënnt an et net ännere wëllt, kënnt Dir dës Noriicht ignoréieren an Äert aalt Passwuert weider benotzen.",
        "passwordreset-emailelement": "Benotzernumm: \n$1\n\nTemporärt Passwuert: \n$2",
        "passwordreset-emailsentemail": "Wann dës E-Mailadress mat Ärem Benotzerkont assoziéiert ass, da gëtt Eng E-Mail fir d'Passwuert zréckzesetze geschéckt.",
        "passwordreset-emailsentusername": "Wann eng E-Mailadress mat dësem Benotzernumm associéiert ass, da gëtt Eng E-Mail fir d'Passwuert zeréckzesetze geschéckt.",
-       "passwordreset-invalideamil": "Net-valabel E-Mail-Adress",
+       "passwordreset-invalidemail": "Net-valabel E-Mail-Adress",
        "passwordreset-nodata": "Et gouf weder e Benotzernumm nach e Passwuert uginn",
        "changeemail": "E-Mail-Adress änneren oder ewechhuelen",
        "changeemail-header": "Fëllt dëse Formulaire aus fir Är E-Mailadress z'änneren.  Wann Dir d'Verbindung tëscht Ärer E-Mailadress an Ärem Benotzerkont ewechhuele wëllt, da loosst d'Feld e-Mailadress eidel wann Dir de Formulaire späichert.",
        "prefs-help-recentchangescount": "Inklusiv Rezent Ännerungen, Versiounshistoriquen a Logbicher.",
        "prefs-help-watchlist-token2": "Dëst ass de geheime Schlëssel fir de Webfeed vun Ärer Iwwerwaachungslëscht. Jiddwereen deen e kennt kann Är Iwwerwaachungslëscht liesen, dofir sollt Dir en net weider ginn. [[Special:ResetTokens|Klickt hei wann Dir en zrécksetze musst]].",
        "savedprefs": "Är Astellunge goufe gespäichert.",
-       "savedrights": "D'Benotzerrechter vum {{GENDER:$1|$1}} goufe gespäichert.",
+       "savedrights": "D'Benotzergruppe vum {{GENDER:$1|$1}} goufe gespäichert.",
        "timezonelegend": "Zäitzon:",
        "localtime": "Lokalzäit:",
        "timezoneuseserverdefault": "De Standardwäert vun der Wiki ($1) benotzen",
        "prefswarning-warning": "Dir hutt Ännerunge vun Ären Astellunge gemaach, déi nach net gespäichert goufen.\n\nWann Dir vun dëser Säit erof gitt ouni op \"$1\" ze klicken, da ginn Är Astellungen net aktualiséiert.",
        "prefs-tabs-navigation-hint": "Tipp: Dir kënnt d'Feiler no lénks an no riets benotze fir tëscht den Tabs an der Lëscht vun den Tabs ze navigéieren.",
        "userrights": "Benotzerrechterverwaltung",
-       "userrights-lookup-user": "Benotzergruppe verwalten",
+       "userrights-lookup-user": "E Benotzer eraussichen",
        "userrights-user-editname": "Benotzernumm uginn:",
-       "editusergroup": "{{GENDER:$1|Benotzer}}gruppen änneren",
+       "editusergroup": "Benotzergruppe lueden",
        "editinguser": "Ännere vun de Rechter vum  {{GENDER:$1|Benotzer}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Benotzergruppen änneren",
        "saveusergroups": "{{GENDER:$1|Benotzer}}gruppe späicheren",
        "userrights-reason": "Grond:",
        "userrights-no-interwiki": "Dir hutt net déi néideg Rechter, fir d'Rechter vu Benoutzer op anere Wikien z'änneren.",
        "userrights-nodatabase": "D'Datebank $1 gëtt et net oder se ass net lokal.",
-       "userrights-nologin": "Dir musst mat engem Administrateurs-Benotzerkont [[Special:UserLogin|ageloggt sinn]], fir Benotzerrechter änneren ze kënnen.",
-       "userrights-notallowed": "Dir hutt net déi néideg Rechter fir Rechter vun anere Benotzer derbäizesetzen oder ewechzehuelen.",
        "userrights-changeable-col": "Gruppen déi Dir ännere kënnt",
        "userrights-unchangeable-col": "Gruppen déi Dir net ännere kënnt",
        "userrights-conflict": "Konflikt bei de Benotzerrechter! Kuckt Är Ännerunge w.e.g. no a maacht se w.e.g. nach eng Kéier.",
-       "userrights-removed-self": "Dir hutt Är eege Rechter ewechgeholl. Dofir kënnt Dir net méi op dës Säit zougräifen.",
        "group": "Grupp:",
        "group-user": "Benotzer",
        "group-autoconfirmed": "Registréiert Benotzer",
        "right-siteadmin": "Datebank spären an d'Spär ophiewen",
        "right-override-export-depth": "Säiten exportéieren inklusiv de verlinkte Säite bis zu enger Déift vu 5",
        "right-sendemail": "Anere Benotzer E-Maile schécken",
-       "right-passwordreset": "Maile vum Zrécksetze vum Passwuert weisen",
        "grant-group-page-interaction": "Mat Säiten interagéieren",
        "grant-group-watchlist-interaction": "Mat Ärer Iwwerwaachungslëscht interagéieren",
        "grant-group-email": "E-Mail schécken",
        "apisandbox-alert-field": "De wäert vun dësem Feld ass net valabel.",
        "apisandbox-continue": "Virufueren",
        "apisandbox-continue-clear": "Eidel maachen",
+       "apisandbox-param-limit": "Gitt <kbd>max</kbd> fir déi maximal Limite ze benotzen.",
+       "apisandbox-multivalue-all-namespaces": "$1 (All Nummräim)",
+       "apisandbox-multivalue-all-values": "$1 (All Wäerter)",
        "booksources": "Bicherreferenzen",
        "booksources-search-legend": "No Bicherreferenze sichen",
        "booksources-search": "Sichen",
        "activeusers-count": "$1 {{PLURAL:$1|Aktioun|Aktiounen}} {{PLURAL:$3|gëschter|an de leschten $3 Deeg}}",
        "activeusers-from": "Benotzer weisen, ugefaange bei:",
        "activeusers-groups": "Benotzer weisen déi zu de Gruppe gehéieren:",
+       "activeusers-excludegroups": "Benotzer ausschléissen déi zu de Gruppe gehéieren:",
        "activeusers-noresult": "Keng Benotzer fonnt.",
        "activeusers-submit": "Aktiv Benotzer weisen",
        "listgrouprights": "Rechter vun de Benotzergruppen",
        "addedwatchtext-short": "D'Säit \"$1\" gouf op Är Iwwerwaachungslëscht derbäigesat.",
        "removewatch": "Vun der Iwwerwaachungslëscht erofhuelen",
        "removedwatchtext": "\"[[:$1]]\" a seng Diskussiounssäit goufe vun Ärer [[Special:Watchlist|Iwwerwaachungslëscht]] erofgeholl.",
+       "removedwatchtext-talk": "\"[[:$1]]\" a seng associéiert Säit goufe vun Ärer [[Special:Watchlist|Iwwerwaachungslëscht]] erofgeholl.",
        "removedwatchtext-short": "D'Säit \"$1\" gouf vun Ärer Iwwerwaachungslëscht erofgeholl.",
        "watch": "Iwwerwaachen",
        "watchthispage": "Dës Säit iwwerwaachen",
        "changecontentmodel-cannot-convert": "Den Inhalt vu(n) [[:$1]] kann net op den Typ $2 ëmgewandelt ginn.",
        "changecontentmodel-nodirectediting": "Den Inhaltsmodell $1 ënnerstëtzt keng direkt Ännerungen",
        "changecontentmodel-emptymodels-title": "Keng Modeller fir Inhalter disponibel",
+       "changecontentmodel-emptymodels-text": "Den Inhalt vu(n) [[:$1]] kann net op een aneren Typ ëmgewandelt ginn.",
+       "log-description-contentmodel": "Evenementer a Relatioun mat den Inhaltsmodeller vun enger Säit",
        "logentry-contentmodel-change-revertlink": "zrécksetzen",
        "logentry-contentmodel-change-revert": "zrécksetzen",
        "protectlogpage": "Protektiounslogbuch",
        "unprotectedarticle": "huet d'Spär vu(n) \"[[$1]]\" opgehuewen",
        "movedarticleprotection": "huet de Säiteschutz vun \"[[$2]]\" op \"[[$1]]\" geännert",
        "protectedarticle-comment": "huet \"[[$1]]\" {{GENDER:$2|gespaart}}",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Huet}} den Niveau vun der Spär vu(n) \"[[$1]]\" geännert",
+       "unprotectedarticle-comment": "{{GENDER:$2|huet}} d'Spär vu(n) \"[[$1]]\" ewechgeholl",
        "protect-title": "Ännerung vun der Protektioun vu(n) „$1“",
        "protect-title-notallowed": "Den Niveau vun der Protektioun vu(n) \"$1\" weisen",
        "prot_1movedto2": "[[$1]] gouf op [[$2]] geréckelt",
        "undeletehistorynoadmin": "Dës Säit gouf geläscht. De Grond fir d'Läsche gesitt der ënnen, zesumme mat der Iwwersiicht vun den eenzele Versioune vun der Säit an hiren Auteuren. Déi verschidden Textversioune kënnen awer just vun Administrateure gekuckt a restauréiert ginn.",
        "undelete-revision": "Geläscht Versioun vu(n) $1 (Versioun vum $4 um $5 Auer) vum $3:",
        "undeleterevision-missing": "Ongëlteg oder Versioun déi feelt. Entweder ass de Link falsch oder d'Versioun gouf aus dem Archiv restauréiert oder geläscht.",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|Eng Versioun konnt|$1 Versioune konnten}} net restauréiert ginn, well hir <code>rev_id</code> scho benotzt {{PLURAL:$1|gëtt|ginn}}.",
        "undelete-nodiff": "Et si keng méi al Versiounen do.",
        "undeletebtn": "Restauréieren",
        "undeletelink": "weisen/restauréieren",
        "pageinfo-robot-index": "Erlaabt",
        "pageinfo-robot-noindex": "Net erlaabt",
        "pageinfo-watchers": "Zuel vun de Benotzer déi d'Säit iwwerwaachen",
+       "pageinfo-visiting-watchers": "Zuel vun de Benotzer déi iwwerwaachen déi déi rezent Ännerunge besicht hunn",
        "pageinfo-few-watchers": "Manner wéi $1 {{PLURAL:$1|Benotzer deen iwwerwaacht|Benotzer déi iwwerwaachen}}",
        "pageinfo-redirects-name": "Zuel vun de Viruleedungen op dës Säit",
        "pageinfo-subpages-name": "Ënnersäite vun dëser Säit",
        "patrol-log-page": "Logbuch vun den iwwerkuckte Versiounen",
        "patrol-log-header": "Dëst ass d'Logbuch vun den nogekuckte Versiounen.",
        "log-show-hide-patrol": "Kontroll-Logbuch $1",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Versioun $3 vu(n) $2 als kontrolléiert markéieren?",
        "deletedrevision": "Al, geläscht Versioun vu(n) $1",
        "filedeleteerror-short": "Feeler beim Läsche vum Fichier: $1",
        "filedeleteerror-long": "Bäim Läsche vum Fichier si Feeler festgestallt ginn:\n\n$1",
        "newimages-legend": "Filter",
        "newimages-label": "Numm vum Fichier (oder en Deel dovun):",
        "newimages-showbots": "Vu Botten eropgeluede Fichiere weisen",
+       "newimages-hidepatrolled": "Nogekuckt Fichiere verstoppen",
        "noimages": "Keng Biller fonnt.",
        "ilsubmit": "Sichen",
        "bydate": "no Datum",
        "tags-edit-add": "Dës Markéierungen (tags) dobäisetzen:",
        "tags-edit-remove": "Dës Markéierungen (tags) ewechhuelen:",
        "tags-edit-remove-all-tags": "(all Markéierungen ewechhuelen)",
+       "tags-edit-chosen-placeholder": "E puer Markéierungen (tags) eraussichen",
        "tags-edit-chosen-no-results": "Keng Markéierunge fonnt déi passen",
        "tags-edit-reason": "Grond:",
        "tags-edit-revision-submit": "Ännerungen op {{PLURAL:$1|dës Versioun|$1 Versiounen}} uwennen",
        "htmlform-date-toohigh": "De wäert deen Dir aginn hutt ass nom leschten erlaabten Datum vum $1.",
        "htmlform-time-toolow": "De Wäert deen Dir aginn hutt ass virun der éischter erlaabter Zäit vu(n) $1.",
        "htmlform-time-toohigh": "De Wäert deen Dir aginn hutt ass no der leschter erlaabter Zäit vu(n) $1.",
+       "htmlform-datetime-toolow": "De Wäert deen Dir uginn hutt ass virum éischten erlaabten Datum an der Zäit vu(n) $1.",
        "htmlform-datetime-toohigh": "De Wäert deen Dir uginn hutt ass nom leschten erlaabten Datum an der Zäit vu(n) $1.",
        "htmlform-title-badnamespace": "[[:$1]] ass net am Nummraum \"{{ns:$2}}\".",
        "htmlform-title-not-creatable": "\"$1\" ass kee Säitentitel deen ugeluecht ka ginn",
        "logentry-block-unblock": "$1 {{GENDER:$2|huet}} d'Spär vum {{GENDER:$4|$3}} opgehuewen",
        "logentry-import-upload": "$1 {{GENDER:$2|huet}} $3 duerch Eropluede vun engem Fichier importéiert",
        "logentry-import-interwiki": "$1 huet $3 vun enger anerer Wiki {{GENDER:$2|importéiert}}",
+       "logentry-import-interwiki-details": "$1 {{GENDER:$2|huet}} $3 vu(n) $5 importéiert ({{PLURAL:$4|Eng Versioun|$4 Versiounen}})",
        "logentry-move-move": "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}}",
        "logentry-move-move-noredirect": "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} ouni eng Viruleedung unzeleeën",
        "logentry-move-move_redir": "$1 huet d'Säit $3 op $4 {{GENDER:$2|geréckelt}} an derbäi gouf eng Viruleedung iwwerschriwwen",
        "mediastatistics-summary": "Statistike vun den Type vun den eropgeluedene Fichieren. Dobäi gëtt nëmmen déi lescht Versioun vun engem Fichier gezielt, al oder geläscht Versioune vu Fichiere sinn ausgeschloss.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 Byte|$1 Byten}} ($2; $3%)",
        "mediastatistics-bytespertype": "Gesamtgréisst vun de Fichiere vun dësem Abschnitt:  {{PLURAL:$1|$1 Byte|$1 Bytes}} ($2; $3%).",
+       "mediastatistics-allbytes": "Gesamtgréisst vun alle Fichieren: {{PLURAL:$1|$1 Byte|$1 Bytes}} ($2).",
        "mediastatistics-table-mimetype": "MIME-Typ",
        "mediastatistics-table-extensions": "Méiglech Erweiderungen",
        "mediastatistics-table-count": "Zuel vun de Fichieren",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
+       "special-characters-title-endash": "en dash",
+       "special-characters-title-emdash": "em dash",
        "special-characters-title-minus": "Minus-Zeechen",
        "mw-widgets-dateinput-no-date": "Keen Datum erausgesicht",
        "mw-widgets-dateinput-placeholder-day": "JJJJ-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "JJJJ-MM",
        "mw-widgets-titleinput-description-new-page": "Säit gëtt et nach net",
        "mw-widgets-titleinput-description-redirect": "viruleeden op $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Eng Kategorie derbäisetzen...",
        "sessionprovider-generic": "$1-Sessiounen",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookie-baséiert Sessiounen",
        "sessionprovider-nocookies": "Cookië sinn eventuell desaktivéiert. Vergewëssert Iech datt Dir d'Cookien aktivéiert hutt a probéiert nach eng Kéier.",
        "log-action-filter-import": "Importtyp:",
        "log-action-filter-move": "Réckeltyp:",
        "log-action-filter-protect": "Typ vu Spär",
+       "log-action-filter-rights": "Typ vun Ännerung vu Rechter:",
        "log-action-filter-upload": "Eropluedtyp:",
        "log-action-filter-all": "All",
        "log-action-filter-block-block": "Spären",
        "log-action-filter-block-reblock": "Ännere vun enger Spär",
        "log-action-filter-block-unblock": "Spär ophiewen",
        "log-action-filter-delete-delete": "Säite läschen",
+       "log-action-filter-delete-delete_redir": "Viruleedung iwwerschreiwen",
        "log-action-filter-delete-restore": "Säiterestauratioun",
        "log-action-filter-delete-event": "Logbuch-Läschung",
        "log-action-filter-delete-revision": "Läsche vun enger Versioun",
        "log-action-filter-upload-upload": "Neien Upload",
        "log-action-filter-upload-overwrite": "Nees eroplueden",
        "authmanager-create-disabled": "D'Opmaache vu Benotzerkonten ass gespaart.",
-       "authmanager-create-from-login": "Fir Äre Benotzerkont unzeleeën fëllt w.e.g. d'Felder hei drënner aus.",
+       "authmanager-create-from-login": "Fir Äre Benotzerkont unzeleeën fëllt w.e.g. d'Felder aus.",
        "authmanager-authplugin-setpass-failed-title": "Änner vum Passwuert huet net funktionéiert",
        "authmanager-authplugin-setpass-bad-domain": "Net valabelen Domain.",
        "authmanager-autocreate-noperm": "Automatescht Uleeë vu Benotzerkonten ass net erlaabt.",
        "linkaccounts": "Benotzerkonte verbannen",
        "linkaccounts-success-text": "De Benotzerkont gouf verlinkt.",
        "linkaccounts-submit": "Benotzerkonte verbannen",
+       "unlinkaccounts": "Benotzerkonten trennen",
+       "unlinkaccounts-success": "De Benotzerkont gouf getrennt.",
        "userjsispublic": "DEnkt drun: Op JavaScript-Ënnersäite solle keng vertraulech Informatioune stoe well se vun anere Benotzer kënne gesi ginn.",
        "restrictionsfield-badip": "Net valabel IP-Adress oder Beräich: $1",
-       "restrictionsfield-label": "Zougeloossen IP-Beräicher:",
-       "edit-error-short": "Feeler: $1",
-       "edit-error-long": "Feeler:\n\n$1"
+       "restrictionsfield-label": "Zougeloossen IP-Beräicher:"
 }
index dd1e9d4..3a8e61b 100644 (file)
        "yourname": "Nom de usor:",
        "yourpassword": "Sinia de entra:",
        "yourpasswordagain": "Retape la sinia:",
-       "remembermypassword": "Memora me sinia de entra a esta computador (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "yourdomainname": "Tu domina:",
        "login": "Identifia",
        "nav-login-createaccount": "Sinia per entra",
index af7f9be..7afd6f8 100644 (file)
        "yourname": "Ery'obwa memba",
        "yourpassword": "Ekigambo ekikuumi",
        "yourpasswordagain": "Ddamu ekigambo ekikuumi",
-       "remembermypassword": "Tereka ekigambo kyange ekikuumi ku kompyuta eno (okumala {{PLURAL:$1|olunaku|ennaku ezitasukka mu}} $1)",
        "yourdomainname": "Linnya lya twale lya kayungirizi lyo:",
        "externaldberror": "Waliwo kiremya mu ggwanika lya data ekozesebwa okukakasa bamemba oba tokkirizibwa okukyusa ku akawunti yo ey'awalala.",
        "login": "Yingira",
index 8cc7e7d..a82bd16 100644 (file)
        "activeusers-intro": "Dit is 'n lies mit gebroekers die aktief zeen gewaes in de aafgeloupe {{PLURAL:$1|daag|$1 daag}}.",
        "activeusers-count": "$1 {{PLURAL:$1|bewèrking|bewèrkinger}} inne {{PLURAL:$3|lèsten daag|lès $3 daag}}",
        "activeusers-from": "Tuin gebroekers vanaaf:",
-       "activeusers-hidebots": "Verberg bots",
-       "activeusers-hidesysops": "Verberg admins",
        "activeusers-noresult": "Gein gebroekers gevónje.",
        "listgrouprights": "Rechte van gebroekersgróppe",
        "listgrouprights-summary": "Op dees pazjena sjtaon de gebroekersgróppe in deze wiki besjreve, mit zien biebehurende rechte.\nInfermasie daoreuver èn de individueel rechter vinjs te [[{{MediaWiki:Listgrouprights-helppage}}|hie]].",
index dd2620b..f0441f0 100644 (file)
        "templatepage": "Vizualizza o modello",
        "viewhelppage": "Vizualizza a paggina d'agiutto",
        "categorypage": "Veddi a paggina da categoria",
-       "viewtalkpage": "Veddi o ciæto",
+       "viewtalkpage": "Amia a paggina de discuscion",
        "otherlanguages": "In âtre lengoe",
        "redirectedfrom": "(Rendirissou da $1)",
        "redirectpagesub": "Paggina de rindirissamento",
        "nstab-category": "Categorîa",
        "mainpage-nstab": "Paggina prinçipâ",
        "nosuchaction": "No se poeu",
-       "nosuchactiontext": "L'açion specificâ inta URL a no l'è vallida.\nO che t'hæ scrito mâ, o che donque l'ea sbaliou o colegamento.\nO magara gh'è 'na cammoa into software doeuviou da {{SITENAME}}.",
+       "nosuchactiontext": "L'açion specificâ inta URL a no l'è vallida.\nÒ che t'hæ scrito mâ, ò che donque l'ea sbaliou l'ingancio.\nÒ magara gh'è 'na cammoa into software dœuviou da {{SITENAME}}.",
        "nosuchspecialpage": "Sta paggina speciale a no gh'è",
        "nospecialpagetext": "<strong>A paggina speciale domandâ a no l'è stæta riconosciua.</strong>\n\nA lista de paggine speciale vallide a se treuva in [[Special:SpecialPages|Lista de paggine speciale]].",
        "error": "Errô",
        "yourpasswordagain": "Riscrivi a pòula segrétta:",
        "createacct-yourpasswordagain": "Conferma a password",
        "createacct-yourpasswordagain-ph": "Conferma a password un'atra votta",
-       "userlogin-remembermypassword": "Mantegnime collegou",
+       "userlogin-remembermypassword": "Mantegnime conligou",
        "userlogin-signwithsecure": "Adoeuvia una conescion segua",
        "cannotlogin-title": "Imposcibbile intrâ",
        "cannotlogin-text": "L'accesso o no l'è poscibbile.",
        "cannotloginnow-text": "Quande s'adoeuvia $1 no se poeu intrâ.",
        "cannotcreateaccount-title": "Imposcibbile creâ di utençe",
        "cannotcreateaccount-text": "A creaçion diretta de l'utença a no l'è attivâ insce questo wiki.",
-       "yourdomainname": "Indirisso do scito:",
+       "yourdomainname": "Adresso do scito:",
        "password-change-forbidden": "No ti peu cangiâ poula segretta in questa wiki.",
        "externaldberror": "Gh'è stæto un aro co-o server de aotenticaçion esterno, oppû no ti g'hæ i aotorizzaçioin pe aggiornâ o to accesso esterno.",
        "login": "Intra",
        "passwordreset-emaildisabled": "E funçionalitæ de posta elettronnica son stæte disabilitæ in sce sta wiki.",
        "passwordreset-username": "Nomme utente",
        "passwordreset-domain": "Dominnio:",
-       "passwordreset-capture": "Visualizzâ o contegnuo do messaggio e-mail?",
-       "passwordreset-capture-help": "Se ti seleçion-i sta casella, l'e-mail (co-a poula segretta temporannia), o saiâ mostròu a ti, oltre ch'a ese inviòu a l'utente.",
        "passwordreset-email": "Addresso e-mail:",
        "passwordreset-emailtitle": "Dettaggi account sciu {{SITENAME}}",
        "passwordreset-emailtext-ip": "Quarcun (probabilmente ti, con adresso IP $1) o l'ha domandòu l'invio de 'na neuva poula segretta per l'accesso a {{SITENAME}} ($4). {{PLURAL:$3|L'utente associòu|I utenti associæ}} a sto addresso e-mail son:\n\n$2\n\n{{PLURAL:$3|Questa poula segretta temporannia a descazziâ|Queste poule segrette temporannie descazzian}} doppo {{PLURAL:$5|un giorno|$5 giorni}}.\nTi doviesci accede e çerne una neuva poula segretta oua. \n\nSe no t'ê stæto ti a fâ a domanda, ò se ti t'hæ aregordòu a poula segretta originale e no ti veu ciù cangiâla, ti peu ignorâ sto messaggio e continuâ a deuviâ a teu vegia poula segretta.",
        "passwordreset-emailelement": "Nomme utente: \n$1\n\nPoula segretta temporannia: \n$2",
        "passwordreset-emailsentemail": "Se questo addresso de posta elettronnica o l'è associou a-a teu utença, alloa saiâ inviou un'e-mail pe rempostâ a poula segretta.",
        "passwordreset-emailsentusername": "Se gh'è un adreçço de posta elettronica associou con questo nomme utente, alloa saiâ inviou una email pe rempostâ a password.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|L'|E }}e-mail de rempostaçion da password {{PLURAL:$1|a l'è stæta inviâ|son stæte inviæ}}. {{PLURAL:$1|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì.",
-       "passwordreset-emailerror-capture2": "Invio d'e-mail {{GENDER:$2|a l'utente}} non ariescio: $1. {{PLURAL:$3|O nomme|L'elenco di nommi}} utente e password o l'è mostrou chì de sotta.",
        "passwordreset-nocaller": "Un chi ciamma ti g'hæ da dâlo",
        "passwordreset-nosuchcaller": "O ciamante o no l'existe: $1",
        "passwordreset-ignored": "A reimpostaçion da password a no l'è stæta gestia. Foscia n'è stæto configuou nisciun provider ?",
-       "passwordreset-invalideamil": "Addresso e-mail non vallido",
+       "passwordreset-invalidemail": "Addresso e-mail non vallido",
        "passwordreset-nodata": "No è stæto fornio ni un nomme utente ni un adreçço de posta elettronica",
        "changeemail": "Cangia o elimmina l'adresso e-mail",
        "changeemail-header": "Completa sto formulaio pe cangiâ o to adresso e-mail. Se ti veu rimeuve l'associaçion de quasesegge addresso e-mail da-a teu utensa, lascia io neuvo addresso e-mail veuo quande ti invii o formulaio.",
        "image_sample": "Exempio.jpg",
        "image_tip": "Incorpora file",
        "media_sample": "Exempio.ogg",
-       "media_tip": "Colegaménto a file moltimediâ",
+       "media_tip": "Ingancio a file moltimediâ",
        "sig_tip": "Firma con dæta e ôa",
        "hr_tip": "Linnia orizontâ",
        "summary": "Oggetto:",
        "previewnote": "'''Questa chì a l'è solo 'n'anteprimma; i cangiamenti no son ancon stæti sarvæ!'''",
        "continue-editing": "Vanni a l'area de modiffica",
        "previewconflict": "L'anteprimma a mostra o scrito presente inta casella de modiffica de d'ato coscì comme o l'apaiâ se ti çerni de sarvalo òua.",
-       "session_fail_preview": "Spiaxenti. No è stæto poscibile elaboâ a modifica perché son andæti persci i dæti relativi a-a sescion.\n\nFoscia t'ê stæto disconnesso. <strong>Verifica d'ese ancon collegou e riproeuva</strong>.\nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegate]] e effettuâ un nuoeuvo accesso, controllando che o to browser o l'açette i cookie da questo scito.",
+       "session_fail_preview": "Spiaxenti. No l'è stæto poscibile elaboâ a modiffica pe via da pèrdia di dæti relativi a-a sescion.\n\nFoscia t'ê stæto disconesso. <strong>Veifica d'ese ancon conligou e prœuva torna</strong>.\nSe o problema o persciste, ti pœu provâ a [[Special:UserLogout|scollegate]] e effetoâ un nœuvo accesso, controlando che o to navegatô o l'açette i cookie da questo scito.",
        "session_fail_preview_html": "Spiaxenti. No è stæto poscibbile elaboâ a modifica perché son anæti persci i dæti relativi a-a sescion.\n\n<em>Scicomme {{SITENAME}} o g'ha de l'HTML sgroeuzzo attivou e gh'è stæto una perdia di dæti da sescion, l'anteprimma a l'è ascosa comme precaoçion contra i attacchi JavaScript.</em>\n\n<strong>Se se tratta de un normale tentativo d'anteprimma, riproeuva.</strong> \nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegati]] e effettuâ un noeuvo accesso, controllando che o to browser o l'açette i cookie da questo scito.",
        "token_suffix_mismatch": "'''A modiffica a no l'è stæta sarvâ perché o to client o l'ha mostrou de gestî in moddo errou i carattei de puntezatua into token associou a-a mæxima. Pe evitâ una poscibile corruçion do testo da pagina, l'è stæto refuou l'intrega modiffica. Questa scituaçion a poeu veificase, de votte, quande s'adoeuvia di serviççi de proxy anonnimi via web che presentan di bug.'''",
        "edit_form_incomplete": "'''De parte do formulaio de modiffica n'han razonto o server; controlla che e modiffiche seggian intatte e ripreuva.'''",
        "userrights-reason": "Raxon:",
        "userrights-no-interwiki": "No ti g'hæ i permissi pe modificâ i driti di utenti insce di atre wiki.",
        "userrights-nodatabase": "O database $1 o no l'esiste ò o no l'è un database locale.",
-       "userrights-nologin": "Pe assegnâ di driti a-i utenti ti g'hæ da [[Special:UserLogin|intrâ]] comme amministratô.",
-       "userrights-notallowed": "No ti g'hæ o permisso de azonze ò rimeuve i driti di utenti.",
        "userrights-changeable-col": "Gruppi che ti peu modificâ",
        "userrights-unchangeable-col": "Gruppi che no ti peu modificâ",
        "userrights-conflict": "Conflito de modiffica di driti utente! Pe piaxei controlla e conferma e teu modiffiche.",
-       "userrights-removed-self": "T'hæ rimosso i teu driti. E quindi, no ti saiæ ciù in grou de accede a questa paggina.",
        "group": "Gruppo:",
        "group-user": "Ûtenti",
        "group-autoconfirmed": "Utenti aotoconfermæ",
        "right-siteadmin": "Abbrocca e sbrocca o database",
        "right-override-export-depth": "Esporta e paggine includendo e pagine collegæ scin a 'na profonditæ de 5",
        "right-sendemail": "Manda de email a di atri utenti",
-       "right-passwordreset": "Vedde i messaggi de rempostaçion da password",
        "right-managechangetags": "Crea e attiva/disattiva i [[Special:Tags|etichette]]",
        "right-applychangetags": "Apprica di [[Special:Tags|etichette]] a-e proppie modiffiche",
        "right-changetags": "Azonze e leva de specifiche [[Special:Tags|etichette]] insce scingole verscioin o voxe de registro",
        "grant-generic": "Pacchetto diritti \"$1\"",
        "grant-group-page-interaction": "Interagisce co-e paggine",
        "grant-group-file-interaction": "Interagisce co-i file murtimediali",
-       "grant-group-watchlist-interaction": "Interagisce con i to oservæ speçiali",
+       "grant-group-watchlist-interaction": "A l'interagisce co-i to oservæ speciali",
        "grant-group-email": "Invia email",
        "grant-group-high-volume": "Esegue açioin mascive",
        "grant-group-customization": "Personalizzaçion e preferençe",
        "recentchangeslinked-feed": "Cangiamenti correlæ",
        "recentchangeslinked-toolbox": "Cangiaménti corelæ",
        "recentchangeslinked-title": "Modiffiche correlæ a \"$1\"",
-       "recentchangeslinked-summary": "Sta pàgina a fa védde i cangiaménti ciù reçenti a-e pàgine colegæ a questa.\nE pàgine che t'æ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] son in '''grascetto'''.",
+       "recentchangeslinked-summary": "Sta paggina a fa védde i cangiaménti ciù reçenti a-e pàggine conligæ a questa.\nE pàggine che t'hæ in oservaçion inti [[Special:Watchlist|oservæ speciâli]] son in '''grascetto'''.",
        "recentchangeslinked-page": "Nómme da pàgina:",
-       "recentchangeslinked-to": "Fanni védde sôlo i cangiaménti a-e pàgine colegæ a-a pàgina specificâ",
+       "recentchangeslinked-to": "Fanni védde sôlo i cangiaménti a-e pàggine conligæ a-a pàggina specificâ",
        "recentchanges-page-added-to-category": "[[:$1]] azonto a-a categoria",
        "recentchanges-page-added-to-category-bundled": "[[:$1]] azonta a-a categoria, [[Special:WhatLinksHere/$1|questa pagina a l'è inclusa a l'interno di atre pagine]]",
        "recentchanges-page-removed-from-category": "[[:$1]] rimosso da-a categoria",
        "uploaded-script-svg": "Trovou elemento de script \"$1\" into file caregou in formato SVG.",
        "uploaded-hostile-svg": "Trovou CSS no seguo inte l'elemento de stile do file in formato SVG caregou.",
        "uploaded-event-handler-on-svg": "Impostâ i attributi de gestion di eventi <code>$1=\"$2\"</code> no l'è consentio inti file SGV",
-       "uploaded-href-attribute-svg": "i attributi href inti file SVG poeuan collegâse solo verso e destinaçioin http:// o https://, trovou <code>&lt;$1 $2=\"$3\"&gt;</code>.",
+       "uploaded-href-attribute-svg": "i attributi href inti file SVG pœuan ese inganciæ solo ch'a-e destinaçioin http:// o https://, trovou <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-href-unsafe-target-svg": "Trovou href a dæti non segui: destinaçion URI <code>&lt;$1 $2=\"$3\"&gt;</code> caregou into file SVG",
        "uploaded-animate-svg": "Trovou o tag \"animate\" ch'o poriæ cangiâ href, doeuviando l'attributo \"from\" <code>&lt;$1 $2=\"$3\"&gt;</code> into file SVG caregou.",
        "uploaded-setting-event-handler-svg": "A configuaçion di attributi pe-o gestô di eventi a l'è bloccâ, trovou <code>&lt;$1 $2=\"$3\"&gt;</code> into file SVG caregou.",
        "imagelinks": "Ûzo do file",
        "linkstoimage": "{{PLURAL:$1|A segoente pàgina a contegne|E segoenti $1 pàgine contegnan}} colegaménti a-o file:",
        "linkstoimage-more": "Ciù de $1 {{PLURAL:$1|pagina aponta|pagine apontan}} a questo file.\nA seguente lista a mostra {{PLURAL:$1|a primma paggina ch'a l'aponta|e primme $1 paggine ch'apontan}} a sto file.\nL'è disponibile un [[Special:WhatLinksHere/$2|elenco completo]].",
-       "nolinkstoimage": "No gh'è nisciûnn-a pàgina collegâ con 'sto file.",
+       "nolinkstoimage": "No gh'è nisciun-a paggina inganciâ a sto file.",
        "morelinkstoimage": "Vixualizza [[Special:WhatLinksHere/$1|di atri inganci]] a questo file.",
        "linkstoimage-redirect": "$1 (rendriççamento file) $2",
        "duplicatesoffile": "{{PLURAL:$1|O seguente file o l'è un dupricou|I seguenti $1 file son di dupricæ}} de questo file ([[Special:FileDuplicateSearch/$2|urteioî detaggi]]):",
        "mimetype": "Tipo MIME:",
        "download": "scarrega",
        "unwatchedpages": "Paggine non öservæ",
-       "listredirects": "Lista de rindirissamenti",
+       "listredirects": "Lista di rendriççi",
        "listduplicatedfiles": "Lista di file doggi",
        "listduplicatedfiles-summary": "Questo o l'è un elenco di file, donde a verscion ciù reçente de 'n file a l'è un dupricou da verscion ciù reçente de 'n atro file. Se piggia in  conscideraçion solo che i file locali.",
        "listduplicatedfiles-entry": "[[:File:$1|$1]] o g'ha [[$3|{{PLURAL:$2|un duplicou|$2 duplicæ}}]].",
        "pageswithprop-submit": "Vanni",
        "pageswithprop-prophidden-long": "valô testoale longo da propietæ ascoso ($1)",
        "pageswithprop-prophidden-binary": "valô binaio da propietæ ascoso ($1)",
-       "doubleredirects": "Rindirissamenti doggi",
+       "doubleredirects": "Rendriççi doggi",
        "doubleredirectstext": "In questa pagina gh'è elencou e paggine che rendiriççan a di atre paggine de redirect.\nOgni riga a conten i collegamenti a-o primmo e a-o segondo redirect, oltre a-a primma riga de testo do segondo redirect che a l'uso o conten a paggina de destinaçion \"corretta\" a-a quæ doviæ puntâ o primmo redirect ascì.\nI redirect <del>scassæ</del> son stæti corretti.",
        "double-redirect-fixed-move": "[[$1]] o l'è stæto mesciou.\nO l'è stato aggiornou aotomaticamente e oua o l'è un redirect a [[$2]].",
        "double-redirect-fixed-maintenance": "Corretto aotomaticamente o redirect doggio da [[$1]] a [[$2]] into travaggio de manutençion.",
        "double-redirect-fixer": "Correttô di redirect",
        "brokenredirects": "Rindirissamenti sballiæ",
-       "brokenredirectstext": "I rendriççi chì de sotta colegan a de paggine inexistente:",
+       "brokenredirectstext": "I rendriççi chì de sotta apontan a de paggine inexistente:",
        "brokenredirects-edit": "cangia",
        "brokenredirects-delete": "scassa",
        "withoutinterwiki": "Paggine sensa interwiki",
        "ntransclusions": "Doeuviou inte $1 {{PLURAL:$1|paggina|paggine}}",
        "specialpage-empty": "Questa paggina speciale a l'è attualmente voeua.",
        "lonelypages": "Paggine orfane",
-       "lonelypagestext": "E seguente paggine no son incluse ni colegæ a di atre paggine de {{SITENAME}}.",
+       "lonelypagestext": "E seguente paggine no son incluse ni conligæ a di atre paggine de {{SITENAME}}.",
        "uncategorizedpages": "Paggine sensa categorîa",
        "uncategorizedcategories": "Categorîe sensa categorîa",
        "uncategorizedimages": "Immaggini sensa categorîa",
        "unusedimages": "File inutilizæ",
        "wantedcategories": "Categorîe domandæ",
        "wantedpages": "Paggine domandæ",
-       "wantedpages-summary": "Lista de paggine inexistente co-o ciu gran nummero de collegamenti a lô, escludendo e pagine ch'han solo che i rendiriççi che-e collegan. Pe 'n elenco de pagine inexistente che g'han di rendriççi che-e collegan, amia [[{{#special:BrokenRedirects}}|a lista di rendriççi erræ]].",
+       "wantedpages-summary": "Lista de paggine inexistente co-o ciu gran nummero d'inganci a lô, escludendo e pagine inganciæ solo che da di rendriççi. Pe 'na lista de pagine inexistente inganciæ da di rendriççi, amia [[{{#special:BrokenRedirects}}|a lista di rendriççi erræ]].",
        "wantedpages-badtitle": "Tittolo invallido into groppo di risultæ: $1",
        "wantedfiles": "File domandæ",
        "wantedfiletext-cat": "I seguenti file son in doeuvia, ma no existan. I file ospitæ inte di repository esterni porieivan esighe elencæ sciben che existan. Questi fasci poxitivi saian <del>barræ</del>. E pagine che incòrpoan i file che no existan son elencæ in [[:$1]].",
        "ancientpages": "Paggine ciû vëgie",
        "move": "Mescia",
        "movethispage": "Mescia 'sta paggina",
-       "unusedimagestext": "I seguenti file existan ma no son doeuviæ inte nisciun-a paggina.\nNotta che di atri sciti web porieivan ese colegæ a 'n file co-in URL diretto, e coscì o poriæ ese inte sta lista sciuben ch'o segge in doeuvia.",
+       "unusedimagestext": "I seguenti file existan ma no son doeuviæ inte nisciun-a paggina.\nNotta che di atri sciti web porieivan ese conligæ a 'n file co-in URL diretto, e coscì o poriæ ese inte sta lista sciuben ch'o segge in doeuvia.",
        "unusedcategoriestext": "E seguente paggine de categoria existan, sciben che nisciun'atra paggina o categoria a-e doeuvie.",
        "notargettitle": "Dæti mancanti",
        "notargettext": "No t'hæ indicou una pagina o un utente con chi eseguî sta fonçion.",
        "rollbackfailed": "Rollback fallio",
        "rollback-missingparam": "Parammetri obrigatoi mancanti inta recesta.",
        "rollback-missingrevision": "Imposcibile caregâ i dæti da verscion.",
-       "cantrollback": "No se peu tornâ inderê; l'utente ch'o l'ha fæto quelle modiffiche o l'è stæto l'unico contribuente.",
+       "cantrollback": "No se poeu tornâ inderê; l'utente ch'o l'ha fæto quelle modiffiche o l'è stæto l'unico contributô.",
        "alreadyrolled": "No l'è poscibbile annullâ e modiffiche apportæ a-a pagina [[:$1]] da parte de [[User:$2|$2]] ([[User talk:$2|discuscion]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]); un atro utente o l'ha zà modificou a pagina oppù o l'ha effettuou o rollback.\n\nA modifica ciù reçente a.a paggina a l'è stæta apportâ da [[User:$3|$3]] ([[User talk:$3|discuscion]]{{int:pipe-separator}}[[Special:Contributions/$3|{{int:contribslink}}]]).",
        "editcomment": "L'ogetto da modiffica o l'ea: <em>$1</em>.",
        "revertpage": "Annullou e modiffiche de [[Special:Contributions/$2|$2]] ([[User talk:$2|discuscion]]), riportâ a-a verscion precedente de [[User:$1|$1]]",
        "nolinkshere-ns": "Pagine ch'apontan a '''[[:$1]]''' into namespace seleçionou no ghe n'è.",
        "isredirect": "Paggina de rindirissamento",
        "istemplate": "Incluxon",
-       "isimage": "Colegamento a file",
+       "isimage": "Ingancio a-o file",
        "whatlinkshere-prev": "{{PLURAL:$1|precedente|precedenti $1}}",
        "whatlinkshere-next": "{{PLURAL:$1|sûccescivo|sûccescivi $1}}",
        "whatlinkshere-links": "← colegaménti",
        "export-addns": "Azonzi",
        "export-download": "Sarva comme file",
        "export-templates": "Inciodi i template",
-       "export-pagelinks": "Includdi paggine colegæ scin a 'na profonditæ de:",
+       "export-pagelinks": "Includdi paggine conligæ scin a 'na profonditæ de:",
        "export-manual": "Azonzi paggine manoalmente:",
        "allmessages": "Messaggi do scistema",
        "allmessagesname": "Nomme",
        "import-nonewrevisions": "Nisciun-a verscion importâ (ean zà tutte presente, ò satæ pe via di erroî)",
        "xml-error-string": "$1 a-a riga $2, colonna $3 (byte $4): $5",
        "import-upload": "Carrega dæti XML",
-       "import-token-mismatch": "I dæti relativi a-a sescion son anæti persci. Riproeuva.\nFoscia t'ê stæto disconnesso. <strong>Verifica d'ese ancon collegou e riproeuva</strong>.\nSe o problema o persciste, ti poeu provâ a [[Special:UserLogout|scollegate]] e effettuâ un nuoeuvo accesso, controllando che o to browser o l'açette i cookie da questo scito.",
+       "import-token-mismatch": "I dæti relativi a-a sescion son anæti persci. Riprœuva.\nFoscia t'ê stæto disconnesso. <strong>Verifica d'ese ancon conligou e riprœuva</strong>.\nSe o problema o persciste, ti pœu provâ a [[Special:UserLogout|sconligâte]] e effettuâ un nœuvo accesso, controlando che o to navegatô o l'açette i cookie da questo scito.",
        "import-invalid-interwiki": "Imposcibbile importâ da-o progetto wiki indicou.",
        "import-error-edit": "A paggina \"$1\" a no l'è stæta importâ perché no t'ê aotorizzou a modificâla.",
        "import-error-create": "A paggina \"$1\" a no l'è stæta importâ perché no t'ê aotorizzou a creâla.",
        "tooltip-n-recentchanges": "I ùrtimi cangiaménti into scîto",
        "tooltip-n-randompage": "Fanni vedde 'na pagina a brettio.",
        "tooltip-n-help": "Pagine d'agiùtto",
-       "tooltip-t-whatlinkshere": "Lista de tùtte e pagine che son colegæ a sta chì.",
-       "tooltip-t-recentchangeslinked": "Ùrtimi càngi de pàgine colegæ a quésta",
+       "tooltip-t-whatlinkshere": "Lista de tùtte e paggine ch'en conligæ a sta chì.",
+       "tooltip-t-recentchangeslinked": "Ùrtimi càngi de pàggine conligæ a questa",
        "tooltip-feed-rss": "Feed RSS pe questa paggina",
        "tooltip-feed-atom": "Feed Atom pe sta pàgina",
        "tooltip-t-contributions": "Lista de contribûssioin de {{GENDER:$1|questo|questa}} utente",
        "newimages-hidepatrolled": "Ascondi i caregamenti controlæ",
        "noimages": "No gh'è ninte da vedde.",
        "ilsubmit": "Çerca",
-       "bydate": "pe dâta",
+       "bydate": "pe dæta",
        "sp-newimages-showfrom": "Mostra i file ciù reçenti a partî da-e oe $2 do $1",
        "seconds": "{{PLURAL:$1|un segondo|$1 segondi}}",
        "minutes": "{{PLURAL:$1|un menuto|$1 menuti}}",
        "exif-pixelxdimension": "Largheçça immaggine",
        "exif-pixelydimension": "Ateçça immaggine",
        "exif-usercomment": "Notte de l'utente",
-       "exif-relatedsoundfile": "File audio collegou",
+       "exif-relatedsoundfile": "File audio conligou",
        "exif-datetimeoriginal": "Dæta e oa de creassion di dæti",
        "exif-datetimedigitized": "Dæta e oa de digitalizzaçion",
        "exif-subsectime": "Dæta e oa, fraçioin de segondo",
        "exif-originaldocumentid": "ID univvoco do documento origin*a",
        "exif-licenseurl": "URL pe-a liçença do copyright",
        "exif-morepermissionsurl": "Informaçioin insce e liçençe alternative",
-       "exif-attributionurl": "Se quest'oeuvia ti l'adoeuvi torna, pe piaxei coleghite a",
+       "exif-attributionurl": "Se quest'œuvia ti l'adœuvi torna, pe piaxei metti 'n ingancio a",
        "exif-preferredattributionname": "Se quest'oeuvia ti l'adoeuvi torna, pe piaxei attribuiscine a paternitæ a",
        "exif-pngfilecomment": "Commento do file JPEG",
        "exif-disclaimer": "Avertençe",
        "confirmemail_loggedin": "L'adreçço e-mail o l'è stæto confermou.",
        "confirmemail_subject": "{{SITENAME}}: recesta de conferma de l'adreççoo",
        "confirmemail_body": "Quarcun, foscia ti mæximo da l'adreçço IP $1, o l'ha registrou l'utença \"$2\" insce {{SITENAME}} indicando questo adreçço e-mail.\n\nPe confermâ che l'utença a t'apparten da vei e attivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi o collegamento seguente co-o to navegatô:\n\n$3\n\nSe *no* t'ê stæto ti a registrâ l'utença, segui sto colegamento pe annulâ a conferma de l'adreçço e-mail:\n\n$5\n\nQuesto coddiçe de conferma o descaziâ aotomaticamente a $4.",
-       "confirmemail_body_changed": "Quarcun, foscia ti mæximo da l'adreçço IP $1, o l'ha modificou l'adreçço e-mail de l'utença \"$2\" insce {{SITENAME}} indicando questo adreçço e-mail.\n\nPe confermâ che l'utença a t'apparten da vei e riattivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi o collegamento seguente co-o to navegatô:\n\n$3\n\nSe l'utença a *no* t'aparten, segui sto colegamento pe annulâ a conferma de l'adreçço e-mail:",
-       "confirmemail_body_set": "Quarcun, foscia ti mæximo da l'adreçço IP $1, o l'ha impostcou l'adreçço e-mail de l'utença \"$2\" insce {{SITENAME}} indicando questo adreçço e-mail.\n\nPe confermâ che l'utença a t'apparten da vei e attivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi o collegamento seguente co-o to navegatô:\n\n$3\n\nSe l'utença a *no* t'aparten, segui sto colegamento pe annulâ a conferma de l'adreçço e-mail:",
+       "confirmemail_body_changed": "Quarcun, foscia ti mæximo da l'adresso IP $1, o l'ha modificou l'adresso e-mail de l'utença \"$2\" insce {{SITENAME}} indicando questo adresso e-mail.\n\nPe confermâ che l'utença a t'apparten davei e riattivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi l'ingancio seguente co-o to navegatô:\n\n$3\n\nSe l'utença a *no* t'aparten, segui st'ingancio pe annulâ a conferma de l'adresso e-mail:",
+       "confirmemail_body_set": "Quarcun, foscia ti mæximo da l'adresso IP $1, o l'ha impostou l'adresso e-mail de l'utença \"$2\" insce {{SITENAME}} indicando questo adresso e-mail.\n\nPe confermâ che l'utença a t'aparten davei e attivâ e fonçioin relative a l'invio di e-mail insce {{SITENAME}}, arvi l'ingancio seguente co-o to navegatô:\n\n$3\n\nSe l'utença a *no* t'aparten, segui st'ingancio pe annulâ a conferma de l'adresso e-mail:",
        "confirmemail_invalidated": "Recesta de conferma adreçço e-mail annulâ",
        "invalidateemail": "Annulla a recesta de conferma e-mail",
        "notificationemail_subject_changed": "L'adreçço de posta elettronica registrou insce {{SITENAME}} o l'è stæto modificou",
        "json-error-recursion": "Un o ciù rifeimenti ricorscivi into valô da codificâ",
        "json-error-inf-or-nan": "Un ò ciu valoî NAN o INF into valô da codificâ",
        "json-error-unsupported-type": "L'è stæto fornio un valô de un tipo ch'o no poeu ese codificou",
-       "headline-anchor-title": "Colegamento a questa seçion",
+       "headline-anchor-title": "Ingancio a questa seçion",
        "special-characters-group-latin": "Latin",
        "special-characters-group-latinextended": "Latin esteiso",
        "special-characters-group-ipa": "IPA",
        "authmanager-authn-not-in-progress": "L'aotenticaçion a no l'è in corso ò i dæti da sescion son anæti persci. Se prega de recomençâ da cavo.",
        "authmanager-authn-no-primary": "E credençiæ fornie no poeuan ese aotenticæ.",
        "authmanager-authn-no-local-user": "E credençiæ fornie no son associæ a nisciun utente de questo wiki.",
-       "authmanager-authn-no-local-user-link": "E credençiæ fornie son vallide ma no son associæ a nisciun utente de questa wiki. Accedi inte 'n atro moddo ò crea un noeuvo utente, e ti gh'aviæ 'n'opçion pe collegâ e to credençiæ precedente a quell'utença.",
+       "authmanager-authn-no-local-user-link": "E credençiæ fornie son vallide ma no son associæ a nisciun utente de questa wiki. Accedi inte 'n atro moddo ò crea un nœuvo utente, e ti gh'aviæ 'n'opçion pe conligâ e to credençiæ precedente a quell'utença.",
        "authmanager-authn-autocreate-failed": "Creaçion aotomattica de 'n'utença locale fallia: $1",
        "authmanager-change-not-supported": "E credençiæ fornie no poeuan ese modificæ, dæto che no saieivan doeuviæ da ninte.",
        "authmanager-create-disabled": "A creaçion di utençe a l'è disabilitâ.",
        "authmanager-create-from-login": "Pe creâ a to utença, completa i campi chì de sotta.",
        "authmanager-create-not-in-progress": "A creaçion de un'utença a no l'è in corso ò i dæti da sescion son anæti perdui. Se prega de recomençâ da cavo.",
        "authmanager-create-no-primary": "E credençiæ fornie no poeuan ese doeuviæ pe-a creaçion de l'utença.",
-       "authmanager-link-no-primary": "E credençiæ fornie no poeuan ese doeuviæ pe-o colegamento de l'utença.",
-       "authmanager-link-not-in-progress": "O colegamento de l'utença o no procede ò i dæti da sescion so-anæti perdui. Se prega de recomençâ da cavo.",
+       "authmanager-link-no-primary": "E credençiæ fornie no pœuan ese dœuviæ pe conligâ l'utença.",
+       "authmanager-link-not-in-progress": "O conligamento de l'utença o no procede ò i dæti da sescion so-anæti perdui. Se prega de recomençâ da cavo.",
        "authmanager-authplugin-setpass-failed-title": "Modiffica da password fallia",
        "authmanager-authplugin-setpass-failed-message": "O plugin d'aotenticaçion o l'ha impedio a modiffica da password.",
        "authmanager-authplugin-create-fail": "O plugin d'aotenticaçion o l'ha impedio a creaçion de l'utença.",
        "authmanager-provider-temporarypassword": "Password temporannia",
        "authprovider-confirmlink-message": "Basandose insce di reçenti tentativi d'accesso, e seguente utençe poeuan ese collegæ a-o to account wiki. Collegandole ti poeu effettuâ l'accesso con quelle ascì. Se prega de seleçionâ quelle che devan ese collegæ.",
        "authprovider-confirmlink-request-label": "Utençe che dovieivan ese collegæ",
-       "authprovider-confirmlink-success-line": "$1: collegou correttamente.",
+       "authprovider-confirmlink-success-line": "$1: inganciou correttamente.",
        "authprovider-confirmlink-failed": "O collegamento de l'utença o no l'è pin-amente ariescio: $1",
        "authprovider-confirmlink-ok-help": "Continnoa doppo a visualizzaçion di messaggi de errô de collegamento.",
        "authprovider-resetpass-skip-label": "Sata",
        "authprovider-resetpass-skip-help": "Sata a rempostaçion da password.",
-       "authform-nosession-login": "L'aotenticaçion a l'ha avuo successo, ma o to navegatô o no l'è in graddo de \"aregordâ\" che t'ê collegou.\n\n$1",
-       "authform-nosession-signup": "L'utença a l'è stæta creâ, ma o to navegatô o no l'è in graddo de \"aregordâ\" che t'ê collegou.\n$1",
+       "authform-nosession-login": "L'aotenticaçion a l'ha avuo successo, ma o to navegatô o no l'è in graddo de \"aregordâ\" che t'ê conligou.\n\n$1",
+       "authform-nosession-signup": "L'utença a l'è stæta creâ, ma o to navegatô o no l'è in graddo d'\"aregordâ\" che t'ê conligou.\n$1",
        "authform-newtoken": "Token mancante. $1",
        "authform-notoken": "Token mancante",
        "authform-wrongtoken": "Token errou",
        "cannotlink-no-provider-title": "Utençe collegabbile no ghe n'è",
        "cannotlink-no-provider": "Utençe colegabbile no ghe n'è.",
        "linkaccounts": "Collega utençe",
-       "linkaccounts-success-text": "L'utença a l'è stæta colegâ.",
+       "linkaccounts-success-text": "L'utença a l'è stæta inganciâ.",
        "linkaccounts-submit": "Collega utençe",
        "unlinkaccounts": "Scollega utençe",
        "unlinkaccounts-success": "L'utença a l'è stæta scollegâ.",
index 0eec9c6..c906996 100644 (file)
        "yourname": "Kȭlbatijiznim:",
        "yourpassword": "Sallisõnä:",
        "yourpasswordagain": "Kēratigid sallisõnā ūtstõ:",
-       "remembermypassword": " Mǟdlõgid sallisõnā (kuņtš $1 {{PLURAL:$1|päuvõ|päuvõ}})",
        "login": "Log sīezõ",
        "nav-login-createaccount": "Log sīezõ agā registrīer kȭlbatijizõks",
        "userlogin": "Sīezõ loggimi agā kȭlbatijiz-konto lūomi",
index 74b2357..8c5fa41 100644 (file)
        "yourpasswordagain": "تکرار گذرواژه:",
        "createacct-yourpasswordagain": "گذرواژه را دوباره وارد کنید",
        "createacct-yourpasswordagain-ph": "گذرواژه را وارد کنید برای بار دوم",
-       "remembermypassword": "رمزعبورت وة ئئ رایانة ئةویرت/یادت بو(تابیشترإژ$1{{PLURAL:$1|رووژةل|رووژ}})",
        "userlogin-remembermypassword": "مإ وارد  بی بیل",
        "userlogin-signwithsecure": "إژ ورود امن استفاده کةن",
        "cannotloginnow-title": "ایسه نمه‌تونین باینه نوم",
        "activeusers-intro": "در زیر فهرستی از کاربرانی را می‌بینید که در $1 {{PLURAL:$1|روز|روزها}} گذشته فعالیتی داشته‌اند.",
        "activeusers-count": "$1 {{PLURAL:$1|فعالیت|فعالیت ها}} در {{PLURAL:$3|روز|$3 روز}} اخیر",
        "activeusers-from": "نمایش کاربران با آغاز از:",
-       "activeusers-hidebots": "نهفتن ربات‌ها",
-       "activeusers-hidesysops": "نهفتن مدیران",
        "activeusers-noresult": "کاربری پیدا نشد.",
        "activeusers-submit": "نمایش کاربةرةل فعال/کارکةر",
        "listgrouprights": "اختیارات گروه‌های کاربری",
        "htmlform-title-not-exists": "$1 وجود ندارد.",
        "htmlform-user-not-exists": "<strong>$1</strong> وجود ندارد.",
        "htmlform-user-not-valid": "حساوو کاربةری <strong>$1</strong> معتبر نیة.",
-       "sqlite-has-fts": "$1 با پشتیبانی از جستجو در متن کامل",
-       "sqlite-no-fts": "$1 بدون پشتیبانی از جستجو در متن کامل",
        "logentry-delete-delete": "$1 VALGA $3{{GENDER:$2|HAZF Kerdi}}",
        "logentry-delete-restore": "$1 وةڵگة $3 را {{GENDER:$2|احیا کرد}}",
        "logentry-delete-event": "$1 پیدایی {{PLURAL:$5|یک مورد سیاهه|$5 مورد سیاهه}} را در $3 {{GENDER:$2|تغییر داد}}: $4",
        "feedback-external-bug-report-button": "پرونده‌سازی یک عمل فنی",
        "feedback-dialog-title": "ارسال یک بازخورد",
        "feedback-dialog-intro": "شما می توانید از فرم زیر برای بازخورد استفاده کنید. متن شما همراه با نام کاربریتان به وةڵگة \"$1\" افزوده خواهد شد.",
-       "feedback-error-title": "خطا",
        "feedback-error1": "خطا: پاسخ‌های ناشناخته از رابط برنامه‌نویسی نرم‌افزار",
        "feedback-error2": "خطا: شکست در ویرایش",
        "feedback-error3": "خطا: عدم پاسخ از رابط برنامه‌نویسی نرم‌افزار",
index 822718f..0555632 100644 (file)
        "yourpasswordagain": "Tùrna a scrìer la password",
        "createacct-yourpasswordagain": "Conférma la password",
        "createacct-yourpasswordagain-ph": "Tùrna a mèter dét la password",
-       "remembermypassword": "Regordass la mé password (per mìa de piö de {{PLURAL:$1|dé|dé}})",
        "userlogin-remembermypassword": "Tègnem colegàt",
        "userlogin-signwithsecure": "Dòpra 'na conesiù sigüra",
        "yourdomainname": "Specificà 'l domini",
        "passwordreset-emailtitle": "Detài de l'ütènsa sö {{SITENAME}}",
        "passwordreset-emailelement": "Nòm ütènt: \n$1\n\nPassword temporànea: \n$2",
        "passwordreset-emailsentemail": "Gh'è stat mandàt vià 'na e-mail de redefinisiù de la password.",
-       "passwordreset-emailsent-capture": "Gh'è stat mandàt vià chèsta e-mail de redefinisiù de la password:",
        "changeemail": "Càmbia l'indirìs e-mail",
        "changeemail-header": "Càmbia l'indirìs e-mail de l'ütènsa",
        "changeemail-none": "(nisü)",
        "content-model-javascript": "JavaScript",
        "content-model-css": "CSS",
        "undo-summary": "Scancelada la mudifega $1 de [[Special:Contributions/$2|$2]] ([[User talk:$2|Ciciarada]])",
-       "cantcreateaccounttitle": "Impusìbol creà 'n ütènt",
        "cantcreateaccount-text": "La creasiù de ütènse de part de chèsto indirìs IP (<strong>$1</strong>) l'è stàda blocàda de l'ütènt [[User:$3|$3]]. El mutìf specificàt de $3 l'è <em>$2</em>",
        "cantcreateaccount-range-text": "La creasiù de ütènse de part de indirìs IP endèl interval <strong>$1</strong>, del qual el fà part apò a 'l tò (<strong>$4</strong>), l'è stàda blocàda de [[User:$3|$3]].\n\nEl mutìf specificàt de $3 l'è <em>$2</em>.",
        "viewpagelogs": "Varda i register de quela pagina chì",
        "listusers-submit": "Fà ved",
        "activeusers": "Lìsta dei ütèncc atìf",
        "activeusers-from": "Fàm vedè i dupradur a partì da:",
-       "activeusers-hidebots": "Scond i bot",
-       "activeusers-hidesysops": "Scond i aministradur",
        "activeusers-noresult": "Nisü ütènt troàt",
        "listgrouprights": "Diricc del grüp dei ütèncc",
        "listgrouprights-group": "Grüp",
index 690b149..47791ce 100644 (file)
@@ -4,33 +4,39 @@
                        "Passawuth",
                        "Tuinui",
                        "아라",
-                       "Iberia2011"
+                       "Iberia2011",
+                       "Aefgh39622"
                ]
        },
-       "tog-underline": "ຂີດເສັ້ນກ້ອງລິງກ໌:",
-       "tog-hideminor": "ເຊື່ອງການດັດແກ້ເລັກນ້ອຍ ໃນ ການປ່ຽນແປງຫຼ້າສຸດ",
-       "tog-hidepatrolled": "ເຊື່ອງ ການລາດຕະເວນດັດແກ້ ໃນ ການດັດແກ້ຫຼ້າສຸດ",
-       "tog-newpageshidepatrolled": "ເຊື່ອງ ການລາດຕະເວນດັດແກ້ ໃນ ລາຍການໜ້າໃໝ່",
-       "tog-extendwatchlist": "ຂະຫຍາຍ ລາຍການຕິດຕາມ ເພື່ອ ສະແດງທຸກໆການປ່ຽນແປງ",
-       "tog-usenewrc": "ສະແດງ ການປ່ຽນແປງຫຼ້າສຸດ ເປັນສີເຂັ້ມ (JavaScript)",
-       "tog-numberheadings": "ໜາຍເລກຫົວຂໍ້ແບບອັດຕະໂນມັດ",
-       "tog-showtoolbar": "ສະແດງ ທູລບາດັດແກ້ (JavaScript)",
-       "tog-editondblclick": "ໃຫ້ສາມາດດັດແກ້ ໂດຍ ດັບເບິລ໌ ຄລິກ (JavaScript)",
-       "tog-editsectiononrightclick": "ໃຫ້ສາມາດ ດັດແກ້ ໂດຍກົດປຸ່ມຂວາ ຂອງເມົາສ໌ ຢູ່ <br /> ຫົວຂໍ້ຂອງພາກ (JavaScript)",
-       "tog-watchcreations": "ເພີ່ມ ໜ້າທີ່ຂ້ອຍສ້າງ ເຂົ້າໃນ ລາຍການຕິດຕາມ ຂອງ ຂ້ອຍ",
-       "tog-watchdefault": "ເພີ່ມໜ້າ ທີ່ ຂ້ອຍດັດແກ້ ໃສ່ ລາຍຕິດຕາມ ຂອງ ຂ້ອຍ",
-       "tog-watchmoves": "ເພີ່ມ ໜ້າທີ່ຂອ້ຍຍ້າຍ ໃສ່ ລາຍການຕິດຕາມຂອງຂ້ອຍ",
-       "tog-watchdeletion": "ເພີ່ມ ໜ້າ ທີ່ຂ້ອຍລຶບ ໃສ່ ລາຍການຕິດຕາມ ຂອງ ຂ້ອຍ",
-       "tog-minordefault": "ຖ້າບໍ່ມີການຕັ້ງ ກຳໜົດໃຫ້ທຸກໆການດັດແກ້ ເປັນ ການດັດແກ້ເລັກນ້ອຍ",
-       "tog-previewontop": "ສະແດງ ຜົນການດັດແກ້ ເທິງ ຊ່ອງດັດແກ້",
-       "tog-previewonfirst": "ສະແດງ ຜົນການດັດແກ້ ໃນ ເວລາດັດແກ້ເທື່ອທຳອິດ",
-       "tog-enotifwatchlistpages": "ສົ່ງອີເມລມາໃຫ້ຂ້ອຍ ເມື່ອ ໜ້າທີ່ຂ້ອຍຕິດຕາມໄດ້ຖືກປ່ຽນແປງ",
-       "tog-enotifusertalkpages": "ສົ່ງ ອີເມລ ມາໃຫ້ ຂ້ອຍ ເວລາ ໜ້າສົນທະນາຂ້ອຍ ມີການປ່ຽນແປງ",
-       "tog-enotifminoredits": "ສົ່ງ ອີເມລ ໃຫ້ຂ້ອຍ ເວລາມີການດັດແກ້ເລັກນ້ອຍນຳ",
-       "tog-enotifrevealaddr": "ສະແດງ ອີເມລ ຂອງຂ້ອຍ ໃນ ການແຈ້ງວ່າມີຂໍ້ຄວາມອີເມລ",
-       "tog-shownumberswatching": "ສະແດງ ຈຳນວນຜູ້ໃຊ້ ຕິດຕາມໝ້ານີ້",
-       "tog-forceeditsummary": "ເຕື່ອນຂ້ອຍ ຖ້າບໍ່ໄດ້ຂຽນຫຍັງໃສ່ ຊ່ອງ ສະຫຼຸບການດັດແກ້",
-       "tog-watchlisthideown": "ເຊື່ອງ ການດັດແກ້ໂດຍຂ້ອຍ ໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ",
+       "tog-underline": "ການຂີດເສັ້ນກ້ອງລິງກ໌:",
+       "tog-hideminor": "ເຊື່ອງການດັດແກ້ເລັກນ້ອຍໃນໜ້າປັບປຸງລ້າສຸດ",
+       "tog-hidepatrolled": "ເຊື່ອງການແກ້ໄຂທີ່ກວດສອບແລ້ວໃນໜ້າປັບປຸງລ້າສຸດ",
+       "tog-newpageshidepatrolled": "ເຊື່ອງໜ້າທີ່ກວດສອບແລ້ວໃນລາຍການໜ້າໃໝ່",
+       "tog-hidecategorization": "ເຊື່ອງການຈັດໝວດໝູ່ໜ້າ",
+       "tog-extendwatchlist": "ຂະຫຍາຍລາຍການຕິດຕາມໃຫ້ສະແດງການປ່ຽນແປງທັງໝົດ, ບໍ່ແມ່ນພຽງການປ່ຽນແປງລ້າສຸດ",
+       "tog-usenewrc": "ຈັດກຸ່ມການປ່ຽນແປງແບ່ງຕາມໜ້າຢູ່ໃນລາຍການປັບປຸງລ້າສຸດແລະລາຍການຕິດຕາມ",
+       "tog-numberheadings": "ກຳນົດເລກຫົວເລື່ອງອັດຕະໂນມັດ",
+       "tog-showtoolbar": "ສະແດງແຖບເຄື່ອງມືແກ້ໄຂ",
+       "tog-editondblclick": "ແກ້ໄຂໜ້າເມື່ອຄລິກສອງເທື່ອ",
+       "tog-editsectiononrightclick": "ເປີດໃຊ້ງານການແກ້ໄຂສ່ວນໂດຍຄລິກຂວາຢູ່ເທິງຊື່ເລື່ອງຂອງສ່ວນນັ້ນ",
+       "tog-watchcreations": "ເພີ່ມໜ້າທີ່ຂ້ອຍສ້າງແລະໄຟລ໌ທີ່ຂ້ອຍອັບໂຫຼດເຂົ້າໃນລາຍການຕິດຕາມ",
+       "tog-watchdefault": "ເພີ່ມໜ້າແລະໄຟລ໌ທີ່ຂ້ອຍແກ້ໄຂເຂົ້າໃນລາຍການຕິດຕາມ",
+       "tog-watchmoves": "ເພີ່ມໜ້າແລະໄຟລ໌ທີ່ຂ້ອຍຍ້າຍເຂົ້າໃນລາຍການຕິດຕາມ",
+       "tog-watchdeletion": "ເພີ່ມໜ້າແລະໄຟລ໌ທີ່ຂ້ອຍລຶບເຂົ້າໃນລາຍການຕິດຕາມ",
+       "tog-watchuploads": "ເພີ່ມໄຟລ໌ໃໝ່ທີ່ຂ້ອຍອັບໂຫຼດເຂົ້າໃນລາຍການຕິດຕາມ",
+       "tog-watchrollback": "ເພີ່ມໜ້າທີ່ຂ້ອຍໄດ້ກັບຄືນຢ່າງສຸກເສີນເຂົ້າໃນລາຍການຕິດຕາມ",
+       "tog-minordefault": "ກຳນົດການແກ້ໄຂທຸກຄັ້ງເປັນການແກ້ໄຂເລັກນ້ອຍໂດຍປະລິຍາຍ",
+       "tog-previewontop": "ສະແດງໂຕຢ່າງກ່ອນກ່ອງແກ້ໄຂ",
+       "tog-previewonfirst": "ສະແດງໂຕຢ່າງໃນການແກ້ໄຂຄັ້ງທຳອິດ",
+       "tog-enotifwatchlistpages": "ອີເມລຫາເມື່ອໜ້າຫຼືໄຟລ໌ໃນລາຍການຕິດຕາມປ່ຽນແປງ",
+       "tog-enotifusertalkpages": "ອີເມລຫາເມື່ອມີການປ່ຽນແປງໜ້າສົນທະນາກັບຜູ້ໃຊ້ຂອງຂ້ອຍ",
+       "tog-enotifminoredits": "ອີເມລຫາເຊັ່ນກັນສຳລັບການແກ້ໄຂໜ້າແລະໄຟລ໌ເລັກນ້ອຍ",
+       "tog-enotifrevealaddr": "ເປີດເຜີຍທີ່ຢູ່ອີເມລຂອງຂ້ອຍໃນອີເມລແຈ້ງເຕືອນ",
+       "tog-shownumberswatching": "ສະແດງຈຳນວນຜູ້ໃຊ້ທີ່ຕິດຕາມ",
+       "tog-fancysig": "ຖືລາຍເຊັນເປັນຂໍ້ຄວາມວິກິ (ໂດຍບໍ່ມີລິງຄ໌ອັດຕະໂນມັດ)",
+       "tog-uselivepreview": "ໃຊ້ການສະແດງໂຕຢ່າງແບບສົດ",
+       "tog-forceeditsummary": "ເຕືອນເມື່ອຊ່ອງຄຳອະທິບາຍໂດຍຫຍໍ້ວ່າງເປົ່າ",
+       "tog-watchlisthideown": "ເຊື່ອງການແກ້ໄຂຂອງຂ້ອຍຈາກລາຍການຕິດຕາມ",
        "tog-watchlisthidebots": "ເຊື່ອງ ການດັດແກ້ ໂດຍ ບອທ໌ ໃນລາຍການຕິດຕາມຂອງຂ້ອຍ",
        "tog-watchlisthideminor": "ເຊື່ອງ ການດັດແກ້ເລັກນ້ອຍ ໃນ ລາຍການຕິດຕາມຂອງຂ້ອຍ",
        "tog-watchlisthideliu": "ເຊື່ອງການດັດແກ້ ໂດຍ ຜູ້ໃຊ້ໄດ້ເຊັນເຂົາ ໃນ ລາຍການຕິດຕາມ",
@@ -41,7 +47,7 @@
        "tog-showhiddencats": "ສະແດງໝວດເຊື່ອງ",
        "underline-always": "ທຸກຄັ້ງ",
        "underline-never": "ບໍ່ຂີດ",
-       "underline-default": "àº\84à»\88າàº\95ັà»\89àº\87à»\80àº\94ີມ àº\82ອàº\87 ບຣາວເຊີ",
+       "underline-default": "ສະàº\81ິàº\99ຫຼືàº\84à»\88າàº\97ີà»\88àº\96ືàº\81àº\81ຳàº\99ົàº\94à»\84ວà»\89àº\82ອàº\87ບຣາວເຊີ",
        "sunday": "ວັນອາທິດ",
        "monday": "ວັນຈັນ",
        "tuesday": "ວັນອັງຄານ",
        "subcategories": "ໝວດຍ່ອຍ",
        "category-media-header": "ໜ້າຕ່າງ າ ໃນ \"$1\"",
        "category-empty": "''ບໍ່ມີໜ້າໃດຢູ່ໃນໝວດນີ້''",
-       "hidden-categories": "{{PLURAL:$1|à»\9cວàº\94à»\80àº\8aືà»\88ອàº\87|à»\9cວàº\94ເຊື່ອງ}}",
+       "hidden-categories": "{{PLURAL:$1|à»\9cວàº\94àº\97ີà»\88àº\96ືàº\81à»\80àº\8aືà»\88ອàº\87|à»\9cວàº\94àº\97ີà»\88àº\96ືàº\81ເຊື່ອງ}}",
        "hidden-category-category": "ບັນດາໜວດເຊື່ອງ",
        "category-subcat-count-limited": "ໜວດນີ້ ມີ ໜວດຍ່ອຍ ດັ່ງຕໍ່ໄປນີ້ {{PLURAL:$1|ໜວດຍ່ອຍ|$1 ໜວດຍ່ອຍ}}.",
        "category-article-count": "{{PLURAL:$2|ໝວດນີ້ມີໜ້າຢູ່ພຽງໜ້າດຽວ|ມີ {{PLURAL:$1|ໜ້າດຽວ|$1 ໜ້າ}} ໃນໝວດນີ້ ເຕັມ $2}}",
        "newwindow": "(ເປີດເປັນ ປ່ອງຢ້ຽມ(ວິນໂດ)ໃໝ່ )",
        "cancel": "ລົບລ້າງ",
        "moredotdotdot": "ຕື່ມ...",
-       "mypage": "ໜ້າຂ້ອຍ",
+       "mypage": "ໜ້າ",
        "mytalk": "ສົນທະນາ",
-       "anontalk": "ສົນທະນາ ສຳຫຼັບ IP ນີ້",
+       "anontalk": "ສົນທະນາ",
        "navigation": "ນຳທິດ",
        "and": "&#32;ແລະ",
        "qbfind": "ຊອກຫາ",
        "qbedit": "ດັດແກ້",
        "qbpageoptions": "ໜ້ານີ້",
        "qbmyoptions": "ໝ້າຂ້ອຍ",
+       "navigation-heading": "ເມນູນຳທາງ",
        "errorpagetitle": "ຜິດພາດ",
        "returnto": "ກັບໄປ  $1.",
        "tagline": "ຈາກ {{SITENAME}}",
        "help": "ຊ່ວຍເຫຼືອ",
-       "search": "àº\8aອàº\81ຫາ",
-       "searchbutton": "àº\8aອàº\81ຫາ",
+       "search": "àº\84ົà»\89àº\99ຫາ",
+       "searchbutton": "àº\84ົà»\89àº\99ຫາ",
        "go": "ໄປ",
        "searcharticle": "ໄປ",
        "history": "ປະຫວັດ",
        "history_short": "ປະຫວັດການດັດແກ້",
        "printableversion": "ສະບັບພິມໄດ້",
-       "permalink": "ລິà»\89àº\87àº\84à»\8càº\96າວອàº\99",
+       "permalink": "ລິງຄ໌ຖາວອນ",
        "print": "ພິມ",
-       "edit": "àº\94ັàº\94à»\81àº\81à»\89",
+       "edit": "à»\81àº\81à»\89à»\84àº\82",
        "create": "ສ້າງ",
        "editthispage": "ດັດແກ້ໜ້ານີ້",
        "create-this-page": "ສ້າງໜ້ານີ້",
        "delete": "ລຶບ",
        "deletethispage": "ລຶບໜ້ານີ້",
        "protect": "ປົກປ້ອງ",
-       "protect_change": "àº\9bà»\88ຽàº\99ຮູàº\9aà»\81àº\9aàº\9aàº\81າàº\99àº\9bົàº\81àº\9bà»\89ອງ",
+       "protect_change": "àº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bງ",
        "protectthispage": "ປ້ອງກັນໜ້ານີ້",
-       "unprotect": "à»\80àº\8aົາàº\9bົàº\81àº\9bà»\89ອàº\87",
+       "unprotect": "àº\9bà»\88ຽàº\99à»\81àº\9bàº\87àº\81າàº\99àº\9bà»\89ອàº\87àº\81ັàº\99",
        "newpage": "ໜ້າໃໝ່",
        "talkpage": "ປຶກສາຫາລືໜ້ານີ້",
        "talkpagelinktext": "ສົນທະນາ",
        "specialpage": "ໝ້າພິເສດ",
-       "personaltools": "à»\80àº\84ືà»\88ອàº\87ມືສà»\88ວàº\99àº\95ົວ",
+       "personaltools": "à»\80àº\84ືà»\88ອàº\87ມືສà»\88ວàº\99àº\9aຸàº\81àº\84ົàº\99",
        "articlepage": "ເບິ່ງໜ້າເນື້ອໃນ",
        "talk": "ສົນທະນາ",
        "views": "ເທື່ອເບິ່ງ",
-       "toolbox": "àº\81ັàº\9aອຸàº\9aàº\9bະàº\81ອàº\99",
+       "toolbox": "à»\80àº\84ືà»\88ອàº\87ມື",
        "userpage": "ເບິ່ງໜ້າສົນທະນາຂອງຜູ້ໃຊ້",
        "projectpage": "ເບິ່ງໝ້າໂຄງການ",
        "mediawikipage": "ເບິ່ງ ໝ້າຂໍ້ຄວາມ",
        "viewcount": "ໜ້ານີ້ຖືກເຂົ້າເບິ່ງ {{PLURAL:$1|ເທື່ອໜຶ່ງ|$1 ເທື່ອ}}.",
        "protectedpage": "ໜ້າຖືກປົກປ້ອງ",
        "jumpto": "ໄປຫາ:",
-       "jumptonavigation": "àº\99ຳàº\97ິàº\94",
+       "jumptonavigation": "àº\9bà»\89າàº\8dàº\9aອàº\81àº\97າàº\87",
        "jumptosearch": "ຄົ້ນຫາ",
        "aboutsite": "ກ່ຽວກັບ{{SITENAME}}",
        "aboutpage": "Project:ກ່ຽວກັບ",
-       "copyright": "ເນື້ອໃນ ສະໜອງໃຫ້ ພາຍໃຕ້ $1.",
+       "copyright": "ເນື້ອໃນແມ່ນສາມາດໃຊ້ໄດ້ພາຍໃຕ້ $1 ຖ້າບໍ່ແມ່ນຢ່າງອື່ນໃດທີ່ລະບຸໄວ້.",
        "copyrightpage": "{{ns:project}}:ລິຂະສິດ",
-       "currentevents": "àº\81ິàº\94àº\88ະàº\81ຳàº\9eວມàº\94ຳà»\80àº\99ີນ",
-       "currentevents-url": "Project:àº\81ິàº\94àº\88ະàº\81ຳàº\9eວມàº\94ຳà»\80àº\99ີນ",
+       "currentevents": "à»\80ຫàº\94àº\81າàº\99àº\9bັàº\94àº\88ຸàº\9aັນ",
+       "currentevents-url": "Project:à»\80ຫàº\94àº\81າàº\99àº\9bັàº\94àº\88ຸàº\9aັນ",
        "disclaimers": "ຂໍ້ປະຕິເສດຄວາມຮັບຜິດຊອບ",
        "disclaimerpage": "Project:ຂໍ້ປະຕິເສດຄວາມຮັບຜິດຊອບ",
        "edithelp": "ວິທີດັດແກ້ໜ້າ",
        "badaccess-group0": "ທ່ານ ບໍ່ໄດ້ຮັບອະນຸຍາດ ໃຫ້ປະຕິບັດການ ທີ່ ທ່ານ ສັ່ງ.",
        "versionrequired": "ຕ້ອງການເວີຣ໌ຊັ່ນ $1 ຂອງມີເດຍວິກິ",
        "ok": "ຕົກລົງ",
-       "retrievedfrom": "àº\96ອàº\99ມາຈາກ \"$1\"",
+       "retrievedfrom": "àº\94ຶàº\87àº\82à»\8dà»\89ມູàº\99ຈາກ \"$1\"",
        "youhavenewmessages": "ທ່ານ ມີ $1 ($2).",
        "youhavenewmessagesmulti": "ທ່ານມີຂໍ້ຄວາມໃໝ່ ຢູ່ $1",
-       "editsection": "àº\94ັàº\94à»\81àº\81à»\89",
+       "editsection": "à»\81àº\81à»\89à»\84àº\82",
        "editold": "ດັດແກ້",
        "viewsourceold": "ເບິ່ງ ຊອສ",
        "editlink": "ດັດແກ້",
-       "editsectionhint": "àº\94ັàº\94à»\81àº\81à»\89 ພາກ: $1",
+       "editsectionhint": "à»\81àº\81à»\89à»\84àº\82ພາກ: $1",
        "toc": "ເນື້ອໃນ",
        "showtoc": "ສະແດງ",
        "hidetoc": "ເຊື່ອງ",
        "viewdeleted": "ເບິ່ງ $1 ບໍ?",
        "site-rss-feed": "$1 RSS ຟີດ",
-       "site-atom-feed": "$1 Atom ຟີດ",
+       "site-atom-feed": "ອະຕອມຟີດ $1",
        "page-rss-feed": "\"$1\" RSS ຟີດ",
-       "red-link-title": "$1 (àº\8dັàº\87àº\9aà»\8dà»\88à»\84àº\94à»\89ສà»\89າàº\87)",
-       "nstab-main": "àº\9aົàº\94àº\84ວາມ",
+       "red-link-title": "$1 (àº\9aà»\8dà»\88ມີà»\9cà»\89າàº\99ີà»\89)",
+       "nstab-main": "à»\9cà»\89າ",
        "nstab-user": "ໜ້າຜູ້ໃຊ້",
-       "nstab-special": "ພິເສດ",
+       "nstab-special": "à»\9cà»\89າàº\9eິà»\80ສàº\94",
        "nstab-project": "ໜ້າໂຄງການ",
        "nstab-image": "ໄຟລ໌",
        "nstab-mediawiki": "ຂໍ້ຄວາມ",
        "nstab-template": "ແມ່ແບບ",
        "nstab-help": "ໜ້າຊ່ອຍເຫຼືອ",
        "nstab-category": "ໝວດ",
+       "mainpage-nstab": "ໜ້າຫຼັກ",
        "nosuchspecialpage": "ບໍ່ມີໝ້າພິເສດຊື່ນັ້ນ",
        "databaseerror": "ມີຄວາມຜິດພາດ ດ້ານ ຖານຂໍ້ມູນ",
        "readonly": "ຖານຂໍ້ມູນຖືກລອັກ",
        "missingarticle-diff": "(ສ່ວນຕ່າງ: $1, $2)",
        "internalerror": "ມີຄວາມຜິດພາດພາຍໃນ",
        "filerenameerror": "ບໍ່ສາມາດ ປ່ຽນ ຊື່ໄຟລ໌  \"$1\" ໄປເປັນ  \"$2\" ໄດ້.",
-       "cannotdelete": "ບໍ່ສາມາດລຶບໜ້າ ຫຼື ໄຟລ໌ ໄດ້. (ມັນອາດຈະຖືກລຶບໂດຍໃຜຜູ້ໜຶ່ງແລ້ວ.)",
+       "cannotdelete": "ບໍ່ສາມາດລຶບໜ້າຫຼືໄຟລ໌ \"$1\" ໄດ້.\nມັນອາດຈະຖືກລຶບໂດຍໃຜຜູ້ໜຶ່ງແລ້ວ.",
        "badtitle": "ຫົວຂໍ້ບໍ່ຖືກຕ້ອງ",
        "viewsource": "ເບິ່ງຊອສ໌",
        "namespaceprotected": "ທ່ານບໍ່ໄດ້ຮັບອະນຸຍາດ ໃຫ້ ດັດແກ້ ໜ້າ ໃນ  '''$1'''.",
-       "logouttext": "'''ທ່່ານ ໄດ້ ເຊັນອອກແລ້ວ.'''\n\nທ່ານ ສາມາດສືບຕໍ່ໃຊ້ {{SITENAME}} ແບບບໍ່ສະແດງຊື່, ຫຼື ທ່ານ ສາມາດ ເຊັນເຂົ້າ ອີກ ໂດຍ ຊື່ຜູ້ໃຊ້ ເກົ່າ ຫຼື ໃໝ່ ກໍ່ໄດ້.\nກະລຸນາ ຮັບຊາບວ່າ ບາງໜ້າ ອາດຈະສືບຕໍ່ ສະແດງ ຄືວ່າ ທ່ານ ຍັງເຊັນເຂົ້າຢູ່ ຈົນກວ່າ ທ່ານ ຂໍ້ມູນບັນທຶກຊົ່ວຄາວ ໃນ ໂປຣແກຣມທ່ອງເວັບ ຂອງ ທ່ານ ຈະຖືກລຶບ.",
+       "logouttext": "<strong>ທ່່ານໄດ້ອອກຈາກລະບົບແລ້ວ.<strong>\n\nກະລຸນາຮັບຊາບວ່າບາງໜ້າຈະຍັງຄົງສະແດງຜົນຕໍ່ໄປເຖິງແມ້ວ່າທ່ານຈະເຂົ້າສູ່ລະບົບແລ້ວ, ຈົນກວ່າທ່ານຈະລ້າງແຄຊໃນບຣາວເຊີຂອງທ່ານທັງໝົດ.",
        "yourname": "ຊື່ຜູ້ໃຊ້",
        "yourpassword": "ລະຫັດຜ່ານ",
        "yourpasswordagain": "ພິມລະຫັດຜ່ານອີກ",
-       "remembermypassword": "ຈົດຈໍາການເຊັນເຂົ້າຂອງຂ້ອຍ ຢູ່ ຄອມພິວເຕີໜ່ວຍນີ້ (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "yourdomainname": "ໂດເມນ ຂອງ ທ່ານ",
        "login": "ເຊັນເຂົ້າ",
        "nav-login-createaccount": "ເຊັນເຂົ້າ / ສ້າງບັນຊີ",
        "userlogin": "ເຊັນເຂົ້າ / ສ້າງບັນຊີ",
        "logout": "ເຊັນອອກ",
        "userlogout": "ເຊັນອອກ",
-       "nologin": "àº\9aà»\8dà»\88ມີàº\9aັàº\99àº\8aີà»\80àº\97ືà»\88ອàº\9aà»\8d? '''$1'''.",
+       "nologin": "àº\8dັàº\87àº\9aà»\8dà»\88ມີàº\9aັàº\99àº\8aີà»\80àº\97ືà»\88ອàº\9aà»\8dà»\88? $1.",
        "nologinlink": "ສ້າງບັນຊີໃໝ່",
        "createaccount": "ສ້າງບັນຊີ",
        "gotaccount": "ມີ ບັນຊີແລ້ວບໍ? '''$1'''.",
        "gotaccountlink": "ເຊັນເຂົ້າ",
-       "createaccountmail": "à»\82àº\94àº\8d àº­àºµà»\80ມລ",
+       "createaccountmail": "à»\83àº\8aà»\89ລະຫັàº\94àº\9cà»\88າàº\99à»\81àº\9aàº\9aສຸà»\88ມàº\8aົà»\88ວàº\84າວà»\81ລະສົà»\88àº\87ມັàº\99à»\84àº\9bà»\83ຫà»\89àº\97ີà»\88ຢູà»\88ອີà»\80ມວàº\97ີà»\88ລະàº\9aຸ",
        "badretype": "ລະຫັດຜ່ານ ທີ່ ທ່ານພິມຄືນ ບໍ່ຖືກກັບ ທີ່ພິມກ່ອນ.",
        "loginerror": "ມີບັນຫາໃນການເຊັນເຂົ້າ",
-       "loginsuccesstitle": "à»\80àº\8aັàº\99à»\80àº\82ົà»\89າສຳà»\80ລັàº\94",
+       "loginsuccesstitle": "à»\80àº\82ົà»\89າສູà»\88ລະàº\9aົàº\9aà»\81ລà»\89ວ",
        "loginsuccess": "'''ທ່ານ ເຊັນເຂົ້າ  {{SITENAME}} ໃນນາມ \"$1\".'''",
        "wrongpassword": "ລະຫັດຜ່ານບໍ່ຖືກ. ກະລຸນາເຮັດຄືນໃໝ່.",
        "wrongpasswordempty": "ບໍ່ມີລະຫັດຜ່ານຖືກພິມເຂົ້າ. ກະລຸນາເຮັດຄືນໃໝ່.",
-       "mailmypassword": "àº\82à»\8dລະຫັàº\94àº\9cà»\88າàº\99àº\97າàº\87ອີà»\80ມລ",
+       "mailmypassword": "àº\95ັà»\89àº\87àº\84à»\88າລະຫັàº\94àº\9cà»\88າàº\99à»\83à»\9dà»\88",
        "acct_creation_throttle_hit": "ຂໍໂທດຫຼາຍໆ, ທ່ານ ໄດ້ສ້າງ $1 ບັນຊີແລ້ວ. ທ່ານ ບໍ່ສາມາດ ສ້ງບັນຊີໄດ້ອີກ.",
-       "emailauthenticated": "ອີເມລ ຂອງ ທ່ານ ຖືກຢືນຢັນ ເມື່ອ $1.",
+       "emailauthenticated": "ອີເມລຂອງທ່ານໄດ້ຖືກຢືນຢັນແລ້ວເມື່ອວັນທີ່ $2 ເວລາ $3.",
        "emailconfirmlink": "ຢືນຢັນ ທີ່ຢູ່ ອີເມລ ຂອງ ທ່ານ",
        "accountcreated": "ບັນຊີ ໄດ້ຖືກສ້າງ ແລ້ວ",
        "accountcreatedtext": "ບັນຊີ ຂອງ  $1 ໄດ້ ຖືກສ້າງແລ້ວ.",
+       "pt-login": "ເຂົ້າສູ່ລະບົບ",
+       "pt-createaccount": "ສ້າງບັນຊີ",
        "changepassword": "ປ່ຽນລະຫັດຜ່ານ",
        "oldpassword": "ລະຫັດຜ່ານເກົ່າ:",
        "newpassword": "ລະຫັດຜ່ານໃໝ່:",
        "retypenew": "ພິມລະຫັດຜ່ານໃໝ່ອີກ:",
        "resetpass_submit": "ຕັ້ງລະຫັດຜ່ານ ແລະ ເຊັນເຂົ້າ",
        "changepassword-success": "ສຳເລັດການປ່ຽນແປງ ລະຫັດຜ່ານຂອງທ່ານແລ້ວ! ດຽວນີ້ ທ່ານ ເຊັ່ນເຂົ້າ ໃນ ...",
+       "passwordreset-invalidemail": "ທີ່ຢູ່ອີເມລບໍ່ຖືກຕ້ອງ",
        "bold_sample": "ໂຕໜັງສືເຂັ້ມ",
        "bold_tip": "ໂຕໜັງສືເຂັ້ມ",
        "italic_sample": "ໂຕເນີ້ງ",
        "template-protected": "(ປົກປ້ອງ)",
        "template-semiprotected": "(ເຄິ່ງປົກປ້ອງ)",
        "nocreatetext": "{{SITENAME}} ໄດ້ຈຳກັດການສ້າງໜ້າໃໝ່.\nທ່ານສາມາດກັບໄປ ດັດແກ້ ໜ້າທີ່ມີແລ້ວ ຫຼື [[Special:UserLogin|ເຊັນເຂົ້າ ຫຼື ສ້າງບັນຊີ]].",
-       "cantcreateaccounttitle": "ບໍ່ສາມາດສ້າງ ບັນຊີ ໄດ້",
        "cantcreateaccount-text": "ການສ້າງບັນຊີ ຈາກ IP ນີ້ (<b>$1</b>) ໄດ້ຖືກຫ້າມ ໂດຍ [[User:$3|$3]].\n\nເຫດຜົນ ໃຫ້ໄວ້ ໂດຍ $3 ແມ່ນ ''$2''",
        "viewpagelogs": "ເບິ່ງບັນທຶກ ຂອງ ໜ້ານີ້",
        "nohistory": "ຍັງບໍ່ມີ ປະຫວັດການດັດແກ້ໜ້ານີ້ເທື່ອ.",
        "currentrev": "ສະບັບປະຈຸບັນ",
-       "revisionasof": "à»\80àº\99ືà»\89ອà»\83àº\99ສະàº\9aັàº\9aເມື່ອ $1",
-       "previousrevision": "â\86\90 àºªàº°àº\9aັàº\9aເກົ່າກວ່າ",
+       "revisionasof": "ລຸà»\89àº\99à»\81àº\81à»\89à»\84àº\82à»\80àº\81ົà»\88າເມື່ອ $1",
+       "previousrevision": "â\86\90 àº¥àº¸à»\89àº\99ເກົ່າກວ່າ",
        "nextrevision": "ສະບັບກ່ອນ",
        "currentrevisionlink": "ສະບັບປະຈຸບັນ",
        "cur": "ດຽວນີ້",
        "show": "ສະແດງ",
        "minoreditletter": "ລ",
        "newpageletter": "ມ",
+       "rc-change-size-new": "$1 {{PLURAL:$1|byte|bytes}} ຫຼັງການປ່ຽນແປງ",
        "recentchangeslinked": "ການດັດແກ້ທີ່ກ່ຽວຂ້ອງ",
        "recentchangeslinked-feed": "ການດັດແກ້ທີ່ກ່ຽວຂ້ອງ",
-       "recentchangeslinked-toolbox": "àº\81າàº\99àº\94ັàº\94à»\81àº\81à»\89ທີ່ກ່ຽວຂ້ອງ",
+       "recentchangeslinked-toolbox": "àº\81າàº\99àº\9bà»\88ຽàº\99à»\81àº\9bàº\87ທີ່ກ່ຽວຂ້ອງ",
        "recentchangeslinked-title": "ການປ່ຽນແປງກ່ຽວຂ້ອງກັບ \"$1\"",
        "upload": "ອັບໂຫຼດໄຟລ໌",
        "filedesc": "ສະຫຼຸບ",
        "sharedupload": "ໄຟລ໌ນີ້ແມ່ນການອັບໂຫຼດຣ່ວມ ແລະ ອາດຖືກໃຊ້ໂດຍໂຄງການອື່ນໆ.",
        "listredirects": "ລາຍການການໂອນໜ້າ",
        "unusedtemplates": "ແມ່ແບບບໍ່ໄດ້ໃຊ້",
-       "randompage": "ໜ້າໃດໜຶ່ງ",
+       "randompage": "ສຸà»\88ມà»\9cà»\89າà»\83àº\94à»\9cຶà»\88àº\87",
        "randomredirect": "ໂອນໄປໜ້າໃດໜຶ່ງ",
        "statistics": "ສະຖິຕິ",
        "doubleredirects": "ໂອນໜ້າ 2 ຄັ້ງ",
        "sp-contributions-search": "ຊອກຫາ ການປະກອບສ່ວນ",
        "sp-contributions-username": "ທີ່ຢູ່ IP ຫຼື ຊື່ຜູ້ໃຊ້:",
        "sp-contributions-submit": "ຊອກຫາ",
-       "whatlinkshere": "ໜ້າທີ່ເຊື່ອມຕໍ່ມາ",
+       "whatlinkshere": "ໜ້າທີ່ເຊື່ອມຕໍ່ມາໜ້ານີ້",
        "whatlinkshere-title": "ໜ້າທີ່ເຊື່ອມຕໍ່ຫາ $1",
        "linkshere": "ບັນດາໜ້າຕໍ່ໄປ ລິ້ງຄ໌ ຫາ ''[[:$1]]''':",
        "nolinkshere": "ບໍ່ມີໜ້າລິ້ງຄ໌ ຫາ '''[[:$1]]'''.",
        "blockipsuccesssub": "ຫ້າມສຳເລັດ",
        "ipblocklist": "ລາຍການ ທີ່ຢູ່ IP ແລະ ຊື່ຜູ້ໃຊ້ ທີ່ຖືກຫ້າມ",
        "blocklink": "ຫ້າມ",
-       "contribslink": "àº\9bະàº\81ອàº\9aສà»\88ວນ",
+       "contribslink": "à»\80ລືà»\88ອàº\87àº\97ີà»\88àº\82ຽນ",
        "autoblocker": "ຫ້າມໂດຍອັດຕາໂນມັດ ຍ້ອນ ທີ່ຢູ່ IP ຂອງທ່ານ ຖືກໃຊ້ໂດຍ \"[[User:$1|$1]]\" ໃນໄລຍະຫຼັງ. ເຫດຜົນໃນການຫ້າມ  $1 ແມ່ນ : \"$2\"",
        "blocklogpage": "ບັນທຶກການຫ້າມ",
        "blocklogentry": "ໄດ້ຫ້າມ \"[[$1]]\" ຈົນຮອດ $2 $3",
        "tooltip-pt-preferences": "ຕັ້ງຄ່າ",
        "tooltip-pt-watchlist": "ລາຍການໜ້າທີ່ທ່ານຕິດຕາມການປ່ຽນແປງ",
        "tooltip-pt-mycontris": "ລາຍການປະກອບສ່ວນຂອງຂ້ອຍ",
-       "tooltip-pt-login": "ມັàº\99àº\9aà»\8dà»\88à»\81ມà»\88àº\99àº\81າàº\99àº\9aັàº\87àº\84ັàº\9a à»\81àº\95à»\88 àº\97à»\88າàº\99àº\84ວàº\99à»\80àº\8aັàº\99à»\80àº\82ົà»\89າ",
+       "tooltip-pt-login": "àº\99ີà»\89àº\9aà»\8dà»\88à»\81ມà»\88àº\99àº\81າàº\99àº\9aັàº\87àº\84ັàº\9a. à»\81àº\95à»\88ຢà»\88າàº\87à»\83àº\94àº\81à»\8dàº\95າມ, àº\97à»\88າàº\99àº\84ວàº\99àº\97ີà»\88àº\88ະà»\80àº\82ົà»\89າສູà»\88ລະàº\9aົàº\9a.",
        "tooltip-pt-logout": "ເຊັນອອກ",
-       "tooltip-ca-talk": "ສົນທະນາ ກ່ຽວກັບ ເນື້ອໃນຂອງໜ້າ",
-       "tooltip-ca-edit": "ທ່ານສາມາດດັດແກ້ໜ້ານີ້ໄດ້. ກະລຸນາໃຊ້ປຸ່ມ ລອງເບິ່ງຜົນ ກ່ອນກົດປຸ່ມບັນທຶກ.",
+       "tooltip-pt-createaccount": "ນີ້ິບໍ່ແມ່ນການບັງຄັບ. ແຕ່ຢ່າງໃດກໍຕາມ, ທ່ານຄວນທີ່ຈະສ້າງບັນຊີແລະເຂົ້າສູ່ລະບົບ.",
+       "tooltip-ca-talk": "ສົນທະນາກ່ຽວກັບເນື້ອໃນຂອງໜ້າ",
+       "tooltip-ca-edit": "ແກ້ໄຂໜ້ານີ້",
        "tooltip-ca-addsection": "ເພີ່ມ ຄຳເຫັນ ໃສ່ ການສົນທະນານີ້.",
        "tooltip-ca-viewsource": "ໜ້ານີ້ຖືກປົກປ້ອງ. ທ່ານສາມາດເບິ່ງຊອສ.",
+       "tooltip-ca-history": "ລຸ້ນແກ້ໄຂເກົ່າຂອງໜ້ານີ້",
        "tooltip-ca-protect": "ປົກປ້ອງໜ້ານີ້",
        "tooltip-ca-delete": "ລຶບໜ້ານີ້",
        "tooltip-ca-move": "ຍ້າຍໜ້ານີ້",
        "tooltip-ca-watch": "ເພີ່ມໜ້ານີ້ໃສ່ລາຍການຕິດຕາມຂອງທ່ານ",
        "tooltip-ca-unwatch": "ເອົາໜ້ານີ້ອອກຈາກລາຍການຕິດຕາມ ຂອງ ທ່ານ",
        "tooltip-search": "ຄົ້ນຫາ {{SITENAME}}",
-       "tooltip-p-logo": "ໜ້າຫຼັກ",
+       "tooltip-search-go": "ໄປຫາໜ້າທີ່ມີຊື່ທີ່ແນ່ນອນນີ້ຖ້າມັນມີຢູ່",
+       "tooltip-search-fulltext": "ຄົ້ນຫາຂໍ້ຄວາມນີ້ໃນໜ້າ",
+       "tooltip-p-logo": "ເຂົ້າສູ່ໜ້າຫຼັກ",
        "tooltip-n-mainpage": "ໄປເບິ່ງໜ້າຫຼັກ",
-       "tooltip-n-portal": "ກ່ຽວກັບໂຄງການ, ທ່ານສາມາດເຮັດຫຍັງ, ແລະ ຈະຊອກຫາຫຍັງໄດ້ຢູ່ໃສ",
-       "tooltip-n-currentevents": "ຊອກຂໍ້ມູນກ່ຽວກັບກິດຈະກຳພວມດຳເນີນ",
-       "tooltip-n-randompage": "ໂຫຼດໜ້າໃດໜຶ່ງ",
-       "tooltip-n-help": "ບ່ອນຊອກ.",
-       "tooltip-t-whatlinkshere": "ລາຍການຂອງທຸກໆໜ້າວິກິ ທີ່ເຊື່ອມຕໍ່ມາ",
+       "tooltip-n-mainpage-description": "ເຂົ້າສູ່ໜ້າຫຼັກ",
+       "tooltip-n-portal": "ກ່ຽວກັບໂຄງການ, ສິ່ງທີ່ທ່ານເຮັດໄດ້, ແລະບ່ອນທີ່ສາມາດຫາສິ່ງຕ່າງໆໄດ້",
+       "tooltip-n-currentevents": "ຄົ້ນຫາມູນກ່ຽວກັບກິດຈະກຳທີ່ກຳລັງດຳເນີນ",
+       "tooltip-n-recentchanges": "ລາຍການການປ່ຽນແປງລ້າສຸດໃນວິກິ",
+       "tooltip-n-randompage": "ສຸ່ມໂຫຼດໜ້າໃດໜຶ່ງ",
+       "tooltip-n-help": "ບ່ອນທີ່ຕ້ອງການຄົ້ນຫາ",
+       "tooltip-t-whatlinkshere": "ລາຍການຂອງທຸກໆໜ້າໃນວິກິທີ່ເຊື່ອມຕໍ່ມາໜ້ານີ້",
+       "tooltip-t-recentchangeslinked": "ການແກ້ໄຂລ້າສຸດໃນໜ້າທີ່ເຊື່ອມຕໍ່ມາຈາກໜ້ານີ້",
        "tooltip-t-contributions": "ເບິ່ງລາຍການປະກອບສ່ວນໂດຍຜູ້ໃຊ້ນີ້",
        "tooltip-t-emailuser": "ສົ່ງອີເມລຫາຜູ້ໃຊ້ນີ້",
        "tooltip-t-upload": "ອັບໂຫຼດໄຟລ໌",
        "tooltip-t-specialpages": "ລາຍການໜ້າພິເສດທັງໝົດ",
+       "tooltip-t-print": "ສະບັບທີ່ພິມໄດ້ຂອງໜ້ານີ້",
+       "tooltip-t-permalink": "ລິງຄ໌ຖາວອນມາລຸ້ນແກ້ໄຂເກົ່າຂອງໜ້ານີ້",
+       "tooltip-ca-nstab-main": "ເບິ່ງໜ້າເນື້ອໃນ",
        "tooltip-ca-nstab-user": "ເບິ່ງໜ້າຜູ້ໃຊ້",
        "tooltip-ca-nstab-project": "ເບິ່ງໜ້າໂຄງການ",
        "tooltip-ca-nstab-image": "ເບິງໜ້າໄຟລ໌",
        "tooltip-compareselectedversions": "ເບິ່ງສ່ວນຕ່າງລະຫວ່າງ ສອງ ສະບັບເລືອກ.",
        "tooltip-watch": "ເພີ່ມໜ້ານີ້ໃສ່ລາຍການຕິດຕາມຂອງທ່ານ",
        "anonymous": "ຜູ້ໃຊ້ ບໍ່ສະແດງຊື່ ຈາກ {{SITENAME}}",
+       "pageinfo-toolboxlink": "ຂໍ້ມູນໜ້າ",
+       "confirm-markpatrolled-button": "ຕົກລົງ",
        "previousdiff": "ສ່ວນຕ່າງກ່ອນ",
        "nextdiff": "ສ່ວນຕ່າງຕໍ່ໄປ →",
        "imagemaxsize": "ກຳນົດຄວາມໃຫຍ່ຂອງ ຮູບ ຫຼື ໜ້າອະທິບາຍຮູບ ບໍ່ໃຫ້ກາຍ:",
        "file-info-size": "$1 × $2  ປິກເຊລ, ຂະໜາດໄຟລ໌: $3, MIME type: $4",
        "file-nohires": "ບໍ່ມີຂະໜາດລະອຽດກວ່າ",
        "show-big-image": "ເຕັມຂະໜາດ",
+       "show-big-image-size": "$1 × $2 ພິກເຊວ",
        "newimages": "ໄຟລ໌ຮູບໃໝ່",
        "newimages-summary": "ໜ້າພິເສດນີ້ສະແດງໄຟລ໌ທີ່ຖຶກອັປໂຫຼດຫຼ້າສຸດ",
        "noimages": "ບໍ່ມີຫຍັງເບິ່ງ.",
        "watchlisttools-edit": "ເບິ່ງ ແລະ ດັດແກ້ ລາຍການຕິດຕາມ",
        "version": "ສະບັບ",
        "specialpages": "ໜ້າພິເສດ",
+       "searchsuggest-search": "ຄົ້ນຫາ {{SITENAME}}",
        "expandtemplates": "ຂະຫຍາຍແມ່ແບບ"
 }
index 4a0cbcc..3b90e11 100644 (file)
        "yourname": "Sebelu:",
        "yourpassword": "Sebu dafi:",
        "yourpasswordagain": "Ritapi sebu dafi:",
-       "remembermypassword": "Askevusize zwa menuhile kwa bye kompyuta (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "yourdomainname": "Zwa domeni:",
        "login": "Menuhile",
        "nav-login-createaccount": "Menuhile / ipupezi sebelu",
        "template-semiprotected": "(bukelezi di pagafi)",
        "nocreatetext": "{{SITENAME}} sa simplekile petulo.\nA afi e kenki/[[Special:UserLogin|menuhile]].",
        "recreate-moveddeleted-warn": "'''!: A sa hloli petulo dy sa afi kulobala.'''\n\nA sa luku a kenki dyangitubilinisize petulo.\nDesu dafi kulobala di petulo sa gi di informasi:",
-       "cantcreateaccounttitle": "Ni sa hloli di sebelu",
        "viewpagelogs": "Kamukile desu di petulo",
        "currentrev": "Selt nca",
        "revisionasof": "Selt di $1",
index 7aed884..996551b 100644 (file)
        "yourpasswordagain": "یئ گئل هأنی رازینە گوڤاردئن نە بأزە",
        "createacct-yourpasswordagain": "رازینە گوڤاردئن نە پوشت راس کو",
        "createacct-yourpasswordagain-ph": "یئ گئل هأنی رازینە گوڤاردئن نە بأزە",
-       "remembermypassword": "ئوٙمائن ڤامین مئنە د ئی دوڤارتە نیأر د ڤیر داشتوٙ (سی بیشتئروٙنە $1{{PLURAL:$1|روٙز|روٙزیا}})",
        "userlogin-remembermypassword": "مئنە د ساموٙنە ڤادار",
        "userlogin-signwithsecure": "ڤأصل بییئن أمن نە ڤئ کار بئیر",
        "yourdomainname": "پوشگئر شوما:",
        "passwordreset-emailtext-user": "کاریار $1 د {{SITENAME}} د نۊ زئنە کئردئن رازینە گوڤاردئن شومانە د{{SITENAME}} ($4) حاستە. {{PLURAL:$3|حئساڤ|حئساڤیا}} کاریاری کئ هان د هار و ڤا ئی تیرنئشوٙن أنجومانامە هان د ئرتئڤاط:\n\n$2\n\n رازینە گوڤاردئن {{PLURAL:$3|ئی رازینە یا گوڤاردئن موڤأقأتی|ئی رازینە یا گوڤاردئن موڤأقأتی}} شوما د گات {{PLURAL:$5|یئ روٙ|$5 روٙ}} باطئل بوٙە.\nأر کأسی هأنی چئن حاستی داشتە یا یە کئ رازینە گوڤاردئن دئمایی شوما د ڤیرئتوٙ ئوٙما و دە نئمیهایت ڤئنە آلئشت کاری بأکیت، می توٙنیت د ئی پئیغوم تیە پوٙشی بأکیت و هأموٙ رازینە گوڤاردئن دئمایی نە بونیت د کار.",
        "passwordreset-emailelement": "نوم کاریاری: \n$1\n\nرازینە گوڤاردئن موڤأقتی: \n$2",
        "passwordreset-emailsentemail": "یئ گئل رازینە گوڤاردئن هأنی سی أنجومانامە کئل بییە.",
-       "passwordreset-emailsent-capture": "رازینە گوڤاردئن تازە توٙ سی أنجومانامە توٙ کئ ها د هار کئل بییە.",
-       "passwordreset-emailerror-capture": "رازینە گوڤاردئن د أنجومانامە د نۊ زئنە کون کئل بییە،و ڤئ د هار دیاری میکە، ڤألی کئل بییئن ڤئ سی {{GENDER:$2|کاریار}} ناخوش سأرنجوم بییە:$1",
        "changeemail": "أنجومانامە توٙنە آلئشت کاری بأکیت",
        "changeemail-header": "ئی فورمئ نە سی آلئشتکاری أنجومانامە توٙ پور بأکیت. أر میھایت ھأر جوٙر أنجومانامە یی نە د مینجا حئساڤئتوٙ پاکسا بأکیت، جاگە دأئن أنجومانامە نئ د چئنی فورمی حالی بأنیت.",
-       "changeemail-passwordrequired": "شوما سی پوشت راستکاری ئی آلئشت بایأد یئ گئل رازینە گوڤاردئن بأزئنیت.",
        "changeemail-no-info": "شوما سی یە کئ د ئی بألگە دأسرئسی داشتوٙییت باس بیاییت ڤامین.",
        "changeemail-oldemail": "تیرنئشوٙن أنجومانامە ئیسئنی:",
        "changeemail-newemail": "تیرنئشوٙن أنجومانامە تازە:",
        "undo-nochange": "وه نظر میا که ای ویرایشت د ایسنیا خومثی بیه.",
        "undo-summary": "خومثی بیئن وانئری وا $1 [[Special:Contributions/$2|$2]] ([[User talk:$2|چک چنه]])",
        "undo-summary-username-hidden": "خومثی بیئن وانئری $1 وا یه گل کاریار قام بیه",
-       "cantcreateaccounttitle": "نأبوٙە حئساڤ راس بأکیت",
        "cantcreateaccount-text": "حساو دروس بیه و ا ای تیرنشون آی پی(<strong>$1</strong>) وه دس ای [[کاریار:$3|$3]] قلف بیه.\n\n\nدلیل دئه بیه وا $3 ها د<em>$2</em>",
        "cantcreateaccount-range-text": "حساو دروس بیه وا تیرنشون آی پی که د پوشینه <strong>$1</strong> ، که وه ئم مینونه دار تیرنشون آی پی شما ئم هئ(<strong>$4</strong>)، وه دس [[کاریار:$3|$3]]قلف بیه.\n\nدلیل دئه بیه وا $3، \"$2\" ئه.",
        "viewpagelogs": "سئیل پئرئستنوٙمە یا ئی بألگە بأکیت",
        "activeusers-intro": "شما د هار یه گل نومگه د کاریاریایی نه مینیت که د $1 {{PLURAL:$1|رو|رو}} دماتر کنشتگر بینه.",
        "activeusers-count": "$1 {{PLURAL:$1|کنشت|کنشت}} در {{PLURAL:$3|رو|$3 رو}} دماتر",
        "activeusers-from": "کاریاریایی که د شرو بینه نشو بیه:",
-       "activeusers-hidebots": "بوتیا قام کو",
-       "activeusers-hidesysops": "دیوون داریا نه قام کو",
        "activeusers-noresult": "هیچ کاروری پیدا نبی",
        "listgrouprights": "حقوق گرو کاریاری",
        "listgrouprights-summary": "نومگه های گرته د ور گرویا کاریاری تعریف بیه د ای ویکی و اختیارات دئه بیه د ونونه.\nدونسمنیا بیشتر دباره هرکوم د اختیارات نه د   [[{{MediaWiki:Listgrouprights-helppage}}]] پیدا بکیت.",
        "htmlform-cloner-create": "هنی اضاف بکیت",
        "htmlform-cloner-delete": "ؤرداشتن",
        "htmlform-cloner-required": "سی کمترونه یه گل ارزایشت لازمه",
-       "sqlite-has-fts": "$1 وا حامینداری پی جوری تمام نیسسه یی",
-       "sqlite-no-fts": "$1 وا بی حامینداری پی جوری تمام نیسسه یی",
        "logentry-delete-delete": "$1 بلگه {{GENDER:$2|پاکسا بیه}} $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|}} بلگه $3 د نو زنه کرده",
        "logentry-delete-event": "$1 دیاری {{PLURAL:$5|یه گل رخ ون د پهرستنومه|$5 رخ ونیا د پهرستنومه}} نه $3 {{GENDER:$2|آلشتکاری کرد}}: $4",
        "feedback-external-bug-report-button": "جانیا سازی یه گل کنشتیاری کسمدار",
        "feedback-dialog-title": "دیار بیین نهاحردیاری",
        "feedback-dialog-intro": "شما می تونیت نوم بلگه هاری نه سی دماداری هوال حونتو وه کار بئریت.نیسسه شما واگرد نوم کاریاریتو د بلگه \"$1\" اضاف موئه.",
-       "feedback-error-title": "خطا",
        "feedback-error1": "خطا: جواویا نادیار د پیوندکار برنامه نیسی نرم افزار",
        "feedback-error2": "خطا:ویرایشت خو نبی",
        "feedback-error3": "خطا: جواو ندئن د پیوندکار برنامه نیسی نرم افزار",
index 1bc403e..d9b5e3a 100644 (file)
        "talk": "Aptarimas",
        "views": "Peržiūros",
        "toolbox": "Įrankiai",
-       "tool-link-userrights": "Keisti {{GENDER:$1|vartotojo|vartotojos}} grupes",
-       "tool-link-emailuser": "Siusti el. laišką {{GENDER:$1|šiam vartotojui|šiai vartotojai}}",
+       "tool-link-userrights": "Keisti {{GENDER:$1|naudotojo|naudotojos}} grupes",
+       "tool-link-emailuser": "Siųsti {{GENDER:$1|šiam naudotojui|šiai naudotojai}} el. laišką",
        "userpage": "Rodyti naudotojo puslapį",
        "projectpage": "Rodyti projekto puslapį",
        "imagepage": "Žiūrėti failo puslapį",
        "ok": "Gerai",
        "retrievedfrom": "Gauta iš „$1“",
        "youhavenewmessages": "Jūs turite $1 ($2).",
-       "youhavenewmessagesfromusers": "Jūs gavote $1 nuo {{PLURAL:$3|kito vartotojo|$3 vartotojų}} ($2).",
+       "youhavenewmessagesfromusers": "Jūs gavote $1 nuo {{PLURAL:$3|kito naudotojo|$3 naudotojų}} ($2).",
        "youhavenewmessagesmanyusers": "Jūs turite $1 iš daugelio vartotojų ( $2 ) .",
        "newmessageslinkplural": "{{PLURAL:$1|nauja žinutė|999=naujos žinutės}}",
        "newmessagesdifflinkplural": "paskutinis {{PLURAL:$1|pakeitimas|999=pakeitimai}}",
        "passwordreset-emaildisabled": "El. pašto funkcijos uždraustos šiame wiki.",
        "passwordreset-username": "Naudotojo vardas:",
        "passwordreset-domain": "Domenas:",
-       "passwordreset-capture": "Peržiūrėti galutinį e-mail laišką?",
-       "passwordreset-capture-help": "Jei jūs čia pažymėsite, tai e-mail laiškas (su laikinuoju slaptažodžiu) bus parodytas jums prieš išsiunčiant jį naudotojui.",
        "passwordreset-email": "E-pašto adresas:",
        "passwordreset-emailtitle": "Paskyros informacija apie {{sitename}}",
        "passwordreset-emailtext-ip": "Kažkas (tikriausiai jūs, iš IP adreso $1) paprašė priminti jūsų slaptažodį svetainėje {{SITENAME}} ($4). Šio naudotojo {{PLURAL:$3|paskyra|paskyros}} yra susietos su šiuo elektroninio pašto adresu:\n\n$2\n\n{{PLURAL:$3|Šis laikinas slaptažodis|Šie laikini slaptažodžiai}} baigs galiot po {{PLURAL:$5|vienos dienos|$5 dienų}}. \n\nJūs turėtumėte prisijungti ir pasirinkti naują slaptažodį. Jei priminti slaptažodį paprašė kažkas kitas arba jūs prisiminėte savo pirminį slaptažodį ir jums nebereikia jo pakeisti, galite ignoruoti šį pranešimą ir toliau naudotis savo senuoju slaptažodžiu.",
        "passwordreset-emailelement": "Naudotojo vardas: \n$1\n\nLaikinas slaptažodis: \n$2",
        "passwordreset-emailsentemail": "Jeigu šis el. pašto adresas yra susietas su jūsų paskyra, tada slaptažodžio atkūrimo laiškas bus išsiųstas.",
        "passwordreset-emailsentusername": "Jeigu buvo el. paštas susietas su šiuo naudotojo vardu, tai slaptažodžio atkūrimo el. laiškas bus išsiųstas.",
-       "passwordreset-emailsent-capture2": "Slaptažodžio keitimo {{PLURAL:$1|el. laiškas buvo išsiųstas|el. laiškai buvo išsiųsti}}. {{PLURAL:$1|vartotojo vardas ir slaptažodis rodomi|vartotojų vardų ir slaptažodžių sąrašas rodomas}} čia.",
-       "passwordreset-emailerror-capture2": "El. laiško siuntimas {{GENDER:$2|vartotojui}} nepavyko: $1 {{PLURAL:$3|vartotojo vardas ir slaptažodis rodomi|vartotojų vardų ir slaptažodžių sąrašas rodomas}} čia.",
        "passwordreset-nocaller": "Skambinantysis turi būti nurodytas",
        "passwordreset-nosuchcaller": "Skambinantysis neegzistuoja: $1",
-       "passwordreset-invalideamil": "Neteisingas el. pašto adresas",
+       "passwordreset-invalidemail": "Neteisingas el. pašto adresas",
        "passwordreset-nodata": "Vartotojo vardas ir el. paštas buvo nepateikti",
        "changeemail": "Pakeisti ar pašalinti el. pašto adresą",
        "changeemail-header": "Užpildykite šią formą, kad pakeistumėte savo el. pašto adresą. Jeigu norite pašalinti bet kurio el. pašto adreso susiejimą su savo paskyra, palikite naujojo el. pašto adreso lauką tuščią, kai pateiksite formą.",
        "userrights-reason": "Priežastis:",
        "userrights-no-interwiki": "Jūs neturite leidimo keisti naudotojų teises kituose projektuose.",
        "userrights-nodatabase": "Duomenų bazė $1 neegzistuoja arba yra ne vietinė.",
-       "userrights-nologin": "Jūs privalote [[Special:UserLogin|prisijungti]] kaip administratorius, kad galėtumėte priskirti naudotojų teises.",
-       "userrights-notallowed": "Jūs neturite leidimo įtraukti arba pašalinti vartotojo teisių.",
        "userrights-changeable-col": "Grupės, kurias galite keisti",
        "userrights-unchangeable-col": "Grupės, kurių negalite keisti",
        "userrights-conflict": "Naudotojo teisių konfliktas! Prašome dar kartą taikyti savo keitimus.",
-       "userrights-removed-self": "Jūs pašalinote savo paties teises. Taigi, nebegalite pasiekti šio puslapio.",
        "group": "Grupė:",
        "group-user": "Naudotojai",
        "group-autoconfirmed": "Automatiškai patvirtinti naudotojai",
        "right-siteadmin": "Atrakinti ir užrakinti duomenų bazę",
        "right-override-export-depth": "Eksportuoti puslapius įtraukiant susietus puslapius iki 5 lygio gylio",
        "right-sendemail": "Siųsti el. laišką kitiems naudotojams",
-       "right-passwordreset": "Peržiūrėti slaptažodžio pakeitimo e-mail laiškus",
        "right-managechangetags": "Kurti ir (de)aktyvuoti [[Special:Tags|žymes]]",
        "right-applychangetags": "Taikyti [[Special:Tags|žymes]] kartu su pokyčiais",
        "right-changetags": "Pridėti ir ištrinti savavališkus [[Special:Tags|žymes]] individualiuose pakeitimuose ir žurnalo įrašuose",
        "activeusers-count": "$1 {{PLURAL:$1|keitimas|keitimai|keitimų}} per {{PLURAL:$3|paskutinę dieną|$3 paskutines dienas|$3 paskutinių dienų}}",
        "activeusers-from": "Rodyti naudotojus, pradedant:",
        "activeusers-groups": "Rodyti vartotojus, priklausančius grupėms:",
+       "activeusers-excludegroups": "Išskirti vartotojus, priklausančius grupėms:",
        "activeusers-noresult": "Nerasta jokių naudotojų.",
        "activeusers-submit": "Rodyti aktyvius vartotojus",
        "listgrouprights": "Naudotojų grupių teisės",
        "patrol-log-header": "Tai patvirtintų versijų sąrašas.",
        "log-show-hide-patrol": "$1 patvirtinimų sąrašą",
        "log-show-hide-tag": "$1 žymės žurnalas",
+       "confirm-markpatrolled-button": "GERAI",
        "deletedrevision": "Ištrinta sena versija $1",
        "filedeleteerror-short": "Klaida trinant rinkmeną: $1",
        "filedeleteerror-long": "Įvyko klaidų trinant failą:\n\n$1",
        "log-action-filter-upload-overwrite": "Kelti iš naujo",
        "authmanager-authn-not-in-progress": "Autentifikavimas nevyksta arba buvo prarasti sesijos duomenys. Prašome pradėti iš naujo.",
        "authmanager-create-disabled": "Paskyros kūrimas yra išjungtas.",
-       "authmanager-create-from-login": "Norėdami sukurti paskyrą užpildykite laukelius žemiau.",
+       "authmanager-create-from-login": "Norėdami sukurti savo paskyrą užpildykite laukelius žemiau.",
        "authmanager-create-not-in-progress": "Paskyros kūrimas nevyksta arba buvo prarasti sesijos duomenys. Prašome pradėti iš naujo.",
        "authmanager-link-not-in-progress": "Paskyrų susiejimas nevyksta arba buvo prarasti sesijos duomenys. Prašome pradėti iš naujo.",
        "authmanager-authplugin-setpass-failed-title": "Slaptažodžio keitimas nepavyko",
        "linkaccounts-success-text": "Paskyra buvo susieta.",
        "linkaccounts-submit": "Susieti paskyras",
        "unlinkaccounts": "Atsieti paskyras",
-       "unlinkaccounts-success": "Paskyra buvo atsieta.",
-       "edit-error-short": "Klaida: $1",
-       "edit-error-long": "Klaidos:\n\n$1"
+       "unlinkaccounts-success": "Paskyra buvo atsieta."
 }
index 7f67c7c..78695da 100644 (file)
        "viewsource": "Apsavērt kodu",
        "yourname": "Slāgvuords:",
        "yourpassword": "Paroļs:",
-       "remembermypassword": "Atguoduot muni  iz ituo datora (na vaira kai $1 {{PLURAL:$1|dīnu|dīnom|dīnom}})",
        "login": "Dasaslāgt",
        "nav-login-createaccount": "Dasaslāgt / sataiseit jaunu lītuotuoju",
        "userlogin": "Dasaslāgt / sataiseit jaunu lītuotuoju",
index 2b001c6..d0fc2b3 100644 (file)
        "yourname": "Hmangtuhming:",
        "yourpassword": "Thurûk:",
        "yourpasswordagain": "Thurûk ziak nawn leh rawh le:",
-       "remembermypassword": "He ka rangpuifanna hman mék (browser)-ah hian ka luhna (a rei berah ni {{PLURAL:$1||}}$1) min vawnsak rawh, thurûk ziah nawn ngai lo tùrin.",
        "yourdomainname": "I ram:",
        "password-change-forbidden": "Hë wiki-ah hian thurûk i thlâk thei lo.",
        "externaldberror": "Insawifiahna felfai lo a awm lo a nih loh vëk pawhin i pawnlam siangchan tihdanglam phalsak i ni lo a ni ang.",
        "passwordreset-emailtitle": "{{SITENAME}}-a siangchan chanchin kim",
        "passwordreset-emailelement": "Hmangtuhming: \n$1\n\nThurûk lailâwk: \n$2",
        "passwordreset-emailsentemail": "Hriat nawntirna e-lehkha thawn fel a ni.",
-       "passwordreset-emailsent-capture": "Hriat nawntirna e-lehkha thawn a ni, a hnuaia tarlan ang khuan.",
-       "passwordreset-emailerror-capture": "Hriat nawntirna e-lehkha siam chhuah a ni a, a hnuaia tarlan ang khuan; mahsé thawn hlawhchham a ni: $1",
        "changeemail": "E-chenhmun thlâk rawh",
        "changeemail-header": "Siangchan e-chenhmun thlâk rawh",
        "changeemail-no-info": "He phêk lut mai tùr chuan i inziahluh a ngai.",
        "node-count-exceeded-warning": "Suihbawl theih chin pèl phêkte",
        "expansion-depth-exceeded-category": "Tihchiam theih chin pèl phêkte",
        "expansion-depth-exceeded-warning": "Tihchiam theih chin phêkin a pèl",
-       "cantcreateaccounttitle": "Siangchan siam theih loh",
        "viewpagelogs": "He phêk chanchin hi en rawh",
        "nohistory": "Hë phêk siamṭhatna chanchin ziak a awm lo tlat.",
        "currentrev": "Ennawnna hnuhnung ber",
        "listusers-noresult": "Hmangtu an awm lo.",
        "listusers-blocked": "(danbeh)",
        "activeusers": "Hmangtu hlun tlarna",
-       "activeusers-hidebots": "Khawlmi thupna",
-       "activeusers-hidesysops": "Roreltu thupna",
        "activeusers-noresult": "Hmangtu awm lo.",
        "listgrouprights": "Hmangtu pawl dikna-chanvote",
        "listgrouprights-key": "* <span class=\"listgrouprights-granted\">Dikna-chanvo phalsak</span>\n* <span class=\"listgrouprights-revoked\">Dikna-chanvo hnuhkirsak</span>",
        "special-characters-group-lao": "Lao",
        "special-characters-group-khmer": "Khmer",
        "mw-widgets-dateinput-placeholder-day": "KKKK-TT-NN",
-       "mw-widgets-dateinput-placeholder-month": "KKKK-TT",
-       "api-error-blacklisted": "Hming dang, chiang zâwk deuh thlang hräm rawh le."
+       "mw-widgets-dateinput-placeholder-month": "KKKK-TT"
 }
index fe7a8e3..0b8c8c4 100644 (file)
        "passwordreset-emailelement": "Lietotājvārds: \n$1\n\nPagaidu parole: \n$2",
        "passwordreset-emailsentemail": "Paroles atiestatīšanas e-pasts ir nosūtīts.",
        "passwordreset-nosuchcaller": "Izsaucējs nepastāv: $1",
-       "passwordreset-invalideamil": "Nederīga e-pasta adrese",
+       "passwordreset-invalidemail": "Nederīga e-pasta adrese",
        "changeemail": "Mainīt vai noņemt e-pasta adresi",
        "changeemail-header": "Mainīt konta e-pasta adresi",
        "changeemail-oldemail": "Pašreizējā e-pasta adrese:",
index 153ab06..81906f6 100644 (file)
        "yourpasswordagain": "復核節",
        "createacct-yourpasswordagain": "訂子符節",
        "createacct-yourpasswordagain-ph": "復告符節",
-       "remembermypassword": "吾之簿通越(達至$1日)",
        "userlogin-remembermypassword": "保我簿登",
        "userlogin-signwithsecure": "以安全伺服登簿",
        "yourdomainname": "汝之網域",
        "undo-failure": "中審之異,此審無返也。",
        "undo-norev": "其審無存或刪,此審無返也。",
        "undo-summary": "返[[Special:Contributions/$2|$2]]([[User talk:$2|書]])之審$1",
-       "cantcreateaccounttitle": "新簿謝焉",
        "cantcreateaccount-text": "[[User:$3|S3]]因''$2''故,封子IP <b>$1</b>。",
        "viewpagelogs": "覽誌",
        "nohistory": "此題無誌",
        "activeusers-intro": "此乃為近$1天內之躍簿也。",
        "activeusers-count": "$3天內之$1易",
        "activeusers-from": "示簿始於:",
-       "activeusers-hidebots": "藏僕",
-       "activeusers-hidesysops": "藏有秩",
        "activeusers-noresult": "無簿矣。",
        "listgrouprights": "權任一覽",
        "listgrouprights-summary": "此所列述,諸職所司也,各有異同。欲知其詳,請閱[[{{MediaWiki:Listgrouprights-helppage}}|此文]]。",
        "htmlform-submit": "呈",
        "htmlform-reset": "復",
        "htmlform-selectorother-other": "他",
-       "sqlite-has-fts": "$1 含全文之尋",
-       "sqlite-no-fts": "$1 不含全文之尋",
        "revdelete-restricted": "應限至有秩",
        "revdelete-unrestricted": "除限自有秩",
        "logentry-newusers-create": "簿$1已{{GENDER:$2|增}}。",
index ad92ab9..c997386 100644 (file)
        "passwordreset-emailtext-user": "प्रयोक्ता $1 {{अन्तर्जाल}} पर अहाँक खाता विवरणक {{SITENAME}} लेल फेरसँ ($4) आग्रह केने छथि। ई प्रयोक्ता {{PLURAL:$3|खाता अछि|खाता सभ अछि}} ऐ ई-पत्र संकेतसँ जुड़ल: $2\n{{PLURAL:$3| ई अस्थायी कूटशब्द|ई सभ अस्थायी कूटशब्द}} खतम भऽ जाएत {{PLURAL:$5|एक दिन|$5 दिन}} मे।\nअहाँ सम्प्रवेश करू आ एकटा नव कूटशब्द आब चुनू। जँ कियो दोसर ई आग्रह केने छथि, वा जँ अहाँकेँ अपन मूल कूटशब्द मोन पड़ि गेल अछि, आ अहाँ आब ओइ कूटशब्दकेँ नै बदलऽ चाहै छी, अहाँ ऐ संदेशकेँ बिसरि सकै छी आ अपन पुरान कूटशब्दक प्रयोग जारी राखि सकै छी।",
        "passwordreset-emailelement": "प्रयोक्ता: \n$1\n\nअस्थायी कूटशब्द: \n$2",
        "passwordreset-emailsentemail": "एकटा ई-पत्र मोन पाड़बा लेल पठाओल गेल अछि।",
-       "passwordreset-invalideamil": "अवैध इमेल ठेगान",
+       "passwordreset-invalidemail": "अवैध इमेल ठेगान",
        "passwordreset-nodata": "प्रयोगकर्ता नाम वा इमेल ठेगान नै देल गेल छल",
        "changeemail": "ई-मेल पता परिवर्तित करी",
        "changeemail-header": "अपन ईमेल पता परिवर्तन हेतु एकरा पुरा करी। यदि अहाँ अपन वर्तमान ईमेल पता हटाबैलेल चाहैत छी, तँ एकरा खाली छोडि दी आ एकरा भेजी।",
        "activeusers-intro": "ई ओहेन प्रयोक्ता सभक सूची अछि जे पछिला $1 {{PLURAL:$1|दिन|दिन}} मे किछु सक्रियता देखेने छथि।",
        "activeusers-count": "$1 {{PLURAL:$1|कार्य}} पिछला $3 {{PLURAL:$3|दिन|दिनसभ}}मे",
        "activeusers-from": "प्रयोक्ता प्रदर्शन प्रारम्भ भेल:",
-       "activeusers-hidebots": "स्वचालक नुकाबी",
-       "activeusers-hidesysops": "प्रबन्धक नुकाबी",
        "activeusers-noresult": "कोनो प्रयोक्ता नै भेटल",
        "activeusers-submit": "सक्रिय प्रयोगकर्ता देखाबी",
        "listgrouprights": "प्रयोगकर्ता समूह अधिकार",
        "sp-contributions-blocked-notice-anon": "ई अनिकेत अखन प्रतिबन्धित अछि।\nअद्यतन प्रतिबन्धित  वृत्तलेख लेखा सन्दर्भ नीचाँ देल अछि:",
        "sp-contributions-search": "अवदानक लेल ताकू",
        "sp-contributions-username": "अनिकेत संकेत वा प्रयोक्तानाम:",
-       "sp-contributions-toponly": "मात्र ओइ सम्पादनकेँ देखाउ जे अद्यतन संशोधन छी।",
+       "sp-contributions-toponly": "मात्र ओइ सम्पादन देखाबी जे अद्यतन संशोधन छी।",
        "sp-contributions-newonly": "मात्र ओइ सम्पादन देखाउ जे पृष्ठ निर्मित भेल अछि",
        "sp-contributions-hideminor": "अल्प सम्पादन नुकाबी",
        "sp-contributions-submit": "ताकू",
index 2cc972a..fe20055 100644 (file)
        "yourpasswordagain": "Balèni tembung sandhi:",
        "createacct-yourpasswordagain": "Konfirmasi tembung sandhi",
        "createacct-yourpasswordagain-ph": "Lebokna tembung sandhi maning",
-       "remembermypassword": "Emutna data login-ne inyong nang peramban kiye (kanggo paling suwe $1 {{PLURAL:$1|dina|dina}})",
        "userlogin-remembermypassword": "Jorna ben Inyong tetep mlebu log",
        "userlogin-signwithsecure": "Gunakna koneksi aman",
        "cannotloginnow-title": "Ora teyeng mlebu siki",
index 31ca464..3a309a5 100644 (file)
        "yourname": "Тиить лемоц:",
        "yourpassword": "Сувама валце:",
        "yourpasswordagain": "Сёрматк сувама валце омбоцекс:",
-       "remembermypassword": "Ванфтомс монь сувама лемозе тя содам машинаса (максимум $1 {{PLURAL:$1|шис|шис}})",
        "yourdomainname": "Тонь доменце:",
        "password-change-forbidden": "Сувама валхне тя викить эса аф полафтовихть",
        "externaldberror": "Лиссь эльбятькс ушеширень датабазонь вельде кемокстакшнембачк эли тондейть аф мярьгови полафнемс тонь ушеширень сёрматфтомацень.",
        "undo-failure": "Тя петнемать аш кода валхтомс ётконь петнематнень карань-каршек арафтомаснон сюнеда.",
        "undo-norev": "Тя петнемать аш кода мърдафтомс сяс мес сонь аш эли сон нардафоль.",
        "undo-summary": "Валхтт петнемась $1 конань тизе [[Special:Contributions/$2|$2]] ([[User talk:$2|Корхнема]])",
-       "cantcreateaccounttitle": "Аш кода сёрматфтомать тиемс",
        "cantcreateaccount-text": "Сёрматфтомась тя IP адреста ('''$1''') пякстазе [[User:$3|$3]].\n\n$3 макссь туфталсь - ''$2''",
        "viewpagelogs": "Няфтемс тя лопать историянц",
        "nohistory": "Тя лопать петнемань историяц аш.",
index 94699ba..74f57ae 100644 (file)
        "yourpasswordagain": "Avereno ampidirina eto ny tenimiafina",
        "createacct-yourpasswordagain": "Hamarino ny tenimiafinao",
        "createacct-yourpasswordagain-ph": "Mbola ampidiro fanindroany ny tenimiafinao",
-       "remembermypassword": "{{PLURAL:}}Tadidio ny tenimiafiko (mandritry ny $1 andro fara-fahabetsany)",
        "userlogin-remembermypassword": "Tadidio aho",
        "userlogin-signwithsecure": "Fidirana amin'ny alalan'ny fanohizana azo antoka",
        "cannotloginnow-title": "Tsy afaka miditra izao",
        "botpasswords-label-delete": "Fafàna",
        "botpasswords-label-resetpassword": "Hamerina ny tenimiafina",
        "botpasswords-label-grants": "Zo mihatra:",
-       "botpasswords-label-restrictions": "Fetran'ny fampiasana:",
        "botpasswords-label-grants-column": "Nomena",
        "botpasswords-bad-appid": "Tsy azo raisina ny anarana rôbô \"$1\".",
        "botpasswords-insert-failed": "Tsy afaka nanampy ny anarana rôbô \"$1\". Tsy efa nampiana ve ilay izy?",
        "activeusers-intro": "Ity ny lisitry ny mpikambana izay nanao zavatra iray nandritry ny andro $1 farany. {{PLURAL:}}",
        "activeusers-count": "Tao $1{{PLURAL:}} tanatin'ny $3 andro",
        "activeusers-from": "Aseho ny mpikambana hatry ny :",
-       "activeusers-hidebots": "Asitriho ny robo",
-       "activeusers-hidesysops": "Asitriho ny mpandrindra",
        "activeusers-noresult": "Tsy nahitana mpikambana.",
        "activeusers-submit": "Hanseho ny mpikambana mavitrika",
        "listgrouprights": "Fahefan'ny vondrom-pikambana",
        "htmlform-title-not-exists": "Tsy misy $1.",
        "htmlform-user-not-exists": "Tsy misy ny <strong>$1</strong>.",
        "htmlform-user-not-valid": "Tsy anaram-pikambana azo raisina <strong>$1</strong>.",
-       "sqlite-has-fts": "$1 misy fikarohan-dahatsoratra tanteraka",
-       "sqlite-no-fts": "$1 tsy misy fikarohan-dahatsoratra tanteraka",
        "logentry-delete-delete": "nofafan'i $1 ny pejy $3",
        "logentry-delete-restore": "Namerina ny pejy $3 i $1{{GENDER:$2|}}",
        "logentry-delete-event": "Nanova ny fahitana {{PLURAL:$5|laogy iray|laogy $5}} tamin'i $3 i $1: $4",
index 868df89..a41205a 100644 (file)
        "yourpasswordagain": "Ulang baliak kato sandi:",
        "createacct-yourpasswordagain": "Konfirmasi kato sandi",
        "createacct-yourpasswordagain-ph": "Masuakan lai kato sandi",
-       "remembermypassword": "Ingek log masuak denai di paramban ko (salamo $1 {{PLURAL:$1|hari}})",
        "userlogin-remembermypassword": "Biakan ambo tetap masuak",
        "userlogin-signwithsecure": "Gunoan server aman",
        "yourdomainname": "Domain Sanak:",
        "listusers-blocked": "(tasakek)",
        "activeusers": "Daftar pangguno aktif",
        "activeusers-from": "Tunjuakan pangguno mulai dari:",
-       "activeusers-hidebots": "Suruakan bot",
-       "activeusers-hidesysops": "Suruakan panguruih",
        "activeusers-noresult": "Pangguno indak basobok",
        "listgrouprights": "Daftar kalompok pangguno",
        "listgrouprights-summary": "Barikuik ko adolah daftar kalompok pangguno nan ado di wiki ko, jo daftar hak aksesnyo masiang-masiang. Informasi labih lanjuik masalah hak masiang-masiang dapek dijumpoi di [[{{MediaWiki:Listgrouprights-helppage}}|laman bantuan hak pangguno]].",
index 2121915..a0634ba 100644 (file)
        "views": "Посети",
        "toolbox": "Алатки",
        "tool-link-userrights": "Смени ги {{GENDER:$1|корисничките}} групи",
+       "tool-link-userrights-readonly": "Погл. {{GENDER:$1|кориснички}} групи",
        "tool-link-emailuser": "Испрати е-пошта на {{GENDER:$1|корисников}}",
        "userpage": "Преглед на корисничката страница",
        "projectpage": "Преглед на проектната страница",
        "botpasswords-label-delete": "Избриши",
        "botpasswords-label-resetpassword": "Ставете нова лозинка",
        "botpasswords-label-grants": "Применливи доделувања:",
-       "botpasswords-help-grants": "Секое Ð´Ð¾Ð´ÐµÐ»Ñ\83ваÑ\9aе Ð´Ð°Ð²Ð° Ð¿Ñ\80иÑ\81Ñ\82ап Ð´Ð¾ Ñ\81пиÑ\81ок Ð´Ð¾ Ð½Ð°Ð²ÐµÐ´ÐµÐ½Ð¸ Ð¿Ñ\80ава Ñ\88Ñ\82о Ð²ÐµÑ\9cе Ð³Ð¸ Ð¸Ð¼Ð° ÐºÐ¾Ñ\80иÑ\81ниÑ\87каÑ\82а Ñ\81меÑ\82ка. Ð\9fовеÑ\9cе Ñ\9cе Ð½Ð°Ñ\98деÑ\82е Ð½Ð° [[Special:ListGrants|Ñ\82абелаÑ\82а Ñ\81о доделувања]].",
+       "botpasswords-help-grants": "Ð\94оделÑ\83ваÑ\9aаÑ\82а Ð²Ð¸ Ð´Ð°Ð²Ð°Ð°Ñ\82 Ð¿Ñ\80иÑ\81Ñ\82ап Ð´Ð¾ Ð¿Ñ\80ава ÐºÐ¾Ð¸ Ð²ÐµÑ\9cе Ð³Ð¸ Ð¸Ð¼Ð° Ð²Ð°Ñ\88аÑ\82а Ñ\81меÑ\82ка. Ð\9eвозможÑ\83ваÑ\98Ñ\9cи Ð´Ð¾Ð´ÐµÐ»Ñ\83ваÑ\9aе Ñ\82Ñ\83ка, Ð½Ðµ Ð´Ð¾Ð±Ð¸Ð²Ð°Ñ\82е Ð½Ð¸ÐºÐ°ÐºÐ²Ð¸ Ð¿Ñ\80ава Ñ\88Ñ\82о Ð²ÐµÑ\9cе Ð³Ð¸ Ð½ÐµÐ¼Ð° Ñ\81меÑ\82каÑ\82а. Ð\9fовеÑ\9cе Ð¸Ð½Ñ\84оÑ\80маÑ\86ии Ñ\9cе Ð½Ð°Ñ\98деÑ\82е Ð½Ð° [[Special:ListGrants|Ñ\82абелаÑ\82а Ð½Ð° доделувања]].",
        "botpasswords-label-grants-column": "Доделено",
        "botpasswords-bad-appid": "Името на ботот „$1“ е неважечко.",
        "botpasswords-insert-failed": "Не успеав да го додадам името на ботот „$1“. Да не е веќе додадено?",
        "passwordreset-emaildisabled": "Можностите за е-пошта се исклучени на ова вики",
        "passwordreset-username": "Корисничко име:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Да ја прикажам пораката?",
-       "passwordreset-capture-help": "Ако го штиклирате кутивчево, ќе ви се прикаже пораката (со привремената лозинка) и истата ќе му биде испратена на корисникот.",
        "passwordreset-email": "Е-пошта:",
        "passwordreset-emailtitle": "Најавни податоци за {{SITENAME}}",
        "passwordreset-emailtext-ip": "Некој (веројатно вие, од IP-адресата $1) побара измена на вашата\nлозинка за {{SITENAME}} ($4). Оваа е-поштенска адреса е наведена во\n{{PLURAL:$3|следнава корисничка сметка|следниве кориснички сметки}}:\n\n$2\n\n{{PLURAL:$3|Оваа привремена лозинка ќе истече|Овие привремени лозинки ќе истечат}} во рок од {{PLURAL:$5|еден ден|$5 дена}}.\nСега треба да се најавите и да внесете нова лозинка. Ако ова барање го\nпоставил некој друг, или пак во меѓувреме сте се сетиле на лозинката, и не сакате\nда ја менувате, тогаш слободно занемарете ја поракава и продолжете да ја користите старата.",
        "passwordreset-emailelement": "Корисничко име: \n$1\n\nПривремена лозинка: \n$2",
        "passwordreset-emailsentemail": "Ако ова е регистрираната е-пошта поврзана со вашата сметка, тогаш ќе ви биде испратено писмо за задавање на нова лозинка.",
        "passwordreset-emailsentusername": "Ако има соодветна регистрирана е-пошта поврзана со ова корисничко име, тогаш ќе ви биде испратена порака за промена на лозинката.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Е-поштата за задавање на нова лозинка|Е-поштата за задавање на нови лозинки}} е испратена. Тука е {{PLURAL:$1|е прикажано корисничкото име и лозинката|прикажан список на кориснички имиња и лозинки}}.",
-       "passwordreset-emailerror-capture2": "Испраќањето е-пошта на {{GENDER:$2|корисникот}} не успеа: $1 Тука е {{PLURAL:$3|прикажано корисничкото име и лозинката|прикажан список на кориснички имиња и лозинки}}.",
        "passwordreset-nocaller": "Мора да се укаже повикувач",
        "passwordreset-nosuchcaller": "Повикувачот не постои: $1",
        "passwordreset-ignored": "Менувањето на лозинката не успеа. Можеби не е поставен услужник?",
-       "passwordreset-invalideamil": "Неважечка е-пошта",
+       "passwordreset-invalidemail": "Неважечка е-пошта",
        "passwordreset-nodata": "Немате укажано ни корисничко име, ни е-пошта.",
        "changeemail": "Смени или отстрани е-пошта",
        "changeemail-header": "Пополнете го образецов за да ја смените е-поштата. Ако сакате да ја отстраните адресата од вашата сметка, оставете го празно полето за нова е-пошта.",
        "prefs-help-recentchangescount": "Подразбира скорешни промени, истории на страници и дневници.",
        "prefs-help-watchlist-token2": "Ова е тајна шифра за вашиот канализиран список на набљудувања.\nСекој што ја знае ќе може да ја чита, па затоа ви препорачуваме да не ја кажувате никому.\n[[Special:ResetTokens|Стиснете тука ако треба да зададете нова]].",
        "savedprefs": "Вашите нагодувања се зачувани.",
-       "savedrights": "Ð\9aоÑ\80иÑ\81ниÑ\87киÑ\82е Ð¿Ñ\80ава Ð½Ð° {{GENDER:$1|$1}} Ð½Ðµ се зачувани.",
+       "savedrights": "Ð\9aоÑ\80иÑ\81ниÑ\87киÑ\82е Ð³Ñ\80Ñ\83пи Ð½Ð° {{GENDER:$1|$1}} се зачувани.",
        "timezonelegend": "Часовен појас:",
        "localtime": "Месно време:",
        "timezoneuseserverdefault": "Од викито ($1)",
        "prefswarning-warning": "Направивте промени во нагодувањата, но не ги зачувавте.\nИзмената нема да се изврши ако ја напуштите страницава без да стиснете на „$1“.",
        "prefs-tabs-navigation-hint": "Совет: Можете да ги користите стрелките на тастатурата за да преоѓате од едно на друго јазиче во списокот на јазичиња.",
        "userrights": "Раководење со кориснички права",
-       "userrights-lookup-user": "РаководеÑ\9aе Ñ\81о ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки Ð³Ñ\80Ñ\83пи",
+       "userrights-lookup-user": "Ð\98збеÑ\80еÑ\82е ÐºÐ¾Ñ\80иÑ\81ник",
        "userrights-user-editname": "Внесете корисничко име:",
-       "editusergroup": "УÑ\80еди {{GENDER:$1|коÑ\80иÑ\81ниÑ\87ки}} групи",
+       "editusergroup": "Ð\92Ñ\87иÑ\82аÑ\98 ÐºÐ¾Ñ\80иÑ\81ниÑ\87ки групи",
        "editinguser": "Менување на правата на {{GENDER:$1|корисникот}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Уреди ги корисничките групи",
        "saveusergroups": "Зачувај ги {{GENDER:$1|корисничките}} групи",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "Немате дозвола за уредување на кориснички права на други викија.",
        "userrights-nodatabase": "Базата на податоци $1 не постои или не е месна.",
-       "userrights-nologin": "Мора да сте [[Special:UserLogin|најавени]] со администраторска корисничка сметка за да може да вршите промена на кориснички права.",
-       "userrights-notallowed": "Немате дозвола за додавање и отстранување на кориснички права.",
        "userrights-changeable-col": "Групи кои може да ги промените",
        "userrights-unchangeable-col": "Групи кои не може да ги промените",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Спротиставеност во измените на корисничките права. Прегледајте ги и потврдете ги.",
-       "userrights-removed-self": "Ги отстранивте вашите права. Затоа, повеќе немате пристап на страницава.",
        "group": "Група:",
        "group-user": "Корисници",
        "group-autoconfirmed": "Автопотврдени корисници",
        "right-siteadmin": "Заклучување и отклучување на базата на податоци",
        "right-override-export-depth": "Извезување на страници вклучувајќи поврзани страници со длабочина до 5",
        "right-sendemail": "Испраќање на е-пошта до други корисници",
-       "right-passwordreset": "Преглед на пораки по е-пошта за промена на лозинка",
        "right-managechangetags": "Создавање и (де)активирање на [[Special:Tags|ознаки]]",
        "right-applychangetags": "Задавање на [[Special:Tags|ознаки]] заедно со направените измени",
        "right-changetags": "Додавате и отстранување на произволни [[Special:Tags|ознаки]] во поединечни преработки и дневнички записи",
        "apisandbox-continue": "Продолжи",
        "apisandbox-continue-clear": "Исчисти",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} ќе [https://www.mediawiki.org/wiki/API:Query#Continuing_queries продолжи] со последното барање; „{{int:apisandbox-continue-clear}}“ ќе ги исчисти параметрите поврзани со продолжување.",
+       "apisandbox-param-limit": "Внесете <kbd>max</kbd> за да ја користите најгорната граница.",
+       "apisandbox-multivalue-all-namespaces": "$1 (сите именски простори)",
+       "apisandbox-multivalue-all-values": "$1 (сите вредности)",
        "booksources": "Печатени извори",
        "booksources-search-legend": "Пребарување на извори за книга",
        "booksources-isbn": "ISBN:",
        "activeusers-count": "$1 {{PLURAL:$1|дејство|дејства}} {{PLURAL:$3|денес|во последните $3 дена}}",
        "activeusers-from": "Прикажи корисници почнувајќи од:",
        "activeusers-groups": "Прикажи ги корисниците кои членуваат во групите:",
+       "activeusers-excludegroups": "Изземи ги корисниците што членуваат во групите:",
        "activeusers-noresult": "Не пронајдов ниеден корисник.",
        "activeusers-submit": "Прикажи активни корисници",
        "listgrouprights": "Права на кориснички групи",
        "patrol-log-header": "Ова е дневник на патролирани преработки.",
        "log-show-hide-patrol": "$1 дневник на патролирање",
        "log-show-hide-tag": "$1 дневник на ознаки",
+       "confirm-markpatrolled-button": "ОК",
+       "confirm-markpatrolled-top": "Да ја означан преработката $3 на $2 како испатролирана?",
        "deletedrevision": "Избришана стара преработка $1.",
        "filedeleteerror-short": "Грешка при бришење на податотека: $1",
        "filedeleteerror-long": "Се појавија грешки при бришењето на податотеката:\n\n$1",
        "tags-deactivate": "деактивирај",
        "tags-hitcount": "$1 {{PLURAL:$1|промена|промени}}",
        "tags-manage-no-permission": "Немате дозвола за раководење со ознаки за промени.",
-       "tags-manage-blocked": "Не можете да раководите со ознаки за промени додека сте блокирани.",
+       "tags-manage-blocked": "Не можете да раководите со ознаки за промени додека {{GENDER:$1|сте}} блокирани.",
        "tags-create-heading": "Создај нова ознака",
        "tags-create-explanation": "Новосоздадните ознаки по основно ќе се стават на располагање за употреба од корисници и ботови.",
        "tags-create-tag-name": "Име на ознаката:",
        "tags-deactivate-not-allowed": "Не можам да ја деактивирам ознаката „$1“.",
        "tags-deactivate-submit": "Декативирај",
        "tags-apply-no-permission": "Немате дозвола да ставате ознаки за промени заедно со измените што ги правите.",
-       "tags-apply-blocked": "Не можете да задавате ознаки за промени додека сте блокирани.",
+       "tags-apply-blocked": "Не можете да задавате ознаки за промени додека {{GENDER:$1|сте}} блокирани.",
        "tags-apply-not-allowed-one": "Не е дозволено ознаката „$1“ да се става рачно.",
        "tags-apply-not-allowed-multi": "Не е дозволено {{PLURAL:$2|следнава ознака да се става рачно|следниве ознаки да се ставаат рачно}}: $1",
        "tags-update-no-permission": "Немате дозвола да додавате или отстранувате ознаки за промена од поединечни преработки или дневнички записи.",
-       "tags-update-blocked": "Не можете да додавате и отстранувате ознаки за промени додека сте блокирани.",
+       "tags-update-blocked": "Не можете да додавате и отстранувате ознаки за промени додека {{GENDER:$1|сте}} блокирани.",
        "tags-update-add-not-allowed-one": "Не е дозволено ознаката „$1“ да се додава рачно.",
        "tags-update-add-not-allowed-multi": "Не е дозволено {{PLURAL:$2|следнава ознака да се додава рачно|следниве ознаки да се додаваат рачно}}: $1",
        "tags-update-remove-not-allowed-one": "Не е дозволено да се отстранува ознаката „$1“.",
        "htmlform-user-not-exists": "<strong>$1</strong> не постои.",
        "htmlform-user-not-valid": "<strong>$1</strong> не претставува важечко корисничко име.",
        "logentry-delete-delete": "$1 {{GENDER:$2|ја избриша}} страницата $3",
+       "logentry-delete-delete_redir": "$1 го {{GENDER:$2|избриша}} пренасочувањето $3 со презапишување",
        "logentry-delete-restore": "$1 {{GENDER:$2|ја возобнови}} страницата $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|настан во дневникот|$5 настани во дневникот}} на $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ја измени}} видливоста на {{PLURAL:$5|преработка|$5 преработки}} на страницата $3: $4",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страницата сè уште не постои",
        "mw-widgets-titleinput-description-redirect": "пренасочување кон $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Додај категорија...",
        "sessionmanager-tie": "Не можете истовремено да користите повеќе типови барања за заверка: $1.",
        "sessionprovider-generic": "$1 седници",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "седници со колачиња",
        "log-action-filter-contentmodel-change": "Промена на содржински модел",
        "log-action-filter-contentmodel-new": "Создавање страница со нестандарден содржински модел",
        "log-action-filter-delete-delete": "Бришење на страница",
+       "log-action-filter-delete-delete_redir": "Презапишување врз пренасочување",
        "log-action-filter-delete-restore": "Повраток на страница",
        "log-action-filter-delete-event": "Бришење на дневник",
        "log-action-filter-delete-revision": "Бришење на преработка",
        "authmanager-authn-autocreate-failed": "Автоматското создавање на месна сметка не успеа: $1",
        "authmanager-change-not-supported": "Укажаните најавни податоци не можат да се изменат, бидејќи тогаш ништо нема да ги користи.",
        "authmanager-create-disabled": "Создавањето на сметки е оневозможено.",
-       "authmanager-create-from-login": "За да направите сметка, пополнете ги полињата подолу.",
+       "authmanager-create-from-login": "За да направите сметка, пополнете ги полињата.",
        "authmanager-create-not-in-progress": "Создавањето на сметката не е во тек, или има губиток на седничките податоци. Почнете одново.",
        "authmanager-create-no-primary": "Укажаните најавни податоци не можат да се употребат во создавање на сметка.",
        "authmanager-link-no-primary": "Укажаните најавни податоци не можат да се употребат во поврзување на сметка.",
        "usercssispublic": "Напомена: потстраниците со CSS не треба да содржат дсоверливи податоци бидејќи истите се видливи и за други корисници.",
        "restrictionsfield-badip": "Неважечки IP-дијапазон на адреси: $1",
        "restrictionsfield-label": "Допуштени IP-опсези:",
-       "restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Грешка: $1",
-       "edit-error-long": "Грешки:\n\n$1"
+       "restrictionsfield-help": "Една IP-адреса или CIDR-опсег по ред. За да овозможите сè, користете<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 022f07f..cbb7d06 100644 (file)
        "activeusers-intro": "ഇത് കഴിഞ്ഞ {{PLURAL:$1|ദിവസം|$1 ദിവസങ്ങളിൽ}} ഏതെങ്കിലും വിധത്തിലുള്ള പ്രവർത്തനങ്ങൾ ചെയ്ത ഉപയോക്താക്കളുടെ പട്ടികയാണ്.",
        "activeusers-count": "കഴിഞ്ഞ {{PLURAL:$3|ഒരു ദിവസം|$3 ദിവസങ്ങളിൽ}} {{PLURAL:$1|ഒരു പ്രവൃത്തി|$1 പ്രവൃത്തികൾ}}",
        "activeusers-from": "ഇങ്ങനെ തുടങ്ങുന്ന ഉപയോക്താക്കളെ കാട്ടുക:",
-       "activeusers-hidebots": "യന്ത്രങ്ങളെ മറയ്ക്കുക",
-       "activeusers-hidesysops": "കാര്യനിർവാഹകരെ മറയ്ക്കുക",
        "activeusers-noresult": "ഉപയോക്താക്കളില്ല",
        "activeusers-submit": "സജീവ ഉപയോക്താക്കളെ പ്രദർശിപ്പിക്കുക",
        "listgrouprights": "ഉപയോക്തൃവിഭാഗത്തിന്റെ അവകാശങ്ങൾ",
index 3e85f15..6ef89e6 100644 (file)
        "passwordreset-emaildisabled": "या विकिवर विपत्र पाठविणे 'अशक्य' करण्यात आलेले आहे.",
        "passwordreset-username": "सदस्यनाव:",
        "passwordreset-domain": "डोमेन",
-       "passwordreset-capture": "ईमेल कशी असेल ते बघायचेय ?",
-       "passwordreset-capture-help": "या चौकटीत खूण केली तर, ईमेल (तात्पुरत्या परवलीच्या शब्दासह) दाखविण्यात व सदस्यास पाठविण्यात येईल.",
        "passwordreset-email": "विपत्र पत्ता",
        "passwordreset-emailtitle": "{{SITENAME}} वरील खात्याची माहिती",
        "passwordreset-emailtext-ip": "कुणीतरी (कदाचित तुम्ही, अंकपत्ता $1 वरुन) {{SITENAME}}($4) करिता नविन 'परवलीचा शब्द' पुनर्स्थापनेबद्दल विनंती केली आहे.\nखालील{{PLURAL:$3|सदस्यखाते}}या विपत्रपत्त्याशी निगडीत आहे: \n\"$2\"\n{{PLURAL:$3|हा तात्पुरता परवलीचा शब्द|हे तात्पुरते परवलीचे शब्द}}{{PLURAL:$5|एक दिवस|$5 दिवसात}} मुदतबाह्य होतील.आता आपण लॉग-ईन करून  नविन परवलीचा शब्द निवडा.जर ईतर कोणी ही विनंती केली असेल,किंवा जर आपणास परवलीच शब्द आठवला असेल तर,व जर आपण तो बदलु इच्छित नसाल तर आपण हा संदेश टाळा व आपला जुना परवलीचा शब्द वापरणे सुरू ठेवा.",
        "userrights-reason": "कारण:",
        "userrights-no-interwiki": "इतर विकींवरचे सदस्य अधिकार बदलण्याची परवानगी तुम्हाला नाही.",
        "userrights-nodatabase": "विदा $1 अस्तित्वात नाही अथवा स्थानिक नाही.",
-       "userrights-nologin": "सदस्य अधिकार देण्यासाठी तुम्ही प्रबंधक म्हणून [[Special:UserLogin|सनोंद प्रवेशित]] असणे आवश्यक आहे.",
-       "userrights-notallowed": "तुमच्या सदस्य खात्यास, सदस्य अधिकारांची निश्चिती करण्याची परवानगी नाही.",
        "userrights-changeable-col": "गट जे तुम्ही बदलू शकता",
        "userrights-unchangeable-col": "गट जे तुम्ही बदलू शकत नाही",
        "userrights-conflict": "बदलाबाबत सदस्य-हक्क विसंवाद !कृपया आपले बदल पुन्हा पुनरावलोकित व नक्की करा.",
-       "userrights-removed-self": "आपण आपले हक्क यशस्वीरित्या काढलेत.म्हणुन, या पानात आपण दाखल होऊ शकणार नाही.",
        "group": "गट:",
        "group-user": "सदस्य",
        "group-autoconfirmed": "स्वयंशाबीत सदस्य",
        "right-siteadmin": "माहितीसाठ्याला कुलूप लावा अथवा काढा",
        "right-override-export-depth": "जोडलेल्या पानांचा पाचव्या पातळीपर्यंत अंतर्भाव करुन पाने निर्यात करा",
        "right-sendemail": "इतर सदस्यांना विपत्रे पाठवा",
-       "right-passwordreset": "परवलीचा शब्द पुनर्स्थापित केल्याचे विपत्र पहा.",
        "right-managechangetags": "डाटाबेस मधून [[Special:Tags|खूणपताका]] तयार करा किंवा  वगळा",
        "right-applychangetags": "कोणाच्याही बदलास [[Special:Tags|खूणपताका]] जोडा",
        "right-changetags": "वैयक्तिक आवृत्त्यांना व नोंद प्रवेष्ट्यांना, आहेतुक(arbitrary) [[Special:Tags|खूणपताका]] जोडा अथवा हटवा",
        "activeusers-intro": "शेवटच्या $1 {{PLURAL:$1|दिवसात}} काम केलेल्या सदस्यांची यादी येथे मिळेल",
        "activeusers-count": "शेवटच्या {{PLURAL:$3|दिवसात|$3 दिवसांत}} $1 {{PLURAL:$1|क्रिया}}",
        "activeusers-from": "पुढील शब्दापासून सुरू होणारे सदस्य दाखवा:",
-       "activeusers-hidebots": "सांगकामे लपवा",
-       "activeusers-hidesysops": "प्रचालक लपवा",
        "activeusers-noresult": "एकही सदस्य सापडला नाही.",
        "activeusers-submit": "सक्रिय सदस्य दर्शवा",
        "listgrouprights": "सदस्य गट अधिकार",
        "listgrants": "अनुदाने",
        "listgrants-grant": "अनुदान",
        "listgrants-rights": "अधिकार",
-       "trackingcategories": "वरà¥\8dà¤\97 à¤¶à¥\8bधत à¤\86हà¥\8bत",
+       "trackingcategories": "माà¤\97à¥\8bवा à¤\98à¥\87णारà¥\87 à¤µà¤°à¥\8dà¤\97",
        "trackingcategories-summary": "या पानात ते रेखापथनातील वर्ग(tracking categories) आहेत, जे, मिडियाविकि संचेतनाद्वारे स्वयंचलितरित्या वसविण्यात (तयार करण्यात) आले आहेत. त्यांची नावे, {{ns:8}} नामविश्वातील संबंधित प्रणाली संदेशात फेरफार करुन, बदलविता येतात.",
        "trackingcategories-name": "संदेश नाम",
        "trackingcategories-desc": "वर्ग अंतर्भूत करण्याचे निकष",
        "randomrootpage": "अविशिष्ट मूळ पान",
        "log-action-filter-suppress-block": "रोधामार्फत सदस्य दाबणे",
        "changecredentials": "अधिकारपत्रे (क्रेडेंटियल्स)बदला",
-       "removecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) हटवा",
-       "edit-error-short": "त्रुटी: $1",
-       "edit-error-long": "त्रुटी:$1"
+       "removecredentials": "अधिकारपत्रे (क्रेडेंटियल्स) हटवा"
 }
index 305228d..0a5267d 100644 (file)
        "yourpasswordagain": "Ulangi kata laluan:",
        "createacct-yourpasswordagain": "Sahkan kata laluan",
        "createacct-yourpasswordagain-ph": "Isikan kata laluan semula",
-       "remembermypassword": "Ingat log masuk saya pada pelayar ini (tidak melebihi $1 {{PLURAL:$1|hari|hari}})",
        "userlogin-remembermypassword": "Biar saya kekal log masuk",
        "userlogin-signwithsecure": "Gunakan sambungan terlindung",
        "yourdomainname": "Domain anda:",
        "activeusers-intro": "Yang berikut ialah senarai pengguna yang bergiat sejak {{PLURAL:$1|semalam|$1 hari lalu}}.",
        "activeusers-count": "$1 tindakan sejak {{PLURAL:$3|semalam|$3 hari lalu}}",
        "activeusers-from": "Tunjukkan pengguna bermula pada:",
-       "activeusers-hidebots": "Sorokkan bot",
-       "activeusers-hidesysops": "Sorokkan penyelia",
        "activeusers-noresult": "Tiada pengguna dijumpai.",
        "listgrouprights": "Hak kumpulan pengguna",
        "listgrouprights-summary": "Berikut adalah senarai kumpulan pengguna yang ditubuhkan di wiki ini, dengan hak-hak mereka masing-masing.\nMungkin terdapat [[{{MediaWiki:Listgrouprights-helppage}}|maklumat tambahan]] mengenai setiap hak.",
        "htmlform-cloner-create": "Tambah lebih",
        "htmlform-cloner-delete": "Buang",
        "htmlform-cloner-required": "Sekurang-kurangnya satu nilai diperlukan.",
-       "sqlite-has-fts": "$1 dengan sokongan carian teks penuh",
-       "sqlite-no-fts": "$1 tanpa sokongan carian teks penuh",
        "logentry-delete-delete": "$1 telah {{GENDER:$2|menghapuskan}} laman $3",
        "logentry-delete-restore": "$1 telah {{GENDER:$2|memulihkan}} laman $3",
        "logentry-delete-event": "$1 telah {{GENDER:$2|mengubah}} keterlihatan $5 peristiwa log di $3: $4",
        "feedback-external-bug-report-button": "Failkan tugas teknikal",
        "feedback-dialog-title": "Hantar maklum balas",
        "feedback-dialog-intro": "Anda boleh menggunakan borang yang mudah di bawah untuk menyerahkan maklum balas. Ulasan anda akan disiarkan pada laman \"$1\" di samping nama pengguna anda.",
-       "feedback-error-title": "Ralat",
        "feedback-error1": "Perhatian: Hasil dari API tidak dikenali",
        "feedback-error2": "Perhatian: Penyuntingan gagal",
        "feedback-error3": "Perhatian: Tiada gerak balas dari API",
index 56e90a0..41c6a59 100644 (file)
        "yourname": "Nome de Outelizador",
        "yourpassword": "Palabra chabe",
        "yourpasswordagain": "Repite la tue palabra-chabe",
-       "remembermypassword": "Lhembrar-se de mi neste cumputador (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "yourdomainname": "L tou domínio",
        "login": "Antrar",
        "nav-login-createaccount": "Antrar / criar cuonta",
index e2b8e1b..f0376cb 100644 (file)
        "activeusers": "တက်ကြွလှုပ်ရှားသည့် အသုံးပြုသူစာရင်း",
        "activeusers-intro": "ဤသည်မှာ နောက်ဆုံး $1 {{PLURAL:$1|ရက်|ရက်}}အတွင်း တက်ကြွလှုပ်ရှားသည့် အသုံးပြုသူများ စာရင်း ဖြစ်သည်။",
        "activeusers-from": "ဤမှစသော အသုံးပြုသူများကို ပြရန် -",
-       "activeusers-hidebots": "ဘော့များကို ဝှက်ရန်",
-       "activeusers-hidesysops": "အက်ဒမင်များကို ဝှက်ရန်",
        "activeusers-noresult": "အသုံးပြုသူ မတွေ့ပါ။",
        "listgrouprights": "အသုံးပြုသူအုပ်စု အခွင့်အရေးများ",
        "listgrouprights-group": "အုပ်စု",
index 7bae28c..2a102ec 100644 (file)
        "listusers-noresult": "Совицязо а муеви",
        "listusers-blocked": "(саймас саезь)",
        "activeusers": "Активной теицятнеде списка",
-       "activeusers-hidebots": "Кекшемс ботатнень",
-       "activeusers-hidesysops": "Кекшемс администратортнэнь",
        "activeusers-noresult": "Якинзэ-пакинзэ арасть",
        "listgrouprights": "Теиця куронть видечинзэ",
        "listgrouprights-group": "Куро",
index dc66e13..a3b7c7e 100644 (file)
        "yourpasswordagain": "پسورد ره دِباره بنویس",
        "createacct-yourpasswordagain": "پسورد ره دِباره باوّین",
        "createacct-yourpasswordagain-ph": "پسورد ره دِباره باوّین",
-       "remembermypassword": "مه رمز ره (تا حداکثر $1 {{PLURAL:$1|روز|روز}}) این مرورگر سر یاد نکان",
        "userlogin-remembermypassword": "مه ره سایت دله دار",
        "yourdomainname": "شمه کاروری نوم",
        "login": "دله بوردن",
        "api-error-unknown-error": "خطای داخلی: زمونی که شما تلاش کاردنی باربی‌یشتن پرونده ره انجوم هادین، اتا چی اشتباه پیش بورده.",
        "api-error-unknown-warning": "اخطار نشناسی‌یه: $1",
        "api-error-uploaddisabled": "باربی‌یشتن این ویکی دله غیرفعاله.",
-       "api-error-verification-error": "ممکن هسته که پرونده رِقِد بورد بائه یا پسوند غلط داره.",
-       "api-error-blacklisted": "اتا عنوان توصیفی دیگه انتخاب هاکنین."
+       "api-error-verification-error": "ممکن هسته که پرونده رِقِد بورد بائه یا پسوند غلط داره."
 }
index e61e6d7..10bdd34 100644 (file)
@@ -53,7 +53,7 @@
        "editfont-serif": "Serif machiyōtlahtōliztli",
        "sunday": "Īccemilhuitl",
        "monday": "Īcōmilhuitl",
-       "tuesday": "Īcyēyilhuitl",
+       "tuesday": "Icyeyilhuitl",
        "wednesday": "Īcnāhuilhuitl",
        "thursday": "Īcmācuīlilhuitl",
        "friday": "Īcchicuacemilhuitl",
        "november-date": "Īcmahtlactlioncēmētztli $1",
        "december-date": "Īcmahtlactliomōmemētztli $1",
        "pagecategories": "{{PLURAL:$1|Neneuhcayotl|Neneuhcayomeh}}",
-       "category_header": "Tlâkuilòlpiltin ìpan tlaìxmatkàtlàlilòtl \"$1\"",
-       "subcategories": "Tlaìxmatkàtlàlilòpilòmë",
+       "category_header": "Tlahcuiloltin ipan neneuhcayotl \"$1\"",
+       "subcategories": "Tlani-neneuhcayotl",
        "category-media-header": "Media \"$1\" neneuhcāyōc",
        "category-empty": "''Cah ahtlein inīn neneuhcāyōc.''",
-       "hidden-categories": "{{PLURAL:$1|tlatlàtìlli tlaìxmatkàyòtlàlilòtl|tlatlàtìltìn tlaìxmatkàyòtlàlilòme}}",
+       "hidden-categories": "{{PLURAL:$1|tlatlatilli neneuhcayotl|tlatlatiltin neneuhcayomeh}}",
        "hidden-category-category": "Tlatlàtìlkàtlaìxmatkàtlàlilòmë",
        "category-subcat-count": "{{PLURAL:$2|Inin neneuhcayotl zan quipiya in tetoquilli tlani-neneuhcayotl.|Inn neneuhcayotl {{PLURAL:$1|quipiya intetoquilli tlani-neneuhcayotl|in tetoquiltin $1 tlani-neneuhcayomeh}}, itech tlacecempohualoni $2.}}",
        "category-subcat-count-limited": "Inīn {{PLURAL:$1|neneuhcāyōtzintli cah|$1 neneuhcāyōtzintli cateh}} inīn neneuhcāyōc.",
        "searchbutton": "Tlatemoliztli",
        "go": "Xiyauh",
        "searcharticle": "Xiyauh",
-       "history": "Tlaīxtli ītlahtōllo",
+       "history": "Tlahtollotl",
        "history_short": "Tlahtollotl",
        "updatedmarker": "ōmoyancuīx īhuīcpa xōcoyōc notlahpololiz",
        "printableversion": "Tepoztlahcuilolli",
        "protectthispage": "Xicpiya inīn tlaīxtli",
        "unprotect": "Xicpatla in tlapiyaliztli",
        "unprotectthispage": "Xicpatla inīn tlaīxtli ītlapiyaliz",
-       "newpage": "Yancuic tlaīxtli",
+       "newpage": "Yancuic tlahcuilolli",
        "talkpage": "Xictlahto inīn tlaīxtli ītechcopa",
        "talkpagelinktext": "Teixnamiquiliztli",
        "specialpage": "Nònkuâkìskàtlaìxtlapalli",
        "copyright": "In tlahcuilōlli cah tlacēcencāhuani īpan $1 tel ahmo intlā īcuepca motēnēhua.",
        "copyrightpage": "{{ns:project}}:Tlachīhualōni ītlapiyaliz",
        "currentevents": "Axcancayotl",
-       "currentevents-url": "Project:Āxcāncāyōtl",
+       "currentevents-url": "Project:Axcancayotl",
        "disclaimers": "tlamamalquixtiliztli",
-       "edithelp": "Tlapatlaliztechcopa tēpalēhuiliztli",
+       "edithelp": "Tepalehuiliztli ica tlapatlaliztli",
        "helppage-top-gethelp": "Tēpalēhuiliztli",
        "mainpage": "Yacatlahcuilolli",
        "mainpage-description": "Yacatlahcuilolli",
        "site-rss-feed": "$1 RSS huelītiliztli",
        "site-atom-feed": "$1 Atom huelītiliztli",
        "page-rss-feed": "\"$1\" RSS huelītiliztli",
-       "page-atom-feed": "\"$1\" RSS huelītiliztli",
+       "page-atom-feed": "\"$1\" RSS huelitiliztli",
        "red-link-title": "$1 (ahmo oncah tlahcuilolli)",
        "nstab-main": "Tlahcuilolli-amatl",
        "nstab-user": "Tlatequitiltilīlli",
        "cannotdelete": "Ahmō ōhuelītic mopoloa in zāzanilli \"$1\".\nHueli tlein āquin ōquipolo achtopa.",
        "badtitle": "Ahcualli tōcāitl",
        "badtitletext": "Zāzanilli ticnequi in ītōca cah ahcualli, ahtlein quipiya nozo ahcualtzonhuiliztli interwiki tōcāhuicpa.\nHueliz quimpiya tlahtōl tlein ahmo mohuelītih motequitiltia tōcāpan.",
-       "viewsource": "Xiquitta mēyalli",
+       "viewsource": "Xiquitta meyalli",
        "viewsource-title": "Xiquitta in $1 īmēyal",
        "actionthrottled": "Tlachīhualiztli ōmotzacuili",
        "viewsourcetext": "Tihuelīti tiquittaz auh ticcopīnaz inīn zāzanilli īmachiyōnecaquilizmēyal.",
        "logout": "Xiquīza",
        "userlogout": "Xiquīza",
        "notloggedin": "Ahmō ōtimocalac",
-       "userlogin-noaccount": "Cuix ahmō titlapōhualeh?",
+       "userlogin-noaccount": "Cuix ahmo titlapohualeh?",
        "nologin": "Cuix ahmō titlapōhualeh? $1.",
        "nologinlink": "Xicchīhua cē tlapōhualli",
        "createaccount": "Xicchīhua tlapōhualli",
        "summary": "Mopatlaliz:",
        "subject": "Ītechpa:",
        "minoredit": "Ca tepitōn inīn tlapatlaliztli",
-       "watchthis": "Xicpiya inīn tlaīxtli",
+       "watchthis": "Tictlachiyaz inin tlahcuilolli",
        "savearticle": "Xicpiya tlahcuilolli",
        "preview": "Xiquitta achtochīhualiztli",
        "showpreview": "Xiquitta achtochīhualiztli",
-       "showdiff": "Xicnēxti tlapatlaliztli",
+       "showdiff": "Monextiz tlapatlaliztli",
        "missingcommenttext": "Timitztlātlauhtiah xitlanitlahcuiloa.",
        "summary-preview": "Tlahcuilōltōn achtochīhualiztli:",
        "blockedtitle": "Ōmotzacuili tlatequitiltilīlli",
        "accmailtext": "Ōquiyōcox zāzochtacātlahtōlli in [[User talk:$1|$1]] auh ōmoquitītlan īhuīc $2. Tihueliti ticpatlaz īpan ''[[Special:ChangePassword|Ticpatlaz in ]]'' in ōticalaco achtopa.",
        "newarticle": "(Yancuic)",
        "newarticletext": "Ōtictocac cētiliztli cē zāzanilhuīc oc ahmo ia. Intlā quiēlēhuia quichīhua, xitlahcuiloa niman (nō xiquitta [$1 tēpalēhuiliztli zāzanilli] huehca ōmpa tlapatlaliztli). Intlā ahmo, yāuh achtopa zāzanilli.",
-       "noarticletext": "In āxcān, ahmō onca tlahcuilōlli inīn zāzanilpan.\nTihuelīti [[Special:Search/{{PAGENAME}}|tictēmōz inīn zāzanilli ītōca]] occequīntīn zāzanilpan,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xictēmoa īpan in tlapōhualāmatechpa],\nahnozo [{{fullurl:{{FULLPAGENAME}}|action=edit}} xichīhua inīn zāzanilli]</span>.",
+       "noarticletext": "In axcan, ahmo oncah tlahcuilolli ipan inin amatl.\nTihueliti [[Special:Search/{{PAGENAME}}|tictemoz inin tlahcuilolli itoca]] occequintin tlahcuilolli,\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} xictemoa ipan in occe tlahcuilolmachiyotl],\nahnozo [{{fullurl:{{FULLPAGENAME}}|action=edit}} xichihua inin tlahcuilolli]</span>.",
        "userpage-userdoesnotexist": "Ahmo ia cuentah \"<nowiki>$1</nowiki>\" ītōca. Timitztlātlauhtiah xitēchquinōtza intlā ticchīhuāz intlā nozo ticpatlāz inīn zāzanilli.",
        "usercsspreview": "'''Ca inīn moachtochīhualiz ītechcopa moCSS.'''\n'''¡Ahmo ōmochīuh nozan!'''",
        "userjspreview": "'''Ca inīn moachtochīhualiz ītechcopa moJavaScript.'''\n'''¡Ahmo ōmochīuh nozan!'''",
        "templatesusedpreview": "{{PLURAL:$1|Nemachiòtl tlèn motekìuhtia|Nemachiòmë tlèn mokìntekìuhtiä}} ìpan inìn achtochìwalistli:",
        "templatesusedsection": "{{PLURAL:$1|Nemachiòtl tlèn motekìuhtia|Nemachiòmë tlèn mokìntekìuhtiä}} ìpan inìn tlaxélòlistli:",
        "template-protected": "(ōmoquīxti)",
-       "hiddencategories": "Inīn zāzanilli mopiya {{PLURAL:$1|1 neneuhcāyōc ōmotlāti|$1 neneuhcāyōc ōmotlāti}}:",
+       "hiddencategories": "Inin tlahcuilolli pohui {{PLURAL:$1|1 tlatlalilli neneuhcayotl|$1 tlatlaliltin neneuhcayomeh}}:",
        "nocreatetext": "Inīn huiqui ōquitzacuili tlahuelītiliztli ic tlachīhua yancuīc zāzaniltin. Tichuelīti ticcuepa auh ticpatla cē zāzanilli, [[Special:UserLogin|xicalaqui nozo xicchīhua cē cuentah]].",
        "nocreate-loggedin": "Ahmo tihuelīti tiquinchīhua yancuīc zāzaniltin.",
        "permissionserrors": "Tēmācāhualiztli aiuhcāyōtl",
        "nohistory": "Nicān ahmō oncah tlaīxtlapatlaliztlahtōllōtl.",
        "currentrev": "Āxcān tlapatlaliztli",
        "currentrev-asof": "Āxcān tlachiyaliztli īpan $1",
-       "revisionasof": "Tlachiyaliztli īpan $1",
+       "revisionasof": "Tlachiyaliztli ipan $1",
        "revision-info": "Tlachiyaliztli īpan $1 īpal {{GENDER:$6|$2}}$7",
-       "previousrevision": "← Huēhueh tlapatlaliztli",
+       "previousrevision": "← Huehueh tlapatlaliztli",
        "nextrevision": "Yancuīc tlapatlaliztli →",
        "currentrevisionlink": "Āxcān tlapatlaliztli",
-       "cur": "āxcān",
+       "cur": "axcan",
        "next": "niman",
-       "last": "xōcoyōc",
+       "last": "xocoyoc",
        "page_first": "achto",
        "page_last": "xōcoyōc",
        "history-fieldset-title": "Xitlatēmo īpan tlahtōllōtl",
        "mergehistory-reason": "Tleīpampa:",
        "revertmerge": "Tiquīxipehuaz",
        "history-title": "«$1» ītlaceppahuiliztlahtōllo",
-       "lineno": "Pāntli $1:",
+       "lineno": "Pantli $1:",
        "editundo": "Ticxitiniz",
        "searchresults": "motlatemoliz itlananquilizhuan",
        "searchresults-title": "«$1» tlatemoliztli imochihualiz",
        "prevn": "{{PLURAL:$1|$1}} achtopa",
        "nextn": "niman {{PLURAL:$1|$1}}",
-       "shown-title": "Quinēxiltīz $1 {{PLURAL:$1|mochīhualiztli}} cece āmac",
+       "shown-title": "Monextiz $1 {{PLURAL:$1|mochihualiztli}} cecen amatl",
        "viewprevnext": "Xiquintta ($1 {{int:pipe-separator}} $2) ($3).",
        "searchmenu-exists": "'''Ye ia zāzanilli ītōca \"[[$1]]\" inīn huiquipan'''",
        "searchmenu-new": "<strong>Ticchīhuāz in zāzanilli «[[:$1]]» inīn huiquipan.</strong> {{PLURAL:$2|0=|Nō xiquitta in tlanāmiquiliztli in mochīhualiztli.}}",
        "searchprofile-everything": "Mochi",
        "searchprofile-advanced": "Huehca ōmpa",
        "searchprofile-articles-tooltip": "Tictēmōz īpan $1",
-       "searchprofile-images-tooltip": "Tiquintēmōz tlahcuilōlli",
+       "searchprofile-images-tooltip": "motemoz tlapiyaliztecpaliztli",
        "searchprofile-everything-tooltip": "Tictēmōz mochi tlapiyalizpan (mopiyah tēixnāmiquiliztli zāzanilli)",
        "search-result-size": "$1 ({{PLURAL:$2|1 tlahtōl|$2 tlahtōltin}})",
        "search-redirect": "(ixquichca ompa mitzhuica $1)",
        "search-section": "(tlahtōltzintli $1)",
-       "search-category": "(tlaìxmatkàyòtlàlilòtl $1)",
+       "search-category": "(neneuhcayotl $1)",
        "search-suggest": "Ahnōceh tiquihtōznequiya: $1",
        "search-interwiki-caption": "Tlachīhualiztli īcnīhuān",
        "search-interwiki-more": "(huehca ōmpa)",
        "recentchanges-legend": "Yancuīc tlapatlaliztechcopa tlanequiliztli",
        "recentchanges-summary": "Xiquinttāz in achi yancuīc ahmo occequīntīn tlapatlaliztli huiquipan inīn zāzanilpan.",
        "recentchanges-label-newpage": "Inīn tlapatlaliztli ōquiyōcox cē yancuīc āmatl",
-       "recentchanges-label-minor": "Ca tepitōn inīn tlapatlaliztli",
+       "recentchanges-label-minor": " Inin tepiton tlapatlaliztli",
+       "recentchanges-label-bot": "Inin tlapaltlaliztli oquichiuh ce robot",
        "rclistfrom": "Xiquinttāz yancuīc tlapatlaliztli īhuīcpa $3 $2",
        "rcshowhideminor": "$1 tlapatlalitzintli",
        "rcshowhideminor-show": "Ticnēxtīz",
        "rcshowhidebots": "$1 tepoztlācah",
-       "rcshowhidebots-show": "Xicnēxti",
+       "rcshowhidebots-show": "Xicnexti",
        "rcshowhidebots-hide": "Tiquihyānaz",
        "rcshowhideliu": "$1 tēmachiyōmacalli tlatequitiltilīltin",
-       "rcshowhideanons": "$1 ahtōcā tlatequitiltilīlli",
+       "rcshowhideanons": "$1 ahtocatl tequiuhqui",
        "rcshowhideanons-show": "Xicnēxti",
        "rcshowhidepatr": "$1 tlapatlaliztli mochiyahua",
-       "rcshowhidemine": "$1 notlahcuilōl",
+       "rcshowhidemine": "$1 notlahcuilol",
        "rcshowhidemine-show": "Xicnēxti",
        "rclinks": "Xiquintta xōcoyōc $1 tlapatlaliztli xōcoyōc $2 tōnalpan.<br />$3",
        "diff": "ahneneuhqui",
        "recentchangeslinked": "Tlapatlaliztli tzonhuilizpan",
        "recentchangeslinked-feed": "Tlapatlaliztli tzonhuilizpan",
        "recentchangeslinked-toolbox": "Itloc itlapatlalizhuan",
-       "recentchangeslinked-title": "Tlapatlaliztli \"$1\" ītechcopa",
+       "recentchangeslinked-title": "Tlapatlaliztli \"$1\" itechcopa",
        "recentchangeslinked-page": "Tlaīxtli ītōcā:",
        "upload": "Tlahcuilolquetzaliztli",
        "uploadbtn": "Tlahcuilōlquetza",
        "listfiles_count": "Cuepaliztli",
        "listfiles-latestversion-yes": "Quēmah",
        "listfiles-latestversion-no": "Ahmō",
-       "file-anchor-link": "Ihcuilōlli",
+       "file-anchor-link": "Tlapiyaliztecpanaliztli",
        "filehist": "Ihcuilōlli ītlahtōllo",
        "filehist-deleteall": "tiquimpolōz mochīntīn",
        "filehist-deleteone": "xicpolo",
        "listredirects": "Tlacuepaliztli",
        "unusedtemplates": "Nemachiyōtīlli ahmotequitiltiah",
        "unusedtemplateswlh": "occequīntīn tzonhuiliztli",
-       "randompage": "Centlaīxtli",
+       "randompage": "Cecen tlahcuilolli",
        "randompage-nopages": "Ahmo oncah zāzanilli īpan inīn {{PLURAL:$2|tōcāitl}}: $1.",
        "randomincategory-submit": "Yāuh",
        "randomredirect": "Zāzotlacuepaliztli",
        "nbytes": "$1 {{PLURAL:$1|byte}}",
        "ncategories": "$1 {{PLURAL:$1|tlaìxmatkàyòtlàlilòtl|tlaìxmatkàyòtlàlilòme}}",
        "nlinks": "$1 {{PLURAL:$1|tzòwilistli|tzòwilistìn}}",
-       "nmembers": "$1 {{PLURAL:$1|tlâkuilòpilli|tlâkuilòpiltìn}}",
+       "nmembers": "$1 {{PLURAL:$1|tlahcuilolli|tlahcuiloltin}}",
        "nrevisions": "$1 {{PLURAL:$1|tlapiyaliztli}}",
        "nimagelinks": "Motekìuhtia ìpan $1 {{PLURAL:$1|tlaìxtlapalli|tlaìxtlapaltìn}}",
        "ntransclusions": "motekìuhtia ìpan $1 {{PLURAL:$1|tlaìxtlapalli|tlaìxtlapaltìn}}",
        "protectedpages-reason": "Tleīpampa",
        "protectedtitles": "Tōcāitl ōmoquīxtih",
        "listusers": "Tlatequitiltilīlli",
-       "newpages": "Yancuīc zāzaniltin",
+       "newpages": "Yancuic tlahcuiloltin",
        "newpages-username": "Tlatequitiltilīltōcāitl:",
        "ancientpages": "Huēhuehzāzanilli",
        "move": "Ticzacāz",
        "allarticles": "Mochīntīn tlahcuilōlli",
        "allinnamespace": "Mochīntīn zāzanilli (īpan $1)",
        "allpagessubmit": "Tiyāz",
-       "categories": "Tlaìxmatkàyòtlàlilòme",
+       "categories": "Neneuhcayotl",
        "categoriespagetext": "{{PLURAL:$1|Inìn tlaìxmatkàyòtlàlilòtl kimpia|Inîke tlaìxmatkàyòtlàlilòme kimpiâke}} tlaìxtlapaltìn noso medios.\nÂmò monèxtiâke nikàn in [[Special:UnusedCategories|tlaìxmatkàyòtlàlilòme tlèn âmò mokìntekitìltia]].\nNò mà mỏta in tlèn [[Special:WantedCategories|ìpan kineki tlaìxmatkàyòtlàlilòtl]].",
        "categoriesfrom": "Mà monèxtìkàn tlaìxmatkàtlàlilòmë tlèn pèwâkë ìka:",
        "linksearch": "Calān tzonhuiliztli tlatemoliztli",
        "undelete-search-submit": "Tlatēmōz",
        "undelete-error-short": "Ahcuallōtl ihcuāc momāquīxtiya: $1",
        "undelete-show-file-submit": "Quemah",
-       "namespace": "Tōcātlacāuhtli:",
-       "invert": "Tlacuepāz motlahtōl",
+       "namespace": "Tocatlacauhtli:",
+       "invert": "Tlacuepaz motlahtol",
        "blanknamespace": "(Huēyi)",
        "contributions": "In {{GENDER:$1|tlatequitiltilīlli}} ītlahcuilōl",
        "contributions-title": "Tlatequitiltilīlli $1 ītlahcuilōl",
        "tooltip-pt-preferences": "{{GENDER:|Motlaēlēhuiliz}}",
        "tooltip-pt-watchlist": "Zāzaniltin tiquintlachiya ic tlapatlaliztli",
        "tooltip-pt-mycontris": "{{GENDER:|Motlahcuilōl}}",
-       "tooltip-pt-login": "Tihuelīti timocalaqui, tēl ahmo tihuīquilia.",
+       "tooltip-pt-login": "Tihueliti timocalaqui, tel ahmo tihuiquilia.",
        "tooltip-pt-logout": "Tiquīzāz",
        "tooltip-ca-talk": "Iteixnamiquiliz itechpa inin tlahcuilolli",
        "tooltip-ca-edit": "Ticpatlaz inin tlahcuilolli",
        "tooltip-n-mainpage-description": "Tiquittaz in yacatlahcuilolli",
        "tooltip-n-portal": "Tlachīhualiztechcopa, inōn tihuelīti titlachīhua, tlatēmoyān",
        "tooltip-n-recentchanges": "Yancuic īpan tlapatlaliztli in huiqui",
-       "tooltip-n-randompage": "Tiquittaz centlaīxtli",
+       "tooltip-n-randompage": "Tiquittaz cecen tlahcuilolli",
        "tooltip-n-help": "In tēmachtīlōyān",
-       "tooltip-t-whatlinkshere": "Mochīntīn zāzaniltin huiquipan quitzonhuiliah nicān",
+       "tooltip-t-whatlinkshere": "Mochintin tlahcuiloltin huiquipan quitzonhuiliah nican",
        "tooltip-t-recentchangeslinked": "Yancuic tlapatlaliztli ipan tlahcuiloltin tlein quitzonhuilia nican",
        "tooltip-feed-rss": "RSS tlachicāhualiztli inīn zāzaniltechcopa",
        "tooltip-feed-atom": "Atom tlachicāhualiztli inīn zāzaniltechcopa",
        "tooltip-compareselectedversions": "Tiquinttāz ahneneuhquiliztli ōme zāzanilli tlapatlaliznepantlah.",
        "tooltip-watch": "Ticcēntilīz inīn zāzanilli motlachiyalizhuīc",
        "tooltip-upload": "Ticpēhua quetzaliztli",
-       "tooltip-summary": "Xicaquilia tepitōn tlahcuilōltōntli",
+       "tooltip-summary": "Xiquihcuilo ce tepiton tlahcuiloltontli",
        "anonymous": "Ahtōcāitl {{PLURAL:$1|tlatequitiltilīlli}} īpan {{SITENAME}}",
        "siteuser": "$1 tlatequitiltilīlli īpan {{SITENAME}}",
        "lastmodifiedatby": "Inīn zāzanilli ōtlapatlac catca īpan $2, $1 īpal $3.",
        "file-info-size": "$1 × $2 pixel; zāzanilli octacayōtl: $3; machiyōtl MIME: $4",
        "file-nohires": "Ahmo ia achi cualli ahmo occē īxiptli.",
        "show-big-image": "Tzintiliztlahcuilolli",
+       "show-big-image-size": "$1 × $2 pixels",
        "newimages": "Yancuīc īxipcān",
        "imagelisttext": "Nicān {{PLURAL:$1|mopiya|mopiyah}} '''$1''' īxiptli $2 iuhcopa.",
        "noimages": "Ahtlein ic tlatta.",
        "exif-gpslatitude-s": "Huiztlān",
        "exif-gpslongitude-e": "Tlāpcopa huehtlatzīncāyōtl",
        "exif-gpslongitude-w": "Cihuātlāmpa huehtlatzīncāyōtl",
-       "namespacesall": "mochīntīn",
+       "namespacesall": "mochintin",
        "monthsall": "(mochīntīn)",
        "confirmemail": "Ticchicāhuāz e-mail",
        "confirmemail_needlogin": "Tihuīquilia $1 ic ticchicāhua mo e-mail.",
index 6d21b41..5cb16cb 100644 (file)
        "botpasswords-label-resetpassword": "Riabbìa 'a password",
        "botpasswords-label-grants": "Assegnaziune apprecabbele:",
        "botpasswords-help-grants": "Ogne assegnazione dà acciesso a 'e deritte utente elencate ca n'utenza avesse già. Vedite 'a [[Special:ListGrants|tabbella 'e ll'assegnaziune]] pe' ne mòvere cchiù nfurmaziune.",
-       "botpasswords-label-restrictions": "Restriziune d'uso:",
        "botpasswords-label-grants-column": "Assegnaziune date",
        "botpasswords-bad-appid": "'O nomme bot \"$1\" nun è bbuono.",
        "botpasswords-insert-failed": "Nun se pò azzeccà 'o nomme bot \"$1\". Fosse stato già azzeccato?",
        "passwordreset-nocaller": "Nu chiammate s'avess'a dà",
        "passwordreset-nosuchcaller": "'O chiammante nun esiste: $1",
        "passwordreset-ignored": "'A reimpustazione d' 'a password nun s'è gistita. Fosse ca nisciunu fornitore è stato mpustato?",
-       "passwordreset-invalideamil": "Indirizzo 'e posta email nun valido",
+       "passwordreset-invalidemail": "Indirizzo 'e posta email nun valido",
        "passwordreset-nodata": "Nun è stato fornito né nomme utente né indirizzo 'e posta email",
        "changeemail": "Cagna o lèva l'indirizzo e-mail",
        "changeemail-header": "Ghienchete stu modulo pe' puté cagnà 'o indirizzo e-mail d' 'o vuosto. Si vuje vulite luvà e 'o scucchià l'associazione 'e cocche cunto mail d' 'o cunto vuosto, lassate 'o cunto e-mail nuovo abbacante quanno mannarrate stu modulo.",
        "activeusers-intro": "Chest'è n'elenco d'utente c'hanno fatto cierti tipe d'attività nfin'a $1 {{PLURAL:$1|juorno|ghiuorne}} fa.",
        "activeusers-count": "$1 {{PLURAL:$1|cagnamiento|cagnamiente}} int'a l'urdeme {{PLURAL:$3|ghiuorne}}",
        "activeusers-from": "Fà vedè l'utente partenno 'a:",
-       "activeusers-hidebots": "Annascunne 'e bot",
-       "activeusers-hidesysops": "Annascunne l'ammenistrature",
        "activeusers-noresult": "Nisciun'utente truvato.",
        "activeusers-submit": "Mmusta cunte attive",
        "listgrouprights": "Deritte d' 'e gruppe utente",
        "feedback-external-bug-report-button": "Archivia na fatica tecnica",
        "feedback-dialog-title": "Manna 'o feedback",
        "feedback-dialog-intro": "Putite ausà sempricemente 'o modulo ccà abbascio pe' putè mannà 'o feedback vuosto. 'O cummento sarrà azzeccato â paggena \"$1\", nziem' 'o nomme vuosto.",
-       "feedback-error-title": "Errore",
        "feedback-error1": "Errore: Risultato nun aspettato 'a ll'API",
        "feedback-error2": "Errore: Cagnamiento scassato",
        "feedback-error3": "Errore: Ll'API nun risponne",
index f3f5855..1a46560 100644 (file)
        "views": "Visninger",
        "toolbox": "Verktøy",
        "tool-link-userrights": "Endre {{GENDER:$1|brukergrupper}}",
+       "tool-link-userrights-readonly": "Vis {{GENDER:$1|brukergrupper}}",
        "tool-link-emailuser": "Send {{GENDER:$1|brukeren}} en e-post",
        "userpage": "Vis brukerside",
        "projectpage": "Vis prosjektside",
        "botpasswords-label-delete": "Slett",
        "botpasswords-label-resetpassword": "Tilbakestill passord",
        "botpasswords-label-grants": "Tilgjengelige tildelinger:",
-       "botpasswords-help-grants": "Hver tildeling gir tilgang til opplistede brukerrettigheter som brukerkontoen allerede har. Se [[Special:ListGrants|tildelingstabellen]] for mer informasjon.",
+       "botpasswords-help-grants": "Tildelinger gir tilgang til rettighetene som allerede innehas av brukerkontoen din. Å slå på en tildeling her gir ikke tilgang til rettigheter brukerkontoen din ikke ellers ville hatt. Se [[Special:ListGrants|tildelingstabellen]] for mer informasjon.",
        "botpasswords-label-grants-column": "Bevilget",
        "botpasswords-bad-appid": "Robotnavnet \"$1\" er ikke gyldig.",
        "botpasswords-insert-failed": "Kunne ikke legge til robotnavnet \"$1\". Har det allerede blitt lagt til?",
        "passwordreset-emaildisabled": "E-posttjenester er slått av på denne wikien.",
        "passwordreset-username": "Brukernavn:",
        "passwordreset-domain": "Domene:",
-       "passwordreset-capture": "Vise resulterende e-post?",
-       "passwordreset-capture-help": "Hvis du krysser av her, vil du se e-posten (med foreløpig passord) i tillegg til at den blir sendt til brukeren.",
        "passwordreset-email": "E-postadresse:",
        "passwordreset-emailtitle": "Kontodetaljer på {{SITENAME}}",
        "passwordreset-emailtext-ip": "Noen (sannsynligvis deg fra IP-adressen $1) ba om en tilbakestilling av ditt passord for {{SITENAME}} ($4). {{PLURAL:$3|Den følgende brukerkontoen|De følgende brukerkontoene}} er\ntilknyttet denne e-postadressen:\n\n$2\n\n{{PLURAL:$3|Dette midlertidige passordet|Disse midlertidige passordene}} utløper om {{PLURAL:$5|én dag|$5 dager}}.\nDu bør logge på og velge et nytt passord nå. Dersom noen andre kom med denne\nforespørselen, eller du har kommet på ditt opprinnelige passord, og ikke lenger\nønsker å endre det, kan du ignorere denne meldingen og fortsette å bruke ditt gamle\npassord.",
        "passwordreset-emailelement": "Brukernavn: \n$1\n\nMidlertidig passord: \n$2",
        "passwordreset-emailsentemail": "Hvis denne epostadressen er koblet til din konto, så vil det bli sendt en epost om tilbakestilling av passord.",
        "passwordreset-emailsentusername": "Hvis det finnes en epostadresse knyttet til dette brukernavnet, vil en epost med informasjon om tilbakestilling av passord bli sendt.",
-       "passwordreset-emailsent-capture2": "{{PLURALS:$1|E-posten|E-postene}} om passordtilbakestilling har blitt sendt. {{PLURAL:$1|Brukernavnet og passordet|Listen over brukernavn og passord}} vises under.",
-       "passwordreset-emailerror-capture2": "Kunne ikke sende e-post til {{GENDER:$2|brukeren}}: $1 {{PLURAL:$3|Brukernavnet og passordet|Listen over brukernavn og passord}} vises her.",
        "passwordreset-nocaller": "En bruker må angis",
        "passwordreset-nosuchcaller": "Brukeren finnes ikke: $1",
        "passwordreset-ignored": "Passordtilbakestillingen ble ikke håndtert. Har ingen leverandør blitt konfigurert?",
-       "passwordreset-invalideamil": "Ugyldig e-postadresse",
+       "passwordreset-invalidemail": "Ugyldig e-postadresse",
        "passwordreset-nodata": "Verken et brukernavn eller en e-postadresse ble oppgitt",
        "changeemail": "Endre eller fjerne epostadresse",
        "changeemail-header": "Fyll ut dette skjemaet for å bytte din epost-adresse. Hvis du vil fjerne epostadressen fra din konto, kan du la ny epostadresse-feltet være tomt når.",
        "prefs-help-recentchangescount": "Dette inkluderer nylige endringer, sidehistorikk og logger.",
        "prefs-help-watchlist-token2": "Dette er den hemmelige nøkkelen til webmatingen for din overvåkningsliste.\nEnhver som kjenner nøkkelen vil kunne lese din overvåkningsliste, så ikke vis den til andre.\n[[Special:ResetTokens|Klikk her om du trenger å nullstille nøkkelen]].",
        "savedprefs": "Innstillingene ble lagret.",
-       "savedrights": "Brukerrettighetene til {{GENDER:$1|$1}} har blitt lagret.",
+       "savedrights": "Brukergruppene til {{GENDER:$1|$1}} har blitt lagret.",
        "timezonelegend": "Tidssone:",
        "localtime": "Lokaltid:",
        "timezoneuseserverdefault": "Bruk wikistandard ($1)",
        "prefswarning-warning": "Du har gjort endringer i dine innstillinger som ikke er lagret ennå.\nDersom du forlater denne siden utenk å klikke på \"$1\" blir ikke innstillingene dine oppdatert.",
        "prefs-tabs-navigation-hint": "Tips: Du kan bruke venstre- og høyrepiltastene for å navigere mellom fanene i fanelisten",
        "userrights": "Bruker&shy;rettighets&shy;kontroll",
-       "userrights-lookup-user": "Ordne brukergrupper",
+       "userrights-lookup-user": "Velg en bruker",
        "userrights-user-editname": "Fyll inn et brukernavn:",
-       "editusergroup": "Endre {{GENDER:$1|brukergrupper}}",
+       "editusergroup": "Last brukergrupper",
        "editinguser": "Endrer brukerrettighetene for {{GENDER:$1|bruker}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Rediger brukergrupper",
        "saveusergroups": "Lagre {{GENDER:$1|brukergrupper}}",
        "userrights-reason": "Årsak:",
        "userrights-no-interwiki": "Du har ikke tillatelse til å endre brukerrettigheter på andre wikier.",
        "userrights-nodatabase": "Databasen $1 finnes ikke, eller er ikke lokal.",
-       "userrights-nologin": "Du må [[Special:UserLogin|logge inn]] med en administratorkonto for å endre brukerrettigheter.",
-       "userrights-notallowed": "Du har ikke tillatelse til å gi eller fjerne brukerrettigheter.",
        "userrights-changeable-col": "Grupper du kan endre",
        "userrights-unchangeable-col": "Grupper du ikke kan endre",
        "userrights-irreversible-marker": "$1 *",
        "userrights-conflict": "En konflikt med endringen av brukerrettigheter! Vær vennlig å sjekke og på nytt bekrefte endringene dine.",
-       "userrights-removed-self": "Du har fjernet dine egne rettigheter. Du har derfor ikke lengre adgang til denne siden.",
        "group": "Gruppe:",
        "group-user": "Brukere",
        "group-autoconfirmed": "Autobekreftede brukere",
        "right-siteadmin": "Låse og låse opp databasen",
        "right-override-export-depth": "Eksporter sider inkludert lenkede sider til en dypde på 5",
        "right-sendemail": "Send e-post til andre brukere",
-       "right-passwordreset": "Vis e-poster over tilbakestilte passord",
        "right-managechangetags": "Opprette og (de)aktivere [[Special:Tags|tagger]]",
        "right-applychangetags": "Legg til [[Special:Tags|merker]] sammen med ens endringer",
        "right-changetags": "Legg til og fjern vilkårlige [[Special:Tags|merker]] på individuelle revisjoner og loggposter",
        "uploadnewversion-linktext": "Last opp en ny versjon av denne filen",
        "shared-repo-from": "fra $1",
        "shared-repo": "et delt fillager",
+       "filepage.css": "/* CSS som plasseres her inkluderes på filbeskrivelsessiden, og inkluderes også på andre wikier som bruker denne */",
        "upload-disallowed-here": "Du kan ikke overskrive denne filen.",
        "filerevert": "Tilbakestill $1",
        "filerevert-legend": "Tilbakestill fil",
        "apisandbox-continue": "Fortsett",
        "apisandbox-continue-clear": "Tøm",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} vil [https://www.mediawiki.org/wiki/API:Query#Continuing_queries fortsette] forrige forespørsel; {{int:apisandbox-continue-clear}} vil tømme fortsettelsesrelaterte parametre.",
+       "apisandbox-param-limit": "Skriv <kbd>max</kbd> for å bruke maksgrensa.",
+       "apisandbox-multivalue-all-namespaces": "$1 (alle navnerom)",
+       "apisandbox-multivalue-all-values": "$1 (alle verdier)",
        "booksources": "Bokkilder",
        "booksources-search-legend": "Søk etter bokkilder",
        "booksources-search": "Søk",
        "booksources-text": "Under er en liste over lenker til andre sider som selger nye og brukte bøker, og kan også ha videre informasjon om bøker du leter etter:",
        "booksources-invalid-isbn": "Det gitte ISBN-nummeret er ugyldig; sjekk om du har angitt det riktig.",
+       "magiclink-tracking-rfc": "Sider som bruker magiske RFC-lenker",
+       "magiclink-tracking-rfc-desc": "Denne siden bruker magiske RFC-lenker. Se [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links MediaWiki.org] for hvordan man kan bytte.",
+       "magiclink-tracking-pmid": "Sider som bruker magiske PMID-lenker",
+       "magiclink-tracking-pmid-desc": "Denne siden bruker magiske PMID-lenker. Se [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links MediaWiki.org] for hvordan man kan bytte.",
+       "magiclink-tracking-isbn": "Sider som bruker magiske ISBN-lenker",
+       "magiclink-tracking-isbn-desc": "Denne siden bruker magiske ISBN-lenker. Se [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links MediaWiki.org] for hvordan man kan bytte.",
        "specialloguserlabel": "Utøver:",
        "speciallogtitlelabel": "Mål (tittel eller {{ns:user}}:brukernavn for brukeren):",
        "log": "Logger",
        "activeusers-intro": "Dette er en liste over brukere som har hatt en eller annen form for aktivitet innenfor {{PLURAL:$1|den siste dagen|de siste dagene}}.",
        "activeusers-count": "$1 {{PLURAL:$1|endring|endringer}} {{PLURAL:$3|det siste døgnet|de siste $3 dagene}}",
        "activeusers-from": "Vis brukere fra og med:",
+       "activeusers-groups": "Vis brukere som tilhører gruppene:",
+       "activeusers-excludegroups": "Ekskluder brukere som hører til gruppene:",
        "activeusers-noresult": "Ingen brukere funnet.",
        "activeusers-submit": "Vis",
        "listgrouprights": "Rettigheter for brukergrupper",
        "modifiedarticleprotection": "endret beskyttelsesnivå for «[[$1]]»",
        "unprotectedarticle": "fjernet beskyttelse av «[[$1]]»",
        "movedarticleprotection": "flyttet beskyttelsesinnstillinger fra «[[$2]]» til «[[$1]]»",
+       "protectedarticle-comment": "{{GENDER:$2|Beskyttet}} «[[$1]]»",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Endret beskyttelsesnivå}} for «[[$1]]»",
+       "unprotectedarticle-comment": "{{GENDER:$2|Fjernet beskyttelsen}} av «[[$1]]»",
        "protect-title": "Låser «$1»",
        "protect-title-notallowed": "Vis beskyttelsesnivået til «$1»",
        "prot_1movedto2": "[[$1]] flyttet til [[$2]]",
        "tooltip-summary": "Skriv et kort sammendrag",
        "interlanguage-link-title": "$1 – $2",
        "common.css": "/* CSS plassert i denne fila vil gjelde for alle utseender. */",
+       "print.css": "/* CSS som plasseres her vil påvirke utskriftsversjoner */",
+       "noscript.css": "/* CSS plassert her vil påvirke brukere som har slått av JavaScript */",
+       "group-autoconfirmed.css": "/* CSS plassert her vil kun påvirke autobekreftede brukere */",
+       "group-user.css": "/* CSS plassert her vil kun påvirke registrerte brukere */",
+       "group-bot.css": "/* CSS plassert her vil kun påvirke botter */",
+       "group-sysop.css": "/* CSS plassert her vil kun påvirke administratorer */",
+       "group-bureaucrat.css": "/* CSS plassert her vil kun påvirke byråkrater */",
        "common.js": "/* Javascript i denne fila vil gjelde for alle drakter. */",
+       "group-autoconfirmed.js": "/* JavaScript her vil kun lastes for autobekreftede brukere */",
+       "group-user.js": "/* JavaScript her vil kun lastes for registrerte brukere */",
+       "group-bot.js": "/* JavaScript her vil kun lastes for botter */",
+       "group-sysop.js": "/* Javascript her vil kun lastes for administratorer */",
+       "group-bureaucrat.js": "/* JavaScript her vil kun lastes for byråkrater */",
        "anonymous": "{{PLURAL:$1|Anonym bruker|Anonyme brukere}} av {{SITENAME}}",
        "siteuser": "{{SITENAME}}-bruker $1",
        "anonuser": "{{SITENAME}}s anonyme bruker $1",
        "patrol-log-header": "Dette er en logg over patruljerte sideversjoner.",
        "log-show-hide-patrol": "$1 patruljeringslogg",
        "log-show-hide-tag": "$1 merkelogg",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Merk revisjon $3 av $2 som patruljert?",
        "deletedrevision": "Slettet gammel revisjon $1.",
        "filedeleteerror-short": "Feil under filsletting: $1",
        "filedeleteerror-long": "Feil oppsto under filsletting:\n\n$1",
        "newimages-showbots": "Vis opplastinger av botter",
        "newimages-hidepatrolled": "Skjul patruljerte opplastinger",
        "noimages": "Ingenting å se.",
+       "gallery-slideshow-toggle": "Skift miniatyrbilder",
        "ilsubmit": "Søk",
        "bydate": "etter dato",
        "sp-newimages-showfrom": "Vis nye filer fra og med $2 $1",
-       "hours-abbrev": "$1t",
+       "hours-abbrev": "$1 t",
        "seconds": "{{PLURAL:$1|$1 sekund|$1 sekunder}}",
        "minutes": "{{PLURAL:$1|$1 minutt|$1 minutter}}",
        "hours": "{{PLURAL:$1|$1 time|$1 timer}}",
        "exif-compression-2": "CCITT Gruppe 3 1-dimensjonal modifisert Huffman-kjørelengdekoding",
        "exif-compression-3": "CCITT Gruppe 3 faks-koding",
        "exif-compression-4": "CCITT Gruppe 4 faks-koding",
+       "exif-compression-6": "JPEG (gammel)",
        "exif-copyrighted-true": "Opphavsrettsbeskyttet",
        "exif-copyrighted-false": "Opphavsrettstatus er ikke angitt",
+       "exif-photometricinterpretation-0": "Svart-hvitt (hvitt er 0)",
        "exif-photometricinterpretation-1": "Sort og hvitt (Sort er 0)",
+       "exif-photometricinterpretation-4": "Gjennomsiktighetsmaske",
+       "exif-photometricinterpretation-5": "Atskilt (trolig CMYK)",
+       "exif-photometricinterpretation-9": "CIE L*a*b* (ICC-koding)",
+       "exif-photometricinterpretation-10": "CIE L*a*b* (ITU-koding)",
+       "exif-photometricinterpretation-32803": "Fargefiltertabell",
+       "exif-photometricinterpretation-34892": "Lineær rå",
        "exif-unknowndate": "Ukjent dato",
        "exif-orientation-1": "Normal",
        "exif-orientation-2": "Snudd horisontalt",
        "confirm-unwatch-top": "Fjern denne siden fra overvåkningslisten din?",
        "confirm-rollback-button": "OK",
        "confirm-rollback-top": "Tilbakestill redigeringer på denne siden?",
+       "ellipsis": "…",
+       "percent": "$1&nbsp;%",
        "quotation-marks": "«$1»",
        "imgmultipageprev": "← forrige side",
        "imgmultipagenext": "neste side &rarr;",
        "autoredircomment": "Omdirigerer til [[$1]]",
        "autosumm-new": "Ny side: $1",
        "autosumm-newblank": "Opprettet tom side",
+       "size-bytes": "$1 {{PLURAL:$1|byte}}",
+       "size-pixel": "$1 {{PLURAL:$1|piksel|piksler}}",
        "lag-warn-normal": "Endringer nyere enn $1 {{PLURAL:$1|sekund|sekunder}} vises muligens ikke i denne listen.",
        "lag-warn-high": "På grunn av stor databaseforsinkelse, vil ikke endringer som er nyere enn $1 {{PLURAL:$1|sekund|sekunder}} vises i denne listen.",
        "watchlistedit-normal-title": "Rediger overvåkningsliste",
        "version-entrypoints": "Inngangspunkts-URL-er",
        "version-entrypoints-header-entrypoint": "Inngangspunkt",
        "version-entrypoints-header-url": "URL",
+       "version-entrypoints-articlepath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgArticlePath Artikkelsti]",
+       "version-entrypoints-scriptpath": "[https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgScriptPath Skriptsti]",
        "version-libraries": "Installerte biblioteker",
        "version-libraries-library": "Bibliotek",
        "version-libraries-version": "Versjon",
        "tags-deactivate": "deaktiver",
        "tags-hitcount": "{{PLURAL:$1|én endring|$1 endringer}}",
        "tags-manage-no-permission": "Du har ikke tillatelse til å behandle tagger.",
-       "tags-manage-blocked": "Du kan ikke behandle endringstagger mens du er blokkert.",
+       "tags-manage-blocked": "Du kan ikke behandle endringstagger mens {{GENDER:$1|du}} er blokkert.",
        "tags-create-heading": "Opprett ny tagg",
        "tags-create-explanation": "Som standard vil nyopprettede tagger være tilgjengelige for brukere og roboter.",
        "tags-create-tag-name": "Taggnavn:",
        "tags-deactivate-not-allowed": "Det er ikke mulig å deaktivere taggen «$1».",
        "tags-deactivate-submit": "Deaktiver",
        "tags-apply-no-permission": "Du har ikke tilgang til å legge til merker sammen med dine endringer.",
-       "tags-apply-blocked": "Du kan ikke bruke endringstagger med endringene dine mens du er blokkert.",
+       "tags-apply-blocked": "{{GENDER:$1|Du}} kan ikke bruke endringstagger med endringene dine mens du er blokkert.",
        "tags-apply-not-allowed-one": "Merket «$1» kan ikke legges til manuelt.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Det følgende merket|De følgende merkene}} kan ikke legges til manuelt: $1",
        "tags-update-no-permission": "Du har ikke tilgang til å legge til eller fjerne merker fra individuelle revisjoner eller loggposter.",
-       "tags-update-blocked": "Du kan ikke legge til eller fjerne endringstagger mens du er blokkert.",
+       "tags-update-blocked": "{{GENDER:$1|Du}} kan ikke legge til eller fjerne endringstagger mens du er blokkert.",
        "tags-update-add-not-allowed-one": "Merket «$1» kan ikke legges til manuelt.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Det følgende merket|De følgende merkene}} kan ikke legges til manuelt: $1",
        "tags-update-remove-not-allowed-one": "Merket «$1» kan ikke fjernes.",
        "htmlform-user-not-exists": "<strong>$1</strong> eksisterer ikke.",
        "htmlform-user-not-valid": "<strong>$1</strong> er ikke et gyldig brukernavn.",
        "logentry-delete-delete": "$1 {{GENDER:$2|slettet}} siden $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|slettet}} omdirigeringen $3 ved å overskrive",
        "logentry-delete-restore": "$1 {{GENDER:$2|gjenopprettet}} siden $3",
        "logentry-delete-event": "$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en logghendelse|$5 logghendelser}} på $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|endret}} synligheten av {{PLURAL:$5|en revisjon|$5 revisjoner}} på side $3: $4",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>slått av</strong>)",
        "mediastatistics": "Mediestatistikk",
        "mediastatistics-summary": "Statistikk over opplastede filtyper. Dette inkluderer bare den nyeste versjonen av hver fil. Eldre eller slettede versjoner av filene er eksludert.",
+       "mediastatistics-nfiles": "$1 ($2&nbsp;%)",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte}} ($2; $3 %)",
        "mediastatistics-bytespertype": "Total filstørrelse for denne seksjonen: {{PLURAL:$1|$1 byte}} ($2; $3 %).",
        "mediastatistics-allbytes": "Total filstørrelse for alle filer: {{PLURAL:$1|$1 byte}} ($2).",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "siden eksisterer ikke ennå",
        "mw-widgets-titleinput-description-redirect": "omdiriger til $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Legg til en kategori …",
        "sessionmanager-tie": "Kan ikke kombinere flere forespørselsautentiseringstyper: $1",
        "sessionprovider-generic": "$1 sesjoner",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "informasjons&shy;kapsel-baserte sesjoner",
        "log-action-filter-contentmodel-change": "Endring av innholdsmodell",
        "log-action-filter-contentmodel-new": "Oppretting av side med ikke-standard innholdsmodell",
        "log-action-filter-delete-delete": "Sidesletting",
+       "log-action-filter-delete-delete_redir": "Overskriving av omdirigering",
        "log-action-filter-delete-restore": "Sidegjenoppretting",
        "log-action-filter-delete-event": "Loggsletting",
        "log-action-filter-delete-revision": "Revisjonssletting",
        "usercssispublic": "Merk: CSS-undersidene bør ikke inneholde konfidensielle data siden de kan ses av andre brukere.",
        "restrictionsfield-badip": "Ugyldig IP-adresse eller intervall: $1",
        "restrictionsfield-label": "Tillatte IP-intervaller:",
-       "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk <br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
-       "edit-error-short": "Feil: $1",
-       "edit-error-long": "Feil:\n\n$1"
+       "restrictionsfield-help": "Én IP-adresse eller CIDR-intervall per linje. For å slå på alt, bruk <br /><code>0.0.0.0/0</code><br /><code>::/0</code>"
 }
index 7beefc3..14f05dc 100644 (file)
        "yourpasswordagain": "Opniej invoeren",
        "createacct-yourpasswordagain": "Wachtwoord bevestigen",
        "createacct-yourpasswordagain-ph": "Geef t wachtwoord opniej op",
-       "remembermypassword": "Vanzelf anmelden (hooguut $1 {{PLURAL:$1|dag|dagen}})",
        "userlogin-remembermypassword": "Vanzelf anmelden",
        "userlogin-signwithsecure": "Beveiligde verbiending gebruken",
        "yourdomainname": "Joew domein",
        "passwordreset-emailtext-user": "De gebruker $1 van {{SITENAME}} hef n anvraag edaon um joew wachtwoord veur {{SITENAME}} ($4) opniej in te stellen. \nDe volgende {{PLURAL:$3|gebruker is|gebrukers bin}} ekoppeld an dit netpostadres:\n\n$2\n\n{{PLURAL:$3|Dit tiejelike wachtwoord vervölt|Disse tiejelike wachtwoorden vervallen}} over {{PLURAL:$5|één dag|$5 dagen}}.\nMeld je eigen noen an en wiezig t wachtwoord. A'j dit verzeuk niet zelf edaon hebben, of a'j t oorspronkelike wachtwoord nog kennen en t niet wiezigen willen, negeer dit bericht dan en blief joew ouwe wachtwoord gebruken.",
        "passwordreset-emailelement": "Gebrukersnaam: \n$1\n\nTiedelik wachtwoord: \n$2",
        "passwordreset-emailsentemail": "As dit netpostadres an joew gebrukerskonto ekoppeld is, dan wördt der n netbericht estuurd um joew wachtwoord opniej in te stellen.",
-       "passwordreset-emailsent-capture": "Der is n bericht verstuurd um joew wachtwoord opniej in te stellen. Dit ku'j hieronder lezen.",
-       "passwordreset-emailerror-capture": "Der is n bericht veur t opniej opstellen van joew wachwoord an-emaakt, dit ku'j hieronder lezen. t Versturen naor de {{GENDER:$2|gebruker}} is mislokt um de volgende reden: $1",
        "changeemail": "Netpostadres wiezigen of vorthaolen",
        "changeemail-header": "Vul dit formulier in um joew netpostadres te wiezigen. A'j t netpostadres van disse gebrukerskonto ontkoppelen willen, laot t netpostadres dan leeg a'j t formulier opslaon.",
        "changeemail-no-info": "Je mutten an-emeld ween um drekt toegang te hebben tot disse zied.",
        "undo-norev": "De bewarking kon niet weerummedreid wörden, umdat t niet besteet of vortedaon is.",
        "undo-summary": "Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) weerummedreid",
        "undo-summary-username-hidden": "Versie $1 deur n verbörgen gebruker weerummedreid",
-       "cantcreateaccounttitle": "Anmaken van n gebrukersprofiel is niet meugelik",
        "cantcreateaccount-text": "t Anmaken van gebrukers van dit IP-adres (<b>$1</b>) is eblokkeerd deur [[User:$3|$3]].\n\nDe deur $3 op-egeven reden is ''$2''",
        "viewpagelogs": "Bekiek logboeken veur disse zied",
        "nohistory": "Der bin gien eerdere versies van disse zied.",
        "activeusers-intro": "Dit is n lieste van gebrukers die de aofgeleupen $1 {{PLURAL:$1|dag|dagen}} enigszins aktief ewest hebben.",
        "activeusers-count": "$1 leste {{PLURAL:$1|haandeling|haandelingen}} in de aofeleupen {{PLURAL:$3|dag|$3 dagen}}",
        "activeusers-from": "Laot gebrukers zien vanaof:",
-       "activeusers-hidebots": "Bots verbargen",
-       "activeusers-hidesysops": "Beheerders verbargen",
        "activeusers-noresult": "Gien aktieve gebrukers evunnen.",
        "activeusers-submit": "Bekiek",
        "listgrouprights": "Rechten van gebrukersgroepen",
        "htmlform-no": "Nee",
        "htmlform-yes": "Ja",
        "htmlform-chosen-placeholder": "Kies n opsie",
-       "sqlite-has-fts": "Versie $1 mit ondersteuning veur \"full-text\" zeuken",
-       "sqlite-no-fts": "Versie $1 zonder ondersteuning veur \"full-text\" zeuken",
        "logentry-delete-delete": "$1 hef de zied $3 {{GENDER:$2|vortedaon}}",
        "logentry-delete-restore": "$1 hef de zied $3 {{GENDER:$2|weerummezet}}",
        "logentry-delete-event": "$1 hef de zichtbaorheid van {{PLURAL:$5|n logboekregel|$5 logboekregels}} van $3 {{GENDER:$2|ewiezigd}}: $4",
index 3fc66f5..b99b7eb 100644 (file)
        "userlogin-yourpassword-ph": "Passwoort ingeven",
        "createacct-yourpassword-ph": "Passwoort ingeven",
        "yourpasswordagain": "Passwoort nochmal ingeven",
-       "remembermypassword": "Mit dissen Browser duersam inloggen (för maximal $1 {{PLURAL:$1|Dag|Daag}})",
        "yourdomainname": "Diene Domään:",
        "externaldberror": "Dat geev en Fehler bi de externe Authentifizerungsdatenbank oder du dröffst dien extern Brukerkonto nich ännern.",
        "login": "Anmellen",
        "activeusers-intro": "Dit is en List von Brukers, de {{PLURAL:$1|den verleden Dag|de verleden $1 Daag}} aktiv wesen sünd.",
        "activeusers-count": "$1 {{PLURAL:$1|Ännern|Ännern}} {{PLURAL:$3|den verleden Dag|in de verleden $3 Daag}}",
        "activeusers-from": "Brukers wiesen vanaf:",
-       "activeusers-hidebots": "Bots nich wiesen",
-       "activeusers-hidesysops": "Administraters nich wiesen",
        "activeusers-noresult": "Keen Brukers funnen.",
        "listgrouprights": "Brukergruppen-Rechten",
        "listgrouprights-summary": "Dit is en List vun de Brukergruppen, de in dit Wiki defineert sünd, un de Rechten, de dor mit verbunnen sünd.\nMehr Informatschonen över enkelte Rechten staht ünner [[{{MediaWiki:Listgrouprights-helppage}}]].",
        "htmlform-submit": "Afspiekern",
        "htmlform-reset": "Ännern trüchsetten",
        "htmlform-selectorother-other": "Annere",
-       "sqlite-has-fts": "$1 mit Stöhn för Vulltext-Söök",
-       "sqlite-no-fts": "$1 ahn Stöhn för Vulltext-Söök",
        "logentry-delete-delete": "$1 {{GENDER:$2|wegsmeten}} Siet $3",
        "revdelete-restricted": "Inschränkungen för Administraters instellt",
        "revdelete-unrestricted": "Inschränkungen för Administraters rutnahmen",
index 3babc10..f5f497e 100644 (file)
        "passwordreset-emaildisabled": "इमेल सुविधा यस विकिमा निस्क्रिय बनाइएको छ ।",
        "passwordreset-username": "प्रयोगकर्ता नाम:",
        "passwordreset-domain": "डोमेन",
-       "passwordreset-capture": "निस्कने इमेलको नमुना हेर्ने ?",
-       "passwordreset-capture-help": "यदि तपाईंले यो कोठामा दाग दिनुभयो भनें यो इमेल (अस्थायी पासवर्ड सहित) तपाईंलाई देखा पर्नेछ साथै प्रयोगकर्तालाई पनि पठाइनेछ।",
        "passwordreset-email": "इमेल ठेगाना:",
        "passwordreset-emailtitle": "{{SITENAME}}मा खाता विवरण",
        "passwordreset-emailtext-ip": "कसैले (सायद तपाईंले, $1 आईपि ठेगानाबाट) {{SITENAME}} ($4)मा तपाईंको खाता विवरणको निम्ति एउटा अनुस्मारकको अनुरोध गरेको छ। निम्न प्रयोगकर्ता {{PLURAL:$3|खाता यस इमेल ठेगानासित सम्बन्धित छ|खाताहरू यस इमेल ठेगानासित सम्बन्धित छन्}}:\n\n$2\n\n{{PLURAL:$3|यो अस्थाई पासवर्डको|यी अस्थाई पासवर्डहरुको}} समय {{PLURAL:$5|एक दिन|$5 दिन}}मा सकिनेछ।\nतपाईंले प्रवेश गरेर अहिले नैं नयाँ पासवर्ड छान्नुहोस्। यदि अरु कसैले अनुरोध गरेको भए अथवा यदि तपाईंलाई मूल पासवर्ड याद भए अनि यसलाई परिवर्तन गर्न चाहनुहुन्न भने, तपाईंले यस सन्देशलाई अनदेखा गर्नुहोस् र पुरानै पासवर्डलाई चालू राख्नुहोस्।",
        "saveprefs": "संग्रह",
        "restoreprefs": "सबै पूर्वनिर्धारित स्थिती कायम गर्ने(सबै खण्डहरूमा)",
        "prefs-editing": "सम्पादन",
-       "rows": "हरफहरà¥\81 :",
-       "columns": "सà¥\8dतमà¥\8dभहरà¥\81 :",
+       "rows": "हरफहरà¥\82 :",
+       "columns": "सà¥\8dतमà¥\8dभहरà¥\82 :",
        "searchresultshead": "खोज",
        "stub-threshold": "<a href=\"#\" class=\"stub\">ठूटो</a> को लागि थ्रेसहोल्ड स्वरूपण (बाइट):",
        "stub-threshold-sample-link": "उदाहरण",
        "right-siteadmin": "डेटाबेसको ताल्चामार्ने र ताल्चाखोल्ने",
        "right-override-export-depth": "गहिराइ ५ सम्मको लिंक गरिएका पृष्ठहरू सहित निर्यात गर्ने",
        "right-sendemail": "अन्य प्रयोगकर्ताहरूलाई इमेल पठाउने",
-       "right-passwordreset": "पासवर्ड परिवर्तन गर्ने ईमेलहरु हेर्नुहोस",
        "right-managechangetags": "डाटाबेसबाट [[Special:Tags|tags]] बनाउने र हटाउने",
        "right-applychangetags": "एकको परिवर्तन सहित [[Special:Tags|tags]] लागु गर्ने",
        "right-changetags": "जोड्ने र हटाउने स्वतन्त्र [[Special:Tags|ट्याग]] व्यक्तिगत अवतरणहरू र लग इन्ट्रीहरूमा",
index c86e332..5679677 100644 (file)
@@ -80,7 +80,8 @@
                        "Jdforrester",
                        "Jeleniccz",
                        "MrLeopold",
-                       "Hex"
+                       "Hex",
+                       "Xxmarijnw"
                ]
        },
        "tog-underline": "Koppelingen onderstrepen:",
        "botpasswords-label-delete": "Verwijderen",
        "botpasswords-label-resetpassword": "Het wachtwoord opnieuw instellen",
        "botpasswords-label-grants": "Van toepassing zijnde rechten:",
-       "botpasswords-help-grants": "Iedere toestemming geeft toegang tot de opgegeven gebruikersrechten die de gebruiker al heeft. Zie [[Special:ListGrants|overzicht van rechten]] voor meer informatie.",
+       "botpasswords-help-grants": "Toestemmingen geven toegang tot gebruikersrechten die u al heeft. Het geven van een toestemming op deze plek geeft u geen toegang tot gebruikersrechten die u anders niet zou hebben. Zie het [[Special:ListGrants|overzicht van toestemmingen]] voor meer informatie.",
        "botpasswords-label-grants-column": "Toegewezen",
        "botpasswords-bad-appid": "De botnaam \"$1\" is niet geldig.",
        "botpasswords-insert-failed": "Toevoegen van botnaam \"$1\" mislukt. Is deze misschien al toegevoegd?",
        "passwordreset-emaildisabled": "E-mailmogelijkheden zijn uitgeschakeld op deze wiki.",
        "passwordreset-username": "Gebruikersnaam:",
        "passwordreset-domain": "Domein:",
-       "passwordreset-capture": "De resulterende e-mail bekijken?",
-       "passwordreset-capture-help": "Als u dit vakje aanvinkt, wordt de e-mail (met het tijdelijke wachtwoord) naar de gebruiker verzonden en ook aan u weergegeven.",
        "passwordreset-email": "E-mailadres:",
        "passwordreset-emailtitle": "Accountgegevens op {{SITENAME}}",
        "passwordreset-emailtext-ip": "Iemand, waarschijnlijk u, heeft vanaf het IP-adres $1 een aanvraag gedaan om uw wachtwoord voor {{SITENAME}} ($4) opnieuw in te stellen. De volgende {{PLURAL:$3|gebruiker is|gebruikers zijn}} gekoppeld aan dit e-mailadres:\n\n$2\n\n{{PLURAL:$3|Dit tijdelijke wachtwoord vervalt|Deze tijdelijke wachtwoorden vervallen}} over {{PLURAL:$5|een dag|$5 dagen}}. Meld u aan en wijzig het wachtwoord nu. Als u dit verzoek niet zelf heeft gedaan, of als u het oorspronkelijke wachtwoord nog kent en het niet wilt wijzigen, negeer dit bericht dan en blijf uw oude wachtwoord gebruiken.",
        "passwordreset-emailelement": "Gebruikersnaam: \n$1\n\nTijdelijk wachtwoord: \n$2",
        "passwordreset-emailsentemail": "Als dit e-mailadres aan uw account gekoppeld is, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
        "passwordreset-emailsentusername": "Als er een e-mailadres geregistreerd is voor die gebruikersnaam, dan wordt er een e-mail verzonden om uw wachtwoord opnieuw in te stellen.",
-       "passwordreset-emailsent-capture2": "De wachtwoordherstel-{{PLURAL:$1|e-mail is|e-mails zijn}} verzonden. {{PLURAL:$1|De gebruikersnaam en het wachtwoord worden|De lijst van gebruikersnamen en wachtwoorden wordt}} hier weergegeven.",
-       "passwordreset-emailerror-capture2": "Het e-mailen naar de {{GENDER:$2|gebruiker}} is mislukt: $1 {{PLURAL:$3|De gebruikersnaam en het wachtwoord|De lijst met gebruikersnamen en wachtwoorden}} wordt hieronder weergegeven.",
        "passwordreset-nocaller": "Een aanroeper moet worden opgegeven",
        "passwordreset-nosuchcaller": "Aanroeper bestaat niet: $1",
        "passwordreset-ignored": "Opnieuw instellen van het wachtwoord niet is afgehandeld. Misschien is er geen provider geconfigureerd?",
-       "passwordreset-invalideamil": "Ongeldig e-mailadres",
+       "passwordreset-invalidemail": "Ongeldig e-mailadres",
        "passwordreset-nodata": "Er is geen gebruikersnaam of e-mailadres opgegeven",
        "changeemail": "E-mailadres wijzigen of verwijderen",
        "changeemail-header": "Vul dit formulier in om uw e-mailadres te wijzigen. Als u het e-mailadres wilt ontkoppelen van uw account, laat het e-mailadres dan leeg als u het formulier opslaat.",
        "prefs-help-email": "E-mailadres is optioneel, maar maakt het mogelijk om u uw wachtwoord te e-mailen als u het bent vergeten.",
        "prefs-help-email-others": "U kunt ook anderen in staat stellen per e-mail contact met u op te nemen via een koppeling op uw gebruikers- en overlegpagina zonder dat u uw identiteit prijsgeeft.",
        "prefs-help-email-required": "Hiervoor is een e-mailadres nodig.",
-       "prefs-info": "Basisinformatie",
+       "prefs-info": "Basisgegevens",
        "prefs-i18n": "Taalinstellingen",
        "prefs-signature": "Ondertekening",
        "prefs-dateformat": "Datumopmaak",
        "prefswarning-warning": "U heeft deze wijzigingen gemaakt in uw voorkeuren die nog niet opgeslagen zijn. Wanneer u de pagina verlaat zonder op \"$1\" te klikken worden uw voorkeuren niet bijgewerkt.",
        "prefs-tabs-navigation-hint": "Tip: u kunt de pijltjestoetsen naar links en naar rechts gebruiken om te navigeren tussen de tabbladen in de lijst.",
        "userrights": "Gebruikersrechtenbeheer",
-       "userrights-lookup-user": "Gebruikersgroepen beheren",
+       "userrights-lookup-user": "Een gebruiker selecteren",
        "userrights-user-editname": "Voer een gebruikersnaam in:",
        "editusergroup": "{{GENDER:$1|Gebruikersgroepen}} wijzigen",
        "editinguser": "Bezig met wijzigen van de gebruikersrechten van gebruiker '''[[User:$1|$1]]''' $2",
        "userrights-reason": "Reden:",
        "userrights-no-interwiki": "U hebt geen rechten om gebruikersrechten op andere wiki's te wijzigen.",
        "userrights-nodatabase": "De database $1 bestaat niet of is geen lokale database.",
-       "userrights-nologin": "U moet [[Special:UserLogin|aangemeld]] zijn met een gebruiker met de juiste rechten om gebruikersrechten toe te wijzen.",
-       "userrights-notallowed": "U bent niet gemachtigd om gebruikersrechten toe te voegen of te verwijderen.",
        "userrights-changeable-col": "Groepen die u kunt beheren",
        "userrights-unchangeable-col": "Groepen die u niet kunt beheren",
        "userrights-conflict": "Er is een probleem opgetreden tijdens het instellen van de gebruikersrechten! Controleer en bevestig uw wijzigingen.",
-       "userrights-removed-self": "U hebt uw eigen bevoegdheden ingetrokken. U kunt deze pagina niet langer raadplegen.",
        "group": "Groep:",
        "group-user": "gebruikers",
        "group-autoconfirmed": "autobevestigde gebruikers",
        "right-siteadmin": "De database blokkeren en weer vrijgeven",
        "right-override-export-depth": "Pagina's exporteren inclusief pagina's waarnaar verwezen wordt tot een diepte van vijf",
        "right-sendemail": "E-mail versturen aan andere gebruikers",
-       "right-passwordreset": "E-mails voor wachtwoord opnieuw instellen bekijken",
        "right-managechangetags": "[[Special:Tags|Labels]] aanmaken en (de)activeren",
        "right-applychangetags": "[[Special:Tags|Labels]] aan bewerkingen toewijzen",
        "right-changetags": "Willekeurige [[Special:Tags|labels]] toevoegen aan en verwijderen van versies en logboekregels",
        "apisandbox-continue": "Doorgaan",
        "apisandbox-continue-clear": "Wissen",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} zal [https://www.mediawiki.org/wiki/API:Query#Continuing_queries doorgaan] met het laatste verzoek; {{int:apisandbox-continue-clear}} zal de voortgangsparameters wissen.",
+       "apisandbox-param-limit": "Gebruik <kbd>max</kbd> voor de maximale limiet.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Alle naamruimtes)",
+       "apisandbox-multivalue-all-values": "$1 (Alle waarden)",
        "booksources": "Boekinformatie",
        "booksources-search-legend": "Bronnen en gegevens over een boek zoeken",
        "booksources-search": "Zoeken",
        "booksources-text": "Hieronder staat een lijst met koppelingen naar andere websites die nieuwe of gebruikte boeken verkopen, en die wellicht meer informatie over het boek dat u zoekt hebben:",
        "booksources-invalid-isbn": "Het opgegeven ISBN lijkt niet geldig te zijn.\nControleer of u wellicht een fout hebt gemaakt bij de invoer.",
+       "magiclink-tracking-rfc": "Pagina's die RFC magische koppelingen gebruiken",
+       "magiclink-tracking-rfc-desc": "Deze pagina gebruikt RFC magische koppelingen. Zie [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] over hoe te migreren.",
+       "magiclink-tracking-pmid": "Pagina's die PMID magische koppelingen gebruiken",
+       "magiclink-tracking-pmid-desc": "Deze pagina gebruikt PMID magische koppelingen. Zie [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] over hoe te migreren.",
+       "magiclink-tracking-isbn": "Pagina's die ISBN magische koppelingen gebruiken",
+       "magiclink-tracking-isbn-desc": "Deze pagina gebruikt ISBN magische koppelingen. Zie [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] over hoe te migreren.",
        "specialloguserlabel": "Uitvoerende gebruiker:",
        "speciallogtitlelabel": "Doel (paginanaam of {{ns:user}}:gebruikersnaam voor gebruiker):",
        "log": "Logboeken",
        "activeusers-intro": "Dit is een lijst met gebruikers die enige activiteit hebben laten zien in de afgelopen {{PLURAL:$1|dag|$1 dagen}}.",
        "activeusers-count": "$1 recente {{PLURAL:$1|handeling|handelingen}} in de {{PLURAL:$3|afgelopen dag|laatste $3 dagen}}",
        "activeusers-from": "Gebruikers worden weergegeven vanaf:",
+       "activeusers-groups": "Gebruikers weergeven die horen bij de groepen:",
+       "activeusers-excludegroups": "Gebruikers uitsluiten die behoren tot de groepen:",
        "activeusers-noresult": "Geen actieve gebruikers gevonden.",
        "activeusers-submit": "Weergeven",
        "listgrouprights": "Rechten van gebruikersgroepen",
        "rollbacklinkcount-morethan": "Meer dan {{PLURAL:$1|één bewerking|$1 bewerkingen}} terugdraaien",
        "rollbackfailed": "Ongedaan maken van wijzigingen mislukt.",
        "rollback-missingparam": "Er ontbreken benodigde parameters in het verzoek.",
+       "rollback-missingrevision": "Laden van versiegegevens mislukt.",
        "cantrollback": "Ongedaan maken van wijzigingen onmogelijk: deze pagina heeft slechts 1 auteur.",
        "alreadyrolled": "Het is niet mogelijk om de bewerking van de pagina [[:$1]] door [[User:$2|$2]] ([[User talk:$2|overleg]]{{int:pipe-separator}}[[Special:Contributions/$2|bijdragen]]) ongedaan te maken.\nIemand anders heeft deze pagina al bewerkt of hersteld naar een eerdere versie.\n\nDe meest recente bewerking is gemaakt door [[User:$3|$3]] ([[User talk:$3|overleg]]{{int:pipe-separator}}[[Special:Contributions/$3|bijdragen]]).",
        "editcomment": "De bewerkingssamenvatting was: <em>$1</em>.",
        "revertpage": "Wijzigingen door [[Special:Contributions/$2|$2]] ([[User talk:$2|Overleg]]) hersteld tot de laatste versie door [[User:$1|$1]]",
        "revertpage-nouser": "Wijzigingen door een verborgen gebruiker teruggedraaid naar de laatste versie door {{GENDER:$1|[[User:$1|$1]]}}",
        "rollback-success": "De wijzigingen door $1 zijn teruggedraaid.\nDe laatste versie van $2 is hersteld.",
+       "rollback-success-notify": "De wijzigingen door $1 zijn teruggedraaid;\nde laatste versie van $2 is hersteld. [$3 Wijzigingen weergeven]",
        "sessionfailure-title": "Sessiefout",
        "sessionfailure": "Er lijkt een probleem te zijn met uw aanmeldsessie.\nUw handeling is gestopt uit voorzorg tegen een beveiligingsrisico (dat bestaat uit mogelijke \"hijacking\" van deze sessie).\nGa een pagina terug, laad die pagina opnieuw en probeer het nog eens.",
        "changecontentmodel": "Inhoudsmodel van pagina bewerken",
        "changecontentmodel-success-text": "Het inhoudstype van [[:$1]] is gewijzigd.",
        "changecontentmodel-cannot-convert": "De inhoud van [[:$1]] kan niet worden omgezet in een type van $2.",
        "changecontentmodel-nodirectediting": "Het inhoudsmodel $1 ondersteunt direct bewerken niet",
+       "changecontentmodel-emptymodels-title": "Geen inhoudsmodellen beschikbaar",
+       "changecontentmodel-emptymodels-text": "De inhoud van [[:$1]] kan niet worden omgezet in een ander type.",
        "log-name-contentmodel": "Wijzigingenlogboek van inhoudsmodel",
        "log-description-contentmodel": "Gebeurtenissen rond het inhoudsmodel van een pagina",
+       "logentry-contentmodel-new": "$1 {{GENDER:$2|maakte}} de pagina $3 aan met behulp van een niet-standaard inhoudsmodel \"$5\"",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|heeft}} het inhoudsmodel gewijzigd van pagina $3 van \"$4\" in \"$5\"",
        "logentry-contentmodel-change-revertlink": "terugdraaien",
        "logentry-contentmodel-change-revert": "terugdraaien",
        "modifiedarticleprotection": "heeft het beveiligingsniveau gewijzigd voor \"[[$1]]\"",
        "unprotectedarticle": "heeft de beveiliging van \"[[$1]]\" opgeheven",
        "movedarticleprotection": "heeft beveiligingsinstellingen verplaatst van \"[[$2]]\" naar \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Beveiligde}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Heeft het beveiligingsniveau voor \"[[$1]]\" gewijzigd}}",
+       "unprotectedarticle-comment": "{{GENDER:$2|Heeft de beveiliging van \"[[$1]]\" opgeheven}}",
        "protect-title": "Beveiligingsniveau instellen voor \"$1\"",
        "protect-title-notallowed": "Beveiligingsniveau voor \"$1\" bekijken",
        "prot_1movedto2": "[[$1]] is hernoemd naar [[$2]]",
        "undeletehistorynoadmin": "Deze pagina is verwijderd.\nDe reden hiervoor staat hieronder, samen met de details van de gebruikers die deze pagina hebben bewerkt vóór de verwijdering.\nDe verwijderde inhoud van de pagina is alleen zichtbaar voor beheerders.",
        "undelete-revision": "Dit is de verwijderde versie van $1 van $4 om $5 gemaakt door $3:",
        "undeleterevision-missing": "Ongeldige of missende versie.\nMogelijk hebt u een verkeerde koppeling of is de versie hersteld of verwijderd uit het archief.",
+       "undeleterevision-duplicate-revid": "{{PLURAL:$1|Eén versie kon|$1 versies konden}} niet worden hersteld, omdat {{PLURAL:$1|haar|hun}} <code>rev_id</code> al in gebruik was.",
        "undelete-nodiff": "Geen eerdere versie gevonden.",
        "undeletebtn": "Terugplaatsen",
        "undeletelink": "bekijken/terugplaatsen",
        "sp-contributions-newbies-sub": "Voor nieuwelingen",
        "sp-contributions-newbies-title": "Bijdragen van nieuwe gebruikers",
        "sp-contributions-blocklog": "blokkeerlogboek",
-       "sp-contributions-suppresslog": "onderdrukte gebruikersbijdragen",
+       "sp-contributions-suppresslog": "onderdrukte {{GENDER:$1|gebruikersbijdragen}}",
        "sp-contributions-deleted": "verwijderde {{GENDER:$1|gebruiker}}sbijdragen",
        "sp-contributions-uploads": "uploads",
        "sp-contributions-logs": "logboeken",
        "whatlinkshere-hideredirs": "doorverwijzingen $1",
        "whatlinkshere-hidetrans": "Transclusies $1",
        "whatlinkshere-hidelinks": "koppelingen $1",
-       "whatlinkshere-hideimages": "Bestandskoppelingen $1",
+       "whatlinkshere-hideimages": "$1 bestandskoppelingen",
        "whatlinkshere-filters": "Filters",
        "whatlinkshere-submit": "OK",
        "autoblockid": "Automatische blokkade #$1",
        "lockdbsuccesstext": "De database is afgesloten.<br />\nVergeet niet de [[Special:UnlockDB|database vrij te geven]] zodra u klaar bent met uw onderhoud.",
        "unlockdbsuccesstext": "De database is vrijgegeven.",
        "lockfilenotwritable": "Geen schrijfrechten op het databaselockbestand.\nOm de database te kunnen blokkeren of vrij te geven, dient de webserver schrijfrechten op dit bestand te hebben.",
-       "databasenotlocked": "De database is niet geblokkeerd.",
+       "databaselocked": "De database is al vergrendeld.",
+       "databasenotlocked": "De database is niet vergrendeld.",
        "lockedbyandtime": "(door $1 om $3 op $2)",
        "move-page": "\"$1\" hernoemen",
        "move-page-legend": "Pagina hernoemen",
        "patrol-log-header": "Dit logboek bevat versies die gemarkeerd zijn als gecontroleerd.",
        "log-show-hide-patrol": "markeerlogboek $1",
        "log-show-hide-tag": "labellogboek $1",
+       "confirm-markpatrolled-button": "OK",
        "deletedrevision": "De oude versie $1 is verwijderd",
        "filedeleteerror-short": "Fout bij het verwijderen van bestand: $1",
        "filedeleteerror-long": "Er zijn fouten opgetreden bij het verwijderen van het bestand:\n\n$1",
        "confirmemail_body_set": "Iemand, waarschijnlijk u, met het IP-adres $1,\nheeft het e-mailadres voor gebruiker \"$2\" op {{SITENAME}} ingesteld op dit e-mailadres.\n\nOpen de volgende koppeling in uw webbrowser om te bevestigen dat u deze gebruiker bent en om de e-mailmogelijkheden op {{SITENAME}} opnieuw te activeren:\n\n$3\n\nAls deze gebruiker *niet* aan u toebehoort, klik dan op de volgende koppeling om de bevestiging van uw e-mailadres te annuleren:\n\n$5\n\nDe bevestigingscode vervalt op $4.",
        "confirmemail_invalidated": "De e-mailbevestiging is geannuleerd",
        "invalidateemail": "E-mailbevestiging annuleren",
+       "notificationemail_body_removed": "Iemand, waarschijnlijk u, met het IP-adres $1, heeft het e-mailadres geregistreerd voor gebruiker \"$2\" verwijderd op {{SITENAME}}. \n\nAls u dit niet was, neem dan onmiddellijk contact op met een sitebeheerder.",
        "scarytranscludedisabled": "[Interwiki-invoeging van sjablonen is uitgeschakeld]",
        "scarytranscludefailed": "[De sjabloon $1 kon niet opgehaald worden]",
        "scarytranscludefailed-httpstatus": "[De sjabloon $1 kon niet opgehaald worden: HTTP $2]",
        "tags-actions-header": "Acties",
        "tags-active-yes": "Ja",
        "tags-active-no": "Nee",
-       "tags-source-extension": "Door een uitbreiding toegevoegd",
+       "tags-source-extension": "Gedefinieerd door de software",
        "tags-source-manual": "Handmatig toegevoegd door gebruikers en bots",
        "tags-source-none": "Niet meer in gebruik",
        "tags-edit": "bewerken",
        "tags-deactivate": "deactiveren",
        "tags-hitcount": "$1 {{PLURAL:$1|wijziging|wijzigingen}}",
        "tags-manage-no-permission": "U hebt geen rechten om labels te beheren.",
-       "tags-manage-blocked": "U kunt geen labels beheren wanneer u geblokkeerd bent.",
+       "tags-manage-blocked": "U kunt geen labels beheren wanneer {{GENDER:$1|u}} geblokkeerd bent.",
        "tags-create-heading": "Een nieuw label aanmaken",
        "tags-create-explanation": "Standaard worden nieuw aangemaakte labels beschikbaar gesteld voor gebruik door gebruikers en bots.",
        "tags-create-tag-name": "Labelnaam:",
        "tags-deactivate-not-allowed": "Het is niet mogelijk het label \"$1\" te deactiveren.",
        "tags-deactivate-submit": "Deactiveren",
        "tags-apply-no-permission": "U hebt geen rechten om wijzigingslabels toe te voegen aan uw wijzigingen.",
-       "tags-apply-blocked": "U kunt geen wijzigen aanbrengen aan labels wanneer u geblokkeerd bent.",
+       "tags-apply-blocked": "U kunt geen labels toevoegen aan uw wijzigingen wanneer {{GENDER:$1|u}} geblokkeerd bent.",
        "tags-apply-not-allowed-one": "Het label \"$1\" mag niet handmatig toegevoegd worden.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Het volgende label mag|De volgende labels mogen}} niet handmatig toegevoegd worden: $1",
        "tags-update-no-permission": "U hebt geen rechten om wijzigingslabels toe te voegen aan of te verwijderen van versies of logboekregels.",
-       "tags-update-blocked": "U kunt geen labels toevoegen of verwijderen wanneer u geblokkeerd bent.",
+       "tags-update-blocked": "U kunt geen labels toevoegen of verwijderen wanneer {{GENDER:$1|u}} geblokkeerd bent.",
        "tags-update-add-not-allowed-one": "Het label \"$1\" mag niet handmatig toegevoegd worden.",
        "tags-update-add-not-allowed-multi": " {{PLURAL:$2|Het label kan|De labels kunnen}} niet handmatig toegevoegd worden: $1",
        "tags-update-remove-not-allowed-one": "Het label \"$1\" mag niet verwijderd worden.",
        "log-action-filter-patrol": "Soort markering:",
        "log-action-filter-protect": "Soort beveiliging:",
        "log-action-filter-rights": "Soort verandering van rechten:",
+       "log-action-filter-suppress": "Soort verberging:",
        "log-action-filter-upload": "Soort upload:",
        "log-action-filter-all": "Alles",
        "log-action-filter-block-block": "Blokkade",
        "log-action-filter-suppress-event": "Verbergen van logboekregel",
        "log-action-filter-suppress-revision": "Verbergen van versie",
        "log-action-filter-suppress-delete": "Verbergen van pagina",
+       "log-action-filter-suppress-block": "Verbergen van gebruiker tijdens blokkade",
+       "log-action-filter-suppress-reblock": "Verbergen van gebruiker tijdens wijzigen blokkade",
        "log-action-filter-upload-upload": "Nieuwe upload",
        "log-action-filter-upload-overwrite": "Herupload",
        "authmanager-authn-autocreate-failed": "Het automatisch aanmaken van een lokaal account is mislukt: $1",
index 66b151e..4142ed8 100644 (file)
        "views": "Visningar",
        "toolbox": "Verktøy",
        "tool-link-userrights": "Endra {{GENDER:$1|brukargrupper}}",
+       "tool-link-userrights-readonly": "Syn {{GENDER:$1|brukar}}grupper",
        "tool-link-emailuser": "Send e-post til {{GENDER:$1|brukaren}}",
        "userpage": "Vis brukarside",
        "projectpage": "Sjå prosjektsida",
        "actionthrottled": "Handlinga vart stoppa",
        "actionthrottledtext": "For å hindre spamming kan du ikkje utføre denne handlinga for mange gonger på kort tid. Ver venleg og prøv igjen litt seinare.",
        "protectedpagetext": "Sida har vorte verna for å hindra endring eller andre handlingar.",
-       "viewsourcetext": "Du kan sjå og kopiere kjeldekoden til denne sida:",
-       "viewyourtext": "Du kan sjå og kopiera kjelda til '''endringane dine''' på sida:",
+       "viewsourcetext": "Du kan sjå og kopiere kjeldekoden til denne sida.",
+       "viewyourtext": "Du kan sjå og kopiera kjelda til <strong>endringane dine</strong> på sida.",
        "protectedinterface": "Denne sida inneheld tekst nytta av brukargrensesnittet for programvara på wikien, og er låst for å hindra hærverk.\nFor å leggja til eller endra omsetjingar for alle wikiar, gjer vel å nytta [https://translatewiki.net/wiki/Main_Page?setlang=nn translatewiki.net], prosjektet for lokalisering av MediaWiki.",
        "editinginterface": "'''Åtvaring:''' Du endrar på ei side som inneheld tekst nytta av brukargrensesnittet for programvara.\nEndringar på denne sida påverkar utsjånaden til brukargrensesnittet for dei andre brukarane av wikien.\nFor å leggja til eller endra omsetjingar, gjer vel å nytta [https://translatewiki.net/wiki/Main_Page?setlang=nn translatewiki.net], prosjektet for lokalisering av MediaWiki.",
        "cascadeprotected": "Denne sida er verna mot endring fordi ho er inkludert i {{PLURAL:$1|den opplista sida|dei opplista sidene}} som har djupvern slått på:\n$2",
        "passwordreset-emaildisabled": "E-postfunksjonen er slegen av på wikien.",
        "passwordreset-username": "Brukarnamn:",
        "passwordreset-domain": "Domene:",
-       "passwordreset-capture": "Vis resulterande epost",
-       "passwordreset-capture-help": "Huk av her dersom du vil sjå eposten (med førebels passord) i tillegg til at han blir sendt til brukaren.",
        "passwordreset-email": "↓E-postadresse:",
        "passwordreset-emailtitle": "↓Kontodetaljar på {{SITENAME}}",
        "passwordreset-emailtext-ip": "Nokon (sannsynlegvis deg, frå IP-adressa $1) bad om ei påminning for kontodetaljane dine for {{SITENAME}} ($4). {{PLURAL:$3|Den fylgjande brukarkontoen|Dei fylgjande brukarkontoane}} er assosierte med denne e-postadressa:\n\n$2\n\n{{PLURAL:$3|Dette mellombels passordet|Desse mellombels passorda}} vil verta ugilde om {{PLURAL:$5|éin dag|$5 dagar}}.\nDu bør logga inn og velja eit nytt passord no. Om nokon andre enn deg bad om denne påminninga, eller du har kome i hug det opphavlege passordet og ikkje lenger ynskjer å endra det, kan du sjå bort frå denne meldinga og halda fram med å nytta det gamle passordet ditt.",
        "userrights-reason": "Årsak:",
        "userrights-no-interwiki": "Du har ikkje tilgang til å endre brukartilgangar på andre wikiar.",
        "userrights-nodatabase": "Databasen $1 finst ikkje eller er ikkje lokal.",
-       "userrights-nologin": "Du må [[Special:UserLogin|logge inn]] med ein administrator- og/eller byråkratkonto for å endre brukartilgangar.",
-       "userrights-notallowed": "Du har ikkje løyve til å leggja til eller fjerna brukarrettar.",
        "userrights-changeable-col": "Grupper du kan endre",
        "userrights-unchangeable-col": "Grupper du ikkje kan endre",
        "group": "Gruppe:",
        "right-siteadmin": "Låse og låse opp databasen",
        "right-override-export-depth": "Eksporter sider inkludert lenkte sider til ei djupn på 5",
        "right-sendemail": "Senda e-post til andre brukarar",
-       "right-passwordreset": "Sjå e-postar for passord som er stilte attende",
        "newuserlogpage": "Brukaropprettingslogg",
        "newuserlogpagetext": "Dette er ein logg over oppretta brukarkontoar.",
        "rightslog": "Brukartilgangslogg",
index 8c42878..bdc8b77 100644 (file)
        "yourpasswordagain": "Пароль ногæй бафысс:",
        "createacct-yourpasswordagain": "Сбæлвырд кæн пароль",
        "createacct-yourpasswordagain-ph": "Пароль ногæй бафысс",
-       "remembermypassword": "Бахъуыды мæ кæнæд ацы браузеры (максимум $1 {{PLURAL:$1|бонмæ}})",
        "userlogin-remembermypassword": "Системæйы мæ дар",
        "userlogin-signwithsecure": "Æдас бастдзинадæй",
        "yourdomainname": "Дæ домен:",
        "passwordreset-emailtext-user": "{{grammar:genitive|{{SITENAME}}}} архайæг $1 æрдомдта дæ {{grammar:genitive|{{SITENAME}}}} ($4) аккаунты пароль ногæй сæвæрын. Ацы архайæджы {{PLURAL:$3|аккаунт баст у|аккаунттæ баст сты}} ацы электрон посты адрисимæ:\n\n$2\n\n{{PLURAL:$3|Ацы рæстæгмæ пароль|Ацы рæстæгмæ паролтæ}} кусдзысты {{PLURAL:$5|иу бон|$5 боны}}.\nНыр ды хъуамæ бахизай системæмæ æмæ равзарай ног пароль. Кæд ай æндæр чидæр æрдомдта, кæнæ кæд дæ пароль æрхъуыды кодтай æмæ дæ нал фæды фæивай йæ, уæд дæ бон у мацæмæ дарай ацы фыстæг æмæ дарддæр архайай дæ зæронд паролæй.",
        "passwordreset-emailelement": "Фæсномыг: \n$1\n\nРæстæгмæ пароль: \n$2",
        "passwordreset-emailsentemail": "Ног пароль сæвæрыны фыстæг æрвыст æрцыд.",
-       "passwordreset-emailsent-capture": "Ног пароль сæвæрыны фыстæг æрвыст æрцыд æмæ бындæр æвдыст у.",
-       "passwordreset-emailerror-capture": "Ног пароль сæвæрыны фыстæг арæзт æрцыд æмæ бындæр æвдыст у. Фæлæ йæ {{grammar:allative|{{GENDER:$2|user}}}} арвитын нæ бантыстис: $1",
        "changeemail": "E-mail адрис фæивын",
        "changeemail-header": "Аккаунты e-mail адрис фæивын",
        "changeemail-no-info": "Ды хъуамæ системæмæ хызт уай, цæмæй ацы фарсмæ комкоммæ бавналай.",
        "post-expand-template-argument-warning": "'''Сындæг:''' Ацы фарсы ис уæддæр иу хуызæджы аргумент, кæй райтынг у æгæр стыр.\nУыцы аргументтæ уагъд æрцыдысты.",
        "post-expand-template-argument-category": "Фæрстæ, кæдоны ис хуызæджы уагъд аргумент",
        "parser-template-loop-warning": "Хуызæгты цасм ссардæуыд: [[$1]]",
-       "cantcreateaccounttitle": "Аккаунт саразæн нæй",
        "viewpagelogs": "Ацы фарсæн йæ логтæ равдисын",
        "nohistory": "Ацы фарсæн ивдтыты истори нæй.",
        "currentrev": "Фæстаг фæлтæр",
        "listusers-noresult": "Иу архайæг дæр не ссардæуыд.",
        "listusers-blocked": "(хъодыгонд)",
        "activeusers": "Активон архайджыты номхыгъд",
-       "activeusers-hidebots": "Боттæ бамбæхс",
-       "activeusers-hidesysops": "Радгæсты бамбæхс",
        "activeusers-noresult": "Иу архайæг дæр не ссардæуыд.",
        "listgrouprights": "Къордты архайджыты бартæ",
        "listgrouprights-group": "Къорд",
        "feedback-back": "Фæстæмæ",
        "feedback-cancel": "Ныууадзын",
        "feedback-close": "Æххæст",
-       "feedback-error-title": "Рæдыд",
        "feedback-error1": "Рæдыд: Æнæзонгæ фæстиуæг API-йæ",
        "feedback-error2": "Рæдыд: Ивд нæ фæрæстмæ",
        "feedback-error3": "Рæдыд: API дзуапп нæ дæтты",
index 829bb0e..0156bdb 100644 (file)
        "yourpasswordagain": "ਪਾਸਵਰਡ ਮੁੜ ਲਿਖੋ:",
        "createacct-yourpasswordagain": "ਪਾਸਵਰਡ ਪੁਸ਼ਟੀ",
        "createacct-yourpasswordagain-ph": "ਪਾਸਵਰਡ ਫੇਰ ਦਿਉ",
-       "remembermypassword": "ਇਸ ਕੰਪਿਊਟਰ ’ਤੇ ਮੇਰਾ ਦਾਖ਼ਲਾ ਯਾਦ ਰੱਖੋ (ਵੱਧ ਤੋਂ ਵੱਧ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਲਈ)",
        "userlogin-remembermypassword": "ਮੈਨੂੰ ਲਾਗਇਨ ਰੱਖੋ",
        "userlogin-signwithsecure": "ਸੁਰੱਖਿਅਤ ਕੁਨੈਕਸ਼ਨ ਰੱਖੋ",
        "yourdomainname": "ਤੁਹਾਡਾ ਡੋਮੇਨ:",
        "passwordreset-emailtext-user": "{{SITENAME}} 'ਤੇ User $1 ਨੇ ਤੁਹਾਡੇ {{SITENAME}} ($4) ਉਤਲੇ ਪਛਾਣ-ਸ਼ਬਦ ਨੂੰ ਮੁੜ-ਬਣਾਉਣ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਹੈ। ਇਸ ਈਮੇਲ ਪਤੇ ਨਾਲ਼ ਹੇਠ ਲਿਖੇ {{PLURAL:$3|ਖਾਤੇ|ਖਾਤਿਆਂ}} ਦਾ ਵਾਸਤਾ ਹੈ:\n\n$2\n\n{{PLURAL:$3|ਇਸ ਆਰਜ਼ੀ ਪਛਾਣ-ਸ਼ਬਦ|ਇਹਨਾਂ ਆਰਜ਼ੀ ਪਛਾਣ-ਸ਼ਬਦਾਂ}} ਦੀ ਮਿਆਦ {{PLURAL:$5|ਇੱਕ ਦਿਨ|$5 ਦਿਨਾਂ}} 'ਚ ਮੁੱਕ ਜਾਵੇਗੀ।\nਤੁਹਾਨੂੰ ਹੁਣੇ ਦਾਖ਼ਲ ਹੋ ਕੇ ਕੋਈ ਨਵਾਂ ਪਛਾਣ-ਸ਼ਬਦ ਬਣਾ ਲੈਣਾ ਚਾਹੀਦਾ ਹੈ। ਜੇਕਰ ਕਿਸੇ ਹੋਰ ਨੇ ਇਹ ਬੇਨਤੀ ਕੀਤੀ ਹੈ ਜਾਂ ਤੁਹਾਨੂੰ ਆਪਣਾ ਪਹਿਲਾ ਪਛਾਣ-ਸ਼ਬਦ ਯਾਦ ਆ ਗਿਆ ਹੈ ਅਤੇ ਹੁਣ ਤੁਸੀਂ ਉਹਨੂੰ ਬਦਲ਼ਨਾ ਨਹੀਂ ਲੋਚਦੇ ਤਾਂ ਤੁਸੀਂ ਇਸ ਸੁਨੇਹੇ ਨੂੰ ਅਣਡਿੱਠਾ ਕਰ ਕੇ ਆਪਣਾ ਪੁਰਾਣਾ ਪਛਾਣ-ਸ਼ਬਦ ਵਰਤਦੇ ਰਹਿ ਸਕਦੇ ਹੋ।",
        "passwordreset-emailelement": "ਯੂਜ਼ਰ-ਨਾਂ: \n$1\n\nਆਰਜ਼ੀ ਪਾਸਵਰਡ: \n$2",
        "passwordreset-emailsentemail": "ਇੱਕ ਪਾਸਵਰਡ ਮੁੜ-ਸੈੱਟ ਈ-ਮੇਲ ਭੇਜੀ ਜਾ ਚੁੱਕੀ ਹੈ।",
-       "passwordreset-invalideamil": "ਗ਼ਲਤ ਈਮੇਲ ਪਤਾ",
+       "passwordreset-invalidemail": "ਗ਼ਲਤ ਈਮੇਲ ਪਤਾ",
        "changeemail": "ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ ਬਦਲੋ ਜਾੰ ਹਟਾਓ",
        "changeemail-header": "ਖਾਤੇ ਵਾਲਾ ਈ-ਮੇਲ ਸਿਰਨਾਵਾਂ ਬਦਲੋ",
        "changeemail-no-info": "ਇਸ ਸਫ਼ੇ ਨੂੰ ਸਿੱਧੇ ਹੀ ਵੇਖਣ ਲਈ ਤੁਹਾਨੂੰ ਲਾਗਇਨ ਕਰਨਾ ਪਵੇਗਾ।",
        "activeusers-intro": "ਇਹ ਓਹਨਾਂ ਮੈਂਬਰਾਂ ਦੀ ਲਿਸਟ ਹੈ ਜਿੰਨ੍ਹਾਂ ਨੇ ਆਖ਼ਰੀ $1 {{PLURAL:$1|ਦਿਨ|ਦਿਨਾਂ}} ਵਿਚ ਕਿਸੇ ਤਰ੍ਹਾਂ ਦਾ ਕੋਈ ਕੰਮ ਕੀਤਾ ਹੈ।",
        "activeusers-count": "ਆਖ਼ਰੀ {{PLURAL:$3|ਦਿਨ|$3 ਦਿਨਾਂ}} ਵਿਚ $1 {{PLURAL:$1|ਸੋਧ|ਸੋਧਾਂ}}",
        "activeusers-from": "ਇਸਤੋਂ ਸ਼ੁਰੂ ਹੋਣ ਵਾਲ਼ੇ ਮੈਂਬਰ ਵਖਾਓ:",
-       "activeusers-hidebots": "ਬੌਟਾਂ ਨੂੰ ਲੁਕਾਓ",
-       "activeusers-hidesysops": "ਪ੍ਰਸ਼ਾਸਕ ਲੁਕਾਓ",
        "activeusers-noresult": "ਕੋਈ ਵਰਤੋਂਕਾਰ ਨਹੀਂ ਲੱਭਾ।",
        "activeusers-submit": "ਚਾਲੂ ਵਰਤੋਂਕਾਰ ਦਿਖਾਓ",
        "listgrouprights": "ਵਰਤੋਂਕਾਰ ਸਮੂਹਾਂ ਦੇ ਹੱਕ",
        "feedback-bugnew": "ਮੈਂ ਚੈੱਕ ਕੀਤਾ। ਇੱਕ ਨਵੇਂ ਦੋਸ਼ ਦੀ ਰਿਪੋਰਟ ਕਰੋ",
        "feedback-cancel": "ਰੱਦ ਕਰੋ",
        "feedback-close": "ਹੋ ਗਿਆ",
-       "feedback-error-title": "ਗ਼ਲਤੀ",
        "feedback-error2": "ਦੋਸ਼:ਸੋਧ ਫੇਲ੍ਹ ਹੋਈ",
        "feedback-error3": "ਦੋਸ਼:API ਵੱਲੋਂ ਕੋਈ ਜੁਆਬ ਨਹੀਂ",
        "feedback-message": "ਸੁਨੇਹਾ:",
index a2de392..95af027 100644 (file)
        "yourname": "Lagyung talagamit (Username):",
        "yourpassword": "Kekang password:",
        "yourpasswordagain": "Pakisulat meng pasibayu ing password:",
-       "remembermypassword": "Tandanan me ing login ku king computer a ini (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "yourdomainname": "Ing kekang karinan (domain):",
        "externaldberror": "Mapalyaring mika pamagkamali king external authentication (pamagpatutung panlual) ning database, o ala kang paintulut a i-update ya ing kekang account a panlual (external account).",
        "login": "Mag log in",
        "undo-failure": "E maliaring iurung ing edit a ini uling e la mipapareu deng minunang me-edit.",
        "undo-norev": "E maliaring iurung ing edit a ini uling ala yu o mebura ya.",
        "undo-summary": "Iurung ya ing miyalilan $1 nang [[Special:Contributions/$2|$2]] ([[User talk:$2|Talk]])",
-       "cantcreateaccounttitle": "E makalalang account",
        "cantcreateaccount-text": "Sebat neng [[User:$3|$3]] ing pamaglalang account manibat kaniting IP address ('''$1''').\n\nIni ing sangkan a binie nang $3: ''$2''",
        "viewpagelogs": "Lon la reng log para king bulung a ini",
        "nohistory": "Alang amlat ning pamag-edit (edit history) para king bulung a ini.",
        "rightsnone": "(ala)",
        "revdelete-summary": "sampulung da reng mibayu (edit summary)",
        "feedback-back": "Mibalik",
-       "feedback-error-title": "Mali",
        "feedback-submit": "I-sumiti",
        "feedback-thanks-title": "Salamat pu!",
        "headline-anchor-title": "Ing suglung king seksyun a ini",
index 4a376c8..d96cf90 100644 (file)
        "yourname": "nom d'uzeu:",
        "yourpassword": "Mot d'passe:",
        "yourpasswordagain": "Intrer à nouvieu ch'mot d'passe:",
-       "remembermypassword": "Intrer oùtonmatiquemint l'prochaine fouos (pour un maximum éd $1 {{PLURAL:$1|jour|jours}})",
        "yourdomainname": "Vote donmène:",
        "login": "Intrer",
        "nav-login-createaccount": "Intrer / créer vote conpte",
index 608b0d1..74d9bb6 100644 (file)
        "linksearch-ok": "Uffgucke",
        "listusers-submit": "Zeig",
        "listusers-noresult": "Ken Yuuser gfunne.",
-       "activeusers-hidebots": "Waddefresser verschwinne losse",
-       "activeusers-hidesysops": "Verwalter verschwinne losse",
        "listgrouprights": "Rechte vun Yuuser-Druppe",
        "listgrouprights-group": "Druppe",
        "listgrouprights-rights": "Rechte",
index 5c0ab95..8722398 100644 (file)
        "yourpasswordagain": "Kennword nomol oigewe:",
        "createacct-yourpasswordagain": "Password bschdedische",
        "createacct-yourpasswordagain-ph": "Bschdedisch doi Password",
-       "remembermypassword": "Moi Kennword uffm Brausa merge (hegschdns fa $1 {{PLURAL:$1|Daach|Daach}})",
        "userlogin-remembermypassword": "Oagmeld blaiwe",
        "login": "Oamelde",
        "nav-login-createaccount": "Oamelde / Kondo oaleesche",
        "post-expand-template-argument-warning": "'''Baßma uff:''' Die Said hodd wenigschdns ä Vorlach midä Kenngreeß, wu groß werre dud. Die Kenngreeß wead do nedd õgeguggd.",
        "post-expand-template-argument-category": "Saide, wu wegfallene Vorlachewead hawen.",
        "undo-nochange": "Die Ännarung isch schunmol rigg'gängisch g'machd worre.",
-       "cantcreateaccounttitle": "Konn kä Kondo mache",
        "viewpagelogs": "Lochbischa fa die Said oagugge",
        "nohistory": "Vunde Said hodds kä Gschischd.",
        "currentrev": "Ledschdi Änarung",
index ece57c4..d3f89d6 100644 (file)
        "views": "Widok",
        "toolbox": "Narzędzia",
        "tool-link-userrights": "Zmiana grup {{GENDER:$1|użytkownika|użytkowniczki}}",
+       "tool-link-userrights-readonly": "Zobacz grupy {{GENDER:$1|użytkownika|użytkowniczki}}",
        "tool-link-emailuser": "Wyślij e-mail do {{GENDER:$1|tego użytkownika|tej użytkowniczki}}",
        "userpage": "Pokaż stronę użytkownika",
        "projectpage": "Pokaż stronę projektu",
        "passwordreset-emaildisabled": "Wysyłanie emaili zostało wyłączone na tej wiki",
        "passwordreset-username": "Nazwa użytkownika:",
        "passwordreset-domain": "Domena:",
-       "passwordreset-capture": "Czy pokazywać treść wiadomości e‐mail?",
-       "passwordreset-capture-help": "Jeśli zaznaczysz to pole, zobaczysz treść wiadomości e‐mail z tymczasowym hasłem, w tej samej formie w jakiej jest wysyłana do użytkownika.",
        "passwordreset-email": "Adres e‐mail:",
        "passwordreset-emailtitle": "Dane konta w {{GRAMMAR:MS.lp|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Ktoś (prawdopodobnie Ty, spod adresu IP $1) poprosił o zresetowanie twojego hasła w {{GRAMMAR:MS.lp{{SITENAME}}}} ($4). Z tym adresem e‐mailowym powiązane {{PLURAL:$3|jest konto użytkownika|są następujące konta użytkowników:}}\n\n$2\n\n{{PLURAL:$3|Tymczasowego hasła|Tymczasowych haseł}} można użyć w ciągu {{PLURAL:$5|jednego dnia|$5 dni}}.\nPowinieneś zalogować się i zmienić hasło na nowe. Jeśli to ktoś inny poprosił o wysłanie przypomnienia lub jeśli pamiętasz aktualne hasło i nie chcesz go zmieniać wystarczy, że zignorujesz tę wiadomość i będziesz nadal korzystać ze swojego starego hasła.",
        "passwordreset-emailelement": "Nazwa użytkownika: \n$1\n\nTymczasowe hasło: \n$2",
        "passwordreset-emailsentemail": "Jeśli ten adres e‐mail jest przypisany do Twojego konta, zostanie na niego wysłany e-mail do odzyskiwania hasła.",
        "passwordreset-emailsentusername": "Jeśli z tym kontem powiązany jest adres e‐mail, zostanie na niego wysłany e-mail do odzyskiwania hasła.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Został wysłany e-mail|Zostały wysłane e-maile}} z informacjami o resetowaniu hasła. {{PLURAL:$1|Użytkownik i hasło jest pokazany|Lista użytkowników i haseł jest pokazana}} tutaj.",
-       "passwordreset-emailerror-capture2": "Wysyłanie e-maila do {{GENDER:$2|użytkownika|użytkowniczki}} nie powiodło się: $1 {{PLURAL:$3|Użytkownik i hasło jest pokazany|Lista użytkowników i haseł jest pokazana}} tutaj.",
        "passwordreset-nocaller": "Musi być podany wywołujący",
        "passwordreset-nosuchcaller": "Wywołujący nie istnieje: $1",
-       "passwordreset-invalideamil": "Nieprawidłowy adres e-mail",
+       "passwordreset-invalidemail": "Nieprawidłowy adres e-mail",
        "passwordreset-nodata": "Nie podano ani nazwy użytkownika, ani adresu e-mail",
        "changeemail": "Zmiana lub usunięcie adresu e‐mail",
        "changeemail-header": "Wypełnij ten formularz, aby zmienić swój adres e-mail. Jeśli chcesz usunąć swój adres e-mail, to przy wypełnianiu formularza pozostaw puste pole nowego adresu e-mail.",
        "prefs-help-recentchangescount": "Uwzględnia ostatnie zmiany, historię stron i rejestry.",
        "prefs-help-watchlist-token2": "To jest tajny klucz umożliwiający dostęp do kanału internetowego zmian w obserwowanych przez ciebie stronach.\nKażdy, kto go zna, będzie mógł je zobaczyć, więc zachowaj go dla siebie.\n[[Special:ResetTokens|Kliknij tu, jeśli chcesz go zresetować]].",
        "savedprefs": "Twoje preferencje zostały zapisane.",
-       "savedrights": "Zapisano uprawnienia {{GENDER:$1|użytkownika $1|użytkowniczki $1}}.",
+       "savedrights": "Zapisano grupy {{GENDER:$1|użytkownika $1|użytkowniczki $1}}.",
        "timezonelegend": "Strefa czasowa:",
        "localtime": "Czas lokalny:",
        "timezoneuseserverdefault": "Użyj domyślnej dla tej wiki ($1)",
        "prefswarning-warning": "Niektóre z dokonanych zmian w preferencjach nie zostały jeszcze zapisane. Jeśli wyjdziesz bez wciśnięcia „$1”, Twoje zmiany zostaną utracone.",
        "prefs-tabs-navigation-hint": "Wskazówka: do poruszania się między zakładkami możesz użyć klawiszy strzałek w lewo i w prawo",
        "userrights": "Zarządzanie uprawnieniami użytkowników",
-       "userrights-lookup-user": "Zarządzaj grupami użytkownika",
+       "userrights-lookup-user": "Wybierz użytkownika",
        "userrights-user-editname": "Wprowadź nazwę użytkownika:",
-       "editusergroup": "Edytuj grupy {{GENDER:$1|użytkownika|użytkowniczki}}",
+       "editusergroup": "Wczytaj grupy użytkownika",
        "editinguser": "Zmiana uprawnień {{GENDER:$1|użytkownika|użytkowniczki}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Edytuj grupy użytkownika",
        "saveusergroups": "Zapisz grupy {{GENDER:$1|użytkownika|użytkowniczki}}",
        "userrights-reason": "Powód:",
        "userrights-no-interwiki": "Nie masz dostępu do edycji uprawnień na innych wiki.",
        "userrights-nodatabase": "Baza danych $1 nie istnieje lub nie jest lokalna.",
-       "userrights-nologin": "Musisz [[Special:UserLogin|zalogować się]] na konto administratora, by nadawać uprawnienia użytkownikom.",
-       "userrights-notallowed": "Nie jesteś upoważniony do nadawania i odbierania uprawnień użytkownikom.",
        "userrights-changeable-col": "Grupy, które możesz wybrać",
        "userrights-unchangeable-col": "Grupy, których nie możesz wybrać",
        "userrights-conflict": "Konflikt zmiany uprawnień użytkownika! Proszę sprawdzić i potwierdzić swoje zmiany.",
-       "userrights-removed-self": "Odebrałeś sobie uprawnienia. W związku z tym nie masz już dostępu do tej strony.",
        "group": "Grupa:",
        "group-user": "Użytkownicy",
        "group-autoconfirmed": "Automatycznie zatwierdzeni użytkownicy",
        "right-siteadmin": "Blokowanie i odblokowywanie bazy danych",
        "right-override-export-depth": "Eksport stron wraz z linkowanymi do głębokości 5 linków",
        "right-sendemail": "Wysyłanie e‐maili do innych użytkowników",
-       "right-passwordreset": "Sprawdzanie treści e‐maila o resetowaniu hasła",
        "right-managechangetags": "Tworzenie i (dez)aktywowanie [[Special:Tags|znaczników]]",
        "right-applychangetags": "Wprowadzanie [[Special:Tags|znaczników]] wraz z własnymi zmianami",
        "right-changetags": "Dodawanie i usuwanie dowolnych [[Special:Tags|znaczników]] z poszczególnych wersji i wpisów w rejestrze",
        "apisandbox-alert-field": "Wartość tego pola jest nieprawidłowa.",
        "apisandbox-continue": "Kontynuuj",
        "apisandbox-continue-clear": "Wyczyść",
+       "apisandbox-param-limit": "Wpisz <kbd>max</kbd>, aby wykorzystać maksymalny limit.",
+       "apisandbox-multivalue-all-namespaces": "$1 (wszystkie przestrzenie nazw)",
+       "apisandbox-multivalue-all-values": "$1 (wszystkie wartości)",
        "booksources": "Książki",
        "booksources-search-legend": "Szukaj informacji o książkach",
        "booksources-search": "Szukaj",
        "booksources-text": "Poniżej znajduje się lista odnośników do innych witryn, które pośredniczą w sprzedaży nowych i używanych książek, a także mogą posiadać dalsze informacje na temat poszukiwanej przez Ciebie książki.",
        "booksources-invalid-isbn": "Podany numer ISBN został rozpoznany jako nieprawidłowy. Sprawdź czy podany numer zgadza się z numerem zaczerpniętym ze źródła.",
        "magiclink-tracking-rfc": "Strony używające magicznych linków RFC",
+       "magiclink-tracking-rfc-desc": "Ta strona zawiera magiczne linki do RFC. Zobacz w [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org], jak dokonać migracji.",
        "magiclink-tracking-pmid": "Strony używające magicznych linków PMID",
+       "magiclink-tracking-pmid-desc": "Ta strona zawiera magiczne linki do PMID. Zobacz w [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org], jak dokonać migracji.",
        "magiclink-tracking-isbn": "Strony używające magicznych linków ISBN",
+       "magiclink-tracking-isbn-desc": "Ta strona zawiera magiczne linki do ISBN. Zobacz w [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org], jak dokonać migracji.",
        "specialloguserlabel": "Kto:",
        "speciallogtitlelabel": "Co (tytuł lub {{ns:user}}:nick użytkownika):",
        "log": "Rejestr operacji",
        "activeusers": "Lista aktywnych użytkowników",
        "activeusers-intro": "Poniżej znajduje się lista użytkowników, którzy byli aktywni w ciągu {{PLURAL:$1|ostatniego dnia|ostatnich $1 dni}}.",
        "activeusers-count": "w ciągu {{PLURAL:$3|ostatniego dnia|ostatnich $3 dni}} {{GENDER:$2|wykonał|wykonała|wykonał}} $1 {{PLURAL:$1|operację|operacje|operacji}}",
-       "activeusers-from": "Pokaż użytkowników zaczynając od:",
+       "activeusers-from": "Wyświetl użytkowników, zaczynając od:",
        "activeusers-groups": "Wyświetl użytkowników należących do grup:",
        "activeusers-noresult": "Nie odnaleziono żadnego użytkownika.",
        "activeusers-submit": "Wyświetl aktywnych użytkowników",
        "allmessages-filter-translate": "Przetłumacz",
        "thumbnail-more": "Powiększ",
        "filemissing": "Brak pliku",
-       "thumbnail_error": "Błąd przy generowaniu miniatury $1",
+       "thumbnail_error": "Błąd przy generowaniu miniatury: $1",
        "thumbnail_error_remote": "Komunikat o błędzie z {{grammar:2sg|$1}}:\n$2",
        "djvu_page_error": "Strona DjVu poza zakresem",
        "djvu_no_xml": "Nie można pobrać danych w formacie XML dla pliku DjVu",
        "patrol-log-header": "Poniżej znajduje się rejestr patrolowania stron.",
        "log-show-hide-patrol": "$1 rejestr sprawdzania",
        "log-show-hide-tag": "$1 rejestr znaczników",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Oznaczyć wersję $3 strony $2 jako sprawdzoną?",
        "deletedrevision": "Usunięto poprzednie wersje $1",
        "filedeleteerror-short": "Błąd przy usuwaniu pliku $1",
        "filedeleteerror-long": "Wystąpiły błędy przy usuwaniu pliku:\n\n$1",
        "tags-deactivate": "dezaktywuj",
        "tags-hitcount": "$1 {{PLURAL:$1|zmiana|zmiany|zmian}}",
        "tags-manage-no-permission": "Nie masz uprawnień do zarządzania znacznikami.",
-       "tags-manage-blocked": "Nie możesz zarządzać znacznikami zmian, kiedy jesteś zablokowany.",
+       "tags-manage-blocked": "Nie możesz zarządzać znacznikami zmian, gdy jesteś {{GENDER:$1|zablokowany|zablokowana}}.",
        "tags-create-heading": "Utwórz nowy znacznik",
        "tags-create-explanation": "Nowe znaczniki będą dostępne domyślnie dla użytkowników i botów.",
        "tags-create-tag-name": "Nazwa znacznika:",
        "tags-deactivate-not-allowed": "Nie można dezaktywować znacznika „$1”.",
        "tags-deactivate-submit": "Dezaktywuj",
        "tags-apply-no-permission": "Nie masz uprawnień do wprowadzania znaczników wraz z własnymi zmianami.",
-       "tags-apply-blocked": "Nie możesz stosować znaczników do swoich zmian, gdy jesteś zablokowany.",
+       "tags-apply-blocked": "Nie możesz stosować znaczników do swoich zmian, gdy jesteś {{GENDER:$1|zablokowany|zablokowana}}.",
        "tags-apply-not-allowed-one": "Znacznik „$1” nie może zostać wprowadzony ręcznie.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Następujący znacznik nie może zostać wprowadzony ręcznie|Następujące znaczniki nie mogą zostać wprowadzone ręcznie}}: $1",
        "tags-update-no-permission": "Nie masz uprawnień do dodawania lub usuwania znaczników z poszczególnych wersji lub wpisów w rejestrze.",
-       "tags-update-blocked": "Nie możesz dodawać i usuwać znaczników zmian, kiedy jesteś zablokowany.",
+       "tags-update-blocked": "Nie możesz dodawać i usuwać znaczników zmian, gdy jesteś {{GENDER:$1|zablokowany|zablokowana}}.",
        "tags-update-add-not-allowed-one": "Znacznik „$1” nie może zostać dodany ręcznie.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Następujący znacznik nie może zostać dodany ręcznie|Następujące znaczniki nie mogą zostać dodane ręcznie}}: $1",
        "tags-update-remove-not-allowed-one": "Znacznika „$1” nie można usunąć.",
        "htmlform-user-not-exists": "<strong>$1</strong> nie istnieje.",
        "htmlform-user-not-valid": "<strong>$1</strong> nie jest prawidłową nazwą użytkownika.",
        "logentry-delete-delete": "$1 {{GENDER:$2|usunął|usunęła}} stronę $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|usunął|usunęła}} przekierowanie $3 poprzez nadpisanie",
        "logentry-delete-restore": "$1 {{GENDER:$2|odtworzył|odtworzyła}} stronę $3",
        "logentry-delete-event": "$1 {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|zdarzenia|$5 zdarzeń}} w rejestrze $3, wykonano następujące operacje: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|zmienił|zmieniła}} widoczność {{PLURAL:$5|wersji|$5 wersji}} strony $3, wykonano następujące operacje: $4",
        "mw-widgets-dateinput-placeholder-month": "RRRR-MM",
        "mw-widgets-titleinput-description-new-page": "strona jeszcze nie istnieje",
        "mw-widgets-titleinput-description-redirect": "przekierowanie do $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategorię...",
        "sessionmanager-tie": "Nie można łączyć kilku rodzajów uwierzytelniania dla zapytania: $1.",
        "sessionprovider-generic": "sesje $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sesje na podstawie cookie",
        "usercssispublic": "Uwaga: Podstrony z kodem CSS są widoczne publicznie i nie powinny zawierać poufnych danych.",
        "restrictionsfield-badip": "Nieprawidłowy adres IP lub zakres adresów: $1",
        "restrictionsfield-label": "Dozwolone zakresy adresów IP:",
-       "restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Błąd: $1",
-       "edit-error-long": "Błędy:\n\n$1"
+       "restrictionsfield-help": "Jeden adres IP lub zakres CIDR w wierszu. Aby zaznaczyć wszystkie, użyj<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index e0b4667..fe7db17 100644 (file)
        "yourpasswordagain": "Che a bata torna soa ciav:",
        "createacct-yourpasswordagain": "Ch'a confirma la ciav",
        "createacct-yourpasswordagain-ph": "Ch'a buta torna la ciav",
-       "remembermypassword": "Visesse ëd mia ciav ansima a 's navigador (për al pi $1 {{PLURAL:$1|di}})",
        "userlogin-remembermypassword": "Ten-me andrinta al sistema",
        "userlogin-signwithsecure": "Dovré na conession sigura",
        "yourdomainname": "Sò domini:",
        "activeusers-intro": "Costa a l'é na lista d'utent ch'a l'han avù n'atività qualsëssìa ant j'ùltim $1 {{PLURAL:$1|di|di}}.",
        "activeusers-count": "$1 {{PLURAL:$1|assion}} ant {{PLURAL:$3|l'ùltim di|j'ùltim $3 di}}",
        "activeusers-from": "Smon-me j'utent a parte da:",
-       "activeusers-hidebots": "Stërmé ij trigomiro",
-       "activeusers-hidesysops": "Stërmé j'aministrator",
        "activeusers-noresult": "Pa gnun utent trovà.",
        "listgrouprights": "Drit dël grup d'utent",
        "listgrouprights-summary": "Ambelessì a-i é na lista dle partìe d'utent definìe ansima a costa wiki, con ij sò drit d'acess associà.\nA peulo ess-ie d'[[{{MediaWiki:Listgrouprights-helppage}}|anformassion adissionaj]] ansima a dij drit individuaj.",
        "htmlform-cloner-create": "Gionté 'd pi",
        "htmlform-cloner-delete": "Gavé",
        "htmlform-cloner-required": "A-i é damanca d'almanch un valor.",
-       "sqlite-has-fts": "$1 con arserca an test pien mantnùa",
-       "sqlite-no-fts": "$1 sensa arserca an test pien mantnùa",
        "logentry-delete-delete": "$1 a l'ha {{GENDER:$2|scancelà}} la pàgina $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|a l'ha ripristinà}} la pàgina $3",
        "logentry-delete-event": "$1 {{GENDER:$2|a l'ha modificà}} la visibilità ëd {{PLURAL:$5|n'event dël registr|$5 event dël registr}} dzora $3: $4",
        "feedback-external-bug-report-button": "Presenta un travaj tècnich",
        "feedback-dialog-title": "Spedì ij coment",
        "feedback-dialog-intro": "A peul dovré ël formolari sempi sì-sota për spedì ij sò coment. Ij sò coment a saran giontà a la pàgina «$1», ansema a sò stranòm.",
-       "feedback-error-title": "Eror",
        "feedback-error1": "Eror: Arzultà ëd l'API nen arconossù",
        "feedback-error2": "Eror: Modìfica falìa",
        "feedback-error3": "Eror: gnun-e rispòste da l'API",
index 15b5bee..33d0afe 100644 (file)
        "activeusers-intro": "اے اوناں ورتن والیاں دی لسٹ اے جنان پچھلے $1 {{PLURAL:$1|دن|دناں}} چ کم کیتا اے۔",
        "activeusers-count": "$1 {{PLURAL:$1|تبدیلی|تبدیلیاں}} پچھلے{{PLURAL:$3|دن|$3 دن}} چ",
        "activeusers-from": "ورتن والے ایس توں شروع ہون والے دسو:",
-       "activeusers-hidebots": "بوٹ چھپاؤ",
-       "activeusers-hidesysops": "مکھۓ لکاؤ",
        "activeusers-noresult": "کوئی ورتن والا نئیں لبیا۔",
        "listgrouprights": "ورتن ٹرلی حق",
        "listgrouprights-summary": "تھلے اک لسٹ اے ورتن ٹولیاں دی ای وکی تے، اپنے رلدے حقاں نال۔ \n\nہربندے دے ح‍ق‍اں [[{{MediaWiki:Listgrouprights-helppage}}|ہور جانکاری]]",
index 16f214a..fbb364b 100644 (file)
        "yourname": "Όνεμαν χρήστε:",
        "yourpassword": "Σημάδι:",
        "yourpasswordagain": "Ξαν' γράψτεν το σημάδι:",
-       "remembermypassword": "Αποθήκεμαν τη σημαδίμ σ' αβούτον τον υπολογιστήν (για μέγιστον $1 {{PLURAL:$1|ημέραν|ημέρας}})",
        "yourdomainname": "Το domain εσούν:",
        "login": "Εμπάτε",
        "nav-login-createaccount": "Εμπάτεν / ποισέστεν λογαρίαν",
        "permissionserrorstext-withaction": "'Κ έχετε την άδειαν για $2, για {{PLURAL:$1|τ'αφκά το λόγον|τ'αφκά τοι λόγους}}:",
        "recreate-moveddeleted-warn": "'''Ωρία: Εφτάτε αξάν μίαν σελίδαν ντ' ενεσβύεν οψεκές.'''\n\nΊσως εν καλλίον να μην εφτάτε τη σελίδαν.\nΤερέστεν για βοήθειαν σ' αρχείον σβησεματίων και ετεροχλαεματίων για την αιτίαν για το σβήσιμον:",
        "moveddeleted-notice": "Αούτο η σελίδαν εβζινέθεν.\nΑφκά ευρίεται έναν γράψιμον ασο αρχείον σβησεματίων και ετεροχλαεματίων τη σελίδας.",
-       "cantcreateaccounttitle": "Το ποίσιμον τη λογαρίας 'κ έντον",
        "viewpagelogs": "Τέρεν αρχεία γι' αβούτεν τη σελίδαν",
        "nohistory": "Αούτο η σελίδαν αλλαγάς 'κ εςς.",
        "currentrev": "Ατωριζνόν μορφήν",
index f4424e0..010c8f6 100644 (file)
        "yourname": "Twajā tērpautajas pabilisnā:",
        "yourpassword": "Twājs kliptaswīrds:",
        "yourpasswordagain": "Āntrinais kliptaswīrdan",
-       "remembermypassword": "Pamēnais majjans enēisnas infōrmaciōnins en šismu kōmputerin (per maksimum of $1 {{PLURAL:$1|deinā|dēinans}})",
        "yourdomainname": "Twajā dōmeni:",
        "externaldberror": "Tikka izwinaīnas autentikāntin dātanbazin blānda, anga ni assei enwarīntan kāi etnaunīnlai twajjan izwinaīnan rekkenan.",
        "login": "Enjaīs",
        "undo-failure": "Ni mazīngi etwārtai wartīntun redigīsenin, kōnfliktas sen persirzdausnas wersiōnins paggan.",
        "undo-norev": "Redigīsenis ni mazzi būtwei etwārtai wartīntan, beggi ni ekzistijja anga pastāi āupausintan.",
        "undo-summary": "Etwārtai wartīnsna stēisan wersiōnin $1 teīktan pra [[Special:Contributions/$2|$2]] ([[User talk:$2|diskusiōni]])",
-       "cantcreateaccounttitle": "Ni mazīngi teīktun rekkenan",
        "cantcreateaccount-text": "Rekkenas teīksenis iz šan IP adressin (\"$1\") pastāi drēuditan pra [[User:$3|$3]].\n\nBrewīnsli dātan pra $3 ast \"$2\"",
        "viewpagelogs": "Wīdais šisse pāusas regīsterins",
        "nohistory": "Ni ast redigīsnas istōrija per šin pāusan.",
        "activeusers": "Aktīwan tērpautajan listi",
        "activeusers-count": "$1 {{PLURAL:$1|redigīsenis|redigīsenei}} en {{PLURAL:$3|panzdauman dēinan|$3 panzdaumans dēinans}}",
        "activeusers-from": "Waidinnais tērpautajans pagaūnintins sen:",
-       "activeusers-hidebots": "Kliptinais bōtans",
-       "activeusers-hidesysops": "Kliptinais perwaldītajans",
        "activeusers-noresult": "Ni aupalā di tērpautajans",
        "listgrouprights": "Tērpautajan gruppin enwarīnsenei",
        "listgrouprights-summary": "Zemmais ast listi stēisan tērpautajan gruppin definītan en šissei wiki sen enwarīnsenins preipeisātan tenēimans.\nIzbandais pāausan sen [[{{MediaWiki:Listgrouprights-helppage}}|papilniminans infōrmaciōnins]] ezze enwarīnsenins.",
index c7c6ac6..c23e1c5 100644 (file)
        "passwordreset-emailtitle": "د {{SITENAME}} د گڼون څرگندنې",
        "passwordreset-emailelement": "کارن-نوم: \n$1\n\nلنډمهاله پټنوم: \n$2",
        "passwordreset-emailsentemail": "د پټنوم بيا پرځای کېدنې لپاره برېښليک درولېږل شو.",
-       "passwordreset-invalideamil": "ناسمه برېښليک پته",
+       "passwordreset-invalidemail": "ناسمه برېښليک پته",
        "changeemail": "برېښليک پته بدلول يا ليرې کول",
        "changeemail-header": "د گڼون برېښليک پته بدلول",
        "changeemail-no-info": "دې مخ ته د لاسرسي لپاره بايد غونډال کې ورننوځۍ.",
        "activeusers-intro": "دا د هغو کارنانو لړليک دی چې په {{PLURAL:$1|تېرې|تېرو}} $1 {{PLURAL:$1|ورځ|ورځو}} کې يې ونډې ترسره کړي.",
        "activeusers-count": "په {{PLURAL:$3|تېرې ورځ|تېرو $3 ورځو}} کې $1 {{PLURAL:$1|سمون|سمونونه}}",
        "activeusers-from": "هغه کارنان کتل چې نومونه يې پېلېږي په:",
-       "activeusers-hidebots": "روباټونه پټول",
-       "activeusers-hidesysops": "پازوالان پټول",
        "activeusers-noresult": "کارن و نه موندل شو.",
        "activeusers-submit": "فعاله کارنان ښکاره کول",
        "listgrouprights": "د کارن ډلو رښتې",
        "feedback-cancel": "ناگارل",
        "feedback-close": "ترسره شو",
        "feedback-external-bug-report-button": "د يوې تخنيکي دندې دوتنه جوړونه",
-       "feedback-error-title": "تېروتنه",
        "feedback-message": "پيغام:",
        "feedback-subject": "سکالو:",
        "feedback-submit": "سپارل",
index 90cf9cc..1830765 100644 (file)
                        "Tusca",
                        "Cristofer Alves",
                        "Tark",
-                       "O Andarilho"
+                       "O Andarilho",
+                       "Bruno.S.Alves 270"
                ]
        },
        "tog-underline": "Sublinhar links:",
        "talk": "Discussão",
        "views": "Visualizações",
        "toolbox": "Ferramentas",
+       "tool-link-userrights": "Editar grupos {{GENDER:$1|usuário}}",
        "userpage": "Ver página de usuário",
        "projectpage": "Ver página de projeto",
        "imagepage": "Ver página do arquivo",
        "passwordreset-emaildisabled": "Os recursos de e-mail foram desativados nesta wiki.",
        "passwordreset-username": "Nome de usuário:",
        "passwordreset-domain": "Domínio:",
-       "passwordreset-capture": "Ver o e-mail resultante?",
-       "passwordreset-capture-help": "Se marcar esta caixa, o e-mail (com a senha temporária) será-lhe mostrado, além de ser enviado para o usuário.",
        "passwordreset-email": "Endereço de e-mail:",
        "passwordreset-emailtitle": "Detalhes da conta em {{SITENAME}}",
        "passwordreset-emailtext-ip": "Alguém (provavelmente você, a partir do endereço IP $1)\nsolicitou um lembrete dos seus detalhes de conta para {{SITENAME}} ($4).\n{{PLURAL:$3|A seguinte conta está associada|As seguintes contas estão associadas}} a este e-mail:\n\n$2\n\n{{PLURAL:$3|Esta senha temporária vai|Essas senhas temporárias vão}} expirar em {{PLURAL:$5|um dia|$5 dias}}.\nVocê deve efetuar login e escolher uma nova senha agora.\nSe você conseguir lembrar da senha, ignore este e-mail e continue\nusando sua senha anterior. Caso contrário, prossiga com as instruções\ndisponíveis no link.",
        "passwordreset-emailelement": "Usuário: \n$1\n\nSenha temporária: \n$2",
        "passwordreset-emailsentemail": "Se este é um endereço de e-mail registrado para a sua conta, em seguida, um e-mail de redefinição de senha será enviada.",
        "passwordreset-emailsentusername": "Se houver um endereço de email associado a esta conta, ser-lhe-á enviada uma mensagem para redefinir a sua senha.",
-       "passwordreset-emailsent-capture2": "A redefinição da senha {{PLURAL:$1|do e-mail|dos e-mails}} foi enviada. {{PLURAL:$1|O nome de usuário e senha|A lista de nomes de usuário e senhas}} encontram-se a seguir.",
-       "passwordreset-emailerror-capture2": "O envio do e-mail {{GENDER:$2|usuário}} falhou: $1 Os {{PLURAL:$3|nome de usuário e senha|lista de nomes de usuários e senhas}} são mostrados abaixo.",
        "passwordreset-nocaller": "Um interlocutor deve ser fornecido",
        "passwordreset-nosuchcaller": "O interlocutor não existe: $1",
        "passwordreset-ignored": "A redefinição da senha não foi realizada. Talvez o provedor não tenha sido configurado?",
-       "passwordreset-invalideamil": "Endereço de e-mail inválido",
+       "passwordreset-invalidemail": "Endereço de e-mail inválido",
        "passwordreset-nodata": "Não foram fornecidos nome de usuário nem endereço de e-mail",
        "changeemail": "Alterar ou remover endereço de email",
        "changeemail-header": "Preencha este formulário para alterar seu endereço de e-mail. Se você gostaria de remover a associação de qualquer endereço de e-mail da sua conta, deixe o novo endereço de email em branco quando enviar o formulário.",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Você não tem permissão para alterar privilégios de usuários em outros wikis.",
        "userrights-nodatabase": "O banco de dados $1 não existe ou não é um banco de dados local.",
-       "userrights-nologin": "Você precisa [[Special:UserLogin|autenticar-se]] como um administrador para especificar os privilégios de usuário.",
-       "userrights-notallowed": "Você não tem permissão para adicionar ou remover privilégios a usuários.",
        "userrights-changeable-col": "Grupos que pode alterar",
        "userrights-unchangeable-col": "Grupos que não pode alterar",
        "userrights-conflict": "Há um comflito de permissões de usuário! Por favor, revise e confirme as alterações novamente.",
-       "userrights-removed-self": "Você removeu seus privilégios. Portanto, você agora não pode mais acessar esta página.",
        "group": "Grupo:",
        "group-user": "Usuários",
        "group-autoconfirmed": "Usuários autoconfirmados",
        "right-siteadmin": "Bloquear e desbloquear o banco de dados",
        "right-override-export-depth": "Exportar páginas incluindo páginas ligadas até uma profundidade de 5",
        "right-sendemail": "Enviar email a outros usuários",
-       "right-passwordreset": "Ver todos os e-mails de reposição de senhas",
        "right-managechangetags": "Criar e (des)ativar [[Special:Tags|tags]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] juntamente com as alterações de alguém",
        "right-changetags": "Adicionar e remover [[Special:Tags|etiquetas]] arbitrárias em revisões e ''logs'' individuais",
index 49fb484..4a75635 100644 (file)
        "navigation-heading": "Menu de navegação",
        "errorpagetitle": "Erro",
        "returnto": "Voltar para $1.",
-       "tagline": "De {{SITENAME}}",
+       "tagline": "Da wiki {{SITENAME}}",
        "help": "Ajuda",
        "search": "Pesquisa",
        "search-ignored-headings": " #<!-- deixe esta linha exatamente como ela está --> <pre>\n# Títulos de página que serão ignorados pela pesquisa.\n# Mudanças a esta lista terão efeito quando a página com o título referido for indexada.\n# Pode forçar a indexação de uma página realizando uma edição nula nessa página.\n# A sintaxe é a seguinte:\n#  * Tudo desde um símbolo de cardinal (#) até ao fim da linha é um comentário\n#  * Cada linha não vazia é o título exato a ignorar, respeitando o uso de maiúsculas\nReferências\nLinks externos\nVer também\n #</pre> <!-- deixe esta linha exatamente como ela está -->",
        "views": "Vistas",
        "toolbox": "Ferramentas",
        "tool-link-userrights": "Alterar grupos {{GENDER:$1|do utilizador|da utilizadora}}",
+       "tool-link-userrights-readonly": "Ver grupos {{GENDER:$1|do utilizador|da utilizadora}}",
        "tool-link-emailuser": "Enviar correio eletrónico a {{GENDER:$1|este utilizador|esta utilizadora|este(a) utilizador(a)}}",
        "userpage": "Ver página de utilizador",
        "projectpage": "Ver página de projeto",
        "pool-errorunknown": "Erro desconhecido",
        "pool-servererror": "O serviço ''pool counter'' não está disponível ($1).",
        "poolcounter-usage-error": "Erro de uso: $1",
-       "aboutsite": "Sobre a {{SITENAME}}",
+       "aboutsite": "Sobre a wiki {{SITENAME}}",
        "aboutpage": "Project:Sobre",
        "copyright": "Conteúdo disponibilizado nos termos da $1, salvo indicação em contrário.",
        "copyrightpage": "{{ns:project}}:Direitos_de_autor",
        "nstab-category": "Categoria",
        "mainpage-nstab": "Página principal",
        "nosuchaction": "Operação não existe",
-       "nosuchactiontext": "A operação especificada pelo URL é inválida.\nÉ possível que tenha escrito mal o URL ou seguido uma ligação incorreta.\nIsto pode também indicar um defeito no software da {{SITENAME}}.",
+       "nosuchactiontext": "A operação especificada pelo URL é inválida.\nÉ possível que tenha escrito mal o URL ou seguido uma ligação incorreta.\nIsto pode também indicar um defeito no software da wiki {{SITENAME}}.",
        "nosuchspecialpage": "Esta página especial não existe",
        "nospecialpagetext": "<strong>Solicitou uma página especial inválida.</strong>\n\nEncontra uma lista das páginas especiais válidas em [[Special:SpecialPages|{{int:specialpages}}]].",
        "error": "Erro",
        "invalidtitle-unknownnamespace": "Título inválido com número de domínio $1 desconhecido e texto \"$2\"",
        "exception-nologin": "Não está autenticado",
        "exception-nologin-text": "Por favor, inicie sessão para poder aceder a esta página ou ação.",
-       "exception-nologin-text-manual": "Por favor $1, para poder aceder a esta página ou acção.",
+       "exception-nologin-text-manual": "Por favor $1, para poder aceder a esta página ou ação.",
        "virus-badscanner": "Má configuração: antivírus desconhecido: ''$1''",
        "virus-scanfailed": "a verificação falhou (código $1)",
        "virus-unknownscanner": "antivírus desconhecido:",
        "cannotlogoutnow-title": "Não é possível encerrar a sessão agora",
        "cannotlogoutnow-text": "Não pode encerrar a sessão quando utilizar $1.",
        "welcomeuser": "Bem-vindo, $1!",
-       "welcomecreation-msg": "A sua conta foi criada.\nNão se esqueça de personalizar as suas [[Special:Preferences|preferências]].",
+       "welcomecreation-msg": "A sua conta foi criada.\nNão se esqueça de personalizar as suas [[Special:Preferences|preferências]] na wiki {{SITENAME}}.",
        "yourname": "Nome de utilizador(a):",
        "userlogin-yourname": "Nome de utilizador(a)",
        "userlogin-yourname-ph": "Digite o seu nome de utilizador(a)",
        "createacct-another-submit": "Criar conta",
        "createacct-continue-submit": "Continuar criação de conta",
        "createacct-another-continue-submit": "Continuar criação de conta",
-       "createacct-benefit-heading": "{{SITENAME}} é feito por pessoas como você.",
+       "createacct-benefit-heading": "A wiki {{SITENAME}} é feita por pessoas como você.",
        "createacct-benefit-body1": "{{PLURAL:$1|edição|edições}}",
        "createacct-benefit-body2": "{{PLURAL:$1|página|páginas}}",
        "createacct-benefit-body3": "{{PLURAL:$1|contribuidor|contribuidores}} recentes",
        "loginerror": "Erro ao iniciar sessão",
        "createacct-error": "Erro na criação da conta",
        "createaccounterror": "Não foi possível criar a conta: $1",
-       "nocookiesnew": "A conta de utilizador foi criada, mas neste momento não tem sessão iniciada.\nA {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e inicie sessão com o seu nome de utilizador e a sua palavra-passe, por favor.",
-       "nocookieslogin": "A {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e tente novamente, por favor.",
+       "nocookiesnew": "A conta de utilizador foi criada, mas neste momento não tem sessão iniciada.\nA wiki {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e inicie sessão com o seu nome de utilizador e a sua palavra-passe, por favor.",
+       "nocookieslogin": "A wiki {{SITENAME}} utiliza ''cookies'' para autenticar os utilizadores.\nOs ''cookies'' estão desativados no seu navegador.\nAtive-os e tente novamente, por favor.",
        "nocookiesfornew": "A conta de utilizador não foi criada, porque não foi possível confirmar a sua origem.\nCertifique-se de que tem os ''cookies'' ativados, recarregue esta página e tente novamente.",
        "createacct-loginerror": "A conta foi criada, mas não foi possível iniciar a sessão automaticamente. Por favor, [[Special:UserLogin|inície a sessão manualmente]].",
        "noname": "Não especificou um nome de utilizador válido.",
        "loginsuccesstitle": "Autenticação bem sucedida",
-       "loginsuccess": "'''Encontra-se agora ligado à {{SITENAME}} como \"$1\"'''.",
+       "loginsuccess": "<strong>Encontra-se agora ligado à wiki {{SITENAME}} como \"$1\".</strong>",
        "nosuchuser": "Não existe nenhum utilizador com o nome \"$1\".\nOs nomes de utilizador são sensíveis às letras maiúsculas e minúsculas.\nVerifique a ortografia, ou [[Special:CreateAccount|crie uma nova conta]].",
        "nosuchusershort": "Não existe um utilizador com o nome \"$1\". Verifique o nome que introduziu.",
        "nouserspecified": "Precisa de especificar um nome de utilizador.",
        "password-name-match": "A sua palavra-passe tem de ser diferente do seu nome de utilizador.",
        "password-login-forbidden": "Foi proibido o uso deste nome de utilizador e palavra-passe.",
        "mailmypassword": "Reiniciar a palavra-passe",
-       "passwordremindertitle": "Nova palavra-passe temporária na {{SITENAME}}",
-       "passwordremindertext": "Alguém (provavelmente você, a partir do endereço IP $1) solicitou uma palavra-passe nova para a sua conta na {{SITENAME}} ($4).\nFoi criada a palavra-passe temporária \"$3\" para o utilizador \"$2\".\nSe o pedido foi feito por si, entre agora na sua conta e escolha uma palavra-passe nova.\nA palavra-passe temporária expira após {{PLURAL:$5|um dia|$5 dias}}.\n\nCaso outra pessoa tenha feito o pedido, ou se entretanto se recordou da sua palavra-passe e já não deseja alterá-la, ignore esta mensagem e continue a utilizar a palavra-passe antiga.",
+       "passwordremindertitle": "Nova palavra-passe temporária na wiki {{SITENAME}}",
+       "passwordremindertext": "Alguém (provavelmente você, a partir do endereço IP $1) solicitou uma palavra-passe nova para a sua conta na wiki {{SITENAME}} ($4).\nFoi criada a palavra-passe temporária \"$3\" para o utilizador \"$2\".\nSe o pedido foi feito por si, entre agora na sua conta e escolha uma palavra-passe nova.\nA palavra-passe temporária expira após {{PLURAL:$5|um dia|$5 dias}}.\n\nCaso outra pessoa tenha feito o pedido, ou se entretanto se recordou da sua palavra-passe e já não deseja alterá-la, ignore esta mensagem e continue a utilizar a palavra-passe antiga.",
        "noemail": "Não foi registado um endereço de correio eletrónico para o utilizador \"$1\".",
        "noemailcreate": "Tem de fornecer um endereço de correio eletrónico válido.",
        "passwordsent": "Foi enviada uma palavra-passe nova para o endereço de correio eletrónico do utilizador \"$1\".\nVolte a iniciar sessão após recebê-la, por favor.",
        "emaildisabled": "Este sítio não consegue enviar mensagens de correio eletrónico.",
        "accountcreated": "Conta criada",
        "accountcreatedtext": "A conta de utilizador para [[{{ns:User}}:$1|$1]] ([[{{ns:User talk}}:$1|talk]]) foi criada.",
-       "createaccount-title": "Criação de conta na {{SITENAME}}",
+       "createaccount-title": "Criação de conta na wiki {{SITENAME}}",
        "createaccount-text": "Alguém criou uma conta com o nome $2 para o seu endereço de correio eletrónico, na wiki {{SITENAME}} ($4), com a palavra-passe \"$3\".\nDeve agora iniciar sessão e alterar a sua palavra-passe.\n\nSe a conta foi criada por engano, pode ignorar esta mensagem.",
        "login-throttled": "Realizou demasiadas tentativas de início de sessão com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
        "login-abort-generic": "O início de sessão falhou - Cancelado",
        "changepassword-throttled": "Realizou demasiadas tentativas de início de sessão com esta conta.\nAguarde $1 antes de tentar novamente, por favor.",
        "botpasswords": "Palavras-passe de robô",
        "botpasswords-summary": "As <em>palavras-passe de robô</em> permitem o acesso a uma conta de utilizador através da API, sem utilizar as credenciais principais de autenticação dessa conta. Os direitos de um utilizador, ao iniciar uma sessão com a palavra-passe de robô, podem estar limitados.\n\nSe não sabe para que necessita desta palavra-passe provavelmente não deveria criá-la. Nunca lhe deve ser solicitado que gere e entregue uma destas palavras-passe.",
-       "botpasswords-disabled": "As palavras-passe de robô estão desactivadas.",
+       "botpasswords-disabled": "As palavras-passe de robô estão desativadas.",
        "botpasswords-no-central-id": "Para utilizar palavras-passe de robô, deve iniciar sessão com uma conta centralizada.",
        "botpasswords-existing": "Palavras-passe de robô existentes",
        "botpasswords-createnew": "Criar uma nova palavra-passe para robô",
        "botpasswords-insert-failed": "Falhou ao adicionar o nome do robô \"$1\". Já foi adicionado?",
        "botpasswords-update-failed": "Falha ao atualizar o nome do robô \"$1\". Será que foi eliminado?",
        "botpasswords-created-title": "Criada palavra-passe para o robô",
-       "botpasswords-created-body": "A palavra-passe de robô para o robô \"$1\" do utilizador \"$2\" foi criada.",
+       "botpasswords-created-body": "A palavra-passe de robô, para o nome de robô \"$1\" do utilizador \"$2\" foi criada.",
        "botpasswords-updated-title": "A palavra-passe de robô foi atualizada.",
-       "botpasswords-updated-body": "O robô palavra-passe para o nome do robô \"$1\" do utilizador \"$2\" foi atualizado.",
+       "botpasswords-updated-body": "A palavra-passe de robô, para o nome de robô \"$1\" do utilizador \"$2\" foi atualizada.",
        "botpasswords-deleted-title": "Palavra-passe de robô eliminada",
-       "botpasswords-deleted-body": "O robô palavra-passe para o nome do robô \"$1\"do utilizador \"$2\" foi eliminado.",
+       "botpasswords-deleted-body": "A palavra-passe de robô, para o nome de robô \"$1\" do utilizador \"$2\" foi eliminada.",
        "botpasswords-newpassword": "A nova palavra-passe para iniciar sessão com <strong>$1</strong> é <strong>$2</strong>. <em>Anote-a para referência futura, por favor.</em> <br> (Para robôs antigos cujo nome de acesso tenha de ser igual ao eventual nome de utilizador, também pode usar o nome de utilizador <strong>$3</strong> e a palavra-passe <strong>$4</strong>.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider não está disponível.",
        "botpasswords-restriction-failed": "Restrições de palavra-passe de robô evitam esta autenticação.",
        "passwordreset-emaildisabled": "A funcionalidade de correio eletrónico foi desativada nesta wiki.",
        "passwordreset-username": "Nome de utilizador(a):",
        "passwordreset-domain": "Domínio:",
-       "passwordreset-capture": "Ver a mensagem resultante?",
-       "passwordreset-capture-help": "Se marcar esta caixa, a mensagem (com a palavra-passe temporária) ser-lhe-á mostrada e enviada ao utilizador.",
        "passwordreset-email": "Correio eletrónico:",
-       "passwordreset-emailtitle": "Detalhes da conta na {{SITENAME}}",
-       "passwordreset-emailtext-ip": "Alguém (provavelmente você, a partir do endereço IP $1) pediu a recuperação da palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
-       "passwordreset-emailtext-user": "O utilizador $1 do projeto {{SITENAME}} pediu a recuperação da sua palavra-passe no projeto {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este endereço de correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
+       "passwordreset-emailtitle": "Detalhes da conta na wiki {{SITENAME}}",
+       "passwordreset-emailtext-ip": "Alguém (provavelmente você, a partir do endereço IP $1) pediu a recuperação da palavra-passe na wiki {{SITENAME}} ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
+       "passwordreset-emailtext-user": "O utilizador $1 da wiki {{SITENAME}} pediu a recuperação da sua palavra-passe ($4). {{PLURAL:$3|A seguinte conta de utilizador está associada|As seguintes contas de utilizador estão associadas}} a este endereço de correio eletrónico:\n\n$2\n\n{{PLURAL:$3|Esta palavra-passe temporária irá|Estas palavras-passes temporárias irão}} expirar dentro de {{PLURAL:$5|um dia|$5 dias}}.\nDeve autenticar-se e escolher uma palavra-passe nova agora. Se outra pessoa fez este pedido, ou se entretanto se recordou da sua palavra-passe original e já não deseja alterá-la, pode ignorar esta mensagem e continuar a usar a palavra-passe antiga.",
        "passwordreset-emailelement": "{{GENDER:$1|Utilizador|Utilizadora}}: \n$1\n\nPalavra-passe temporária: \n$2",
        "passwordreset-emailsentemail": "Se este é o endereço de correio eletrónico associado a esta conta, ser-lhe-á enviada uma palavra-passe de reposição.",
        "passwordreset-emailsentusername": "Se houver um endereço de correio eletrónico associado a esta conta, ser-lhe-á enviada uma mensagem para redefinir a sua palavra-passe.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|A mensagem|As mensagens}} de redefinição da palavra-passe {{PLURAL:$1|foi enviada|foram enviadas}} para o seu correio eletrónico. {{PLURAL:$1|O nome de utilizador e palavra-passe encontram-se|A lista de nomes de utilizador e palavras-passe encontra-se}} a seguir.",
-       "passwordreset-emailerror-capture2": "O envio do correio {{GENDER:$2|ao utilizador|à utilizadora|a(o) utilizador(a)}} falhou: $1 {{PLURAL:$3|O nome de utilizador e palavra-passe são mostrados aqui|A lista de nomes de utilizador e palavras-passe é mostrada aqui}}.",
        "passwordreset-nocaller": "Um interlocutor deve ser fornecido",
        "passwordreset-nosuchcaller": "A pessoa que chama não existe: $1",
        "passwordreset-ignored": "A reposição de palavra-passe não foi realizada. Talvez o fornecedor não tenha sido configurado?",
-       "passwordreset-invalideamil": "Correio eletrónico inválido",
+       "passwordreset-invalidemail": "Correio eletrónico inválido",
        "passwordreset-nodata": "Não foram fornecidos nome de utilizador(a) nem endereço de correio eletrónico",
        "changeemail": "Alterar ou remover o endereço de correio eletrónico",
        "changeemail-header": "Complete este formulário para alterar o seu endereço de correio eletrónico. Se quer eliminar a associação de qualquer endereço de correio eletrónico com a sua conta, deixe em branco o novo endereço de correio eletrónico ao submeter o formulário.",
        "changeemail-newemail": "Novo endereço de correio eletrónico:",
        "changeemail-newemail-help": "Este campo deve ser deixado em branco caso pretenda remover o seu endereço de correio eletrónico.\nNão será capaz de redefinir a sua palavra-passe nem receber mensagens eletrónicas desta wiki se efetuar esta operação.",
        "changeemail-none": "(nenhum)",
-       "changeemail-password": "A sua palavra-passe em {{SITENAME}}:",
+       "changeemail-password": "A sua palavra-passe na wiki {{SITENAME}}:",
        "changeemail-submit": "Alterar correio eletrónico",
        "changeemail-throttled": "Realizou demasiadas tentativas de início de sessão.\nAguarde $1 antes de tentar novamente, por favor.",
        "changeemail-nochange": "Por favor insira um novo endereço de e-mail.",
        "nonunicodebrowser": "<strong>Aviso: O seu navegador não é compatível com as especificações Unicode.</strong>\nFoi ativado um sistema de edição alternativo que lhe permite editar as páginas com segurança: os caracteres não-ASCII aparecerão na caixa de edição no formato de códigos hexadecimais.",
        "editingold": "'''Aviso: Está a editar uma revisão desatualizada desta página.'''\nSe gravar, todas as mudanças feitas a partir desta revisão serão perdidas.",
        "yourdiff": "Diferenças",
-       "copyrightwarning": "Note, por favor, que todas as suas contribuições na {{SITENAME}} são consideradas publicadas nos termos da licença $2 (consulte $1 para mais detalhes).\nSe não deseja que o seu texto possa ser inexoravelmente editado e redistribuído, não o envie.\nGarante-nos também que isto é algo escrito por si, ou copiado do domínio público ou de outra fonte de teor livre.<br />\n'''Não envie conteúdos cujos direitos de autor estão protegidos, sem ter a devida permissão!'''",
-       "copyrightwarning2": "Note, por favor, que todas as suas contribuições na {{SITENAME}} podem ser editadas, alteradas ou removidas por outros utilizadores.\nSe não deseja que o seu texto seja inexoravelmente editado, não o envie.<br />\nGarante-nos também que isto é algo escrito por si, ou copiado do domínio público ou de outra fonte de teor livre (consulte $1 para mais detalhes).<br />\n'''Não envie conteúdos cujos direitos de autor estão protegidos, sem ter a devida permissão!'''",
+       "copyrightwarning": "Note, por favor, que todas as suas contribuições na wiki {{SITENAME}} são consideradas publicadas nos termos da licença $2 (consulte $1 para mais detalhes).\nSe não deseja que o seu texto possa ser inexoravelmente editado e redistribuído, não o envie.\nGarante-nos também que isto é algo escrito por si, ou copiado do domínio público ou de outra fonte de teor livre.<br />\n<strong>Não envie conteúdos cujos direitos de autor estão protegidos, sem ter a devida permissão!</strong>",
+       "copyrightwarning2": "Note, por favor, que todas as suas contribuições na wiki {{SITENAME}} podem ser editadas, alteradas ou removidas por outros utilizadores.\nSe não deseja que o seu texto seja inexoravelmente editado, não o envie.<br />\nGarante-nos também que isto é algo escrito por si, ou copiado do domínio público ou de outra fonte de teor livre (consulte $1 para mais detalhes).<br />\n<strong>Não envie conteúdos cujos direitos de autor estão protegidos, sem ter a devida permissão!</strong>",
        "editpage-cannot-use-custom-model": "O modelo de conteúdo desta página não pode ser alterado.",
        "longpageerror": "'''Erro: O texto que submeteu ocupa {{PLURAL:$1|um kilobyte|$1 kilobytes}}, que excede o máximo de {{PLURAL:$2|um kilobyte|$2 kilobytes}}.'''\nA página não pode ser gravada.",
        "readonlywarning": "<strong>Atenção: A base de dados foi bloqueada para manutenção, pelo que não poderá gravar as suas edições neste momento.</strong>\nPode, contudo, copiar e colar o seu texto num ficheiro de texto e guardá-lo para mais tarde.\n\nO administrador do sistema que a bloqueou forneceu a seguinte explicação: $1",
        "template-semiprotected": "(semi-protegida)",
        "hiddencategories": "Esta página pertence a {{PLURAL:$1|uma categoria oculta|$1 categorias ocultas}}:",
        "edittools": "<!-- O texto colocado aqui será mostrado abaixo dos formulários de edição e de envio de ficheiros. -->",
-       "nocreatetext": "A {{SITENAME}} restringe a criação de páginas novas por utilizadores anónimos.\nPode voltar atrás e editar uma página já existente, ou [[Special:UserLogin|inicie sessão ou criar uma conta]].",
+       "nocreatetext": "A wiki {{SITENAME}} restringe a criação de páginas novas por utilizadores anónimos.\nPode voltar atrás e editar uma página já existente, ou [[Special:UserLogin|iniciar uma sessão ou criar uma conta]].",
        "nocreate-loggedin": "Não possui permissão para criar novas páginas.",
        "sectioneditnotsupported-title": "Edição de secções não suportada",
        "sectioneditnotsupported-text": "A edição de secções não é suportada nesta página de edição.",
        "permissionserrorstext": "Não possui permissão para fazer isso, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "permissionserrorstext-withaction": "Não possui permissão para $2, {{PLURAL:$1|pelo seguinte motivo|pelos seguintes motivos}}:",
        "contentmodelediterror": "Não pode editar esta revisão pois seu modelo de conteúdo é <code>$1</code>, que é diferente do modelo atual da página <code>$2</code>.",
-       "recreate-moveddeleted-warn": "'''Aviso: Está a recriar uma página anteriormente eliminada.'''\n\nVerifique se é apropriado continuar a editar esta página.\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
-       "moveddeleted-notice": "Esta página foi eliminada.\nPara referência, é apresentado de seguida o registo de eliminações e de movimento da página.",
+       "recreate-moveddeleted-warn": "<strong>Aviso: Está a recriar uma página anteriormente eliminada.</strong>\n\nVerifique se é apropriado continuar a editar esta página.\nPara sua conveniência, é apresentado abaixo o registo de eliminação e movimentação da página:",
+       "moveddeleted-notice": "Esta página foi eliminada.\nPara sua referência, é apresentado abaixo o registo de eliminação e movimentação da página.",
        "moveddeleted-notice-recent": "Desculpe, esta página foi eliminada recentemente (nas últimas 24 horas).\nA exclusão e registo de movimentação para a página são fornecidos abaixo para referência.",
        "log-fulllog": "Ver registo detalhado",
        "edit-hook-aborted": "A edição foi abortada por um hook.\nNão foi dada nenhuma explicação.",
        "powersearch-togglenone": "Nenhum",
        "powersearch-remember": "Lembrar seleção para pesquisas futuras",
        "search-external": "Pesquisa externa",
-       "searchdisabled": "Foi impossibilitada a realização de pesquisas na {{SITENAME}}.\nEntretanto, pode realizar pesquisas através do Google.\nNote, no entanto, que a indexação da {{SITENAME}} neste motor de busca pode estar desatualizada.",
+       "searchdisabled": "Foi impossibilitada a realização de pesquisas na wiki {{SITENAME}}.\nEntretanto, pode realizar pesquisas através do Google.\nNote, no entanto, que a indexação da wiki {{SITENAME}} neste motor de busca pode estar desatualizada.",
        "search-error": "Um erro ocorreu enquanto se efectuava a pesquisa: $1",
        "preferences": "Preferências",
        "mypreferences": "Preferências",
        "prefs-help-recentchangescount": "Inclui mudanças recentes, histórico de páginas e registos.",
        "prefs-help-watchlist-token2": "Esta é a chave secreta para o ''feed'' RSS da sua lista de páginas vigiadas.\nQualquer pessoa que conheça a chave será capaz de ler a sua lista de páginas vigiadas, por isso não a divulgue.\n[[Special:ResetTokens|Clique aqui para redefini-la]].",
        "savedprefs": "As suas preferências foram gravadas.",
-       "savedrights": "Os privilégios de utilizador para {{GENDER:$1|$1}} foram gravados.",
+       "savedrights": "Os grupos {{GENDER:$1|do utilizador|da utilizadora}} $1 foram gravados.",
        "timezonelegend": "Fuso horário:",
        "localtime": "Hora local:",
        "timezoneuseserverdefault": "Usar padrão da wiki ($1)",
        "prefswarning-warning": "Fez alterações às suas preferências que não foram gravadas ainda.\nSe abandonar esta página sem clicar em \"$1\", as suas preferências não serão atualizadas.",
        "prefs-tabs-navigation-hint": "Dica: Pode usar as setas direita e esquerda do teclado para navegar entre os separadores.",
        "userrights": "Gestão de privilégios {{GENDER:{{BASEPAGENAME}}|do utilizador|da utilizadora|de utilizador(a)}}",
-       "userrights-lookup-user": "Gerir grupos de utilizadores",
+       "userrights-lookup-user": "Selecionar um utilizador",
        "userrights-user-editname": "Introduza um nome de utilizador(a):",
-       "editusergroup": "Editar grupos {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
+       "editusergroup": "Carregar grupos do utilizador",
        "editinguser": "A modificar os privilégios {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}  <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Editar grupos {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
        "saveusergroups": "Gravar grupos {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}}",
        "userrights-reason": "Motivo:",
        "userrights-no-interwiki": "Não tem permissões para alterar os privilégios de utilizadores noutras wikis.",
        "userrights-nodatabase": "A base de dados $1 não existe ou não é uma base de dados local.",
-       "userrights-nologin": "Precisa de [[Special:UserLogin|iniciar sessão]] com uma conta de administrador para atribuir privilégios aos utilizadores.",
-       "userrights-notallowed": "A sua conta não tem permissão para adicionar ou remover privilégios a utilizadores.",
        "userrights-changeable-col": "Grupos que pode alterar",
        "userrights-unchangeable-col": "Grupos que não pode alterar",
        "userrights-conflict": "Conflito entre alterações de privilégios de utilizador! Por favor, reveja e confirme as suas mudanças.",
-       "userrights-removed-self": "Removeu os seus privilégios. Como resultado disto, já não consegue aceder a esta página.",
        "group": "Grupo:",
        "group-user": "Utilizadores",
        "group-autoconfirmed": "Utilizadores autoconfirmados",
        "right-reupload-shared": "Sobrescrever localmente ficheiros no repositório partilhado de imagens",
        "right-upload_by_url": "Carregar um ficheiro de um endereço URL",
        "right-purge": "Limpar a ''cache'' de uma página no servidor sem confirmação",
-       "right-autoconfirmed": "Não ser afetado pelos limites de frequência baseados no número de IP",
+       "right-autoconfirmed": "Não ser afetado pelos limites de frequência de edição baseados em endereços IP",
        "right-bot": "Ser tratado como um processo automatizado",
        "right-nominornewtalk": "Não desencadear o aviso de mensagens novas ao fazer edições menores a páginas de discussão",
        "right-apihighlimits": "Usar limites superiores nas consultas ''(queries)'' via API",
        "right-blockemail": "Impedir um utilizador de enviar correio eletrónico",
        "right-hideuser": "Bloquear um nome de utilizador, escondendo-o do público",
        "right-ipblock-exempt": "Contornar bloqueios de IP, bloqueios automáticos e bloqueios de gamas de IP",
-       "right-unblockself": "Desbloquearem-se a si próprios",
+       "right-unblockself": "Desbloquear-se a si próprio",
        "right-protect": "Mudar níveis de proteção e editar páginas protegidas em cascata",
        "right-editprotected": "Editar páginas protegidas com \"{{int:protect-level-sysop}}\"",
        "right-editsemiprotected": "Editar páginas protegidas com \"{{int:protect-level-autoconfirmed}}\"",
        "right-editmyoptions": "Editar as suas próprias preferências",
        "right-rollback": "Reverter rapidamente as edições do último utilizador que editou uma página em particular",
        "right-markbotedits": "Marcar edições revertidas como edições de robô",
-       "right-noratelimit": "Não ser afetado pelos limites de velocidade de operação",
+       "right-noratelimit": "Não ser afetado pelos limites de frequência de edição",
        "right-import": "Importar páginas de outras wikis",
        "right-importupload": "Importar páginas de um ficheiro xml",
        "right-patrol": "Marcar edições de outros utilizadores como patrulhadas",
        "right-siteadmin": "Bloquear e desbloquear a base de dados",
        "right-override-export-depth": "Exportar páginas incluindo páginas ligadas até uma profundidade de 5",
        "right-sendemail": "Enviar correio eletrónico a outros utilizadores",
-       "right-passwordreset": "Ver mensagens de redefinição da palavra-passe",
        "right-managechangetags": "Criar e (des)ativar [[Special:Tags|etiquetas]]",
        "right-applychangetags": "Aplicar [[Special:Tags|etiquetas]] juntamente com as alterações",
        "right-changetags": "Adicionar ou remover [[Special:Tags|etiquetas]] arbitrárias em revisões e entradas de registo individuais",
        "action-history": "ver histórico desta página",
        "action-minoredit": "marcar esta edição como uma edição menor",
        "action-move": "mover esta página",
-       "action-move-subpages": "mover esta página e as respectivas subpáginas",
+       "action-move-subpages": "mover esta página e as respetivas subpáginas",
        "action-move-rootuserpages": "mover páginas raiz de utilizadores",
        "action-move-categorypages": "mover categorias",
        "action-movefile": "mover este ficheiro",
        "enhancedrc-history": "histórico",
        "recentchanges": "Mudanças recentes",
        "recentchanges-legend": "Opções das mudanças recentes",
-       "recentchanges-summary": "Acompanha nesta página as mudanças mais recentes desta wiki.",
-       "recentchanges-noresult": "Nenhuma alteração correspondente a esses critérios foi realizada durante o período selecionado.",
+       "recentchanges-summary": "Acompanhe nesta página as mudanças mais recentes da wiki.",
+       "recentchanges-noresult": "Não foi realizada nenhuma alteração correspondente a esses critérios durante o período selecionado.",
        "recentchanges-feed-description": "Acompanhe neste ''feed'' as mudanças mais recentes da wiki.",
        "recentchanges-label-newpage": "Esta edição criou uma nova página",
        "recentchanges-label-minor": "Esta é uma edição menor",
        "upload_directory_missing": "O diretório de carregamento de ficheiros ($1) não existe e o servidor de Internet não conseguiu criá-lo.",
        "upload_directory_read_only": "O servidor de Internet não possui permissão de escrita no diretório de carregamento de ficheiros ($1).",
        "uploaderror": "Erro ao carregar",
-       "upload-recreate-warning": "'''Aviso: Um ficheiro com esse nome foi eliminado ou movido.'''\n\nPara sua conveniência, é apresentado de seguida o registo de eliminação e de movimento da página:",
+       "upload-recreate-warning": "<strong>Aviso: Um ficheiro com esse nome foi eliminado ou movido.</strong>\n\nPara sua conveniência, é apresentado abaixo o registo de eliminação e movimentação da página:",
        "uploadtext": "Utilize o formulário abaixo para fazer o carregamento de novos ficheiros.\nPara ver ou pesquisar ficheiros anteriormente enviados, consulte a [[Special:FileList|lista de ficheiros]].\nOs reenvios de um ficheiro são também registados no [[Special:Log/upload|registo de carregamentos]] e as eliminações no [[Special:Log/delete|registo de eliminações]].\n\nPara utilizar um ficheiro numa página, depois de ter feito o carregamento, insira uma ligação com um dos seguintes formatos:\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.jpg]]</nowiki></code>''' para mostrar uma imagem nas suas dimensões originais;\n* '''<code><nowiki>[[</nowiki>{{ns:file}}<nowiki>:ficheiro.png|200px|thumb|left|texto]]</nowiki></code>''' para mostrar uma imagem com a dimensão horizontal de 200 píxeis, dentro de uma caixa, na margem esquerda, contendo 'texto' como descrição (pode usar subconjuntos destas características);\n* '''<code><nowiki>[[</nowiki>{{ns:media}}<nowiki>:ficheiro.ogg]]</nowiki></code>''' para apresentar uma ligação direta para o ficheiro em vez de mostrá-lo, quer este tenha por conteúdo uma imagem ou outros dados.",
        "upload-permitted": "{{PLURAL:$2|Tipo|Tipos}} de ficheiro {{PLURAL:$2|permitido|permitidos}}: $1.",
        "upload-preferred": "{{PLURAL:$2|Tipo|Tipos}} de ficheiro {{PLURAL:$2|preferido|preferidos}}: $1.",
        "upload-prohibited": "{{PLURAL:$2|Tipo|Tipos}} de ficheiro {{PLURAL:$2|proibido|proibidos}}: $1.",
-       "uploadlogpage": "Registo de carregamento",
+       "uploadlogpage": "Registo de carregamentos",
        "uploadlogpagetext": "Segue-se uma lista dos carregamentos mais recentes.\nConsulte a [[Special:NewFiles|galeria de novos ficheiros]] para visioná-los.",
        "filename": "Nome do ficheiro",
        "filedesc": "Descrição do ficheiro",
        "upload-form-label-own-work": "Este é minha obra própria",
        "upload-form-label-infoform-categories": "Categorias",
        "upload-form-label-infoform-date": "Data",
-       "upload-form-label-own-work-message-generic-local": "Confirmo que estou a carregar este ficheiro segundo as condições de serviço e política de licenças de {{SITENAME}}.",
-       "upload-form-label-not-own-work-message-generic-local": "Se não é capaz de carregar este ficheiro sob as políticas de {{SITENAME}}, por favor feche esta janela e tente outro método.",
+       "upload-form-label-own-work-message-generic-local": "Confirmo que estou a carregar este ficheiro segundo as condições de serviço e política de licenças da wiki {{SITENAME}}.",
+       "upload-form-label-not-own-work-message-generic-local": "Se não pode carregar este ficheiro de acordo com as normas da wiki {{SITENAME}}, por favor feche esta janela e tente outro método.",
        "upload-form-label-not-own-work-local-generic-local": "Poderá querer experimentar [[Special:Upload|a página padrão de carregamento]].",
        "upload-form-label-own-work-message-generic-foreign": "Entendo que estou a carregar este ficheiro em um repositório partilhado. Confirmo que estou a fazê-lo cumprindo com os termos de serviço e com as políticas de licenciamento.",
        "upload-form-label-not-own-work-message-generic-foreign": "Se não é capaz de carregar este ficheiro sob as políticas do repositório partilhado, por favor feche esta janela e tente outro método.",
-       "upload-form-label-not-own-work-local-generic-foreign": "Pode querer tentar utilizar [[Special:Upload|a página de carregamento em {{SITENAME}}]], se este ficheiro puder ser carregado de acordo com suas as políticas.",
+       "upload-form-label-not-own-work-local-generic-foreign": "Pode querer tentar utilizar [[Special:Upload|a página de carregamento na wiki {{SITENAME}}]], se este ficheiro puder ser carregado de acordo com as normas da wiki.",
        "backend-fail-stream": "Não foi possível transmitir o ficheiro \"$1\".",
        "backend-fail-backup": "Não foi possível fazer cópia de segurança do ficheiro \"$1\".",
        "backend-fail-notexists": "O ficheiro $1 não existe.",
        "listfiles-latestversion-no": "Não",
        "file-anchor-link": "Ficheiro",
        "filehist": "Histórico do ficheiro",
-       "filehist-help": "Clique numa data/hora para ver o ficheiro tal como se encontrava nesse momento.",
+       "filehist-help": "Clique uma data e hora para ver o ficheiro tal como ele se encontrava nessa altura.",
        "filehist-deleteall": "eliminar todas",
        "filehist-deleteone": "eliminar",
        "filehist-revert": "restaurar",
        "imagelinks": "Uso do ficheiro",
        "linkstoimage": "{{PLURAL:$1|A seguinte página contém ligação|As seguintes $1 páginas contêm ligações}} para este ficheiro:",
        "linkstoimage-more": "Mais de {{PLURAL:$1|uma página contém ligação|$1 páginas contêm ligações}} para este ficheiro.\nA lista abaixo apresenta apenas {{PLURAL:$1|a primeira página|as primeiras $1 páginas}}.\nEncontra-se disponível uma [[Special:WhatLinksHere/$2|lista completa]].",
-       "nolinkstoimage": "Nenhuma página contém ligação para este ficheiro.",
+       "nolinkstoimage": "Não há nenhuma página que contenha ''links'' para este ficheiro.",
        "morelinkstoimage": "Ver a [[Special:WhatLinksHere/$1|lista completa]] de páginas que contêm ligações para este ficheiro.",
        "linkstoimage-redirect": "$1 (redirecionamento de ficheiro) $2",
        "duplicatesoffile": "{{PLURAL:$1|O seguinte ficheiro é duplicado|Os seguintes $1 ficheiros são duplicados}} deste ficheiro ([[Special:FileDuplicateSearch/$2|mais detalhes]]):",
        "statistics-pages": "Páginas",
        "statistics-pages-desc": "Todas as páginas da wiki, incluindo páginas de discussão, redirecionamentos, etc.",
        "statistics-files": "Ficheiros carregados",
-       "statistics-edits": "Edições de páginas desde que a {{SITENAME}} foi instalada",
+       "statistics-edits": "Edições de páginas desde que a wiki {{SITENAME}} foi instalada",
        "statistics-edits-average": "Média de edições por página",
        "statistics-users": "[[Special:ListUsers|Utilizadores]] registados",
        "statistics-users-active": "Utilizadores ativos",
        "ntransclusions": "usada {{PLURAL:$1|numa página|em $1 páginas}}",
        "specialpage-empty": "Não existem dados para apresentar.",
        "lonelypages": "Páginas órfãs",
-       "lonelypagestext": "As seguintes páginas não são destino de ligação nem são transcluídas a partir de outras páginas na {{SITENAME}}.",
+       "lonelypagestext": "As seguintes páginas não são destino de links nem são transcluídas a partir de outras páginas na wiki {{SITENAME}}.",
        "uncategorizedpages": "Páginas não categorizadas",
        "uncategorizedcategories": "Categorias não categorizadas",
        "uncategorizedimages": "Ficheiros não categorizados",
        "shortpages": "Páginas curtas",
        "longpages": "Páginas longas",
        "deadendpages": "Páginas sem saída",
-       "deadendpagestext": "As seguintes páginas não contêm ligações para outras páginas em {{SITENAME}}.",
+       "deadendpagestext": "As seguintes páginas não contêm links para outras páginas na wiki {{SITENAME}}.",
        "protectedpages": "Páginas protegidas",
        "protectedpages-indef": "Apenas proteções indefinidas",
        "protectedpages-summary": "Esta página lista páginas existentes que estão protegidas. Para ver os títulos cuja criação está impossibilitada, consulte [[{{#special:ProtectedTitles}}|{{int:protectedtitles}}]].",
        "apisandbox-continue": "Continuar",
        "apisandbox-continue-clear": "Limpar",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries continuará] o último pedido; {{int:apisandbox-continue-clear}} limpará os parâmetros relativos à continuação.",
+       "apisandbox-param-limit": "Introduza <kbd>max</kbd> para usar o limite máximo.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Todos os espaços nominais)",
+       "apisandbox-multivalue-all-values": "$1 (Todos os valores)",
        "booksources": "Fontes bibliográficas",
        "booksources-search-legend": "Pesquisar referências bibliográficas",
        "booksources-search": "Pesquisar",
        "logeventslist-submit": "Mostrar",
        "all-logs-page": "Todos os registos públicos",
        "alllogstext": "Apresentação combinada de todos os registos disponíveis na wiki {{SITENAME}}.\nPode reduzir a lista escolhendo um tipo de registo, um nome de utilizador ou um título de página. Respeite maiúsculas e minúsculas.",
-       "logempty": "Nenhum item correspondente no registo.",
+       "logempty": "Não existe nenhuma entrada correspondente no registo.",
        "log-title-wildcard": "Procurar títulos iniciados por este texto",
        "showhideselectedlogentries": "Mostrar ou ocultar as entradas selecionadas",
        "log-edit-tags": "Editar etiquetas das entradas de registo selecionadas",
        "allpagessubmit": "Ver",
        "allpagesprefix": "Apresentar páginas iniciadas por:",
        "allpagesbadtitle": "O título de página fornecido era inválido ou tinha um prefixo interlínguas ou interwikis.\nTalvez contenha um ou mais caracteres que não podem ser usados nos títulos.",
-       "allpages-bad-ns": "{{SITENAME}} não possui o domínio \"$1\".",
+       "allpages-bad-ns": "A wiki {{SITENAME}} não possui o espaço nominal \"$1\".",
        "allpages-hide-redirects": "Ocultar redirecionamentos",
        "cachedspecial-viewing-cached-ttl": "Está a ver uma versão desta página guardada na cache há pelo menos $1.",
        "cachedspecial-viewing-cached-ts": "Está a ver uma versão da página guardada na cache, que pode estar desatualizada.",
        "activeusers-count": "$1 {{PLURAL:$1|ação|ações}} {{PLURAL:$3|no último dia|nos últimos $3 dias}}",
        "activeusers-from": "Mostrar utilizadores começados por:",
        "activeusers-groups": "Apresentar os utilizadores que pertencem aos grupos:",
-       "activeusers-noresult": "Nenhum utilizador encontrado.",
+       "activeusers-excludegroups": "Excluir os utilizadores que pertencem aos grupos:",
+       "activeusers-noresult": "Não foram encontrados utilizadores.",
        "activeusers-submit": "Mostrar utilizadores ativos",
        "listgrouprights": "Privilégios dos grupos de utilizadores",
-       "listgrouprights-summary": "A seguinte lista contém os grupos de utilizadores definidos nesta wiki, com os respectivos privilégios de acesso.\nEncontram-se disponíveis [[{{MediaWiki:Listgrouprights-helppage}}|informações adicionais]] sobre privilégios individuais.",
+       "listgrouprights-summary": "A seguinte lista contém os grupos de utilizadores definidos nesta wiki, com os respetivos privilégios de acesso.\nEncontram-se disponíveis [[{{MediaWiki:Listgrouprights-helppage}}|informações adicionais]] sobre privilégios individuais.",
        "listgrouprights-key": "Legenda:\n* <span class=\"listgrouprights-granted\">Privilégio concedido</span>\n* <span class=\"listgrouprights-revoked\">Privilégio revogado</span>",
        "listgrouprights-group": "Grupo",
        "listgrouprights-rights": "Privilégios",
        "expensive-parserfunction-category-desc": "A página tem demasiadas funções do analisador custosas (como <code>#ifexist</code>) incluídas. Consulte [https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:$wgExpensiveParserFunctionLimit Manual:$wgExpensiveParserFunctionLimit].",
        "broken-file-category-desc": "A página contém uma ligação quebrada para um ficheiro (uma ligação para incorporar um ficheiro que não existe).",
        "hidden-category-category-desc": "Esta é uma categoria com a marca <code><nowiki>__HIDDENCAT__</nowiki></code>, que faz com que ela não apareça na caixa de ligações de categoria nas páginas, por omissão.",
-       "trackingcategories-nodesc": "Nenhuma descrição disponível.",
+       "trackingcategories-nodesc": "Sem descrição disponível.",
        "trackingcategories-disabled": "A categoria está desativada.",
        "mailnologin": "Não existe endereço de envio",
        "mailnologintext": "Precisa de estar [[Special:UserLogin|autenticado]] e ter um endereço de correio válido nas suas [[Special:Preferences|preferências]], para poder enviar correio eletrónico a outros utilizadores.",
        "emailuser-title-target": "Enviar correio eletrónico a {{GENDER:$1|este utilizador|esta utilizadora|este(a) utilizador(a)}}",
        "emailuser-title-notarget": "Enviar correio eletrónico ao utilizador",
        "emailpagetext": "Pode usar o formulário abaixo para enviar uma mensagem por correio eletrónico para {{GENDER:$1|este utilizador|esta utilizadora}}.\nO endereço de correio que introduziu nas [[Special:Preferences|suas preferências]] irá aparecer no campo do remetente da mensagem \"De:\", para que o destinatário lhe possa responder diretamente.",
-       "defemailsubject": "Correio eletrónico da {{SITENAME}}, {{GENDER:$1|do utilizador|da utilizadora|do(a) utilizador(a)}} \"$1\"",
+       "defemailsubject": "Correio eletrónico {{GENDER:$1|do utilizador|da utilizadora}} \"$1\" da wiki {{SITENAME}}",
        "usermaildisabled": "O correio eletrónico do utilizador foi desativado",
        "usermaildisabledtext": "Não pode enviar correio eletrónico a outros utilizadores desta wiki",
        "noemailtitle": "Sem endereço de correio eletrónico",
        "emailtarget": "Introduza o nome do(a) destinatário(a)",
        "emailusername": "Utilizador(a):",
        "emailusernamesubmit": "Enviar",
-       "email-legend": "Enviar uma mensagem a outro utilizador da {{SITENAME}}",
+       "email-legend": "Enviar uma mensagem a outro utilizador da wiki {{SITENAME}}",
        "emailfrom": "De:",
        "emailto": "Para:",
        "emailsubject": "Assunto:",
        "emailccsubject": "Cópia da sua mensagem para $1: $2",
        "emailsent": "Mensagem enviada",
        "emailsenttext": "A sua mensagem foi enviada.",
-       "emailuserfooter": "Esta mensagem foi {{GENDER:$1|enviada}} por $1 para {{GENDER:$2|$2}} através da opção \"{{int:emailuser}}\" em {{SITENAME}}.",
+       "emailuserfooter": "Esta mensagem foi {{GENDER:$1|enviada}} por $1 para {{GENDER:$2|$2}} através da opção \"{{int:emailuser}}\" da wiki {{SITENAME}}.",
        "usermessage-summary": "Deixar mensagem de sistema.",
        "usermessage-editor": "Editor de mensagens de sistema",
        "watchlist": "Páginas vigiadas",
        "wlshowhideliu": "utilizadores registados",
        "wlshowhideanons": "utilizadores anónimos",
        "wlshowhidepatr": "edições patrulhadas",
-       "wlshowhidemine": "minhas edições",
+       "wlshowhidemine": "edições minhas",
        "wlshowhidecategorization": "categorização de páginas",
        "watchlist-options": "Opções da lista de páginas vigiadas",
        "watching": "A vigiar...",
        "unwatching": "A deixar de vigiar...",
        "watcherrortext": "Ocorreu um erro ao alterar a configuração da sua lista de páginas vigiadas para \"$1\".",
        "enotif_reset": "Marcar todas as páginas como visitadas",
-       "enotif_impersonal_salutation": "Utilizador de {{SITENAME}}",
-       "enotif_subject_deleted": "A página  $1 de {{SITENAME}} foi {{GENDER:$2|eliminada}} por $2",
-       "enotif_subject_created": "A página $1 de {{SITENAME}} foi {{GENDER:$2|criada}} por $2",
-       "enotif_subject_moved": "A página $1 de {{SITENAME}} foi {{GENDER:$2|movida}} por $2",
-       "enotif_subject_restored": "A página $1 de {{SITENAME}} foi {{GENDER:$2|restaurada}} por $2",
-       "enotif_subject_changed": "A página $1 de {{SITENAME}} foi {{GENDER:$2|alterada}} por $2",
-       "enotif_body_intro_deleted": "A página $1 de {{SITENAME}} foi {{GENDER:$2|eliminada}} em $PAGEEDITDATE por $2, ver $3.",
-       "enotif_body_intro_created": "A página $1 em {{SITENAME}} foi {{GENDER:$2| criada}} em $PAGEEDITDATE por $2, ver $3 para a versão atual.",
-       "enotif_body_intro_moved": "A página $1 em {{SITENAME}} foi {{GENDER:$2|movida}} em $PAGEEDITDATE por $2, ver $3 para a versão atual.",
-       "enotif_body_intro_restored": "A página $1 em {{SITENAME}} foi {{GENDER:$2|restaurada}} em $PAGEEDITDATE por $2, ver $3 para a versão atual.",
-       "enotif_body_intro_changed": "A página $1 em {{SITENAME}} foi {{GENDER:$2|alterada}} em $PAGEEDITDATE por $2, ver $3 para a versão atual.",
+       "enotif_impersonal_salutation": "Utilizador da wiki {{SITENAME}}",
+       "enotif_subject_deleted": "A página $1 da wiki {{SITENAME}} foi eliminada {{GENDER:$2|pelo utilizador|pela utilizadora}} $2",
+       "enotif_subject_created": "A página $1 da wiki {{SITENAME}} foi criada {{GENDER:$2|pelo utilizador|pela utilizadora}} $2",
+       "enotif_subject_moved": "A página $1 da wiki {{SITENAME}} foi movida {{GENDER:$2|pelo utilizador|pela utilizadora}} $2",
+       "enotif_subject_restored": "A página $1 da wiki {{SITENAME}} foi restaurada {{GENDER:$2|pelo utilizador|pela utilizadora}} $2",
+       "enotif_subject_changed": "A página $1 da wiki {{SITENAME}} foi alterada {{GENDER:$2|pelo utilizador|pela utilizadora}} $2",
+       "enotif_body_intro_deleted": "A página $1 da wiki {{SITENAME}} foi eliminada a $PAGEEDITDATE {{GENDER:$2|pelo utilizador|pela utilizadora}} $2. Veja $3.",
+       "enotif_body_intro_created": "A página $1 da wiki {{SITENAME}} foi criada a $PAGEEDITDATE {{GENDER:$2|pelo utilizador|pela utilizadora}} $2. Veja a revisão atual em $3.",
+       "enotif_body_intro_moved": "A página $1 da wiki {{SITENAME}} foi movida a $PAGEEDITDATE {{GENDER:$2|pelo utilizador|pela utilizadora}} $2. Veja a revisão atual em $3.",
+       "enotif_body_intro_restored": "A página $1 da wiki {{SITENAME}} foi restaurada a $PAGEEDITDATE {{GENDER:$2|pelo utilizador|pela utilizadora}} $2. Veja a revisão atual em $3.",
+       "enotif_body_intro_changed": "A página $1 da wiki {{SITENAME}} foi alterada a  $PAGEEDITDATE {{GENDER:$2|pelo utilizador|pela utilizadora}} $2. Veja a revisão atual em $3.",
        "enotif_lastvisited": "Consulte $1 para todas as alterações efetuadas desde a sua última visita.",
        "enotif_lastdiff": "Consulte $1 para ver esta alteração.",
        "enotif_anon_editor": "utilizador anónimo $1",
-       "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumo da edição: $PAGESUMMARY $PAGEMINOREDIT\n\nContacte o editor:\ncorreio eletrónico: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté se autenticar e visitar novamente esta página, não receberá mais notificações das alterações futuras. Também pode reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da {{SITENAME}}\n\n--\nPara alterar as suas preferências de notificação por correio eletrónico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n$HELPPAGE",
+       "enotif_body": "{{GENDER:$WATCHINGUSERNAME|Caro|Cara|Caro(a)}} $WATCHINGUSERNAME,\n\n$PAGEINTRO $NEWPAGE\n\nResumo da edição: $PAGESUMMARY $PAGEMINOREDIT\n\nContacte o editor:\ncorreio eletrónico: $PAGEEDITOR_EMAIL\nwiki: $PAGEEDITOR_WIKI\n\nAté se autenticar e visitar novamente esta página, não receberá mais notificações das alterações futuras. Também pode reativar as notificações para todas páginas na sua lista de páginas vigiadas.\n\nO seu sistema de notificação amigável da wiki {{SITENAME}}\n\n--\nPara alterar as suas preferências de notificação por correio eletrónico, visite\n{{canonicalurl:{{#special:Preferences}}}}\n\nPara alterar as suas preferências das páginas vigiadas, visite\n{{canonicalurl:{{#special:EditWatchlist}}}}\n\nPara retirar a página da lista de páginas vigiadas, visite\n$UNWATCHURL\n\nPara comentários e pedidos de ajuda:\n$HELPPAGE",
        "created": "criada",
        "changed": "alterada",
        "deletepage": "Eliminar página",
        "deletereasonotherlist": "Outro motivo",
        "deletereason-dropdown": "* Motivos de eliminação comuns\n** Spam\n** Vandalismo\n** Violação de direitos de autor\n** Pedido do autor\n** Redirecionamento quebrado",
        "delete-edit-reasonlist": "Editar motivos de eliminação",
-       "delete-toobig": "Esta página tem um histórico longo, com mais de $1 {{PLURAL:$1|edição|edições}}.\nA eliminação de páginas como esta foi restringida na {{SITENAME}}, para evitar problemas acidentais.",
-       "delete-warning-toobig": "Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.\nEliminá-la poderá causar problemas na base de dados da {{SITENAME}};\nprossiga com precaução.",
+       "delete-toobig": "Esta página tem um histórico longo, com mais de $1 {{PLURAL:$1|edição|edições}}.\nA eliminação de páginas como esta foi restringida na wiki {{SITENAME}}, para evitar problemas acidentais.",
+       "delete-warning-toobig": "Esta página tem um histórico de edições longo, com mais de $1 {{PLURAL:$1|edição|edições}}.\nEliminá-la poderá causar problemas na base de dados da wiki {{SITENAME}};\nprossiga com precaução.",
        "deleteprotected": "Não é possível eliminar esta página porque foi protegida.",
        "deleting-backlinks-warning": "<strong>Aviso:</strong> Existem [[Special:WhatLinksHere/{{FULLPAGENAME}}|páginas]] que contêm ligações para a página que está prestes a eliminar ou que a transcluem.",
        "rollback": "Reverter edições",
        "logentry-contentmodel-change": "$1 {{GENDER:$2|alterou}} o modelo de conteúdo da página $3 de \"$4\" para \"$5\"",
        "logentry-contentmodel-change-revertlink": "reverter",
        "logentry-contentmodel-change-revert": "reverter",
-       "protectlogpage": "Registo de proteção",
+       "protectlogpage": "Registo de proteções",
        "protectlogtext": "Encontra abaixo o registo de proteção e desproteção de páginas.\nConsulte a [[Special:ProtectedPages|lista de páginas protegidas]] para ver as páginas que se encontram protegidas neste momento.",
        "protectedarticle": "protegeu \"[[$1]]\"",
        "modifiedarticleprotection": "alterou o nível de proteção para \"[[$1]]\"",
        "sp-contributions-blocked-notice": "Este utilizador está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-blocked-notice-anon": "Este endereço IP está bloqueado neste momento.\nPara referência é apresentado abaixo o último registo de bloqueio:",
        "sp-contributions-search": "Pesquisar contribuições",
-       "sp-contributions-username": "Endereço de IP ou utilizador(a):",
+       "sp-contributions-username": "Endereço IP ou nome de utilizador:",
        "sp-contributions-toponly": "Mostrar apenas as edições mais recentes",
        "sp-contributions-newonly": "Mostrar só edições que são criações de páginas",
        "sp-contributions-hideminor": "Ocultar edições menores",
        "whatlinkshere-hideimages": "$1 ligações para ficheiros",
        "whatlinkshere-filters": "Filtros",
        "whatlinkshere-submit": "Continuar",
-       "autoblockid": "Bloqueio automático nº$1",
+       "autoblockid": "Bloqueio automático nº $1",
        "block": "Bloquear utilizador(a)",
        "unblock": "Desbloquear utilizador",
        "blockip": "Bloquear {{GENDER:$1|utilizador|utilizadora|utilizador(a)}}",
        "blockip-legend": "Bloquear utilizador(a)",
        "blockiptext": "Utilize o formulário abaixo para bloquear o acesso de escrita a um endereço IP específico ou a um nome de utilizador(a).\nIsto só deve ser feito para prevenir vandalismo e de acordo com a [[{{MediaWiki:Policy-url}}|política]]. Indique a seguir um motivo de bloqueio específico (por exemplo, indicando as páginas que foram alvo de vandalismo).\nPode bloquear intervalos de endereços IP com a sintaxe [https://en.wikipedia.org/wiki/Classless_Inter-Domain_Routing CIDR]; o maior intervalo permitido é /$1 para IPv4 e /$2 para IPv6.",
-       "ipaddressorusername": "Endereço de IP ou utilizador(a):",
+       "ipaddressorusername": "Endereço IP ou nome de utilizador:",
        "ipbexpiry": "Expiração:",
        "ipbreason": "Motivo:",
        "ipbreason-dropdown": "*Razões comuns para um bloqueio\n** Inserção de informações falsas\n** Remoção de conteúdos de páginas\n** Inserção de \"spam\" para sítios externos\n** Inserção de conteúdo sem sentido/incompreensível nas páginas\n** Comportamento intimidador/inoportuno\n** Uso abusivo de contas múltiplas\n** Nome de utilizador inaceitável",
        "blocklist-userblocks": "Ocultar bloqueios de contas",
        "blocklist-tempblocks": "Ocultar bloqueios temporários",
        "blocklist-addressblocks": "Ocultar bloqueios de IP único",
-       "blocklist-rangeblocks": "Ocultar bloqueios de faixas",
+       "blocklist-rangeblocks": "Ocultar bloqueios de gamas",
        "blocklist-timestamp": "Data e hora",
        "blocklist-target": "Destinatário",
        "blocklist-expiry": "Expira",
        "contribslink": "contribs",
        "emaillink": "enviar correio eletrónico",
        "autoblocker": "Foi automaticamente bloqueado, porque o seu endereço IP foi recentemente usado por \"[[User:$1|$1]]\". \nO motivo apresentado para o bloqueio de $1 é: \"$2\".",
-       "blocklogpage": "Registo de bloqueio",
+       "blocklogpage": "Registo de bloqueios",
        "blocklog-showlog": "Este utilizador foi já bloqueado anteriormente.\nO registo de bloqueios é fornecido abaixo para referência:",
        "blocklog-showsuppresslog": "Este utilizador foi bloqueado e ocultado anteriomente.\nO registo de supressão é fornecido abaixo para referência:",
        "blocklogentry": "bloqueou \"[[$1]]\" por $2. $3",
        "unblock-hideuser": "Não pode desbloquear o utilizador, porque o nome deste utilizador foi oculto.",
        "ipb_cant_unblock": "Erro: O bloqueio com ID $1 não foi encontrado. Pode já ter sido desbloqueado.",
        "ipb_blocked_as_range": "Erro: O IP $1 não se encontra bloqueado de forma direta e não pode ser desbloqueado deste modo. No entanto, está bloqueado como parte da gama $2, a qual pode ser desbloqueada.",
-       "ip_range_invalid": "Gama de IP inválida.",
+       "ip_range_invalid": "Gama de endereços IP inválida.",
        "ip_range_toolarge": "Não são permitidas gamas de IP maiores do que /$1.",
        "proxyblocker": "Bloqueador de proxies",
        "proxyblockreason": "O seu endereço IP foi bloqueado por ser um ''proxy'' público.\nContacte o seu fornecedor de internet ou o serviço de apoio técnico e informe-os deste grave problema de segurança, por favor.",
-       "sorbsreason": "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}.",
-       "sorbs_create_account_reason": "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela {{SITENAME}}. Não pode criar uma conta",
+       "sorbsreason": "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela wiki {{SITENAME}}.",
+       "sorbs_create_account_reason": "O seu endereço IP encontra-se listado como ''proxy'' aberto na DNSBL utilizada pela wiki {{SITENAME}}. Não pode criar uma conta.",
        "xffblockreason": "Um endereço IP presente no cabeçalho X-Forwarded-For, seja seu ou de um servidor de proxy que estiver a usar, foi bloqueado. A razão do bloqueio original foi: $1",
        "cant-see-hidden-user": "O utilizador que está a tentar bloquear já está bloqueado e oculto.\nComo não tem o privilégio para ocultar utilizadores ''(hideuser)'', não pode ver ou editar o bloqueio deste utilizador.",
        "ipbblocked": "Não pode bloquear ou desbloquear outros, porque está bloqueado",
        "locknoconfirm": "Não marcou a caixa de confirmação.",
        "lockdbsuccesssub": "Base de dados foi bloqueada",
        "unlockdbsuccesssub": "Base de dados foi desbloqueada",
-       "lockdbsuccesstext": "A base de dados da {{SITENAME}} foi bloqueada.<br />\nLembre-se de [[Special:UnlockDB|remover o bloqueio]] após a manutenção.",
+       "lockdbsuccesstext": "A base de dados da wiki {{SITENAME}} foi bloqueada.<br />\nLembre-se de [[Special:UnlockDB|remover o bloqueio]] após a manutenção.",
        "unlockdbsuccesstext": "A base de dados foi desbloqueada.",
        "lockfilenotwritable": "O ficheiro de bloqueio da base de dados não pode ser escrito.\nPara bloquear ou desbloquear a base de dados, este precisa de poder ser escrito pelo servidor de internet.",
        "databaselocked": "A base de dados já está bloqueada.",
        "importbadinterwiki": "Ligação interlíngua incorreta",
        "importsuccess": "Importação completa!",
        "importnosources": "Não foram definidas as wikis das quais importar e o carregamento direto de históricos encontra-se desativado.",
-       "importnofile": "Nenhum ficheiro de importação foi carregado.",
+       "importnofile": "Não foi carregado nenhum ficheiro de importação.",
        "importuploaderrorsize": "O carregamento do ficheiro importado falhou.\nO ficheiro é maior do que o tamanho máximo permitido.",
        "importuploaderrorpartial": "O carregamento do ficheiro importado falhou.\nO ficheiro foi recebido parcialmente.",
        "importuploaderrortemp": "O carregamento do ficheiro importado falhou.\nNão há um diretório temporário.",
        "import-parse-failure": "Falha ao importar dados XML",
        "import-noarticle": "Sem páginas para importar!",
-       "import-nonewrevisions": "Nenhuma revisão foi importada (já estavam todas presentes ou foram ignoradas devido a erros).",
+       "import-nonewrevisions": "Não foi importada nenhuma revisão (já estavam todas presentes ou foram ignoradas devido a erros).",
        "xml-error-string": "$1 na linha $2, coluna $3 (byte $4): $5",
        "import-upload": "Enviar dados em XML",
        "import-token-mismatch": "Perda de dados da sessão.\n\nA sua sessão poderá ter sido encerrada. <strong>Por favor, verifique se ainda está autenticado e tente novamente</strong>. \nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite a utilização de ''cookies'' deste sítio.",
        "import-error-interwiki": "A página \"$1\" não pode ser importada pois o seu nome está reservado para um ligação externa (interlíngua).",
        "import-error-special": "A página \"$1\" não pode ser importada porque pertence a um domínio especial que não permite páginas.",
        "import-error-invalid": "A página \"$1\" não pode ser importada porque o seu nome é inválido nesta wiki.",
-       "import-error-unserialize": "Revisão $2 da página \"$1\" não pode ser desserializada. Foi relatado que a revisão usava o modelo de conteúdo $3 serializado como $4.",
+       "import-error-unserialize": "Não foi possível anular a seriação da revisão $2 da página \"$1\". Foi reportado que a revisão usava o modelo de conteúdo $3, seriado como $4.",
        "import-error-bad-location": "A revisão $2, que usa o modelo de conteúdo $3, não pode ser gravada em \"$1\" nesta wiki, porque o modelo não é suportado nessa página.",
        "import-options-wrong": "{{PLURAL:$2|Opção errada|Opções erradas}}: <nowiki>$1</nowiki>",
        "import-rootpage-invalid": "A raiz da página dada é um título inválido.",
        "tooltip-pt-preferences": "As {{GENDER:|suas}} preferências",
        "tooltip-pt-watchlist": "Lista de mudanças nas páginas que está a vigiar",
        "tooltip-pt-mycontris": "Lista das {{GENDER:|suas}} contribuições",
-       "tooltip-pt-anoncontribs": "Uma lista de edições feitas a partir deste endereço de IP",
+       "tooltip-pt-anoncontribs": "Uma lista de edições feitas a partir deste endereço IP",
        "tooltip-pt-login": "É encorajado que inicie sessão, apesar de não ser obrigatório.",
        "tooltip-pt-logout": "Sair da conta",
        "tooltip-pt-createaccount": "É encorajado a criar uma conta e iniciar sessão; no entanto, não é obrigatório",
        "tooltip-ca-move": "Mover esta página",
        "tooltip-ca-watch": "Adicionar esta página à lista de páginas vigiadas",
        "tooltip-ca-unwatch": "Remover esta página da lista de páginas vigiadas",
-       "tooltip-search": "Pesquisar em {{SITENAME}}",
+       "tooltip-search": "Pesquisar na wiki {{SITENAME}}",
        "tooltip-search-go": "Ir para uma página com este nome exacto, caso exista",
        "tooltip-search-fulltext": "Procurar páginas que contêm este texto",
        "tooltip-p-logo": "Visitar a página principal",
        "print.css": "/* Código CSS colocado aqui afectará as impressões */",
        "noscript.css": "/* Os estilos CSS colocados aqui afetarão os utilizadores que tenham o JavaScript desativado em seus navegadores */",
        "common.js": "/* Código Javascript colocado aqui será carregado para todos os utilizadores em cada carregamento de página */",
-       "anonymous": "{{PLURAL:$1|Utilizador anónimo|Utilizadores anónimos}} da {{SITENAME}}",
-       "siteuser": "$1 da {{SITENAME}}",
-       "anonuser": "utilizador anónimo $1 da {{SITENAME}}",
+       "anonymous": "{{PLURAL:$1|Utilizador anónimo|Utilizadores anónimos}} da wiki {{SITENAME}}",
+       "siteuser": "$1 da wiki {{SITENAME}}",
+       "anonuser": "utilizador anónimo $1 da wiki {{SITENAME}}",
        "lastmodifiedatby": "Esta página foi modificada pela última vez à(s) $2 de $1 por $3.",
        "othercontribs": "Baseado no trabalho de $1.",
        "others": "outros",
-       "siteusers": "{{PLURAL:$2|um utilizador|$2 utilizadores}} da {{SITENAME}} ($1)",
-       "anonusers": "{{PLURAL:$2|utilizador anónimo|utilizadores anónimos}} da {{SITENAME}} ($1)",
+       "siteusers": "{{PLURAL:$2|um utilizador|$2 utilizadores}} da wiki {{SITENAME}} ($1)",
+       "anonusers": "{{PLURAL:$2|utilizador anónimo|utilizadores anónimos}} da wiki {{SITENAME}} ($1)",
        "creditspage": "Créditos da página",
        "nocredits": "Não há informação disponível sobre os créditos desta página.",
        "spamprotectiontitle": "Filtro de proteção contra spam",
        "pageinfo-robot-noindex": "Não permitida",
        "pageinfo-watchers": "Número de vigilantes da página",
        "pageinfo-visiting-watchers": "Número de vigilantes que consultaram as edições recentes da página",
-       "pageinfo-few-watchers": "Menos do que $1 {{PLURAL:$1|vigilante|vigilantes}}",
+       "pageinfo-few-watchers": "Menos de $1 {{PLURAL:$1|vigilante|vigilantes}}",
        "pageinfo-few-visiting-watchers": "Pode ou não pode haver editores a vigiar as edições recentes",
        "pageinfo-redirects-name": "Número de redirecionamentos para esta página",
        "pageinfo-subpages-name": "Subpáginas desta página",
        "patrol-log-header": "Este é um registo de edições patrulhadas.",
        "log-show-hide-patrol": "$1 registo de edições patrulhadas",
        "log-show-hide-tag": "$1 registo de etiquetas",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Marcar a revisão $3 de $2 como patrulhada?",
        "deletedrevision": "Apagou a versão antiga $1",
        "filedeleteerror-short": "Erro ao eliminar ficheiro: $1",
        "filedeleteerror-long": "Foram encontrados erros ao tentar eliminar o ficheiro:\n\n$1",
        "monthsall": "todos",
        "confirmemail": "Confirmar endereço de correio eletrónico",
        "confirmemail_noemail": "Não tem um endereço de correio eletrónico válido nas suas [[Special:Preferences|preferências de utilizador]].",
-       "confirmemail_text": "{{SITENAME}} requer que valide o seu endereço de correio eletrónico antes de usar as funcionalidades de correio.\nClique o botão abaixo para enviar uma mensagem de confirmação para o seu endereço.\nA mensagem incluirá um URL que contém um código;\ninsira o URL no seu navegador para confirmar que o seu endereço de correio eletrónico é válido.",
+       "confirmemail_text": "A wiki {{SITENAME}} requer que valide o seu endereço de correio eletrónico antes de usar as funcionalidades de correio.\nClique o botão abaixo para enviar uma mensagem de confirmação para o seu endereço.\nA mensagem incluirá um URL que contém um código;\ninsira o URL no seu navegador para confirmar que o seu endereço de correio eletrónico é válido.",
        "confirmemail_pending": "Um código de confirmação já lhe foi enviado;\ncaso tenha criado a conta recentemente, é recomendado que aguarde alguns minutos até o receber antes de tentar pedir um novo código.",
        "confirmemail_send": "Enviar código de confirmação",
        "confirmemail_sent": "Correio de confirmação enviado.",
        "confirmemail_oncreate": "Foi enviado um código de confirmação para o seu endereço de correio eletrónico.\nEste código não é necessário para se autenticar no sistema, mas será necessário para ativar qualquer funcionalidade baseada no uso de correio na wiki.",
-       "confirmemail_sendfailed": "A {{SITENAME}} não conseguiu enviar a mensagem de confirmação.\nVerifique se o seu endereço de correio eletrónico tem caracteres inválidos.\n\nO sistema de correio devolveu o erro: $1",
+       "confirmemail_sendfailed": "A wiki {{SITENAME}} não conseguiu enviar a mensagem de confirmação.\nVerifique se o seu endereço de correio eletrónico tem caracteres inválidos.\n\nO sistema de correio devolveu o erro: $1",
        "confirmemail_invalid": "Código de confirmação inválido. O código pode ter expirado.",
        "confirmemail_needlogin": "Precisa de $1 para confirmar o seu endereço de correio eletrónico.",
        "confirmemail_success": "O seu endereço de correio eletrónico foi confirmado.\nPode agora [[Special:UserLogin|autenticar-se]] e desfrutar da wiki.",
        "confirmemail_loggedin": "O seu endereço de correio eletrónico foi confirmado.",
-       "confirmemail_subject": "Confirmação de endereço de correio eletrónico da {{SITENAME}}",
-       "confirmemail_body": "Alguém, provavelmente você a partir do endereço IP $1,\nregistou uma conta \"$2\" com este endereço de correio eletrónico em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e ativar\nas funcionalidades de correio eletrónico em {{SITENAME}}, abra a seguinte ligação no seu navegador:\n\n$3\n\nSe a conta *não* é sua, abra a seguinte ligação para cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
-       "confirmemail_body_changed": "Alguém, provavelmente você a partir do endereço IP $1,\nalterou o endereço de correio eletrónico da conta \"$2\" para este em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico em {{SITENAME}},\nabra o seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
-       "confirmemail_body_set": "Alguém, provavelmente você a partir do endereço IP $1,\ndefiniu o seu endereço de correio eletrónico como correio da conta \"$2\" em {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico em {{SITENAME}},\nabra a seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_subject": "Confirmação de endereço de correio eletrónico da wiki {{SITENAME}}",
+       "confirmemail_body": "Alguém, provavelmente você a partir do endereço IP $1,\nregistou uma conta \"$2\" com este endereço de correio eletrónico na wiki {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e ativar\nas funcionalidades de correio eletrónico na wiki {{SITENAME}}, abra a seguinte ligação no seu navegador:\n\n$3\n\nSe a conta *não* é sua, abra a seguinte ligação para cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body_changed": "Alguém, provavelmente você a partir do endereço IP $1,\nalterou o endereço de correio eletrónico da conta \"$2\" para este endereço, na wiki{{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico na wiki {{SITENAME}},\nabra a seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
+       "confirmemail_body_set": "Alguém, provavelmente você a partir do endereço IP $1,\ndefiniu o seu endereço de correio eletrónico como correio da conta \"$2\" na wiki {{SITENAME}}.\n\nPara confirmar que esta conta é realmente sua e reativar\nas funcionalidades de correio eletrónico na wiki {{SITENAME}},\nabra a seguinte ligação no seu navegador:\n\n$3\n\nCaso a conta *não* lhe pertença, abra a seguinte ligação\npara cancelar a confirmação do endereço de correio eletrónico:\n\n$5\n\nEste código de confirmação expira a $4.",
        "confirmemail_invalidated": "Confirmação de endereço de correio eletrónico cancelada",
        "invalidateemail": "Cancelar confirmação do correio eletrónico",
-       "notificationemail_subject_changed": "O endereço de correio eletrónico registado em {{SITENAME}} foi alterado",
-       "notificationemail_subject_removed": "O endereço de correio eletrónico registado em {{SITENAME}} foi removido",
-       "notificationemail_body_changed": "Alguém, provavelmente você, a partir do endereço IP $1, alterou o endereço de correio eletrónico da conta \"$2\" para \"$3\" em {{SITENAME}}.\n\nCaso não tenha alterado, contacte imediatamente um administrador do sítio.",
-       "notificationemail_body_removed": "Alguém, provavelmente você, a partir do endereço IP $1, eliminou o endereço de correio eletrónico da conta \"$2\" em {{SITENAME}}.\n\nCaso não tenha alterado, contacte imediatamente um administrador do sítio.",
+       "notificationemail_subject_changed": "O endereço de correio eletrónico registado na wiki {{SITENAME}} foi alterado",
+       "notificationemail_subject_removed": "O endereço de correio eletrónico registado na wiki {{SITENAME}} foi removido",
+       "notificationemail_body_changed": "Alguém, provavelmente você, a partir do endereço IP $1, alterou o endereço de correio eletrónico da conta \"$2\" para \"$3\" na wiki {{SITENAME}}.\n\nCaso não o tenha alterado, contacte imediatamente um administrador do sítio.",
+       "notificationemail_body_removed": "Alguém, provavelmente você, a partir do endereço IP $1, eliminou o endereço de correio eletrónico da conta \"$2\" na wiki {{SITENAME}}.\n\nCaso não o tenha eliminado, contacte imediatamente um administrador do sítio.",
        "scarytranscludedisabled": "[Transclusão interwikis foi impossibilitada]",
        "scarytranscludefailed": "[Não foi possível obter a predefinição a partir de $1]",
        "scarytranscludefailed-httpstatus": "[Não foi possível obter a predefinição a partir de $1: HTTP $2]",
        "specialpages-group-users": "Utilizadores e privilégios",
        "specialpages-group-highuse": "Páginas muito usadas",
        "specialpages-group-pages": "Listas de páginas",
-       "specialpages-group-pagetools": "Ferramentas de páginas",
+       "specialpages-group-pagetools": "Ferramentas de página",
        "specialpages-group-wiki": "Dados e ferramentas",
-       "specialpages-group-redirects": "Redirecionar páginas especiais",
+       "specialpages-group-redirects": "Páginas especiais de redirecionamento",
        "specialpages-group-spam": "Ferramentas anti-spam",
        "specialpages-group-developer": "Ferramentas de desenvolvimento",
        "blankpage": "Página em branco",
        "tags-deactivate": "desativar",
        "tags-hitcount": "$1 {{PLURAL:$1|modificação|modificações}}",
        "tags-manage-no-permission": "Não possui permissão para gerir alterações de etiquetas.",
-       "tags-manage-blocked": "Não pode gerir alterações de etiquetas enquanto estiver bloqueado.",
+       "tags-manage-blocked": "Não pode gerir etiquetas de modificação enquanto estiver {{GENDER:$1|bloqueado|bloqueada}}.",
        "tags-create-heading": "Criar nova etiqueta",
        "tags-create-explanation": "Por definição, etiquetas recém-criadas estarão disponíveis para utilização por utilizadores e robôs.",
        "tags-create-tag-name": "Nome da etiqueta:",
        "tags-deactivate-not-allowed": "Não é possível desativar a etiqueta \"$1\".",
        "tags-deactivate-submit": "Desativar",
        "tags-apply-no-permission": "Não possui privilégios para aplicar alterações a etiquetas em conjunto com as suas modificações.",
-       "tags-apply-blocked": "Não pode aplicar etiquetas de modificação nas suas alterações enquanto estiver bloqueado(a).",
+       "tags-apply-blocked": "Não pode aplicar etiquetas de modificação nas suas alterações enquanto estiver {{GENDER:$1|bloqueado|bloqueada}}.",
        "tags-apply-not-allowed-one": "A etiqueta \"$1\" não pode ser aplicada manualmente.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta não pode ser aplicada|As seguintes etiquetas não podem ser aplicadas}} manualmente: $1",
        "tags-update-no-permission": "Não possui privilégios para adicionar ou remover etiquetas de revisões individuais ou entradas de registo.",
-       "tags-update-blocked": "Não pode adicionar ou remover etiquetas de modificação enquanto estiver bloqueado(a).",
+       "tags-update-blocked": "Não pode adicionar ou remover etiquetas de modificação enquanto estiver {{GENDER:$1|bloqueado|bloqueada}}.",
        "tags-update-add-not-allowed-one": "A etiqueta \"$1\" não pode ser adicionada manualmente.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|A seguinte etiqueta não pode ser adicionada|As seguintes etiquetas não podem ser adicionadas}} manualmente: $1",
        "tags-update-remove-not-allowed-one": "A remoção da etiqueta \"$1\" não é permitida.",
        "htmlform-user-not-exists": "<strong>$1</strong> não existe.",
        "htmlform-user-not-valid": "<strong>$1</strong> não é um nome de utilizador válido.",
        "logentry-delete-delete": "$1 apagou a página $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|eliminou}} o redirecionamento $3, sobrescrevendo-o",
        "logentry-delete-restore": "$1 restaurou a página $3",
        "logentry-delete-event": "$1 alterou a visibilidade de {{PLURAL:$5|uma entrada|$5 entradas}} em $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|alterou}} a visibilidade de {{PLURAL:$5|uma revisão|$5 revisões}} em $3: $4",
        "feedback-thanks": "Obrigado! O seu comentário foi adicionado à página \"[$2 $1]\".",
        "feedback-thanks-title": "Obrigado!",
        "feedback-useragent": "Agente de utilizador:",
-       "searchsuggest-search": "Pesquisar em {{SITENAME}}",
+       "searchsuggest-search": "Pesquisar na wiki {{SITENAME}}",
        "searchsuggest-containing": "contendo...",
-       "api-error-autoblocked": "O seu endereço de IP foi bloqueado automaticamente, pois foi utilizado por um utilizador bloqueado.",
+       "api-error-autoblocked": "O seu endereço IP foi bloqueado automaticamente, pois foi utilizado por um utilizador bloqueado.",
        "api-error-badaccess-groups": "Não tem permissão para enviar ficheiros para esta wiki.",
        "api-error-badtoken": "Erro interno: Chave incorrecta.",
        "api-error-blocked": "Foi bloqueado de editar.",
        "duration-centuries": "$1 {{PLURAL:$1|século|séculos}}",
        "duration-millennia": "$1 {{PLURAL:$1|milénio|milénios}}",
        "rotate-comment": "Imagem rodada em $1 {{PLURAL:$1|grau|graus}} no sentido dos ponteiros do relógio",
-       "limitreport-title": "Dados de perfis do analisador:",
+       "limitreport-title": "Dados de caracterização do analisador sintático:",
        "limitreport-cputime": "Tempo de utilização da CPU",
        "limitreport-cputime-value": "$1 {{PLURAL:$1|segundo|segundos}}",
        "limitreport-walltime": "Tempo real de utilização",
        "limitreport-templateargumentsize": "Tamanho dos argumentos da predefinição",
        "limitreport-templateargumentsize-value": "$1/$2 {{PLURAL:$2|byte|bytes}}",
        "limitreport-expansiondepth": "Profundidade máxima de expansão",
-       "limitreport-expensivefunctioncount": "Número de funções do analisador custosas",
+       "limitreport-expensivefunctioncount": "Número de funções exigentes do analisador sintático",
        "expandtemplates": "Expandir predefinições",
        "expand_templates_intro": "Esta página especial recebe um texto e expande recursivamente todas as predefinições nele existentes.\nTambém expande funções do analisador sintático ''(parser)'', tais como\n<nowiki>{{</nowiki>#language:...}}, e variáveis, como\n<nowiki>{{</nowiki>CURRENTDAY}}.\nNa verdade, expande tudo o que estiver entre chavetas duplas.",
        "expand_templates_title": "Título de contexto para {{FULLPAGENAME}} etc.:",
        "expand_templates_generate_xml": "Mostrar a árvore de análise sintáctica do XML",
        "expand_templates_generate_rawhtml": "Mostrar o HTML puro",
        "expand_templates_preview": "Antevisão do resultado",
-       "expand_templates_preview_fail_html": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de ter havido perda de dados da sessão, a pré-visualização ficará oculta como precaução contra ataques por JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor tente novamente.</strong>\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite a utilização de ''cookies'' deste sítio.",
-       "expand_templates_preview_fail_html_anon": "<em>Devido ao fato de {{SITENAME}} possuir código HTML puro ativado e de não ter sessão iniciada, a pré-visualização ficará oculta como precaução contra ataques do JavaScript.</em>\n\n<strong>Se esta é uma legítima tentativa de visualização, por favor [[Especial:UserLogin|inicie sessão]] e tente novamente.</strong>",
+       "expand_templates_preview_fail_html": "<em>Porque a wiki {{SITENAME}} permite código HTML puro e ocorreu uma perda de dados da sessão, a antevisão ficará ocultada como precaução contra ataques por JavaScript.</em>\n\n<strong>Se esta é uma tentativa legítima de visionamento, por favor tente novamente.</strong>\nCaso continue a não funcionar, tente [[Special:UserLogout|sair]] e voltar a entrar na sua conta, e verifique se o seu navegador permite que este site crie ''cookies''.",
+       "expand_templates_preview_fail_html_anon": "<em>Porque a wiki {{SITENAME}} permite código HTML puro e não iniciou uma sessão, a antevisão ficará ocultada como precaução contra ataques por JavaScript.</em>\n\n<strong>Se esta é uma tentativa legítima de visionamento, por favor [[Special:UserLogin|inicie uma sessão]] e tente novamente.</strong>",
        "expand_templates_input_missing": "Necessita de fornecer pelo menos algum texto de entrada.",
        "pagelanguage": "Alterar idioma da página",
        "pagelang-name": "Página",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (ativado)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>desativado</strong>)",
        "mediastatistics": "Estatísticas multimédia",
-       "mediastatistics-summary": "Estatísticas sobre os tipos de ficheiros carregados. Inclui apenas a versão mais recente do ficheiro. Versões antigas ou eliminadas são excluídas.",
+       "mediastatistics-summary": "Estatísticas sobre os tipos de ficheiro carregados. Inclui apenas a versão mais recente de cada ficheiro. Versões antigas ou eliminadas não estão incluídas.",
        "mediastatistics-nbytes": "{{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%)",
-       "mediastatistics-bytespertype": "Tamanho total dos ficheiros para esta secção: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
+       "mediastatistics-bytespertype": "Tamanho total dos ficheiros desta secção: {{PLURAL:$1|$1 byte|$1 bytes}} ($2; $3%).",
        "mediastatistics-allbytes": "Tamanho total de todos os ficheiros: {{PLURAL:$1|$1 byte|$1 bytes}} ($2).",
        "mediastatistics-table-mimetype": "Tipo MIME",
        "mediastatistics-table-extensions": "Extensões possíveis",
        "mediastatistics-header-total": "Todos os ficheiros",
        "json-warn-trailing-comma": "$1 {{PLURAL:$1|vírgula desnecessária foi removida|vírgulas desnecessárias foram removidas}} do código JSON",
        "json-error-unknown": "Houve um problema com o JSON. Erro: $1",
-       "json-error-depth": "A profundidade máxima da pilha foi excedida",
+       "json-error-depth": "A profundidade máxima do ''stack'' foi excedida",
        "json-error-state-mismatch": "Código JSON inválido ou mal formatado",
        "json-error-ctrl-char": "Erro de carácter de controlo, possivelmente codificado incorretamente",
        "json-error-syntax": "Erro de sintaxe",
        "special-characters-title-endash": "hífen",
        "special-characters-title-emdash": "travessão",
        "special-characters-title-minus": "sinal de subtração",
-       "mw-widgets-dateinput-no-date": "Nenhuma data selecionada",
+       "mw-widgets-dateinput-no-date": "Não foi selecionada nenhuma data",
        "mw-widgets-dateinput-placeholder-day": "AAAA-MM-DD",
        "mw-widgets-dateinput-placeholder-month": "AAAA-MM",
        "mw-widgets-titleinput-description-new-page": "a página ainda não existe.",
        "mw-widgets-titleinput-description-redirect": "redirecionar para $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Adicionar uma categoria...",
        "sessionmanager-tie": "Não se pode combinar múltiplas solicitações de tipos de autenticação: $1.",
        "sessionprovider-generic": "Sessões $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sessões baseadas em cookie",
        "log-action-filter-delete": "Tipo de eliminação:",
        "log-action-filter-import": "Tipo de importação:",
        "log-action-filter-managetags": "Tipo de ação de gestão de etiqueta:",
-       "log-action-filter-move": "Tipo do movimento:",
+       "log-action-filter-move": "Tipo de movimentação:",
        "log-action-filter-newusers": "Tipo de criação de conta:",
        "log-action-filter-patrol": "Tipo de patrulha:",
        "log-action-filter-protect": "Tipo de proteção:",
        "log-action-filter-suppress": "Tipo de supressão:",
        "log-action-filter-upload": "Tipo de carregamento:",
        "log-action-filter-all": "Todas",
-       "log-action-filter-block-block": "Bloquear",
+       "log-action-filter-block-block": "Bloqueio",
        "log-action-filter-block-reblock": "Alteração de bloqueio",
-       "log-action-filter-block-unblock": "Desbloquear",
-       "log-action-filter-contentmodel-change": "Edição de modelo de conteúdo",
-       "log-action-filter-contentmodel-new": "Criação de página com modelo de conteúdo desconhecido",
+       "log-action-filter-block-unblock": "Desbloqueio",
+       "log-action-filter-contentmodel-change": "Alteração de modelo de conteúdo",
+       "log-action-filter-contentmodel-new": "Criação de página com modelo de conteúdo não padronizado",
        "log-action-filter-delete-delete": "Eliminação de página",
+       "log-action-filter-delete-delete_redir": "Sobrescrição de redirecionamento",
        "log-action-filter-delete-restore": "Restauro de página",
        "log-action-filter-delete-event": "Eliminação de registo",
        "log-action-filter-delete-revision": "Eliminação de revisão",
-       "log-action-filter-import-interwiki": "Importação de transwiki",
+       "log-action-filter-import-interwiki": "Importação transwikis",
        "log-action-filter-import-upload": "Importação por carregamento XML",
        "log-action-filter-managetags-create": "Criação de etiqueta",
        "log-action-filter-managetags-delete": "Eliminação de etiqueta",
        "log-action-filter-managetags-activate": "Ativação de etiqueta",
        "log-action-filter-managetags-deactivate": "Desativação de etiqueta",
-       "log-action-filter-move-move": "Mover sem a substituição de páginas de redirecionamento",
-       "log-action-filter-move-move_redir": "Mover com a substituição de páginas de redirecionamento",
+       "log-action-filter-move-move": "Movimentação sem sobrescrever páginas de redirecionamento",
+       "log-action-filter-move-move_redir": "Movimentação sobrescrevendo páginas de redirecionamento",
        "log-action-filter-newusers-create": "Criação por utilizador anónimo",
        "log-action-filter-newusers-create2": "Criação por utilizador registado",
        "log-action-filter-newusers-autocreate": "Criação automática",
        "log-action-filter-protect-protect": "Proteção",
        "log-action-filter-protect-modify": "Alteração da proteção",
        "log-action-filter-protect-unprotect": "Desproteção",
-       "log-action-filter-protect-move_prot": "Proteção de movimentos",
+       "log-action-filter-protect-move_prot": "Proteção de movimentações",
        "log-action-filter-rights-rights": "Alteração manual",
        "log-action-filter-rights-autopromote": "Alteração automática",
        "log-action-filter-suppress-event": "Supressão de registo",
        "log-action-filter-suppress-block": "Supressão de utilizadores por bloqueio",
        "log-action-filter-suppress-reblock": "Supressão de utilizador por rebloqueio",
        "log-action-filter-upload-upload": "Novo carregamento",
-       "log-action-filter-upload-overwrite": "Recarregar",
+       "log-action-filter-upload-overwrite": "Recarregamento",
        "authmanager-authn-not-in-progress": "A autenticação não está em curso ou os dados da sessão foram perdidos. Comece novamente desde o princípio, por favor.",
        "authmanager-authn-no-primary": "As informações de identificação fornecidas não podem ser autenticadas.",
        "authmanager-authn-no-local-user": "As credenciais fornecidas não estão associadas a nenhum utilizador nesta wiki.",
        "usercssispublic": "Nota: As subpáginas de CSS não devem conter dados confidenciais porque podem ser vistas por outros utilizadores.",
        "restrictionsfield-badip": "Endereço IP (ou gama de endereços IP) inválido: $1",
        "restrictionsfield-label": "Gamas de endereços IP permitidas:",
-       "restrictionsfield-help": "Um endereço IP ou uma gama CIDR por linha. Para ativar todos,\nuse<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Erro: $1",
-       "edit-error-long": "Erros:\n\n$1"
+       "restrictionsfield-help": "Um endereço IP ou uma gama CIDR por linha. Para ativar todos,\nuse<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index b9a28c5..03458d1 100644 (file)
        "talk": "Used as display name for the tab to all {{msg-mw|Talk}} pages. These pages accompany all content pages and can be used for discussing the content page. Example: [[Talk:Example]].\n\nSee also:\n* {{msg-mw|Talk}}\n* {{msg-mw|Accesskey-ca-talk}}\n* {{msg-mw|Tooltip-ca-talk}}\n{{Identical|Discussion}}",
        "views": "Subtitle for the list of available views, for the current page. In \"monobook\" skin the list of views are shown as tabs, so this sub-title is not shown. For an example, see [{{canonicalurl:Main_Page|useskin=simple}} Main Page using simple skin].\n\n'''Note:''' This is \"views\" as in \"appearances\"/\"representations\", '''not''' as in \"visits\"/\"accesses\".\n{{Identical|View}}",
        "toolbox": "The title of the toolbox below the search menu.\n{{Identical|Tool}}",
-       "tool-link-userrights": "Link to [[Special:UserRights]] (user rights management) in the sidebar toolbox.\n\nParameters:\n* $1 - Name of user for the user group management (usable for GENDER)",
+       "tool-link-userrights": "Link to [[Special:UserRights]] (user rights management) in the sidebar toolbox, shown if the current user is allowed to change given user's groups.\n\nParameters:\n* $1 - Name of user for the user group management (usable for GENDER)",
+       "tool-link-userrights-readonly": "Link to [[Special:UserRights]] (user rights management) in the sidebar toolbox, shown if the current user is '''not''' allowed to change given user's groups.\n\nParameters:\n* $1 - Name of user for the user group management (usable for GENDER)",
        "tool-link-emailuser": "Link to [[Special:EmailUser]] (email user tool) in the sidebar toolbox.\n\nParameters:\n* $1 - Name of user who would receive the email\n\nSee also:\n* {{msg-mw|Emailuser-title-target}}",
        "userpage": "Used in user talk pages as the text of the link to the user page, with the Cologne Blue skin.",
        "projectpage": "Used as link text in Talk page of project page with the Cologne Blue skin.",
        "passwordreset-emaildisabled": "Used as error message in changing password when site's email feature is disabled.",
        "passwordreset-username": "{{Identical|Username}}",
        "passwordreset-domain": "A domain like used in Domain Name System (DNS) or more specifically like a domain component in the Lightweight Directory Access Protocol (LDAP).\n{{Identical|Domain}}",
-       "passwordreset-capture": "Label for checkbox asking the user whether they want to see the contents of the password reset email (only shown if they have the <code>passwordreset</code> permission).",
-       "passwordreset-capture-help": "Longer explanatory message for the capture checkbox label.",
        "passwordreset-email": "{{Identical|E-mail address}}",
        "passwordreset-emailtitle": "Used as subject (title) of email.",
        "passwordreset-emailtext-ip": "Be consistent with {{msg-mw|Passwordreset-emailtext-user}}.\n\nParameters:\n* $1 - an IP address\n* $2 - message {{msg-mw|Passwordreset-emailelement}} repeated $3 times\n* $3 - the number of repetitions in $2\n* $4 - base URL of the wiki\n* $5 - number of days",
        "passwordreset-emailelement": "This is a body of a password reset email to allow them into the system with a new password. Parameters:\n* $1 - the user's login name. This parameter can be used for GENDER.\n* $2 - the temporary password given by the system",
        "passwordreset-emailsentemail": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-emailsentusername": "Used in [[Special:PasswordReset]].\n\nSee also:\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
-       "passwordreset-emailsent-capture2": "Used in [[Special:PasswordReset]].\n\nParameters:\n* $1 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
-       "passwordreset-emailerror-capture2": "Error message displayed in [[Special:PasswordReset]] when sending an email fails. Parameters:\n* $1 - error message\n* $2 - username, used for GENDER\n* $3 - number of accounts notified\n\nSee also:\n* {{msg-mw|Passwordreset-emailsentemail}}\n* {{msg-mw|Passwordreset-emailsentusername}}\n* {{msg-mw|Passwordreset-emailsent-capture}}\n* {{msg-mw|Passwordreset-emailerror-capture}}",
        "passwordreset-nocaller": "Shown when a password reset was requested but the process failed due to an internal error related to missing details about the origin (caller) of the password reset request.",
        "passwordreset-nosuchcaller": "Shown when a password reset was requested but the username of the caller could not be resolved to a user. This is an internal error.\n\nParameters:\n* $1 - username of the caller",
        "passwordreset-ignored": "Shown when password reset was unsuccessful due to configuration problems.",
-       "passwordreset-invalideamil": "Returned when the email address is syntatically invalid.",
+       "passwordreset-invalidemail": "Returned when the email address is syntatically invalid.",
        "passwordreset-nodata": "Returned when no data was provided.",
        "changeemail": "Title of [[Special:ChangeEmail|special page]]. This page also allows removing the user's email address.",
        "changeemail-summary": "{{ignored}}",
        "prefs-help-recentchangescount": "Used in [[Special:Preferences]], tab \"Recent changes\".",
        "prefs-help-watchlist-token2": "Used in [[Special:Preferences]], tab Watchlist. (Formerly in {{msg-mw|prefs-help-watchlist-token}}.)",
        "savedprefs": "This message appears after saving changes to your user preferences.",
-       "savedrights": "This message appears after saving the user rights on [[Special:UserRights]].\n* $1 - The user name of the user which rights was saved.",
+       "savedrights": "This message appears after saving the user groups on [[Special:UserRights]].\n* $1 - The user name of the user which groups was saved.",
        "timezonelegend": "{{Identical|Time zone}}",
        "localtime": "Used as label in [[Special:Preferences#mw-prefsection-datetime|preferences]].",
        "timezoneuseserverdefault": "[[Special:Preferences]] > Date and time > Time zone\n\nThis option lets your time zone setting use the one that is used on the wiki (often UTC).\n\nParameters:\n* $1 - timezone name, or timezone offset (in \"%+03d:%02d\" format)",
        "userrights-summary": "{{doc-specialpagesummary|userrights}}",
        "userrights-lookup-user": "Label text when managing user rights ([[Special:UserRights]])",
        "userrights-user-editname": "Displayed on [[Special:UserRights]].",
-       "editusergroup": "Button name, in page [[Special:Userrights]] (only available to administrators), in the section named {{MediaWiki:userrights-lookup-user}}.\n\n{{Identical|Edit user groups}}.\nParameters:\n* $1 - username, for GENDER support",
+       "editusergroup": "Button name, in page [[Special:Userrights]], in the section named {{MediaWiki:userrights-lookup-user}}. The username or gender of the user is not known when this message is displayed.",
        "editinguser": "Appears on [[Special:UserRights]]. Parameters:\n* $1 - a plaintext username\n* $2 - user tool links. e.g. \"(Talk | contribs | block | send email)\"",
-       "userrights-editusergroup": "Parameter:\n* $1 - (Optional) a username, can be used for GENDER\n{{Identical|Edit user groups}}",
+       "userrights-editusergroup": "Parameter:\n* $1 - (Optional) a username, can be used for GENDER",
        "saveusergroups": "Button text when editing user groups.\nParameters:\n* $1 - username, for GENDER support",
        "userrights-groupsmember": "Used when editing user groups in [[Special:Userrights]].\n\nThe message is followed by a list of group names.\n\nParameters:\n* $1 - (Optional) the number of items in the list following the message, for PLURAL\n* $2 - (Optional) the user name, for GENDER",
        "userrights-groupsmember-auto": "Used when editing user groups in [[Special:Userrights]]. The message is followed by a list of group names.\n\n\"Implicit\" is for groups that the user was automatically added to (such as \"autoconfirmed\"); cf. {{msg-mw|userrights-groupsmember}}\n\nParameters:\n* $1 - (Optional) the number of items in the list following the message, for PLURAL\n* $2 - (Optional) the user name, for GENDER",
        "userrights-reason": "Text beside log field when editing user groups\n\n{{Identical|Reason}}",
        "userrights-no-interwiki": "Error message when editing user groups",
        "userrights-nodatabase": "Error message when editing user groups.\n\n\"Local\" means databases/wikis of the same farm/cluster; that is, meta, enwiki, dewiki, commons, etc are all local databases of the Wikimedia Foundation.\n\nSee [{{canonicalurl:meta:Special:Log|type=rights}} meta:Special:Log?type=rights] for a usage of local databases: username@barwiki\n\nParameters:\n* $1 - database name",
-       "userrights-nologin": "Error displayed on [[Special:UserRights]] when you aren't logged in.\n\nIf you are logged in, but don't have the correct permission, you see {{msg-mw|Userrights-notallowed}}.",
-       "userrights-notallowed": "Error displayed on [[Special:UserRights]] when you don't have the permission.",
        "userrights-changeable-col": "Used when editing user groups in [[Special:Userrights]].\n\nThe message is the head of a column of group assignments.\n\nParameters:\n* $1 - (Optional) for PLURAL use, the number of items in the column following the message. Avoid PLURAL, if your language can do without.",
        "userrights-unchangeable-col": "Used when editing user groups in [[Special:Userrights]]. The message is the head of a column of group assignments.\n\nParameters:\n* $1 - (Optional) for PLURAL use, the number of items in the column following the message. Avoid PLURAL, if your language allows that.",
        "userrights-irreversible-marker": "{{optional}}\nParameters:\n* $1 - group member",
        "userrights-conflict": "Shown on [[Special:UserRights]] if the target's rights have been changed since the form was loaded.",
-       "userrights-removed-self": "Shown on [[Special:UserRights]] in a green box after the user removed its own rights to access that page.",
        "group": "{{Identical|Group}}",
        "group-user": "{{doc-group|user}}\n{{Identical|User}}",
        "group-autoconfirmed": "{{doc-group|autoconfirmed}}\nOn Wikimedia sites autoconfirmed users are users which are older than 4 days. After those 4 days, they have more rights.",
        "right-siteadmin": "{{doc-right|siteadmin}}",
        "right-override-export-depth": "{{doc-right|override-export-depth}}",
        "right-sendemail": "{{doc-right|sendemail}}",
-       "right-passwordreset": "{{doc-right|passwordreset}}",
        "right-managechangetags": "{{doc-right|managechangetags}}",
        "right-applychangetags": "{{doc-right|applychangetags}}",
        "right-changetags": "{{doc-right|changetags}}",
        "grant-patrol": "Name for grant \"patrol\".\n{{Related|Grant}}",
        "grant-privateinfo": "Name for grant \"privateinfo\".\n{{Related|Grant}}",
        "grant-protect": "Name for grant \"protect\".\n{{Related|Grant}}",
-       "grant-rollback": "Name for grant \"rollback\".\n{{Related|Grant}}",
+       "grant-rollback": "Name for grant \"rollback\".\n{{Related|Grant}}\n{{Identical|Rollback}}",
        "grant-sendemail": "Name for grant \"sendemail\".\n{{Related|Grant}}",
        "grant-uploadeditmovefile": "Name for grant \"uploadeditmovefile\".\n{{Related|Grant}}",
        "grant-uploadfile": "Name for grant \"uploadfile\".\n{{Related|Grant}}\n{{Identical|Upload new file}}",
        "action-suppressionlog": "{{Doc-action|suppressionlog}}",
        "action-block": "{{Doc-action|block}}",
        "action-protect": "{{Doc-action|protect}}",
-       "action-rollback": "{{Doc-action|rollback}}",
+       "action-rollback": "{{Doc-action|rollback}}\n{{Identical|Rollback}}",
        "action-import": "{{Doc-action|import}}",
        "action-importupload": "{{Doc-action|importupload}}",
        "action-patrol": "{{Doc-action|patrol}}",
        "apisandbox-continue": "Button text for sending another request using query continuation.\n{{Identical|Continue}}",
        "apisandbox-continue-clear": "Button text for clearing query continuation parameters.\n{{Identical|Clear}}",
        "apisandbox-continue-help": "Help text for the continue and clear buttons.",
+       "apisandbox-param-limit": "Additional documentation text for 'limit'-type parameters.",
+       "apisandbox-multivalue-all-namespaces": "Used as an entry in a multiple-namespace widget to select all available namespaces. Parameters:\n* $1 - API input value meaning \"all namespaces\".",
+       "apisandbox-multivalue-all-values": "Used as an entry in a multiple-value widget to select all available values. Parameters:\n* $1 - API input value meaning \"all values\".",
        "booksources": "{{doc-special|BookSources}}\n\n'''This message shouldn't be changed unless it has serious mistakes.'''\n\nIt's used as the page name of the configuration page of [[Special:BookSources]]. Changing it breaks existing sites using the default version of this message.\n\nSee also:\n* {{msg-mw|Booksources|title}}\n* {{msg-mw|Booksources-text|text}}",
        "booksources-summary": "{{doc-specialpagesummary|booksources}}",
        "booksources-search-legend": "Box heading on [[Special:BookSources|book sources]] special page. The box is for searching for places where a particular book can be bought or viewed.",
        "activeusers-count": "Used in [[Special:ActiveUsers]] to show the active user's recent action count in brackets ([]).\n* $1 is the number of recent actions\n* $2 is the user's name for use with GENDER (optional)\n* $3 is the maximum number of days of the RecentChangesList",
        "activeusers-from": "Used as label for checkbox in the form on [[Special:ActiveUsers]].\n\nidentical with {{msg-mw|listusersfrom}}\n\nSee also:\n* {{msg-mw|activeusers|legend for the form}}",
        "activeusers-groups": "Used as label on [[Special:ActiveUsers]].",
+       "activeusers-excludegroups": "Used as an option on [[Special:ActiveUsers]].",
        "activeusers-noresult": "identical with {{msg-mw|listusers-noresult}}",
        "activeusers-submit": "Used as label for button in the form on [[Special:ActiveUsers]]",
        "listgrouprights": "The name of the special page [[Special:ListGroupRights]].",
        "listgrants-summary": "Explanatory text shown at the top of the grant/rights mapping table.\n\nRefers to {{msg-mw|Listgrouprights-helppage}}.",
        "listgrants-grant": "Used as table header for the grant/rights mapping table.\n{{Identical|Grant}}",
        "listgrants-rights": "Used as table header for the grant/rights mapping table.\n{{Identical|Right}}",
+       "listgrants-grant-display": "{{optional}}\nUsed to display the code name of a grant next to the grant. Parameters:\n* $1 - the text from the \"grant-...\" messages, i.e. {{msg-mw|Grant-highvolume}}\n* $2 - the codename of this grant",
        "trackingcategories": "[[Special:TrackingCategories]] page implementing list of Tracking categories [[mw:Special:MyLanguage/Help:Tracking categories|tracking category]].\n{{Identical|Tracking category}}",
        "trackingcategories-summary": "Description for [[Special:TrackingCategories]] page [[mw:Help:Tracking categories|tracking category]]",
        "trackingcategories-msg": "Header for the message column of the table on [[Special:TrackingCategories]]. This column lists the mediawiki message that controls the tracking category in question.\n{{Identical|Tracking category}}",
        "tags-deactivate": "Used on [[Special:Tags]]. Verb. Used as display text on a link to deactivate a tag.\n{{Identical|Delete}}",
        "tags-hitcount": "Shown in the \"{{msg-mw|Tags-hitcount-header}}\" column in [[Special:Tags]]. For more information on tags see [[mw:Manual:Tags|MediaWiki]].\n\nParameters:\n* $1 - the number of changes marked with the tag",
        "tags-manage-no-permission": "Error message on [[Special:Tags]]",
-       "tags-manage-blocked": "Error message on [[Special:Tags]]",
+       "tags-manage-blocked": "Error message on [[Special:Tags]]\n\nParameters:\n* $1 - user name for gender",
        "tags-create-heading": "The title of a fieldset, beneath which lies a form used to create a tag. For more information on tags see [[mw:Manual:Tags|MediaWiki]].",
        "tags-create-explanation": "The first paragraph of an explanation to tell users what they are about to do.",
        "tags-create-tag-name": "Form field label for the name of the tag to be created.",
        "tags-deactivate-not-allowed": "Error message on [[Special:Tags]]",
        "tags-deactivate-submit": "The label of the form \"submit\" button when the user is about to deactivate a tag.\n{{Identical|Deactivate}}",
        "tags-apply-no-permission": "Error message seen via the API when a user lacks the permission to apply change tags.",
-       "tags-apply-blocked": "Error message seen via the API when a user is blocked and attempted to apply change tags.",
+       "tags-apply-blocked": "Error message seen via the API when a user is blocked and attempted to apply change tags.\n\nParameters:\n* $1 - user name for gender",
        "tags-apply-not-allowed-one": "Error message seen via the API when a user tries to apply a single tag that is not properly defined. This message is only ever used in the case of 1 tag.\n\nParameters:\n* $1 - tag name",
        "tags-apply-not-allowed-multi": "Error message seen via the API when a user tries to apply more than one tag that is not properly defined.\n\nParameters:\n* $1 - comma-separated list of tag names\n* $2 - number of tags",
        "tags-update-no-permission": "Error message seen via the API when a user lacks the permission to add or remove change tags after the fact.",
-       "tags-update-blocked": "Error message seen via the API when a user is blocked and attempted to add or remove change tags after the fact.",
+       "tags-update-blocked": "Error message seen via the API when a user is blocked and attempted to add or remove change tags after the fact.\n\nParameters:\n* $1 - user name for gender",
        "tags-update-add-not-allowed-one": "Error message seen via the API when a user tries to add a single tag that is not properly defined. This message is only ever used in the case of 1 tag.\n\nParameters:\n* $1 - tag name",
        "tags-update-add-not-allowed-multi": "Error message seen via the API when a user tries to add more than one tag that is not properly defined.\n\nParameters:\n* $1 - comma-separated list of tag names\n* $2 - number of tags",
        "tags-update-remove-not-allowed-one": "Error message seen via the API when a user tries to remove a single tag that is not properly defined. This message is only ever used in the case of 1 tag.\n\nParameters:\n* $1 - tag name",
        "htmlform-user-not-valid": "Error message shown if the name provided by the user isn't a valid username. $1 is the username.",
        "rawmessage": "{{notranslate}} Used to pass arbitrary text as a message specifier array",
        "logentry-delete-delete": "{{Logentry|[[Special:Log/delete]]}}",
+       "logentry-delete-delete_redir": "{{Logentry|[[Special:Log/delete]]}}",
        "logentry-delete-restore": "{{Logentry|[[Special:Log/delete]]}}",
        "logentry-delete-event": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $5 - count of affected log events",
        "logentry-delete-revision": "{{Logentry|[[Special:Log/delete]]}}\n{{Logentryparam}}\n* $5 - the number of affected revisions of the page $3",
        "mediastatistics-header-audio": "Header on [[Special:MediaStatistics]] for file types that are in the audio category\n{{Identical|Audio}}",
        "mediastatistics-header-video": "Header on [[Special:MediaStatistics]] for file types that are in the video category\n{{Identical|Video}}",
        "mediastatistics-header-multimedia": "Header on [[Special:MediaStatistics]] for file types that are in the multimedia category. This does not include plain audio or video files, but more complex multimedia such as flash or vrml. This especially includes scripted multimedia. Ogg files in which MediaWiki cannot determine if it is an audio or video file (or something else) are included here.",
-       "mediastatistics-header-office": "Header on [[Special:MediaStatistics]] for file types that are in the Office category. This includes PDFs, OpenDocument files, Microsoft Word files, etc.",
+       "mediastatistics-header-office": "Header on [[Special:MediaStatistics]] for file types that are in the Office category. This includes PDFs, OpenDocument files, Microsoft Word files, etc.\n{{Identical|Office}}",
        "mediastatistics-header-text": "Header on [[Special:MediaStatistics]] for file types that are in the text category. This includes simple text formats, including plain text formats, json, csv, and xml. Source code of compiled programming languages may be included here in the future, but isn't currently.",
        "mediastatistics-header-executable": "Header on [[Special:MediaStatistics]] for file types that are in the executable category. This includes things like source files for interpreted programming language (Shell scripts, javascript, etc).",
        "mediastatistics-header-archive": "Header on [[Special:MediaStatistics]] for file types that are in the archive category. Includes things like tar, zip, gzip etc.",
        "mw-widgets-dateinput-no-date": "Label of a date input field when no date has been selected.",
        "mw-widgets-dateinput-placeholder-day": "[[File:DateInputWidget active, empty.png|frame|Screenshot]]\nPlaceholder displayed in a date input field when it's empty, representing a date format with 4 digits for year, 2 digits for month, and 2 digits for day, separated with hyphens. This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
        "mw-widgets-dateinput-placeholder-month": "Placeholder displayed in a date input field when it's empty, representing a date format with 4 digits for year and 2 digits for month, separated with hyphens (without a day). This should be uppercase, if possible, and must not include any additional explanations. If there is no good way to translate it, make this message blank.",
+       "mw-widgets-mediasearch-input-placeholder": "Place holder text for media search input",
+       "mw-widgets-mediasearch-noresults": "Label notifying the user no results were found for the media search.",
        "mw-widgets-titleinput-description-new-page": "Description label for a new page in the title input widget.",
        "mw-widgets-titleinput-description-redirect": "Description label for a redirect in the title input widget.",
+       "mw-widgets-categoryselector-add-category-placeholder": "Placeholder displayed in the category selector widget after the capsules of already added categories.",
        "sessionmanager-tie": "Used as an error message when multiple session sources are tied in priority.\n\nParameters:\n* $1 - List of dession type descriptions, from messages like {{msg-mw|sessionprovider-mediawiki-session-cookiesessionprovider}}.",
        "sessionprovider-generic": "Used to create a generic session type description when one isn't provided via the proper message. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.\n\nParameters:\n* $1 - PHP classname.",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "Description of the sessions provided by the CookieSessionProvider class, which use HTTP cookies. Should be phrased to make sense when added to a message such as {{msg-mw|cannotloginnow-text}}.",
        "sessionprovider-nocookies": "Used to inform the user that sessions may be missing due to lack of cookies.",
        "randomrootpage": "{{doc-special|RandomRootPage}}",
-       "log-action-filter-block": "{{doc-log-action-filter-type|block}}",
-       "log-action-filter-contentmodel": "{{doc-log-action-filter-type|contentmodel}}",
-       "log-action-filter-delete": "{{doc-log-action-filter-type|delete}}",
-       "log-action-filter-import": "{{doc-log-action-filter-type|import}}",
-       "log-action-filter-managetags": "{{doc-log-action-filter-type|managetags}}",
-       "log-action-filter-move": "{{doc-log-action-filter-type|move}}",
-       "log-action-filter-newusers": "{{doc-log-action-filter-type|newusers}}",
-       "log-action-filter-patrol": "{{doc-log-action-filter-type|patrol}}",
-       "log-action-filter-protect": "{{doc-log-action-filter-type|protect}}",
-       "log-action-filter-rights": "{{doc-log-action-filter-type|rights}}",
-       "log-action-filter-suppress": "{{doc-log-action-filter-type|suppress}}",
-       "log-action-filter-upload": "{{doc-log-action-filter-type|upload}}",
-       "log-action-filter-all": "{{doc-log-action-filter-type|all}}\n{{Identical|All}}",
+       "log-action-filter-block": "{{doc-log-action-filter-type|block}}\n{{related|Log-action-filter}}",
+       "log-action-filter-contentmodel": "{{doc-log-action-filter-type|contentmodel}}\n{{related|Log-action-filter}}",
+       "log-action-filter-delete": "{{doc-log-action-filter-type|delete}}\n{{related|Log-action-filter}}",
+       "log-action-filter-import": "{{doc-log-action-filter-type|import}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-managetags": "{{doc-log-action-filter-type|managetags}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-move": "{{doc-log-action-filter-type|move}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-newusers": "{{doc-log-action-filter-type|newusers}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-patrol": "{{doc-log-action-filter-type|patrol}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-protect": "{{doc-log-action-filter-type|protect}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-rights": "{{doc-log-action-filter-type|rights}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-suppress": "{{doc-log-action-filter-type|suppress}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-upload": "{{doc-log-action-filter-type|upload}}\n{{Related|Log-action-filter}}",
+       "log-action-filter-all": "{{doc-log-action-filter-type|all}}\n{{related|Log-action-filter}}\n{{Identical|All}}",
        "log-action-filter-block-block": "{{doc-log-action-filter-action|block|block}}\n{{Identical|Block}}",
        "log-action-filter-block-reblock": "{{doc-log-action-filter-action|block|reblock}}",
        "log-action-filter-block-unblock": "{{doc-log-action-filter-action|block|unblock}}\n{{Identical|Unblock}}",
        "log-action-filter-contentmodel-change": "{{doc-log-action-filter-action|contentmodel|change}}",
        "log-action-filter-contentmodel-new": "{{doc-log-action-filter-action|contentmodel|new}}",
        "log-action-filter-delete-delete": "{{doc-log-action-filter-action|delete|delete}}",
+       "log-action-filter-delete-delete_redir": "{{doc-log-action-filter-action|delete|delete_redir}}",
        "log-action-filter-delete-restore": "{{doc-log-action-filter-action|delete|restore}}",
        "log-action-filter-delete-event": "{{doc-log-action-filter-action|delete|event}}",
        "log-action-filter-delete-revision": "{{doc-log-action-filter-action|delete|revision}}",
        "usercssispublic": "A reminder to users that CSS subpages are not preferences but normal pages, and thus can be viewed by other users and the general public. This message is shown to a user whenever they are editing a subpage in their own user-space that ends in .css. See also {{msg-mw|userjsispublic}}",
        "restrictionsfield-badip": "An error message shown when one entered an invalid IP address or range in a restrictions field (such as Special:BotPassword). $1 is the IP address.",
        "restrictionsfield-label": "Field label shown for restriction fields (e.g. on Special:BotPassword).",
-       "restrictionsfield-help": "Placeholder text displayed in restriction fields (e.g. on Special:BotPassword).",
-       "edit-error-short": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-long}}\n{{Identical|Error}}",
-       "edit-error-long": "Error message. Parameters:\n* $1 - the error details\nSee also:\n* {{msg-mw|edit-error-short}}\n{{Identical|Error}}"
+       "restrictionsfield-help": "Placeholder text displayed in restriction fields (e.g. on Special:BotPassword)."
 }
index 6de7ea2..e1c2830 100644 (file)
        "yourname": "Rurak shuti:",
        "yourpassword": "Yaykunkapak rimay:",
        "yourpasswordagain": "Yaykunapak rimayta kutin killkapay:",
-       "remembermypassword": "Kay Internet-wampunapi {{PLURAL:$1|shuk punchata|$1 punchakunata}} ñuka rurak shutiwan yaykushkami katichiwapay.",
        "login": "Yaykuna",
        "nav-login-createaccount": "Yaykuna",
        "userlogin": "Yaykuna",
index 52111d3..6e54be3 100644 (file)
        "activeusers-intro": "Quai è ina glista dals utilisaders che han gì activitads {{PLURAL:$1|l'ultim di|en ils ultims $1 dis}}.",
        "activeusers-count": "$1 {{PLURAL:$1|acziun|acziuns}} {{PLURAL:$3|l'ultim di|ils ultims $3 dis}}",
        "activeusers-from": "Mussar utilisaders davent da:",
-       "activeusers-hidebots": "Zuppentar bots",
-       "activeusers-hidesysops": "Zuppentar administraturs",
        "activeusers-noresult": "Chattà nagins utilisaders.",
        "listgrouprights": "Dretgs da las gruppas d'utilisaders",
        "listgrouprights-summary": "Sutvart vegn mussada ina glista da las gruppas d'utilisaders sin questa wiki cun ils dretgs d'access associads.\nInfurmaziuns supplementaras davart ils singuls dretgs chattas [[{{MediaWiki:Listgrouprights-helppage}}|sin questa pagina]].",
index d113101..0d4a8b2 100644 (file)
        "passwordreset-emailelement": "Nume de utilizator: \n$1\n\nParolă temporară: \n$2",
        "passwordreset-emailsentemail": "Dacă această adresă de e-mail este asociată contului dumneavoastră, atunci se va trimite un e-mail de resetare a parolei.",
        "passwordreset-emailsentusername": "Dacă există o adresă de e-mail asociată acestui nume de utilizator, atunci se va trimite un e-mail de resetare a parolei.",
-       "passwordreset-invalideamil": "Adresă de e-mail nevalidă",
+       "passwordreset-invalidemail": "Adresă de e-mail nevalidă",
        "passwordreset-nodata": "Nu au fost furnizate un nume de utilizator sau o adresă de e-mail",
        "changeemail": "Modificare sau înlăturare adresă de e-mail",
        "changeemail-header": "Completați acest formular pentru a vă schimba adresa de e-mail. Dacă doriți să înlăturați orice asociere a unei adrese de e-mail cu contul dumneavoastră, lăsați necompletat câmpul pentru introducerea unei noi adrese de e-mail atunci când trimiteți formularul.",
        "activeusers-intro": "Aceasta este o listă cu utilizatorii care au avut orice fel de activitate în {{PLURAL:$1|ultima zi|ultimele $1 zile}}.",
        "activeusers-count": "{{PLURAL:$1|o acțiune|$1 acțiuni|$1 de acțiuni}} în {{PLURAL:$3|ultima zi|ultimele $3 zile|ultimele $3 de zile}}",
        "activeusers-from": "Afișează utilizatori începând cu:",
-       "activeusers-hidebots": "Ascunde roboții",
-       "activeusers-hidesysops": "Ascunde administratorii",
        "activeusers-noresult": "Niciun utilizator găsit.",
        "activeusers-submit": "Afișează utilizatorii activi",
        "listgrouprights": "Permisiuni grupuri de utilizatori",
index ad4e913..deeece5 100644 (file)
@@ -15,6 +15,7 @@
        "tog-hideminor": "Scunne le cangiaminde stuédeche jndr'à le cangiaminde recende",
        "tog-hidepatrolled": "Scunne le cangiaminde condrollate jndr'à le cangiaminde recende",
        "tog-newpageshidepatrolled": "Scunne le pàggene tenute sotte condrolle da l'elenghe de le pàggene nuève",
+       "tog-hidecategorization": "Scunne le categorije d'a vôsce",
        "tog-extendwatchlist": "Spanne l'elenghe de le pàggene condrollate pe fa vedè tutte le cangiaminde fatte, none sulamende l'urteme",
        "tog-usenewrc": "Cangiaminde d'u gruppe pe pàgene jndr'à le urteme cangiaminde e elenghe de le pàggene condrollate",
        "tog-numberheadings": "Testate auto-numerate",
@@ -25,6 +26,7 @@
        "tog-watchdefault": "Mitte le pàggene ca je agghie cangiate jndr'à le pàggene condrollate",
        "tog-watchmoves": "Mitte le pàggene ca je agghie spustate jndr'à le pàggene condrollate",
        "tog-watchdeletion": "Mitte le pàggene ca je agghie scangellate jndr'à le pàggene condrollate",
+       "tog-watchuploads": "Aggiunge file nuéve a l'elenghe de le pàggene condrollate",
        "tog-watchrollback": "Aggiunge le pàggene addò agghie fatte 'n'annullamende jndr'à l'elenghe de le pàggene condrollate",
        "tog-minordefault": "Pe convenzione signe tutte le cangiaminde cumme stuédeche",
        "tog-previewontop": "Fa vedè l'andeprime apprime d'a caselle de le cangiaminde",
@@ -42,6 +44,7 @@
        "tog-watchlisthidebots": "Scunne le cangiaminde de le bot da l'elenghe de le pàggene condrollate",
        "tog-watchlisthideminor": "Scunne le cangiaminde stuèdeche da l'elenghe de le pàggene condrollate",
        "tog-watchlisthideliu": "Scunne le cangiaminde de l'utinde canusciute da l'elenghe de le pàggene condrollate",
+       "tog-watchlistreloadautomatically": "Recareche automaticamende l'eleghe de le pàggene condrollate quanne cange 'nu filtre (richieste Javascript)",
        "tog-watchlisthideanons": "Scunne le cangiaminde de l'utinde scanusciute da l'elenghe de le pàggene condrollate",
        "tog-watchlisthidepatrolled": "Scunne le cangiaminde condrollate jndr'à l'elenghe de le pàggene condrollate",
        "tog-ccmeonemails": "Manneme 'na copie de le mail ca je manne a l'ôtre utinde",
        "october-date": "Ottommre $1",
        "november-date": "Novemmre $1",
        "december-date": "Decemmre $1",
+       "period-am": "AM",
+       "period-pm": "PM",
        "pagecategories": "{{PLURAL:$1|Categorije|Categorije}}",
        "category_header": "Pàggene jndr'à categorie \"$1\"",
        "subcategories": "Sotte Categorije",
        "morenotlisted": "Ste elenghe non g'è comblete.",
        "mypage": "'A pàgena meje",
        "mytalk": "'Ngazzaminde mie",
-       "anontalk": "'Ngazzaminde pe quiste IP",
+       "anontalk": "'Ngazzaminde",
        "navigation": "Naveghesce",
        "and": "&#32;e",
        "qbfind": "Cirche",
        "laggedslavemode": "Attenzione: 'A pàgene no ge tène cangiaminde recente.",
        "readonly": "Archivie blocchete",
        "enterlockreason": "Mitte 'na raggione p'u blocche, 'ncludenne 'na stime de quanne 'u blocche avène luate.",
-       "readonlytext": "'U database jndr'à stu mumende jè blocchete pe nueve 'nzereminde e otre cangiaminde, pò essere 'nu blocche pe 'na manutenziona de ''routine'', apprisse 'a quale torne tutte a poste.\n\nLe amministrature ca onne mise 'u blocche onne date sta motivazione: $1",
+       "readonlytext": "'U database jndr'à stu mumende ète bloccate pe 'nzereminde nuéve e otre cangiaminde, pò essere 'nu blocche pe 'na manutenziona de ''routine'', apprisse 'a quale torne tutte a poste.\n\nLe amministrature ca onne mise 'u blocche onne date sta mutivazione: $1",
        "missing-article": "'U database non ge iacchije 'u teste de 'na pàgene ca avesse acchià, nnomenete \"$1\" $2.\n\nStu fatte pò succedere quanne le collegaminde 'mbrà le differenze o le cunde non ge sonde aggiornete sus a 'na pàgene ca ha state scangellete.\n\nCe quiste non g'è 'u case, tu pò essere ca è 'cchiate 'nu bochere jndr'à 'u software.\nPe piacere manne 'na comunicazzione a 'n'[[Special:ListUsers/sysop|amministratore]], mettène jndr'à note pure l'URL.",
        "missingarticle-rev": "(versione#: $1)",
        "missingarticle-diff": "(Diff: $1, $2)",
index 78169e2..e567a2f 100644 (file)
        "views": "Просмотры",
        "toolbox": "Инструменты",
        "tool-link-userrights": "Изменить группы {{GENDER:$1|участника|участницы}}",
+       "tool-link-userrights-readonly": "Смотреть группы {{GENDER:$1|участника|участницы}}",
        "tool-link-emailuser": "Написать письмо {{GENDER:$1|участнику|участнице}}",
        "userpage": "Просмотреть страницу участника",
        "projectpage": "Просмотреть страницу проекта",
        "botpasswords-label-delete": "Удалить",
        "botpasswords-label-resetpassword": "Сбросить пароль",
        "botpasswords-label-grants": "Применимые разрешения:",
-       "botpasswords-help-grants": "Ð\93Ñ\80анÑ\82Ñ\8b Ñ\80азÑ\80еÑ\88иÑ\82Ñ\8c Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ðº Ð¿Ñ\80авам, ÐºÐ¾Ñ\82оÑ\80Ñ\8bми Ñ\83же Ð²Ð»Ð°Ð´ÐµÐµÑ\82 Ð\92аÑ\88ей Ñ\83Ñ\87еÑ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и Ð¿Ð¾Ð»Ñ\8cзоваÑ\82елÑ\8f. Ð\92клÑ\8eÑ\87ение Ð\93Ñ\80анÑ\82 Ð·Ð´ÐµÑ\81Ñ\8c Ð½Ðµ Ð¿Ñ\80едоÑ\81Ñ\82авлÑ\8fеÑ\82 Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ðº Ð»Ñ\8eбÑ\8bм Ð¿Ñ\80авам, Ñ\87Ñ\82о Ð²Ð°Ñ\88а Ñ\83Ñ\87еÑ\82наÑ\8f Ð·Ð°Ð¿Ð¸Ñ\81Ñ\8c Ð\9fолÑ\8cзоваÑ\82елÑ\8f Ð½Ðµ Ð±Ñ\83деÑ\82 Ð² Ð¿Ñ\80оÑ\82ивном Ñ\81лÑ\83Ñ\87ае. Ð¡Ð¼ [[Special:ListGrants|ТаблиÑ\86а Ð³Ñ\80анÑ\82ов]] для получения дополнительной информации.",
+       "botpasswords-help-grants": "Ð\9aаждое Ñ\80азÑ\80еÑ\88ение Ð´Ð°Ñ\91Ñ\82 Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ðº Ð¿ÐµÑ\80еÑ\87иÑ\81леннÑ\8bм Ð¿Ñ\80авам Ñ\83Ñ\87аÑ\81Ñ\82ника, ÐºÐ¾Ñ\82оÑ\80Ñ\8bе Ñ\83же ÐµÑ\81Ñ\82Ñ\8c Ñ\83 Ñ\83Ñ\87Ñ\91Ñ\82ной Ð·Ð°Ð¿Ð¸Ñ\81и Ñ\83Ñ\87аÑ\81Ñ\82ника. Ð¡Ð¼. [[Special:ListGrants|Ñ\82аблиÑ\86Ñ\83 Ñ\80азÑ\80еÑ\88ений]] для получения дополнительной информации.",
        "botpasswords-label-grants-column": "Разрешено",
        "botpasswords-bad-appid": "Имя бота «$1» является недопустимым.",
        "botpasswords-insert-failed": "Не удалось добавить бота с именем «$1». Возможно, он был уже добавлен?",
        "passwordreset-emaildisabled": "Функции электронной почты отключены в этой вики.",
        "passwordreset-username": "Имя участника:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Просмотреть получившееся письмо?",
-       "passwordreset-capture-help": "Если вы установите данную отметку, то вам будет показано письмо с временным паролем, отправляемое участнику.",
        "passwordreset-email": "Адрес электронной почты:",
        "passwordreset-emailtitle": "Сведения об учётной записи {{SITENAME}}",
        "passwordreset-emailtext-ip": "Кто-то (возможно, вы, с IP-адреса $1) запросил сброс пароля к вашей учётной записи в проекте {{SITENAME}} ($4).\nС этим адресом электронной почты {{PLURAL:$3|1=связана следующая учётная запись|связаны следующие учётные записи}}:\n\n$2\n\n{{PLURAL:$3|1=Этот временный пароль будет|Эти временные пароли будут}} действовать {{PLURAL:$5|$5 день|$5 дня|$5 дней|1=один день}}.\nВы должны представиться системе и выбрать новый пароль. \nЕсли вы не делали этого запроса, или вспомнили свой исходный пароль и не желаете его менять, \nто можете проигнорировать это сообщение и продолжить использовать свой старый пароль.",
        "passwordreset-emailelement": "Имя участника: \n$1\n\nВременный пароль: \n$2",
        "passwordreset-emailsentemail": "Если это адрес электронной почты связан с вашей учётной записью, вам будет отправлено письмо для сброса пароля.",
        "passwordreset-emailsentusername": "Если есть адрес электронной почты, связанный с этим именем участника, то будет отправлено письмо для восстановления пароля.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Письмо|Письма}} для сброса пароля {{PLURAL:$1|было отправлено|были отправлены}}. {{PLURAL:$1|Логин и пароль показаны|Список логинов и паролей показан}} здесь.",
-       "passwordreset-emailerror-capture2": "Отправка {{GENDER:$2|участнику|участнице}} письма по электронной почте не удалась: $1\n{{PLURAL:$3|Логин и пароль показаны|Список логинов и паролей показан}} здесь.",
        "passwordreset-nocaller": "Должен быть предоставлен источник вызова",
        "passwordreset-nosuchcaller": "Источник вызова не существует: $1",
        "passwordreset-ignored": "Сброс пароля не был обработан. Может быть, не был настроен ни один провайдер?",
-       "passwordreset-invalideamil": "Недопустимый адрес электронной почты",
+       "passwordreset-invalidemail": "Недопустимый адрес электронной почты",
        "passwordreset-nodata": "Ни имя участника, ни адрес электронной почты не были предоставлены",
        "changeemail": "Изменить или удалить адрес электронной почты",
        "changeemail-header": "Заполните эту форму, чтобы изменить свой адрес электронной почты. Если вы хотите отвязать свой адрес электронной почты от учётной записи, то при заполнении формы оставьте пустым поле нового адреса электронной почты.",
        "undo-failure": "Правка не может быть отменена из-за несовместимости промежуточных изменений.",
        "undo-norev": "Правка не может быть отменена, так как её не существует или она была удалена.",
        "undo-nochange": "Правка, похоже, уже была отменена.",
-       "undo-summary": "Отмена правки $1, сделанной {{GENDER:$2|участником|участницей}} [[Special:Contributions/$2|$2]] ([[User talk:$2|обс.]])",
+       "undo-summary": "Отмена правки $1, сделанной [[Special:Contributions/$2|$2]] ([[User talk:$2|обсуждение]])",
        "undo-summary-username-hidden": "Отмена правки $1, сделанной участником, чьё имя скрыто",
        "cantcreateaccount-text": "Создание учётных записей с этого IP-адреса ('''$1''') было заблокировано {{GENDER:$3|участником|участницей|}} [[User:$3|$3]].\n\n$3 {{GENDER:$3|указал|указала}} следующую причину: ''$2''.",
        "cantcreateaccount-range-text": "{{GENDER:$3|Участник|Участница}} [[User:$3|$3]] {{GENDER:$3|установил|установила}} запрет на создание учётных записей из диапазона IP-адресов <strong>$1</strong>, включающего ваш IP-адрес (<strong>$4</strong>). \n\nБыла указана следующая причина: $2.",
        "prefs-help-recentchangescount": "Включает свежие правки, истории страниц, журналы.",
        "prefs-help-watchlist-token2": "Это секретный ключ для веб-канала вашего списка наблюдений.\nЛюбой, кто знает его, сможет читать ваш список наблюдения, поэтому не сообщайте его другим. [[Special:ResetTokens|Нажмите здесь, если вам нужно сбросить его]].",
        "savedprefs": "Ваши настройки сохранены.",
-       "savedrights": "Ð\9fÑ\80ава пользователя {{GENDER:$1|$1}} были сохранены.",
+       "savedrights": "Ð\93Ñ\80Ñ\83ппÑ\8b пользователя {{GENDER:$1|$1}} были сохранены.",
        "timezonelegend": "Часовой пояс:",
        "localtime": "Местное время:",
        "timezoneuseserverdefault": "Использовать настройки сервера ($1)",
        "prefswarning-warning": "Вы внесли в свои настройки изменения, которые ещё не были сохранены.\nЕсли вы покинете эту страницу, не нажав «$1», настройки не будут обновлены.",
        "prefs-tabs-navigation-hint": "Совет: Вы можете использовать клавиши стрелок влево и вправо для перехода между вкладками в списке вкладок.",
        "userrights": "Управление правами участника",
-       "userrights-lookup-user": "УпÑ\80авление Ð³Ñ\80Ñ\83ппами Ñ\83Ñ\87аÑ\81Ñ\82ников",
+       "userrights-lookup-user": "Ð\92Ñ\8bбоÑ\80 Ñ\83Ñ\87аÑ\81Ñ\82ника",
        "userrights-user-editname": "Введите имя учётной записи:",
-       "editusergroup": "Ð\98змениÑ\82Ñ\8c Ð³Ñ\80Ñ\83ппÑ\8b {{GENDER:$1|Ñ\83Ñ\87аÑ\81Ñ\82ника|Ñ\83Ñ\87аÑ\81Ñ\82ниÑ\86Ñ\8b}}",
+       "editusergroup": "Ð\97агÑ\80Ñ\83зка Ð³Ñ\80Ñ\83пп Ñ\83Ñ\87аÑ\81Ñ\82ников",
        "editinguser": "Изменение прав {{GENDER:$1|участника|участницы}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Изменение членства в группах",
        "saveusergroups": "Сохранить группы {{GENDER:$1|участника|участницы}}",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "У вас нет разрешения изменять права участников в других вики.",
        "userrights-nodatabase": "База данных $1 не существует или расположена не локально.",
-       "userrights-nologin": "Вы должны [[Special:UserLogin|представиться системе]] с учётной записи администратора, чтобы присваивать права участникам.",
-       "userrights-notallowed": "У вас нет разрешения добавлять и удалять права участников.",
        "userrights-changeable-col": "Группы, которые вы можете изменять",
        "userrights-unchangeable-col": "Группы, которые вы не можете изменять",
        "userrights-conflict": "Конфликт изменения прав участника! Пожалуйста, проверьте и примените изменения заново.",
-       "userrights-removed-self": "Вы удалили собственные права. Таким образом, вы больше не сможете получить доступ к этой странице.",
        "group": "Группа:",
        "group-user": "Участники",
        "group-autoconfirmed": "Автоподтверждённые участники",
        "right-siteadmin": "блокировка и разблокировка базы данных",
        "right-override-export-depth": "экспортирование страниц, включая связанные страницы с глубиной до 5",
        "right-sendemail": "отправка электронной почты другим участникам",
-       "right-passwordreset": "просмотр электронных писем с изменением пароля",
        "right-managechangetags": "создание и (де)активация [[Special:Tags|меток]]",
        "right-applychangetags": "применение [[Special:Tags|меток]] вместе со своими правками",
        "right-changetags": "добавление и удаление произвольных [[Special:Tags|меток]] на отдельных правках и записях в журнале",
        "apisandbox-continue": "Продолжить",
        "apisandbox-continue-clear": "Очистить",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries продолжит] последний запрос; {{int:apisandbox-continue-clear}} очистит связанные с продолжением параметры.",
+       "apisandbox-param-limit": "Введите <kbd>максимальное</kbd> использование максимального предела.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Все пространства имён)",
+       "apisandbox-multivalue-all-values": "$1 (Все значения)",
        "booksources": "Источники книг",
        "booksources-search-legend": "Поиск информации о книге",
        "booksources-isbn": "ISBN:",
        "activeusers-intro": "Это список участников, совершавших какие-либо действия за {{PLURAL:$1|последний $1 день|последние $1 дня|последние $1 дней|1=последний день}}.",
        "activeusers-count": "$1 {{PLURAL:$1|правка|правки|правок}} за {{PLURAL:$3|$3 последний день|последние $3 дня|последние $3 дней|1=последний день}}",
        "activeusers-from": "Показать участников, начиная с:",
-       "activeusers-groups": "Отображать пользователей, принадлежащих к группам:",
+       "activeusers-groups": "Отображать участников, принадлежащих к группам:",
+       "activeusers-excludegroups": "Исключать участников, принадлежащих к группам:",
        "activeusers-noresult": "Не найдено участников.",
        "activeusers-submit": "Показать активных участников",
        "listgrouprights": "Права групп участников",
        "movedarticleprotection": "перенёс настройки защиты с «[[$2]]» на «[[$1]]»",
        "protectedarticle-comment": "Защитил{{GENDER:$2||а}} «[[$1]]»",
        "modifiedarticleprotection-comment": "Изменил{{GENDER:$2||а}} уровень защиты «[[$1]]»",
-       "unprotectedarticle-comment": "Убрал{{GENDER:$2||а}} защиту с «[[$1]]»",
+       "unprotectedarticle-comment": "Убрал {{GENDER:$2||а}} защиту с «[[$1]]»",
        "protect-title": "Установка уровня защиты для «$1»",
        "protect-title-notallowed": "Просмотр уровня защиты «$1»",
        "prot_1movedto2": "[[$1]] переименована в [[$2]]",
        "patrol-log-header": "Это журнал патрулированных версий.",
        "log-show-hide-patrol": "$1 журнал патрулирования",
        "log-show-hide-tag": "$1 журнал меток",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Пометить версию $3 страницы $2 как отпатрулированную?",
        "deletedrevision": "Удалена старая версия $1",
        "filedeleteerror-short": "Ошибка удаления файла: $1",
        "filedeleteerror-long": "Во время удаления файла возникли ошибки:\n\n$1",
        "tags-deactivate": "отключить",
        "tags-hitcount": "$1 {{PLURAL:$1|изменение|изменения|изменений}}",
        "tags-manage-no-permission": "У вас нет прав на управление изменениями меток.",
-       "tags-manage-blocked": "Вы не можете управлять метками правок, пока вы заблокированы.",
+       "tags-manage-blocked": "Вы не можете управлять метками правок, пока {{GENDER:$1|вы}} заблокированы.",
        "tags-create-heading": "Создать новую метку",
        "tags-create-explanation": "Вновь созданные метки по умолчанию будут созданы доступными для использования участниками и ботами.",
        "tags-create-tag-name": "Название метки:",
        "tags-deactivate-not-allowed": "Невозможно отключить метку «$1».",
        "tags-deactivate-submit": "Отключить",
        "tags-apply-no-permission": "У вас нет права применять метки изменения к своими изменениям.",
-       "tags-apply-blocked": "Вы не можете применять метки правок к своим правкам, пока вы заблокированы.",
+       "tags-apply-blocked": "Вы не можете применять метки правок к своим правкам, пока {{GENDER:$1|вы}} заблокированы.",
        "tags-apply-not-allowed-one": "Метка «$1» не может быть применена вручную.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Следующая метка не может быть применена|Следующие метки не могут быть применены}} вручную: $1",
        "tags-update-no-permission": "У вас нет права на добавление или изменение меток изменения из отдельных версий или записей журналов.",
-       "tags-update-blocked": "Вы не можете добавлять или удалять метки правок, пока вы заблокированы.",
+       "tags-update-blocked": "Вы не можете добавлять или удалять метки правок, пока {{GENDER:$1|вы}} заблокированы.",
        "tags-update-add-not-allowed-one": "Тег \"$1\" не может быть добавлен вручную.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Следующий тег|Следующие теги}} нельзя добавлять вручную: $1",
        "tags-update-remove-not-allowed-one": "Метка «$1» не может быть удалена.",
        "htmlform-user-not-exists": "<strong>$1</strong> не существует.",
        "htmlform-user-not-valid": "<strong>$1</strong> — недопустимое имя учётной записи.",
        "logentry-delete-delete": "$1 {{GENDER:$2|удалил|удалила}} страницу $3",
+       "logentry-delete-delete_redir": "$1 удалил{{GENDER:$2||а}} перенаправление $3 с помощью перезаписи",
        "logentry-delete-restore": "$1 {{GENDER:$2|восстановил|восстановила}} страницу $3",
        "logentry-delete-event": "$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 записи|$5 записей|1=записи}} журнала для $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|изменил|изменила}} видимость {{PLURAL:$5|$5 версии|$5 версий|1=версии}} страницы $3: $4",
        "mw-widgets-dateinput-placeholder-month": "ГГГГ-ММ",
        "mw-widgets-titleinput-description-new-page": "страница ещё не существует",
        "mw-widgets-titleinput-description-redirect": "перенаправление на $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Добавить категорию…",
        "sessionmanager-tie": "Невозможно использовать одновременно несколько типов проверки подлинности запроса: $1.",
        "sessionprovider-generic": "$1 сессий",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "сессий на основе куки",
        "log-action-filter-contentmodel-change": "Изменение модели содержимого",
        "log-action-filter-contentmodel-new": "Создание страницы с нестандартной моделью Contentmodel",
        "log-action-filter-delete-delete": "Удаления страницы",
+       "log-action-filter-delete-delete_redir": "Перезапись перенаправления",
        "log-action-filter-delete-restore": "Восстановление страницы",
        "log-action-filter-delete-event": "Удаление журнала",
        "log-action-filter-delete-revision": "Удаление версии",
        "usercssispublic": "Обратите внимание: подстраницы CSS не должны содержать конфиденциальные сведения, поскольку они доступны для просмотра другим участникам.",
        "restrictionsfield-badip": "Недопустимый IP-адрес или диапазон адресов: $1",
        "restrictionsfield-label": "Разрешённые диапазоны IP-адресов:",
-       "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте <br /><code>0.0.0.0/0</code><br /><code>::/0</code>",
-       "edit-error-short": "Ошибка: $1",
-       "edit-error-long": "Ошибки: $1"
+       "restrictionsfield-help": "По одному IP-адресу или CIDR-диапазону в строке. Чтобы разрешить всё, используйте <br /><code>0.0.0.0/0</code><br /><code>::/0</code>"
 }
index 1259b35..dbc7b57 100644 (file)
        "yourpasswordagain": "Повторяйте гесло:",
        "createacct-yourpasswordagain": "Потвердьте гесло",
        "createacct-yourpasswordagain-ph": "Уведьте гесло знову",
-       "remembermypassword": "Запамнятати моє приголошіня на тім компютерї (максімално $1 {{PLURAL:$1|день|днів}})",
        "userlogin-remembermypassword": "Приголосити ня на довго",
        "userlogin-signwithsecure": "Хосновати забеспечене споїня",
        "yourdomainname": "Ваша домена:",
        "passwordreset-emailtext-user": "{{gender:$1|Хоснователь|Хоснователька|Хоснователь}} $1 {{grammar:2sg|{{SITENAME}}}} {{gender:$1|попросив|попросила|попросив}} о наставлїня нового гесла до вашого\nконта на {{grammar:6sg|{{SITENAME}}}} ($4). З тов адресов {{PLURAL:$3|є повязане наступне конто|суть повязаны наступны конта}}:\n\n$2\n\n{{PLURAL:$3|Тото дочасне гесло кінчить|Тоты дочасны гесла кінчать}} {{PLURAL:$5|о єден день|о $5 днї|о $5 днїв}}.\nТеперь бы сьте ся мали приголосити і зволити собі нове гесло. Кідь тоту пожадавку \nпослав дахто другый або сьте собі на своє старе гесло спомянули і не хочете го\nзмінити, можете тото повідомлїня іґноровати і надале хосновати старе гесло.",
        "passwordreset-emailelement": "Імя хоснователя: \n$1\n\nДочасне гесло: \n$2",
        "passwordreset-emailsentemail": "Імейл з геслом быв посланый.",
-       "passwordreset-emailsent-capture": "Быв выґенерованый імейл з геслом, што є вказаный ниже.",
-       "passwordreset-emailerror-capture": "Быв выґенерованый імейл з геслом, котрый є указаный ниже, але ся го не вдало загнати {{GENDER:$2|хоснователёви|хосновательцї}}: $1",
        "changeemail": "Зміна імейловой адресы",
        "changeemail-header": "Зміна імейловой адресу ку конту",
        "changeemail-no-info": "Ку тій сторінцї мають прямый приступ лем приголошены хоснователї.",
        "undo-norev": "Тото едітованя не можете вернути назад, бо не екзістує або было змазане.",
        "undo-summary": "Зрушена верзія $1 од хоснователя [[Special:Contributions/$2|$2]] ([[User talk:$2|діскузія]])",
        "undo-summary-username-hidden": "Зрушыти ревізію $1 скрытого хоснователя",
-       "cantcreateaccounttitle": "Не є можне вытворити конто",
        "cantcreateaccount-text": "Створёваня новых конт з той IP адресы ('''$1''') было заблоковане хоснователём [[User:$3|$3]].\n\n$3 зазначів тоту причіну: ''$2''",
        "viewpagelogs": "Вказати лоґы про тоту сторінку",
        "nohistory": "Про тоту статю не екзістує історія едітовань.",
        "activeusers-intro": "Тото є список хоснователїв, котры были даяк актівны за {{plural:$1|остатнїй день|остатных $1 днїв}}.",
        "activeusers-count": "$1 {{PLURAL:$1|дїя|дїї|дїй}} через {{PLURAL:$3|остатнёго дня|остатнїх  $3 днїв}}",
        "activeusers-from": "Вказати хоснователїв, што ся зачінають на:",
-       "activeusers-hidebots": "Сховати ботів",
-       "activeusers-hidesysops": "Сховати адміністраторів",
        "activeusers-noresult": "Ненайдженый жаден хоснователь.",
        "listgrouprights": "Права ґруп хоснователїв",
        "listgrouprights-summary": "Тото є список ґруп хоснователїв дефінованых на тій вікіi і&nbsp;їх приступовых прав.\n\n[[{{MediaWiki:Listgrouprights-helppage}}|Детайлны інформації о&nbsp;єднотливых правах]]",
        "htmlform-no": "Нє",
        "htmlform-yes": "Гей",
        "htmlform-chosen-placeholder": "Звольте параметер",
-       "sqlite-has-fts": "$1 з підпоров повнотекстового гляданя",
-       "sqlite-no-fts": "$1 без підпоры повнотекстового гляданя",
        "logentry-delete-delete": "$1 {{GENDER:$2|змазав|змазала}} сторінку $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|обновив|обновила}} сторінку $3",
        "logentry-delete-event": "$1 {{GENDER:$2|змінив|змінила}}  відимость {{PLURAL:$5|протоколового запису|$5 протоколовых записів}} к сторінцї $3: $4",
        "special-characters-group-lao": "Лаоськы",
        "special-characters-group-khmer": "Кгмерськы",
        "mw-widgets-dateinput-placeholder-day": "РРРР-ММ-ДД",
-       "mw-widgets-dateinput-placeholder-month": "РРРР-ММ",
-       "api-error-blacklisted": "Звольте іншу, пописну назву."
+       "mw-widgets-dateinput-placeholder-month": "РРРР-ММ"
 }
index 9591937..d96819c 100644 (file)
        "activeusers-intro": "एषा तु गतेषु $1 {{PLURAL:$1|दिनेषु}} कृतकार्याणां योजकाना आवली ।",
        "activeusers-count": "$1 {{PLURAL:$1|कार्यं|कार्याणि}} गतेषु $3 {{PLURAL:$3|दिनेषु}} कृतानि  ।",
        "activeusers-from": "एतस्मात् आरभमाणान् योजकान् दर्शयतु ।",
-       "activeusers-hidebots": "स्वयं चालकान् गोपयतु ।",
-       "activeusers-hidesysops": "प्रशासकान् गोपयतु ।",
        "activeusers-noresult": "सदस्यः न प्राप्तः ।",
        "listgrouprights": "योजकसमूहाधिकाराः ।",
        "listgrouprights-summary": "अधोदत्ता विकिपरिभाषितस्य सङ्गताभिगम्यताधिकारैः सहिता योजकसमूहस्य आवली । [[{{MediaWiki:Listgrouprights-helppage}}|additional information]]",
        "feedback-external-bug-report-button": "यान्त्रककार्यम् अङ्क्यताम्",
        "feedback-dialog-title": "स्वप्रतिक्रियां लिखतु",
        "feedback-dialog-intro": "स्वप्रतिक्रियां लेखितुं निम्नं सरलपत्रम् उपयोक्तुं शक्नोति   ।\nभवतः/भवत्याः योजकनामोल्लेखन सह $1 इत्यस्मिन् पृष्ठे भवतः/भवत्याः प्रतिक्रियां योजयिष्यामः ।",
-       "feedback-error-title": "दोषः",
        "feedback-error1": "API इत्यस्मात् दोषः : अज्ञातः परिणामः ।",
        "feedback-error2": "दोषः : सम्पादनं निष्फलं जातम्",
        "feedback-error3": "दोषः : ए पि ऐ तः प्रतिस्पन्दः न प्राप्तः",
index 184a3a0..6e45545 100644 (file)
@@ -34,6 +34,7 @@
        "tog-watchdefault": "Уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
        "tog-watchmoves": "Аатын уларыппыт сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
        "tog-watchdeletion": "Соппут сирэйдэрбин уонна билэлэрбин кэтээн көрүү тиһигэр киллэрэн ис",
+       "tog-watchuploads": "Хачайдаан киллэрбит билэлэрбин кэтииргэ",
        "tog-watchrollback": "Төннөрбүт сирэйдэрбин кэтэбилим тиһигэр киллэрэн ис",
        "tog-minordefault": "Уларытыылары атын этиллибэтэҕинэ кыра уларытыы курдук бэлиэтээ",
        "tog-previewontop": "Хайдах буоларын уларытар түннүк үрдүнэн (иннигэр) көрдөр",
        "newwindow": "(атын түннүккэ арыллар)",
        "cancel": "Салҕаама",
        "moredotdotdot": "Өссө...",
-       "morenotlisted": "Ð\91Ñ\83 Ñ\82иһик Ñ\82олоÑ\80Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85.",
+       "morenotlisted": "Ð\91Ñ\83 Ñ\82иһилик Ñ\82олоÑ\80Ñ\83Ñ\82а Ñ\81Ñ\83оÑ\85 Ð±Ñ\83олÑ\83он Ñ\81өп.",
        "mypage": "Сирэй",
        "mytalk": "Кэпсэтэр сирим",
        "anontalk": "Ырытыы",
        "tagline": "{{SITENAME}} диэн сиртэн ылыллыбыт",
        "help": "Көмө",
        "search": "Көрдөөһүн",
+       "search-ignored-headings": " #<!-- бу устуруоканы уларытыма --> <pre>\n# Көрдүүр тиһиктэр көрбөтөҕө буолуохтаах ааттара.\n# Уларыйыы көрдүүр тиһик (поисковик) сирэйи болҕомтоҕо ылбытын кэннэ олоххо киирэр.\n# Болҕомтоҕо ылыыны түргэтэтэр туһугар кураанах (ньуул) уларытыы оҥоруохха сөп.\n# Синтэксииһэ маннык көстөр:\n#   * Маннык бэлиэттэн саҕаланар устуруока «#» ырытыы быһыытынан ааҕыллар.\n#   * Кураанаҕа суох устуруока барыта — көрүллүбэт аат чопчу көрүҥэ, эрэгиистирин эҥин учуоттаан туран.\nБыһаарыылар\nСигэлэр\nЭбии көр\n #</pre> <!-- бу устуруоканы уларытыма -->",
        "searchbutton": "Бул",
        "go": "Бар",
        "searcharticle": "Көрдөр",
        "talk": "Ырытыы",
        "views": "Көрүү",
        "toolbox": "Сэп-сэбиргэл",
+       "tool-link-userrights": "{{GENDER:$1|Кыттааччы}} бөлөҕүн уларыт",
+       "tool-link-userrights-readonly": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн көр",
+       "tool-link-emailuser": "{{GENDER:$1|Кыттааччыга}} сурук суруйуу",
        "userpage": "Кыттааччы туһунан сирэй",
        "projectpage": "Бырайыак сирэйэ",
        "imagepage": "Билэ сирэйин көрүү",
        "versionrequiredtext": "Бу сирэйи туттарга MediaWiki $1 -с барыла наада. [[Special:Version|Барыллар тустарынан сирэйи]] көр.",
        "ok": "Сөп",
        "retrievedfrom": "Төрдө — «$1»",
-       "youhavenewmessages": "$1 ($2) кэллэ.",
+       "youhavenewmessages": "$1 ($2) {{PLURAL:$3|кэллэ}}.",
        "youhavenewmessagesfromusers": "Маны $1 {{PLURAL:$3|соҕотох кыттааччыттан|$3 кыттааччыттан}} туппуккун ($2).",
        "youhavenewmessagesmanyusers": "Маны $1 элбэх кыттааччыттан туппуккун ($2).",
        "newmessageslinkplural": "{{PLURAL:$1|саҥа этии|999=саҥа этии}}",
        "createacct-yourpasswordagain-ph": "Киирии тылгын хатылаа",
        "userlogin-remembermypassword": "Тиһиликтэн тахсыма",
        "userlogin-signwithsecure": "Бигэ холбонуу",
+       "cannotlogin-title": "Киирэр сатаммат",
+       "cannotlogin-text": "Тиһиккэ киирэр табыллыбат.",
        "cannotloginnow-title": "Сип-билигин киирэр кыах суох",
        "cannotloginnow-text": "Маны $1 туһанар кэмҥэ киирэр кыах суох.",
+       "cannotcreateaccount-title": "Бэлиэтэнэр табыллыбат",
+       "cannotcreateaccount-text": "Быһа бэлиэтэнии бу биикигэ сатаммат эбит.",
        "yourdomainname": "Эн дөмүөнүҥ:",
        "password-change-forbidden": "Бу биикигэ киирии тылы уоарытар табыллыбат.",
        "externaldberror": "Тас киирии билиитин олоҕун сыыһата буолла, эбэтэр тас киирии билииҥ олоҕун саҥардар кыаҕыҥ суох.",
        "login": "Киир",
+       "login-security": "Ким буоларгын бигэргэт",
        "nav-login-createaccount": "Киир / бэлиэтэн",
        "userlogin": "Киир / бэлиэтэн",
        "userloginnocreate": "Киир",
        "userlogin-resetpassword-link": "Киирии тылгын санаттараҕын дуо?",
        "userlogin-helplink2": "Киирэргэ көмө",
        "userlogin-loggedin": "Маннык аатынан киирбиккин {{GENDER:$1|$1}}.\nАтын аатынан киирэргэ аллара көстөр форманы туһан.",
+       "userlogin-reauth": "Тиһиккэ хат киирэн {{GENDER:$1|$1}} буоларгын бигэргэтиэхтээххин.",
        "userlogin-createanother": "Атын аатынан бэлиэтэн",
        "createacct-emailrequired": "Email аадырыс",
        "createacct-emailoptional": "Email аадырыс (булгуччута суох)",
        "createacct-email-ph": "Эл аадырыскын суруй",
        "createacct-another-email-ph": "Эл. почтаҕын киллэр",
        "createaccountmail": "Быстах киирии тылы туһаныы уонна ону ыйыллыбыт аадырыска ыытыы",
+       "createaccountmail-help": "Атын киһиэхэ аһарыгын билбэккэ эрэ бэлиэ-ааты оҥорон биэрэргэ туттуллуон сөп.",
        "createacct-realname": "Дьиҥнээх аатыҥ (булгуччута суох)",
        "createaccountreason": "Төрүөтэ:",
        "createacct-reason": "Төрүөтэ",
        "createacct-reason-ph": "Саҥа аатынан тоҕо киирэҕиний",
+       "createacct-reason-help": "Саҥаны суруйуу сурунаалыгар тахсар сурук",
        "createacct-submit": "Бэлиэтэнии",
        "createacct-another-submit": "Бэлиэтэн",
+       "createacct-continue-submit": "Бэлиэ-ааты салгыы оҥоруу",
+       "createacct-another-continue-submit": "Салгыы бэлиэтэнии",
        "createacct-benefit-heading": "{{SITENAME}} ситим-сири эн курдук дьон оҥороллор.",
        "createacct-benefit-body1": "{{PLURAL:$1|уларытыы|уларытыы}}",
        "createacct-benefit-body2": "{{PLURAL:$1|сирэй|сирэй}}",
        "nocookiesnew": "Маннык ааттаах кыттааччы баар буолла гынан баран, систиэмэҕэ киирэ илик. {{SITENAME}} «cookies» туттар, оттон эн көмпүүтэргэр ону туһанар бобуллубут. Бука диэн «cookies» холбоо, онтон өссө киирэн көр.",
        "nocookieslogin": "{{SITENAME}} дьону билэргэ «cookies» туттар. Эн көмпүүтэргэр «cookies» бобуллубут. Ону холбоон баран өссө киирэн көр.",
        "nocookiesfornew": "Аат кыайан бэлиэтэниллибэтэ. Төрүөтүнэн атын саайка сибидиэнньэ биэрии (CSRF) бобуллубута буолуон сөп. \nКуукилар холбоно сылдьалларын көрөн баран өссө биирдэ боруобалаа.",
+       "createacct-loginerror": "Бэлиэтэнниҥ гынан баран бэлиэ-ааккынан киирэ иликкин. Бука диэн, [[Special:UserLogin|киир дуу]].",
        "noname": "Эн тиһилик билэр аатын киллэрбэтэххин.",
        "loginsuccesstitle": "Киирдиҥ",
        "loginsuccess": "'''Билигин бу аатынан үлэлиигин: \"$1\".'''",
-       "nosuchuser": "Маннык - \"$1\" - ааттаах кыттааччы суох.\nУлахан кыра буукубалар атыннаахтар.\nАатыҥ сөпкө суруллубутун көр эбэтэр [[Special:CreateAccount|саҥаттан бэлиэтэн]].",
+       "nosuchuser": "Маннык - \"$1\" - ааттаах кыттааччы суох эбит.\nУлахан кыра буукубалар атыннаахтарын умнума.\nАатыҥ сөпкө суруллубутун көр эбэтэр [[Special:CreateAccount|саҥаттан бэлиэтэн]].",
        "nosuchusershort": "Маннык - \"$1\" - ааттаах кыттааччы суох. Аатыҥ сөпкө суруллубутун көр.",
        "nouserspecified": "Кыттааччы аатын киллэриэхтээххин.",
        "login-userblocked": "Бу кыттааччы бобуллубут. Тиһиккэ киирии көҥүллэммэт.",
        "noemail": "\"$1\" ааттаах киһиэхэ эл. почтата ыйыллыбатах.",
        "noemailcreate": "Электроннай почтаҥ сөптөөх аадырыһын суруйуохтааххын",
        "passwordsent": "Саҥа аһарык тыл \"$1\" эл. почтатыгар ыытылынна.\nТиһиккэ киирэргэ саҥа аһарыгы туһан.",
-       "blocked-mailpassword": "Эн IP аадырыскыттан манна тугу эмэ уларытар бобуллубут,\nонон киирии тылы өйдөтөр кыах эмиэ суох.",
+       "blocked-mailpassword": "Ð\9eмÑ\81олооÑ\85 Ð´Ñ\8cайÑ\8bÑ\8b Ð¾Ò¥Ð¾Ò»Ñ\83ллÑ\83баÑ\82Ñ\8bн Ñ\82Ñ\83Ò»Ñ\83гаÑ\80 Ð­Ð½ IP Ð°Ð°Ð´Ñ\8bÑ\80Ñ\8bÑ\81кÑ\8bÑ\82Ñ\82ан Ð¼Ð°Ð½Ð½Ð° Ñ\82Ñ\83гÑ\83 Ñ\8dмÑ\8d Ñ\83лаÑ\80Ñ\8bÑ\82аÑ\80 Ð±Ð¾Ð±Ñ\83ллÑ\83бÑ\83Ñ\82,\nонон ÐºÐ¸Ð¸Ñ\80ии Ñ\82Ñ\8bлÑ\8b Ó©Ð¹Ð´Ó©Ñ\82Ó©Ñ\80 ÐºÑ\8bаÑ\85 Ñ\8dмиÑ\8d Ñ\81Ñ\83оÑ\85.",
        "eauthentsent": "Эл. почтаҕар сурук ыытылынна.\nБу аадырыс эйиэнэ буоларын бигэргэтэргэ өссө тугу гыныахтааҕыҥ туһунан сурукка кэпсэниллэр.",
        "throttled-mailpassword": "Киирии тылы өйдөтөр тэрил бүтэһик {{PLURAL:$1|чаас|$1 чаас}} иһигэр туттулла сылдьыбыт.\nКөмүскэнэр соруктан сылтаан киирии тылы {{PLURAL:$1|чааска|$1 чааска}} биирдэ эрэ ыйытыахха сөп.",
        "mailerror": "Сурук ыытарга алҕас таҕыста: $1",
-       "acct_creation_throttle_hit": "Эн IP-гыттан бүгүн {{PLURAL:$1|1 аат оҥоһуллубут|$1 аат бэлиэтэммит}} буолан бүгүҥҥү күннээҕи нуорма туолбут.\nБу IP-тан киирэр дьон саҥа ааты билигин бэлиэтиир кыахтара суох.",
+       "acct_creation_throttle_hit": "Эн IP-гыттан тиһэх $2 болдьоххо {{PLURAL:$1|1 аат оҥоһуллубут|$1 аат бэлиэтэммит}} буолан саҥа аат оҥоһуллар нуормата туолан хаалбыт.\nОнон бу IP-тан киирэн саҥа ааты билигин бэлиэтиир кыах суох.",
        "emailauthenticated": "Эн почтаҥ аадырыһа бигэргэтиллибит кэмэ: $2, $3.",
        "emailnotauthenticated": "Эл. почтаҥ аадырыһа бигэргэтиллэ илик эбит.\nОнон сурук манна ааттаммыт түгэннэргэ ыытыллыа суоҕа.",
        "noemailprefs": "Эл. почтаҥ ыйыллыбатах, онон вики-движок аадырыскын туһанар кыаҕа суох.",
        "createaccount-title": "{{SITENAME}} бырайыакка саҥа аат оҥоруу",
        "createaccount-text": "Ким эрэ {{SITENAME}} бырайыакка ($4) саҥа $2 ааты бэлиэтээбит. \"$2\" киирии тыла \"$3\". Билигин киирэн киирии тылгын уларытыаххын наада.\n\nСаҥа аат сыыһа оҥоһуллубут буоллаҕына тугу да гыныа суоххун сөп.",
        "login-throttled": "Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.\nБука диэн $1 буолан баран өссө киирэн көрөөр.",
-       "login-abort-generic": "Бу аатынан сатаан киирбэтиҥ - быстан хаалла",
+       "login-abort-generic": "Бу аатынан сатаан киирбэтиҥ - быһынна",
        "login-migrated-generic": "Эн бэлиэ-аатыҥ көһөрүллүбүт, онон урукку аатыҥ бу биикигэ суох буолбут эбит.",
        "loginlanguagelabel": "Омугун тыла: $1",
        "suspicious-userlogout": "Сеансы түмүктүүр ыйытыгыҥ ылыныллыбата, тоҕо диэтэххэ браузер эбэтэр кээштыыр прокси алҕас ыыппыт ыйытыктарыгар майгынныыр.",
        "createacct-another-realname-tip": "Дьиҥнээх аатыҥ булгуччута суох.\nЫйдаххына уларыппыт сирэйиҥ устуоруйатыгар көстөр буолуоҕа.",
        "pt-login": "Киир",
        "pt-login-button": "Киир",
+       "pt-login-continue-button": "Киириини салҕаа",
        "pt-createaccount": "Бэлиэтэнии",
        "pt-userlogout": "Тахсыы",
        "php-mail-error-unknown": "mail() PHP-функциятыгар туох эрэ алҕас тахсыбыт",
        "newpassword": "Саҥа аһарык:",
        "retypenew": "Саҥа киирии тылы хатылаа:",
        "resetpass_submit": "Киирии тылы уларыт уонна киир",
-       "changepassword-success": "Ð\9aииÑ\80ии Ñ\82Ñ\8bлÑ\8bÒ¥ Ñ\8dÑ\82Ñ\8dÒ¥Ò¥Ñ\8d уларыйда!",
+       "changepassword-success": "Ð\90һаÑ\80Ñ\8bгÑ\8bÒ¥ уларыйда!",
        "changepassword-throttled": "Ааккын аһара элбэхтик билиһиннэрэ сатаатыҥ.\nБука диэн $1 буолан баран өссө киирэн көрөөр.",
        "botpasswords": "Оруобаттар аһарыктара",
        "botpasswords-summary": "<em>Хатыыр тыллара</em> туттааччы учуоттуур сурутуутугар API-нан   логины уонна хатыыр тылы туттубакка эрэ киирэр кыах биэрэр. Кыттааччы  бота хатыыр тыллаах киириитигэр бырааба хааччахтаныан сөп.\nЭн  ити тоҕо наадатын билбэт буоллаххына, бука, итини гымматыҥ ордук.Ким даҕаны эйигиттэн хаһан даҕаны эн оҥорбутуҥ уонна биллэрбитиҥ диэн ыйытыа суохтаах.",
        "botpasswords-label-delete": "Сот",
        "botpasswords-label-resetpassword": "Аһарыгы саҥаттан",
        "botpasswords-label-grants": "Туттуллар көҥүллэр:",
-       "botpasswords-help-grants": " Кыттааччы учуоттуур суруйуутугар баар ыйыллыбыт кыттааччы быраабыгар киирэргэ кыах биэрэр. к. [[Special:ListGrants|көҥүллэр табылыыссаларын]] эбии информацияны ылар туһугар.",
+       "botpasswords-help-grants": "Хас биирдии көҥүл урукку кыахтарга эбиллэн биэрэр. Сиһилии аналлаах [[Special:ListGrants|табылыыссаланы]] көр.",
        "botpasswords-label-grants-column": "Көҥүллэннэ",
        "botpasswords-bad-appid": "Маннык аат «$1» сатаммат.",
        "botpasswords-insert-failed": "«$1» диэн ааттаах оруобаты эбэр табыллыбата. Баҕар хайыы-үйэ эбиллибитэ буолаарай?",
        "botpasswords-update-failed": "\"$1\" диэн ааттаах ботаны кыайан саҥардыбатыбыт. Баҕар, сотторуллубута буолуо?",
        "botpasswords-created-title": "Оруобат аһарыга оҥоһулунна",
-       "botpasswords-created-body": "«$1» оруобат аһарыга бигэргэтилиннэ.",
+       "botpasswords-created-body": "«$2» кыттааччы «$1» оруобатын аһарыга оҥоһулунна.",
        "botpasswords-updated-title": "Оруобат аһарыга саҥардылынна",
-       "botpasswords-updated-body": "«$1» оруобат аһарыга уларытылынна.",
+       "botpasswords-updated-body": "«$2» кыттааччы «$1» оруобатын аһарыга уларытылынна.",
        "botpasswords-deleted-title": "Оруобат аһарыга сотулунна",
-       "botpasswords-deleted-body": "«$1» оруобат аһарыга сотулунна.",
-       "botpasswords-newpassword": "\nСаҥа хатыыр тыл <strong>$1</strong> — <strong>$2</strong> аннынан киириигэ. <em> суруй аныгыскыга туттарга.</em>",
+       "botpasswords-deleted-body": "«$2» кыттааччы «$1» оруобатын аһарыга сотулунна.",
+       "botpasswords-newpassword": "<strong>$1</strong> — <strong>$2</strong> аатынан киирэргэ саҥа аһарык. <em>Кэлин туттарга сурунан кэбис.</em> <br /> (Эргэ оруобаттар кыттааччы аата уонна саҥа киирэр киһи аата сөп түбэллэрин ирдиир буоллахтарына, <strong>$3</strong> кыттааччы аатын уонна маны <strong>$4</strong> аһарык курдук туттуохха сөп.)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider кыаллыбат.",
        "botpasswords-restriction-failed": "Буот аһарыгын кытта сыһыаннаах хааччахтан киирии сатаммата.",
        "botpasswords-invalid-name": "Кыттааччы аатыгар буот аһарыгын араарааччыта суох эбит (\"$1\").",
        "botpasswords-not-exist": "«$1» кыттааччыга «$2» диэн ааттаммыт оруобакка аналлаах аһарыга суох эбит.",
        "resetpass_forbidden": "Киирии тылы уларытар сатаммат",
+       "resetpass_forbidden-reason": "Аһарыгы уларытар сатаммат: $1",
        "resetpass-no-info": "Ааккын билиһиннэрдэххинэ эрэ бу сирэйгэ быһа тиийиэххин сөп.",
        "resetpass-submit-loggedin": "Киирии тылы уларытыы",
        "resetpass-submit-cancel": "Салҕаама",
        "passwordreset-emaildisabled": "Бу биикигэ эл. почтаны туттуу араарыллыбыт",
        "passwordreset-username": "Кыттааччы:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Суруллубут суругу көрөҕүн дуо?",
-       "passwordreset-capture-help": "Бу бэлиэни туруордаххына кыттааччыга ыытыллар сурук (быстах кэмҥэ туһаныллар киирии тыллаах) көстүө.",
        "passwordreset-email": "Электроннай почтата:",
        "passwordreset-emailtitle": "{{SITENAME}} бырайыакка аатын туһунан",
        "passwordreset-emailtext-ip": "Ким эрэ (баҕар эн буолуо, бу IP-ттан $1)  {{SITENAME}} ($4) бырайыакка киирии тылы уларытар туһунан ыйытык биэрбит.\nБу электрон аадырыһы кытта бу {{PLURAL:$3|аат ситимнээх|ааттар ситимнээхтэр}}:\n\n$2\n\nБу быстах кэмҥэ аналлаах {{PLURAL:$3|киирии тыл|кирии тыллар}} {{PLURAL:$5|биир күн үлэлиэҕэ|$5 күн үлэлиэхтэрэ}}.\nЭн тиһиликкэ ааккын этэн саҥа киирии тылы киллэриэхтээххин.\nӨскө бу ыйытыгы ыыппатах буоллаххына, эбэтэр урукку киирии тылгын өйдөөн кэлбит буоллаххына \nбу биллэриини ааххайыа суоххун сөп.\nОччоҕо урукку киирии тылыҥ оннунан хаалыа.",
        "passwordreset-emailelement": "Кыттааччы: \n$1\n\nБыстах аһарык тыл: \n$2",
        "passwordreset-emailsentemail": "Өскө бу Эн ааккар баайыллыбыт аадырыс буоллаҕына, аһарык тылы уларытар туһунан сурук барыа.",
        "passwordreset-emailsentusername": "Өскө бу аакка баайыллыбыт аадырыс баар буоллаҕына, аһарык тылы уларытар туһунан сурук онно барыа.",
+       "passwordreset-nocaller": "Ыҥырааччы көстүөхтээх",
+       "passwordreset-nosuchcaller": "Ыҥырааччы суох: $1",
+       "passwordreset-ignored": "Аһарыгы быраҕар сатаммата. Баҕар биир да провайдер холбоммокко сылдьара буолаарай?",
+       "passwordreset-invalidemail": "Аадырыс алҕастаах",
+       "passwordreset-nodata": "Кыттааччы аата да, аадырыһа да ыйыллыбатахтар",
        "changeemail": "Аадырыһы уларытыы уонна сотуу",
        "changeemail-header": "Бу форманы толорон аадырыскын уларыт. Уларытыыны бигэргэтэргэ аһарыккын киллэриэхтээххин. Почтаҥ аадырыһыттан бэлиэ-ааккыттан араарыаххын баҕарар буоллаххына аадырыһы сотон баран бигэргэтэн кэбиһээр.",
        "changeemail-no-info": "Бу сирэйгэ чопчу тиийэргэ, тиһиликкэ бэлиэтэммит ааккын этиэхтиэххин.",
        "minoredit": "Бу суолтата суох уларытыы",
        "watchthis": "Бу сирэйи кэтээн көрөргө",
        "savearticle": "Уларытыыны бигэргэтии",
+       "savechanges": "Уларытыылары бигэргэтии",
+       "publishpage": "Оҥор",
+       "publishchanges": "Бигэргэт",
        "preview": "Холоон көрүү",
        "showpreview": "Уларытыах иннинэ көрүү",
        "showdiff": "Уларытыылар",
        "accmailtext": "[[User talk:$1|$1]] кыттааччыга түбэспиччэ бэлиэлэртэн оҥоһуллубут аһарык тыл бу аадырыска $2 ыытылынна.\nТиһиккэ бэлиэтэнэн баран аһарыккын ''[[Special:ChangePassword|уларытыаххын]]'' сөп.",
        "newarticle": "(Саҥа ыстатыйа)",
        "newarticletext": "Эн суох сирэйгэ киирэ сатаатыҥ.\nМаннык ааттаах саҥа ыстатыйаны оҥорор буоллаххына, аллара баар түннүккэ суруй\n(сиһ. [$1 көмөнү] көрүөххүн сөп).\nӨскө манна сыыһа киирбит буоллаххына интэриниэтиҥ бырагыраамматын \"төнүн\" диэххин сөп.",
-       "anontalkpagetext": "----''Бу аатын эппэтэх кыттааччы ырытар сирэйэ.\nIP-аадырыһа эрэ көстөр.\nБиир IP-аадырыс хас да киһиэхэ бэриллиэн сөп. Өскө атын киһиэхэ суруллубут суругу алҕас туппут буоллаххына, бэйэҥ [[Special:CreateAccount|ааккын билиһиннэр]] эбэтэр [[Special:UserLogin|киир]], оччоҕо кэлин да булкуур тахсыа суоҕа.''",
+       "anontalkpagetext": "----\n<em>Бу аатын эппэтэх, бэлиэтэнэ илик эбэтэр бэлиэтэниэн баҕарбат кыттааччы сирэйэ.</em>\nОл иһин кинини чопчулаары IP-аадырыһын туттабыт.\nБу аадырыһы атын кыттааччылар эмиэ туһаныахтарын сөп.\nӨскөтө Эн ааккын эппэтэх кыттааччы Эйиэхэ туһуламматах суругу туттум дии саныыр буоллаххына, бука диэн, [[Special:CreateAccount|бэлиэтэн]] биитэр [[Special:UserLogin|урут бэлиэтэммит ааккынан киир]]. Оччоҕо булкуур тахсыа суоҕа.",
        "noarticletext": "Билигин бу сирэй кураанах.\nБу аат атын ыстатыйаларга туттулларын [[Special:Search/{{PAGENAME}}|булуоххун сөп]],\n<span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} сурунаалларга көрдүөххүн сөп],\nэбэтэр [{{fullurl:{{FULLPAGENAME}}|action=edit}} маннык ааттаах саҥа ыстатыйаны суруйуоххун сөп]</span>.",
        "noarticletext-nopermission": "Билигин бу сирэй кураанах.\nБу [[Special:Search/{{PAGENAME}}|ааты атын сирэйдэргэ көрдөөн көрүөххүн]] сөп,\nэбэтэр <span class=\"plainlinks\">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} сурунаалларга манна сыһыаннаах суруктары булуоххун сөп].</span> Бу сирэйи айар кыаҕыҥ суох.",
        "missing-revision": "«{{FULLPAGENAME}}» сирэй $1 барыла суох.\n\nМаннык үксүн хайыы-үйэ сотуллубут билэҕэ эргэрбит сигэнэн бардахха буолааччы.\nСиһилии баҕар [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} сотуу сурунаалыгар] баара буолуо.",
        "userpage-userdoesnotexist": "\"<nowiki>$1</nowiki>\" аат бэлиэтэммэтэх. Бу сирэйи оҥорор/уларытар баҕалааххын дуо?",
        "userpage-userdoesnotexist-view": "\"$1\" кыттааччы аата бэлиэтэниллибэтэх.",
        "blocked-notice-logextract": "Бу кыттааччы билигин бобуллубут.\nМанна бобуу сурунаалын бүтэһик суруга көстөр:",
-       "clearyourcache": "'''Болҕой:''' Уларыппыт сирэйгин сөпкө көрөргө браузер кээһин ыраастыаххын наада буолуо.\n*'''Firefox / Safari.''' ''Shift'' кунуопканы тутан туран ''Reload'' баттаа, эбэтэр ''Ctrl-F5'', ''Ctrl-R'' дуу (Mac-ка ''⌘-R'') баттаа;\n*'''Google Chrome:''' ''Ctrl-Shift-R'' баттаа (Mac-ка ''⌘-Shift-R'')\n*'''Internet Explorer:''' ''Ctrl'' тутан туран ''Refresh'' баттаа, эбэтэр ''Ctrl-F5'' баттаа.\n*'''Opera:''' Манна ''Tools → Preferences'' киирэн кээһин ыраастаа",
+       "clearyourcache": "<strong>Болҕой:</strong> Уларыппыт сирэйгин сөпкө көрөргө браузер кээһин ыраастыаххын наада буолуо.\n*<strong>Firefox / Safari.</strong> <em>Shift</em> кунуопканы тутан туран <em>Саҥардыы</em> баттаа, эбэтэр <em>Ctrl-F5</em>, <em>Ctrl-R</em> дуу (Mac-ка <em>⌘-R</em>) баттаа;\n*<strong>Google Chrome:</strong> <em>Ctrl-Shift-R</em> баттаа (Mac-ка <em>⌘-Shift-R</em>)\n*<strong>Internet Explorer:</strong> <em>Ctrl</em> тутан туран <em>Саҥардыы</em> баттаа, эбэтэр <em>Ctrl-F5</em> баттаа.\n*<strong>Opera:</strong> Манна <em>Tools → Preferences</em> киирэн кээһин ыраастаа",
        "usercssyoucanpreview": "'''Көмө.''' CSS-билэ саҥа барылын бигэргэтиэҥ иннинэ бу тимэҕи «{{int:showpreview}}»  баттаан тургутан көр.",
        "userjsyoucanpreview": "'''Көмө.''' JS-билэ саҥа барылын бигэргэтиэҥ иннинэ бу тимэҕи «{{int:showpreview}}»  баттаан тургутан көр.",
        "usercsspreview": "'''Умнума: бу CSS тургутуута эрэ.\nБилигин оҥорбутуҥ бигэргэтиллэ илик!'''",
        "continue-editing": "Уларытар сиргэ",
        "previewconflict": "Этот предварительный просмотр отражает текст в верхнем окне редактирования так, как он будет выглядеть, если вы решите записать его.",
        "session_fail_preview": "'''Сиэрбэр сессия идентификаторын сүтэрэн кэбиһэн эн уларытыыгын кыайан киллэрбэтэ.\nБаҕар, үлэ сеансын бүтэрбитиҥ буолуо. <strong>Баһаалыста, көҥүлү ааспыккын бил уонна өссө холонон көр.\n<strong>\nОлох сатамматаҕына биикиттэн [[Special:UserLogout|тахсан]] баран өссө киирэн көрөөр, ону сэргэ браузерыҥ бу саайтан cookies диэни ыларга көҥүллүүрүн бэрэбиэркэлээҥ.'''",
-       "session_fail_preview_html": "'''Сессия дааннайдарын сүтэрэн кэбиһэн сиэрбэр эн уларытыыгын киллэрбэтэ.'''\n\n''{{SITENAME}} ыраас HTML тылы көҥүллүүр буолан JavaScript туһананнар куһаҕаны оҥоруохтарын сөп, онон эрдэ көрдөрүү араарыллыбыт.''\n\n'''Өскө бу уларытыы туох да куһаҕаны аҕалыа диэбэт буоллаххына хатылаа. Ол сатамматаҕына [[Special:UserLogout|тахсан баран]] өссө киирэн көрөөр.'''",
+       "session_fail_preview_html": "Сиэссийэ дааннайдарын сүтэрэн кэбиһэн сиэрбэр эн уларытыыгын киллэрбэтэ.\n\n<em>{{SITENAME}} ыраас HTML тылы туттары көҥүллүүр буолан, JavaScript көмөтүнэн куһаҕаны оҥоруохтарын сөп, онон эрдэ көрдөрүү араарыллыбыт.</em>\n\n<strong>Өскө бу уларытыы туох да куһаҕаны аҕалыа диэбэт буоллаххына хатылаа.</strong> \nОл сатамматаҕына [[Special:UserLogout|тахсан баран]] өссө киирэн көрөөр, ону таһынан браузерыҥ cookies көҥүллүүрүн тургутуоххун сөп.",
        "token_suffix_mismatch": "'''Эн уларытыыҥ киирбэтэ, тоҕо диэтэххэ эн бырагырааммаҥ сорох сурук бэлиэлэрин сыыһа көрөр эбит.\nЫстатыйаны буорту гынымаары уларытыыҥ ылыныллыбата.\nИтинник сыыһалар үксүн прокси-сиэрбэрдэри туһаннахха тахсааччылар.'''",
        "edit_form_incomplete": "'''Уларытыы сорҕото сиэрбэргэ тиийбэтэ. Үчүгэйдик сыныйан көр, Эн уларытыыларыҥ туох да омсото суохтар дуо. Онтон өссө боруобалаа.'''",
        "editing": "Уларытыы $1",
        "invalid-content-data": "Алҕастаах дааннайдар",
        "content-not-allowed-here": "[[$2]] сирэйгэ \"$1\" туттуллуо суохтаах",
        "editwarning-warning": "Атын сирэйгэ көстөххүнэ билигин оҥорбут уларытыыҥ барыта сүтэн хаалыаҕа.\nБэлиэтэммит буоллаххына, бу сэрэтиини туруорууларыҥ \"{{int:prefs-editing}}\" салаатыгар араарар кыахтааххын.",
+       "editpage-invalidcontentmodel-title": "Иһинээҕитин мадьыала өйөммөт эбит",
+       "editpage-invalidcontentmodel-text": "«$1» иһинээҕитин мадьыала өйөммөт эбит.",
        "editpage-notsupportedcontentformat-title": "Иһинээҕитин формаата өйөммөт эбит",
        "editpage-notsupportedcontentformat-text": "$2 иһинээҕитин модела $1 иһинээҕитин формаатын өйөөбөт эбит.",
        "content-model-wikitext": "биики-тиэкис",
        "content-model-css": "CSS",
        "content-json-empty-object": "Кураанах эбийиэк",
        "content-json-empty-array": "Кураанах массив",
+       "deprecated-self-close-category": "Манна көҥүллэммэт бэйэтэ сабыллар HTML-тиэктэри туттар сирэйдэр",
+       "deprecated-self-close-category-desc": "Манна көҥүллэммэт бэйэтэ сабыллар HTML-тиэктэр бааллар, холобур <code>&lt;b/></code> биитэр <code>&lt;span/></code>. Сотору кэминэн HTML5 ирдэбилигэр сөп түбэһиннэрэ, дьайыылара уларыйыа. Онон маннык эргэрбит тиэктэри туттубакка буола сатаа.",
        "duplicate-args-warning": "<strong>Болҕой:</strong> «$3» параметр бииртэн ордук эрэ буоллаҕына [[:$1]] маны [[:$2]] холбуур. Кэлиҥҥи эрэ сыыппара туһаныллыа.",
        "duplicate-args-category": "Халыыптары ыҥырарга хатыланар аргуменнардаах сирэйдэр",
        "duplicate-args-category-desc": "Халыыптары ыҥырарга хатыланар аргуменнардаах сирэйдэр, холобур маннык <code><nowiki>{{foo|bar=1|bar=2}}</nowiki></code> or <code><nowiki>{{foo|bar|1=baz}}</nowiki></code>.",
        "revdelete-unsuppress": "Төннөрүллүбүт торумнартан хааччахтааһыны ылан кэбиһэргэ",
        "revdelete-log": "Төрүөтэ:",
        "revdelete-submit": "Маны талбыт {{PLURAL:$1|барылбар|барылларбар}} тутун",
-       "revdelete-success": "'''Барыл көстүүтэ сөпкө уларыйда.'''",
+       "revdelete-success": "Торум көстүүтэ саҥардылынна.",
        "revdelete-failure": "'''Барыл хайдах көстөрө кыайан уларытыллыбат:'''\n$1",
-       "logdelete-success": "'''Дьайыы көстүүтэ сөпкө уларыйда.'''",
+       "logdelete-success": "Дьайыы көстүүтэ уларыйда.",
        "logdelete-failure": "'''Сурунаал дөбөҥө быһаарыллыбата:'''\n$1",
        "revdel-restore": "Көстүүтүн уларытыы",
        "pagehist": "Устуоруйатын сирэйэ",
        "mergehistory-fail-no-change": "Устуоруйа холбоһуутугар ханнык да биэрсийэ холбоһуута буолбата. Баһаалыста сирэйи уонна быстах кэмнээх кэмнэбили өссө төгүл бэрэбиэркэлээ.",
        "mergehistory-fail-permission": "Устуоруйаны холбуурга быраап тиийбэт",
        "mergehistory-fail-self-merge": "Саҕалыыр уонна түмүктүүр сирэйдэриҥ атын буолуохтаахтар",
+       "mergehistory-fail-timestamps-overlap": "Төрүт торумнар биитэр сабырыйаллар, биитэр атын торумнар кэнниттэн кэлэллэр.",
        "mergehistory-fail-toobig": "Устуоруйаны холбуур табыллыбата, тоҕо диэтэххэ $1  барылга көҥүллэнэр лимииттэн элбэҕи көһөрөр наада эбит.",
        "mergehistory-no-source": "Бастакы $1 сирэй суох.",
        "mergehistory-no-destination": "Баар буолуохтаах $1 сирэй суох.",
        "prefs-help-recentchangescount": "Бу саҥа көннөрүүлэри, сирэй устуоруйаларын уонна сурунааллары көрдөрөр.",
        "prefs-help-watchlist-token2": "Бу кэтиир тиһигиҥ ситим-ханаалын кистэлэҥ күлүүһэ.\nБу күлүүһүнэн ким баҕарар эн кэтиир тиһиккин көрүөн сөп, онон кимиэхэ да биэримэ. [[Special:ResetTokens|Маны баттаан уларытыаххын сөп]].",
        "savedprefs": "Эн туруорууларыҥ олохтоннулар.",
-       "savedrights": "{{GENDER:$1|$1}} кыттааччы бырааба бигэргэннэ.",
+       "savedrights": "{{GENDER:$1|$1}} кыттааччы бөлөҕө бигэргэннэ.",
        "timezonelegend": "Олохтоох кэм:",
        "localtime": "Олохтоох кэмим:",
        "timezoneuseserverdefault": "Сиэрбэр туруоруутунан ($1)",
        "prefswarning-warning": "Туруорууларгын уларыппыккын ол эрэн бигэргэппэтэххин.\nБу сирэйтэн «$1» баттамы баттаабакка таҕытаххына, барыта уруккутунан хаалыа.",
        "prefs-tabs-navigation-hint": "Сүбэ: Көмпүүтэриҥ клаватууратын стрелкаларын туһанан кыбытыктан кыбытыкка көһүөххүн сөп.",
        "userrights": "Кыттааччылар бырааптарын салайыы",
-       "userrights-lookup-user": "Ð\9aÑ\8bÑ\82Ñ\82ааÑ\87Ñ\8bлаÑ\80 Ð±Ó©Ð»Ó©Ñ\85Ñ\82Ó©Ñ\80үн Ñ\81алайыы",
+       "userrights-lookup-user": "Ð\9aÑ\8bÑ\82Ñ\82ааÑ\87Ñ\87Ñ\8bнÑ\8b Ñ\82алыы",
        "userrights-user-editname": "Кыттааччы аата:",
-       "editusergroup": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн уларытарга",
+       "editusergroup": "Кыттааччы бөлөхтөрүн көрдөрүү",
        "editinguser": "<strong>[[User:$1|$1]]</strong> кыттааччы $2 быраабын уларытыы",
        "userrights-editusergroup": "Кыттааччы бөлөхтөрүн уларытарга",
        "saveusergroups": "{{GENDER:$1|Кыттааччы}} бөлөхтөрүн бигэргэт",
        "userrights-reason": "Төрүөтэ:",
        "userrights-no-interwiki": "Атын биикилэргэ кыттааччылар бырааптарын уларытар быраабыҥ суох.",
        "userrights-nodatabase": "$1 билэ тиһигэ (олоҕо, база данных) суох эбэтэр локальнай буолбатах.",
-       "userrights-nologin": "Эн дьон бырааптарын уларытаргар администратор быһыытынан [[Special:UserLogin|бэлиэтэниэхтээххин]].",
-       "userrights-notallowed": "Атын кыттааччы быраабын эбэр уонна уларытар кыаҕыҥ суох эбит.",
        "userrights-changeable-col": "Эн уларытар кыахтаах бөлөхтөрүҥ",
        "userrights-unchangeable-col": "Бу бөлөхтөрү уларытар кыаҕыҥ суох",
        "userrights-conflict": "Кыттааччы быраабын быһаарарга алҕас таҕыста! Хатылаан көр.",
-       "userrights-removed-self": "Бэйэҥ кыаххын сарбынныҥ. Онон бу сирэйгэ киирэр кыаҕыҥ суох буолла.",
        "group": "Бөлөх:",
        "group-user": "Кыттааччылар",
        "group-autoconfirmed": "Аптамаатынан бигэргэтиллибит кыттааччылар",
        "right-siteadmin": "Билэ олоҕор (database) киирэри бобуу уонна көҥүллээһин",
        "right-override-export-depth": "сирэйдэри таһаарааһын (экспортааһын), ситимнээх сирэйдэри 5-с таһымҥа дылы холбоон туран",
        "right-sendemail": "Атын кыттааччыларга эл. почтаны ыытарга",
-       "right-passwordreset": "Киирии тылы почта нөҥүө уларытыыны көрүү",
-       "right-managechangetags": "[[Special:Tags|Бэлиэлэри]] билии олоҕуттан ылыы уонна сотуу",
+       "right-managechangetags": "[[Special:Tags|Тиэктэри]] оҥоруу уонна холбооһун/араарааһын",
        "right-applychangetags": "Улартыыларгын кытта [[Special:Tags|тиэктэри]] тутун",
        "right-changetags": "Ханнык баҕарар [[Special:Tags|тиэктэри]] биирдиилээн уларытыыларга уонна сурунаал суруйууларыгар эбэри уонна сотору көҥүллээ",
+       "right-deletechangetags": "[[Special:Tags|тиэктэри]] билии олоҕуттан сотуу",
        "grant-generic": "Быраап «$1» нобуора",
        "grant-group-page-interaction": "Сирэйдиин алтыһыы",
        "grant-group-file-interaction": "Миэдьийэлиин алтыһыы",
        "grant-group-high-volume": "Кылгас кэм иһигэр элбэҕи оҥоруу",
        "grant-group-customization": "Нарылааһын уонна туруоруулар",
        "grant-group-administration": "Дьаһайыы",
+       "grant-group-private-information": "Эн тускунан билиини көҥүллээһин",
        "grant-group-other": "Эгэлгэ тэрээһиннэр",
        "grant-blockusers": "Бэлиэ ааттары хааччахтааһын ууонна хааччаҕын устуу",
        "grant-createaccount": "Бэлиэтэнии",
        "grant-highvolume": "Түргэнник элбэҕи уларытыы",
        "grant-oversight": "Кыттааччылар уларытыыларын уонна сирэйдэр барылларын кистээһин",
        "grant-patrol": "Сирэй уларыйыытын ботурууллааһын",
+       "grant-privateinfo": "Киһи туһунан сиһилии билиигэ көҥүл",
        "grant-protect": "Көмүскээһин уонна көмүскэли суох гыныы",
        "grant-rollback": "Сирэй уларыйыытын төннөрүү",
        "grant-sendemail": "Атын кыттааччыларга эл. суругу ыытыы",
        "grant-basic": "Сүрүн быраап",
        "grant-viewdeleted": "Сотуллубут билэлэри уонна сирэйдэри көрүү",
        "grant-viewmywatchlist": "Кэтиир тиһиликкин көрүү",
+       "grant-viewrestrictedlogs": "Хааччахтаах сурунаалы көрүү",
        "newuserlogpage": "Кыттааччылары бэлиэтиир сурунаал",
        "newuserlogpagetext": "Соторутааҕыта бэлиэтэммит кыттааччылар.",
        "rightslog": "Кыттаачы бырааптарын сурунаала",
        "rightslogtext": "Бу кыттааччы бырааптарын уларыйыытын көрдөрөр сурунаал.",
        "action-read": "бу сирэйи ааҕыы",
        "action-edit": "бу сирэйи көннөрүү",
-       "action-createpage": "сирэйдэри оҥоруу",
-       "action-createtalk": "Ñ\8bÑ\80Ñ\8bÑ\82Ñ\8bÑ\8b Ñ\81иÑ\80Ñ\8dйдÑ\8dÑ\80ин Ð¾Ò¥Ð¾Ñ\80Ñ\83Ñ\83",
+       "action-createpage": "бу сирэйи оҥоруу",
+       "action-createtalk": "ырытыы сирэйин оҥоруу",
        "action-createaccount": "кыттааччы бу бэлиэтэнэр аатын оҥоруу",
        "action-autocreateaccount": "тас бэлиэ-аатынан аптамаатынан киирии",
        "action-history": "сирэй устуоруйатын көрүү",
        "action-viewmyprivateinfo": "бэйэҥ тускунан көрүү",
        "action-editmyprivateinfo": "бэйэҥ тускунан суруллубуту уларыт",
        "action-editcontentmodel": "сирэй ис тутулун уларытыы",
-       "action-managechangetags": "билии олоҕор бэлиэлэри оҥоруу уонна сотуу",
+       "action-managechangetags": "тиэктэри оҥоруу уонна холбооһун/араарыы",
        "action-applychangetags": "тиэктэри Эн уларытыыларгын кытта туһанары көҥүллээ",
        "action-changetags": "ханнык баҕарар тиэктэри сурунаал биирдиилээн уларытыыларыгар уонна суруктарыгар эбэри уонна сотору көҥүллээ",
+       "action-deletechangetags": "тиэктэри билии олоҕуттан сотуу",
+       "action-purge": "сирэй кээһин ыраастааһын",
        "nchanges": "$1 {{PLURAL:$1|уларытыы|уларытыылар}}",
        "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|тиһэх сылдьыыгыттан}}",
        "enhancedrc-history": "устуоруйата",
        "recentchangeslinked-page": "Сирэй аата:",
        "recentchangeslinked-to": "Төттөрүтүн, ыйыллыбыт сирэйгэ сигэнэр сирэйдэри көрдөр",
        "recentchanges-page-added-to-category": "[[:$1]] категорияҕа эбилиннэ",
-       "recentchanges-page-added-to-category-bundled": "[[:$1]] уонна [[Special:WhatLinksHere/$1|{{PLURAL:$2|биир сирэй|$2 сирэй}}]] категорияҕа эбилиннэ",
+       "recentchanges-page-added-to-category-bundled": "[[:$1]] категорияҕа эбилиннэ, [[Special:WhatLinksHere/$1|бу сирэй атын сирэйдэргэ киириитэ]]",
        "recentchanges-page-removed-from-category": "[[:$1]] категорияттан сотулунна",
-       "recentchanges-page-removed-from-category-bundled": "[[:$1]] уонна {{PLURAL:$2|биир сирэй|$2 сирэй}} категорияттан сотулунна",
+       "recentchanges-page-removed-from-category-bundled": "[[:$1]] категорияттан сотулунна, [[Special:WhatLinksHere/$1|бу сирэй атын сирэйдэргэ киириитэ]]",
        "autochange-username": "MediaWiki аптамаатынан уларыйыыта",
        "upload": "Билэни угуу",
        "uploadbtn": "Билэни киллэрии",
        "file-thumbnail-no": "Билэ аата мантан саҕаланар <strong>$1</strong>.\nАрааһа ойуу кыра куоппуйата быһыылаах ''(миниатюра)''.\nБу ойуу толору барыйаана баар буоллаҕына ону манна суруй, эбэтэр аатын уларыт.",
        "fileexists-forbidden": "Маннык ааттаах билэ баар, хат суруллар кыаҕа суох.\n\nСин биир бу билэни киллэриэххин баҕарар буоллаххына төннөн атыннык ааттаа. [[File:$1|thumb|center|$1]]",
        "fileexists-shared-forbidden": "Маннык ааттаах ойуу уопсай ыскылаакка баар эбит.\nОл да буоллар билэни киллэриэххин баҕарар буоллаххына төннөн атыннык ааттаа. [[File:$1|thumb|center|$1]]",
+       "fileexists-no-change": "Киллэриллэр билэ баар билэни кытта үүт-үкчү <strong>[[:$1]]</strong>.",
+       "fileexists-duplicate-version": "Киллэриллэр билэ баар билэ {{PLURAL:$2|урукку барылын|урукку барылларын}} кытта үүт-үкчү <strong>[[:$1]]</strong>.",
        "file-exists-duplicate": "Бу билэ атын {{PLURAL:$1|билэ дубликаата|билэлэр дубликааттара}} буолар:",
        "file-deleted-duplicate": "Маннык билэ ([[:$1]]) урут сотуллубут эбит. Суруттарыаҥ иннинэ бастаан тоҕо сотуллубутун көр.",
        "file-deleted-duplicate-notitle": "Маннык билэ урут сотуллубут эбит, аата бобуллубут.\nБилэни саҥаттан киллэриэҥ иннинэ бобуллубут билэлэри көрөр кыахтаах киһиэхэ тахсан тоҕо бобуллубутун быһаарыс.",
        "uploaded-script-svg": "Хачайдаммыт SVG-билэҕэ сценарийы өйүүр куттааллаах «$1» элэмиэн көһүннэ.",
        "uploaded-hostile-svg": "Хачайдаммыт SVG-билэ истиилин элэмиэнигэр кутталлаах CSS-куод көһүннэ.",
        "uploaded-event-handler-on-svg": "SVG-билэлэргэ <code>$1=\"$2\"</code> сабыытыйаны таҥастааччы атрибууттарын туруоруу көҥүллэммэт.",
+       "uploaded-href-attribute-svg": "Манна көстүбүт <code><$1 $2=\"$3\"></code> SVG-билэ сигэҕэ аналлаах href-атрибуттарыгар, маннык эрэ көүллэнэр: http:// биитэр https://.",
        "uploaded-href-unsafe-target-svg": "Хачайдаммыт SVG-билэҕэ кутталлаах сигэ көһүннэ <code>&lt;$1 $2=\"$3\"&gt;</code>.",
        "uploaded-animate-svg": "«Animate» тиэк көһүннэ, кини «from»-атрибут көмөтүнэн  <code>&lt;$1 $2=\"$3\"&gt;</code> хачайдаммыт SVG-билэҕэ сигэни уларытыан сөп.",
        "uploaded-setting-event-handler-svg": "Дьайыы таҥастыыр тэрил атрибуутун уларытар бобуллубут, киллэриллибит SVG-билэҕэ <code>&lt;$1 $2=\"$3\"&gt;</code> куод көстүбүт.",
        "upload-http-error": "HTTP алҕаһа таҕыста: $1",
        "upload-copy-upload-invalid-domain": "Бу домеҥҥа хачайдааһыны хатылыыр табыллыбат.",
        "upload-foreign-cant-upload": "Бу биики ыйыллыбыт репозиторийга хачайдыырга туруоруллубатах",
+       "upload-foreign-cant-load-config": "Билэ тас ыскылаатыгар хачайдааһын конфигурациятын ылар сатаммата.",
+       "upload-dialog-disabled": "Бу тэрил көмөтүнэн бу биикигэ хачайдыыры сабан кэбиспиттэр.",
        "upload-dialog-title": "Билэни угуу",
        "upload-dialog-button-cancel": "Салҕаама",
+       "upload-dialog-button-back": "Төнүн",
        "upload-dialog-button-done": "Оҥоһулунна",
        "upload-dialog-button-save": "Бигэргэт",
        "upload-dialog-button-upload": "Киллэрии",
        "upload-form-label-infoform-title": "Сиһилии",
        "upload-form-label-infoform-name": "Аата",
+       "upload-form-label-infoform-name-tooltip": "Билэ баһа кини аатын курдук бигэргэниэ. Ханнык баҕарар тылы уонна тыллар ыккардыларыгар арыты туһаныахха сөп. Кэтирээһинин ыйыма.",
        "upload-form-label-infoform-description": "Быһаарыыта",
        "upload-form-label-infoform-description-tooltip": "Кылгастык бу айымньы туһунан сүрүннээн этиҥ. Хаартыскаҕа сүнньүнэн туох ойууламмытый, ханна түһэриллибитий.",
        "upload-form-label-usage-title": "Туһаныы",
        "backend-fail-read": "$1 билэни ааҕар табыллыбата.",
        "backend-fail-create": "$1 билэни суруттарар табыллыбата.",
        "backend-fail-maxsize": "$1 билэни суруттарар табыллыбата, тоҕо диэтэххэ кини кээмэйэ $2 баайты куоһарар.",
-       "backend-fail-readonly": "«$1» сиэрбэр «ааҕыы эрэ» эрэсиимҥэ турар. Төрүөтэ: «$2»",
+       "backend-fail-readonly": "«$1» сиэрбэр «ааҕыы эрэ» диэн эрэсиимҥэ турар. Төрүөтэ: <em>$2</em>",
        "backend-fail-synced": "«$1» билэ сөпсөһүллүбэтэх туруктаах эбит",
        "backend-fail-connect": "Маны кытта «$1» холбонор табыллыбата.",
        "backend-fail-internal": "Манна «$1» биллибэт алҕас таҕыста.",
        "uploadstash-summary": "Бу сирэй биикигэ киллэриллибит (эбэтэр киллэриллэ турар) ол гынан баран аһаҕас көрүүгэ тахса илик билэлэри көрөргө аналлаах. Бу билэлэр ааптартан ураты кимиэхэ да көстүбэттэр.",
        "uploadstash-clear": "Кистэммит билэлэри суох оҥорорго",
        "uploadstash-nofiles": "Кистэммит билэлэриҥ суохтар.",
-       "uploadstash-badtoken": "ЫйбÑ\8bÑ\82 Ð´Ñ\8cайÑ\8bÑ\8bгÑ\8bн Ð¾Ò¥Ð¾Ñ\80оÑ\80 Ñ\82абÑ\8bллÑ\8bбаÑ\82а. Ð\90Ñ\80ааһа Ð±Ð¾Ð»Ð´Ñ\8cоÒ\95о Ð±Ò¯Ð¿Ð¿Ò¯Ñ\82 Ð±Ñ\8bÒ»Ñ\8bÑ\8bлааÑ\85. Ó¨Ñ\81Ñ\81Ó© Ð±Ð¾Ñ\80Ñ\83обалаа.",
+       "uploadstash-badtoken": "ЫйбÑ\8bÑ\82 Ð´Ñ\8cайÑ\8bÑ\8bгÑ\8bн Ð¾Ò¥Ð¾Ñ\80оÑ\80 Ñ\82абÑ\8bллÑ\8bбаÑ\82а. Ð\90Ñ\80ааһа ÐºÐ¸Ð¸Ñ\80биÑ\82 Ð°Ð°Ñ\82Ñ\8bÒ¥ Ð±Ð¾Ð»Ð´Ñ\8cоÒ\95о Ð±Ò¯Ð¿Ð¿Ò¯Ñ\82 Ð±Ñ\8bÒ»Ñ\8bÑ\8bлааÑ\85. Ð¥Ð°Ñ\82Ñ\8bлаан ÐºÓ©Ñ\80.",
        "uploadstash-errclear": "Билэлэри сотор табыллыбата.",
        "uploadstash-refresh": "Билэлэр тиһиктэрин саҥардан биэр",
+       "uploadstash-thumbnail": "ойуучааны көрдөр",
+       "uploadstash-exception": "Суруттараргын быстах уурар сиргэ харайар сатаммата ($1): \"$2\".",
        "invalid-chunk-offset": "Бобуллубут сыҕарыйыы",
        "img-auth-accessdenied": "Киирии бобуллубут",
        "img-auth-nopathinfo": "PATH_INFO суох.\nЭн сиэрбэриҥ маннык сибидиэнньэни ыытарга туруоруллубатах эбит.\nБаҕар кини CGI олоҕурара буолуо ол иһин img_auth өйөөбөтө буолуо.\nМаны https://www.mediawiki.org/wiki/Special:MyLanguage/Manual:Image_Authorization көр.",
        "filerevert-submit": "Төннөрүү",
        "filerevert-success": "'''[[Media:$1|$1]]''' бу торумҥа төннөрүлүннэ [$4 торум Filetype-missingот $3, $2].",
        "filerevert-badversion": "Бу билэ этиллибит күҥҥэ-ыйга/кэмҥэ оҥоһуллубут урукку торума суох.",
+       "filerevert-identical": "Талбыт торумуҥ билиҥҥи торуму кытта үүт үкчүлэр.",
        "filedelete": "Сот: $1",
        "filedelete-legend": "Билэни сот",
        "filedelete-intro": "Бу билэни '''[[Media:$1|$1]]''' туох баар суруллубут историятын кытта сотон эрэҕин.",
        "apisandbox": "API песочница",
        "apisandbox-jsonly": "API-песочницаны туһанарга JavaScript ирдэнэр.",
        "apisandbox-api-disabled": "Бу сайтка API араарыллыбыт.",
+       "apisandbox-intro": "Бу сирэйи <strong>MediaWiki API</strong> тургутан көрөргө туһан.\nAPI-ни туттар туһунан сиһилии манна ааҕыахха сөп [[mw:API:Main page|API туһунан]]. Холобура, [https://www.mediawiki.org/wiki/API#A_simple_example Сүрүн сирэй иһинээҕитин хайдах ылар туһунан]. Атын холобурдары көрөргө сигэни баттаа.\nБолҕой: бу тургутар сирэй эрээри, манна суруйбутуҥ биикигэ уларытыыны оҥоруон сөп.",
        "apisandbox-fullscreen": "Паныалы арыйыы.",
        "apisandbox-fullscreen-tooltip": "Браузеры толорорго песочница паныалын арыйыы.",
        "apisandbox-unfullscreen": "Сирэйи көрдөрүү",
        "apisandbox-submit": "Ыйытык оҥоруу",
        "apisandbox-reset": "Сот",
        "apisandbox-retry": "Хатылаа",
+       "apisandbox-loading": "«$1» API-модульга аналлаах хачайдана турар…",
+       "apisandbox-load-error": "«$1» API-модулга аналлаах хачайданарыгар алҕас таҕыста: $2",
+       "apisandbox-no-parameters": "Бу API-модулга туруоруута (параметра) суох.",
        "apisandbox-helpurls": "Көмө сигэлэр",
        "apisandbox-examples": "Холобурдар",
        "apisandbox-dynamic-parameters": "Дьайыы кээмэйдэрэ.",
        "apisandbox-results": "Түмүк",
        "apisandbox-sending-request": "API-көрдөбүлү ыытыы…",
        "apisandbox-loading-results": "API-түмүгүн ылыы…",
+       "apisandbox-results-error": "Көрдөбүлгэ API-хоруйу киллэрии  кэмигэр алҕас таҕыста: $1.",
+       "apisandbox-request-url-label": "Көрдөбүл URL-аадырыһа:",
+       "apisandbox-request-time": "Көрдөбүл болдьоҕо: {{PLURAL:$1|$1 мс}}",
        "apisandbox-results-fixtoken": "Токены көннөрөн баран саҥаттан ыыт.",
+       "apisandbox-results-fixtoken-fail": "«$1» токены ыҥырар табыллыбата.",
+       "apisandbox-alert-page": "Бу сирэй хонуулара алҕастаах.",
+       "apisandbox-alert-field": "Хонуу суолтата алҕастаах.",
+       "apisandbox-continue": "Салгыы",
+       "apisandbox-continue-clear": "Сот",
        "booksources": "Кинигэлэр источниктара",
        "booksources-search-legend": "Кинигэ туһунан көрдөө",
        "booksources-search": "Бул",
index 7b57f55..f711abd 100644 (file)
        "yourpasswordagain": "Arhõ oku namber olme",
        "createacct-yourpasswordagain": "Uku nambar sãyãḱme",
        "createacct-yourpasswordagain-ph": "Uku nambar arhõ emme",
-       "remembermypassword": "Mitṭen khon bạṛti khata reaḱ cạbi disạ dohoḱma (Jạsti $1 {{PLURAL:$1 din reaḱ din reaḱ}} lạgit)",
        "userlogin-remembermypassword": "Bolo thirege dohokạńme",
        "yourdomainname": "Amaḱ ḍomen:",
        "externaldberror": "Hoe daṛeyaḱa jahan bahre reaḱ jacaeaḱ ḍaṭabes vul hoeakana se amaḱ bahre reaḱ ekaunṭ do nahaḱ halot aguire ạidạri bạnuḱa.",
        "passwordreset-emailtitle": "{{SITENAME}} sayeṭre beoharićaḱ purạo thutiko",
        "passwordreset-emailelement": "Beoharićaḱ ńutum: \n$1\n\nMit́ ghạṛi lạgit uku nambar: \n$2",
        "passwordreset-emailsentemail": "Mitṭen disạ ruaṛ e-mail do kulena.",
-       "passwordreset-emailsent-capture": "Mit́ṭen disạ ruaṛaḱ e-mail dokulena, oka do latarre ńeloḱ kana.",
-       "passwordreset-emailerror-capture": "Disạ ruạṛ oco lạgit́te mit́ṭen e-mail tear hoelena, oka do latarre udugoḱkana, menkhan $1 beoharić ṭhen  ṭhen baṅ kul hoe akana.",
        "changeemail": "E-mail ṭhikạna do bodolme",
        "changeemail-header": "Ekaunṭ e-mail ṭhikạna do bodolme",
        "changeemail-no-info": "Noa sakam sojhete laṛcaṛ lạgit́te am do bhitri boloḱ hoyoḱtama.",
        "post-expand-template-inclusion-category": "Sakamko oka borḍre noa tahẽna ona doe paromkeda",
        "post-expand-template-argument-warning": "'''Sontoroḱmẽ:''' Noa sakamre komse kom mitṭen forma joṛao menaḱa ạḍi lạṭute pasnao akana.\nOnate noa ạrgumenṭkodo bạgi giḍi hoena.",
        "post-expand-template-argument-category": "Bagi forma ạrgumenṭ sapdoho sakam",
-       "cantcreateaccounttitle": "Ekaunṭ do baṅ tearlena",
        "viewpagelogs": "Noa sakam reaḱ cạbi udukme",
        "nohistory": "Noa sakam re do jahan sompadon reaḱ jạṛ bạnuḱa.",
        "currentrev": "Mucạt nãwã aroe",
index 6dc082e..2bdc449 100644 (file)
        "yourpasswordagain": "Repite sa password:",
        "createacct-yourpasswordagain": "Cunfirma sa password",
        "createacct-yourpasswordagain-ph": "Inserta sa password torra",
-       "remembermypassword": "Ammenta sa password in custu navigadore (pro unu màssimu de $1 {{PLURAL:$1|die|dies}})",
        "userlogin-remembermypassword": "Mantènnemi cullegadu",
        "userlogin-signwithsecure": "Imprea una cunnessione segura",
        "yourdomainname": "Ispetzìfica su domìniu",
        "content-model-css": "CSS",
        "post-expand-template-inclusion-category": "Pàginas in is cale sa dimensione templates inclùdidos propassat su lìmite cunsentidu",
        "post-expand-template-argument-category": "Pàginas cuntenentes templates cun argumentos fartados",
-       "cantcreateaccounttitle": "Non si podet creare unu contu",
        "viewpagelogs": "Càstia is registros de custa pàgina",
        "nohistory": "Non b'est sa stòria de is acontzos pro custa pàgina.",
        "currentrev": "Revisione currente",
        "linksearch-line": "$1 est ligadu in sa pàgina $2",
        "listusers-submit": "Ammustra",
        "listusers-blocked": "(blocadu)",
-       "activeusers-hidebots": "Cua bots",
-       "activeusers-hidesysops": "Cua amministradores",
        "listgrouprights-group": "Grupu",
        "listgrouprights-rights": "Deretos",
        "listgrouprights-members": "(lista de is cumponentes)",
index 152a08a..a94b562 100644 (file)
        "yourpasswordagain": "Retype passwaird:",
        "createacct-yourpasswordagain": "Confirm passwaird.",
        "createacct-yourpasswordagain-ph": "Enter passwaird again.",
-       "remembermypassword": "Mynd ma login oan this brouser (fer $1 {{PLURAL:$1|day|days}} at the maist)",
        "userlogin-remembermypassword": "Keep me loggit in",
        "userlogin-signwithsecure": "Uise secure connection",
        "cannotloginnow-title": "Canna log in nou",
        "activeusers-intro": "This is ae leet o uisers that had some kynd o acteevitie wiin the last $1 {{PLURAL:$1|day|days}}.",
        "activeusers-count": "$1 {{PLURAL:$1|action|actions}} in the laist {{PLURAL:$3|day|$3 days}}",
        "activeusers-from": "Displey uisers stairtin at:",
-       "activeusers-hidebots": "Skauk bots",
-       "activeusers-hidesysops": "Skauk admeenistraters",
        "activeusers-noresult": "Naw uisers foond.",
        "listgrouprights": "Uiser groop richts",
        "listgrouprights-summary": "The follaein is ae leet o uiser groops defined oan this wiki, wi thair associatit access richts.\nThaur micht be [[{{MediaWiki:Listgrouprights-helppage}}|addeetional information]] aneat indiveedual richts.",
        "htmlform-cloner-create": "Eik mair",
        "htmlform-cloner-delete": "Remuiv",
        "htmlform-cloner-required": "At least the ae value is needit.",
-       "sqlite-has-fts": "$1 wi ful-tex rake support",
-       "sqlite-no-fts": "$1 wioot ful-tex rake support",
        "logentry-delete-delete": "$1 {{GENDER:$2|delytit}} page $3",
        "logentry-delete-restore": "$1 {{GENDER:$2|restored}} page $3",
        "logentry-delete-event": "$1 {{GENDER:$2|chynged}} veesibeelitie o {{PLURAL:$5|ae log event|$5 log events}} oan $3: $4",
index f3a4340..be9c104 100644 (file)
        "tog-watchdefault": "منهنجا ترميميل صفحا ۽ فائيل  منهنجي نظرھيٺ فھرست ۾ رکو",
        "tog-watchmoves": "جيڪي صفحا ۽ فائيل آءُٗ چوريان، سي منهنجي نظرھيٺ فھرست ۾ شامل ڪريو.",
        "tog-watchdeletion": "آءُٗ جيڪي صفحا ۽ فائيل  ڊاهيان، سي منهنجي نظرھيٺ فھرست تي رکو",
+       "tog-watchuploads": "منهنجا نوان چاڙهيل فائيلس ٽيٽ فهرست ۾ شامل ڪريو",
        "tog-watchrollback": "انهن صفحن کي منهنجي نظرھيٺ فھرست تي رکو، جن ۾ تبديلين کي مون واپس ورايو آهي.",
        "tog-minordefault": "سمورين تبديلين کي بنان چئي معمولي ترميم تصور ڪريو",
-       "tog-previewontop": "ترميمي دٻي مٿان پيش نگاھ ڏيکاريو",
-       "tog-previewonfirst": "پهرين ترميم تي پيش نگاھ ڏيکاريو",
-       "tog-enotifwatchlistpages": "Ù\85Ù\88Ù\86 Ú©Ù\8a Ø§Ù\8aÙ\85Ù\8aÙ\84 ÚªØ±Ù\8aÙ\88 Ø¬Ú\8fÙ\87Ù\86 Ù\85Ù\86Ù\87Ù\86جÙ\8a Ù\86ظرھÙ\8aÙº Ù\81ھرست Û¾ ÚªÙ\88 ØµÙ\81Ø­Ù\88 Ù\8aا Ù\81ائÙ\8aÙ\84 ØªØ¨Ø¯Ù\8aÙ\84 ÚªÙ\8aÙ\88 Ù\88Ú\83Ù\8a",
+       "tog-previewontop": "ترميمي دٻيءَ مٿان پيش نگاهہ ڏيکاريو",
+       "tog-previewonfirst": "پهرين ترميم تي پيش نگاهہ ڏيکاريو",
+       "tog-enotifwatchlistpages": "Ù\85Ù\86Ù\87Ù\86جÙ\8a Ù½Ù\8aÙ½ Ù\81ھرست Ø§Ù\86در Ø´Ø§Ù\85Ù\84 ÚªÙ\86Ù\87Ù\86 ØµÙ\81Ø­Ù\8a Ù\8aا Ù\81ائÙ\8aÙ\84 Û¾ ØªØ¨Ø¯Ù\8aÙ\84 Ù¾Ù\8aØ´ Ø§Ú\86Ù\8a Ù\85Ù\88Ù\86 Ú©Ù\8a Ø¨Ø±Ù\82 Ù½Ù¾Ø§Ù\84 Ø§Ù\85اڻÙ\8aÙ\88",
        "tog-enotifusertalkpages": "منهنجي مباحثي صفحي ۾ تبديليءَ جي صورت ۾ مون کي برق ٽپال اماڻيو",
        "tog-enotifminoredits": "صفحن ۾ معمولي ترميمن جي صورت ۾ بہ مون کي برق ٽپال ڪريو",
        "tog-enotifrevealaddr": "پڌراين ۾ منهنجو برق ٽپال پتو ظاهر ڪريو.",
        "tog-watchlisthideminor": "ٽيٽ فهرست تان معمولي ترميمون لڪايو",
        "tog-watchlisthideliu": "لاگ اِن ٿيل يوزرس جون ڪيل ترميمون زيرنظر فهرست ۾ نہ ڏيکاريو",
        "tog-watchlisthideanons": "ٽيٽ فهرست تان اڻڄاتل يوزر جون ترميمون لڪايو",
-       "tog-watchlisthidepatrolled": "Ù\86ظرھÙ\8aÙº فھرست مان گشت ڪيل ترميمون لڪايو",
+       "tog-watchlisthidepatrolled": "Ù½Ù\8aÙ½ فھرست مان گشت ڪيل ترميمون لڪايو",
        "tog-watchlisthidecategorization": "صفحن جا زمرا لڪايو",
        "tog-ccmeonemails": "ٻين يوزرس ڏانهن منهنجي موڪليل برق ٽپال جو پرت مون کي اماڻيو",
        "tog-diffonly": "تفاوت هيٺان صفحي جو مواد نہ ڏيکاريو",
        "tog-showhiddencats": "لڪل زمرا ڏيکاريو",
+       "tog-norollbackdiff": "واپس ورائڻ کان پوءِ تفاوت نہ ڏيکاريو",
        "tog-useeditwarning": "مونکي خبردار ڪريو جڏهن مان هڪ ترميم وارو صفحو بغير تبديلين سانڍڻ جي ڇڏيان",
        "tog-prefershttps": "هميشہ محفوظ ڪنيڪشن استعمال ڪريو جڏهن داخل ٿيل هجو",
        "underline-always": "هميشہ",
        "underline-never": "ڪڏهن بہ نہ",
+       "underline-default": "پيش طَي چَم يا جھانگُو",
        "editfont-style": "ايراضي جو فونٽ اسٽائيل سنواريو:",
-       "editfont-sansserif": "سينس-سيرف فونٽ",
-       "editfont-serif": "سيرِف اِنڊو",
+       "editfont-default": "پيش طَي جھانگُو",
+       "editfont-monospace": "يڪ وٺيل اِنڊو",
+       "editfont-sansserif": "بي سريف اِنڊو",
+       "editfont-serif": "باسريف اِنڊو",
        "sunday": "آچر",
        "monday": "سومر",
        "tuesday": "اڱارو",
@@ -69,9 +74,9 @@
        "february": "فيبروري",
        "march": "مارچ",
        "april": "اپريل",
-       "may_long": "مَئي",
-       "june": "جÙ\88Ù\86",
-       "july": "جولاءِ",
+       "may_long": "مَي",
+       "june": "جÙ\8fÙ\88Ù\86Ù\90",
+       "july": "جÙ\8fÙ\88Ù\84اءÙ\90",
        "august": "آگسٽ",
        "september": "سيپٽمبر",
        "october": "آڪٽوبر",
@@ -93,9 +98,9 @@
        "feb": "فيبروري",
        "mar": "مارچ",
        "apr": "اپريل",
-       "may": "مئي",
-       "jun": "جÙ\88Ù\86",
-       "jul": "جولاءِ",
+       "may": "مَي",
+       "jun": "جÙ\8fÙ\88Ù\86Ù\90",
+       "jul": "جÙ\8fÙ\88Ù\84اءÙ\90",
        "aug": "آگسٽ",
        "sep": "سيپٽمبر",
        "oct": "آڪٽوبر",
        "qbpageoptions": "هيءُ صفحو",
        "qbmyoptions": "منهنجا صفحا",
        "faq": "ڪپس",
-       "faqpage": "Project:ڪپوس",
-       "actions": "فعل",
+       "faqpage": "Project:ڪپس",
+       "actions": "ڪارگذاريون",
        "namespaces": "نانءُپولارَ",
        "variants": "بَدَلَ",
        "navigation-heading": "رهنما مينيو",
        "title-invalid-interwiki": "ڄاڻايل عنوان ۾ اهڙو بين‌الوڪِي ڳنڍڻو شامل آهي، جيڪو عنوانن ۾ استعمال ڪري نہ ٿو سگھجي.",
        "title-invalid-characters": "صفحي جي ڄاڻايل عنوان ۾ ناقابل ڪار اکر شامل آهن: $1",
        "title-invalid-leading-colon": "صفحي جي ڄاڻايل عنوان جي ابتدا ۾ ناقابل ڪار ڪالن شامل آهي.",
-       "viewsource": "ذريعو ڏسو",
+       "viewsource": "ڪوڊ ڏسو",
        "viewsource-title": "$1 جو ڪوڊ ڏسو",
        "protectedpagetext": "هيءُ صفحو ترميمن کان تحفظيل آهي.",
        "viewsourcetext": "توهان هن صفحي جو ڪوڊ ڏسي ۽ نقل ڪري سگھو ٿا:",
        "mypreferencesprotected": "توهان جي پنهنجون ترجيحات سنوارڻ جي اجات حاصل ڪانهي.",
        "ns-specialprotected": "خاص صفحا سنواري نٿا سگھجن.",
        "titleprotected": "[[User:$1|$1]] اهڙي عنوان سان صفحو سرجڻ تي روڪ لڳائي ڇڏي آهي. سبب <em>$2</em> ڄاڻايو ويو آهي.",
-       "exception-nologin": "داخل ٿيل ناهيو",
+       "exception-nologin": "داخل ٿيل نہ آهيو",
        "virus-unknownscanner": "اڻ ڄاتل نِس وائرس:",
        "cannotlogoutnow-title": "ھاڻي ٻاھر نٿو نڪري سگھجي",
        "cannotlogoutnow-text": "$1 استعمال ڪرڻ دوران ٻاھر نڪرڻ ممڪن نہ آھي.",
        "cannotlogin-text": "داخل ٿيڻ ممڪن نه آھي",
        "cannotloginnow-title": "ھاڻي داخل نٿو ٿي سگھجي",
        "cannotloginnow-text": "$1 استعمال ڪرڻ دوران داخل ٿيڻ ممڪن نہ آھي.",
-       "cannotcreateaccount-title": "کاتا نٿو کولي سگھي",
+       "cannotcreateaccount-title": "کاتا کولي نہ ٿو سگھي",
        "yourdomainname": "توهان جو ميدان:",
        "password-change-forbidden": "هن وڪِي تي توهان ڳجھالفظ بدلائي نٿا سگھو.",
        "login": "داخل ٿيو",
        "userloginnocreate": "داخل ٿيو",
        "logout": "ٻاھر نڪرو",
        "userlogout": "ٻاھر نڪرو",
-       "notloggedin": "داخل ٿيل ناهيو",
-       "userlogin-noaccount": "کاتو نٿا رکو؟",
+       "notloggedin": "داخل ٿيل نہ آهيو",
+       "userlogin-noaccount": "کاتو نہ ٿا رکو؟",
        "userlogin-joinproject": "{{SITENAME}} ۾ شامل ٿيو",
        "nologin": " کاتو نہ ٿا رکو؟ '''$1'''.",
        "nologinlink": "نئون کاتو کوليو",
        "createacct-benefit-heading": "{{SITENAME}} توهان جهڙن سڄڻن ٺاهيو آهي.",
        "createacct-benefit-body1": "{{PLURAL:$1|ترميم|ترميمون}}",
        "createacct-benefit-body2": "{{PLURAL:$1|صفحو|صفحا}}",
-       "createacct-benefit-body3": "حاليه {{PLURAL:$1|ڀاڱيدار}}",
+       "createacct-benefit-body3": "ھاڻوڪا {{PLURAL:$1|ڀاڱيدار}}",
        "badretype": "توهان جو ڄاڻايل ڳجھولفظ درست نہ آهي.",
        "usernameinprogress": "ان يُوزرنانءُ لاءِ کاتو اڳ ۾ ئي تياريءَ هيٺ آهي. مهرباني ڪري انتظار فرمايو.",
        "userexists": "ڄاڻايل يوزرنانءُ اڳ ۾ ئي استعمال هيٺ آهي. مهرباني ڪري ڪو ٻيو يُوزرنانءُ چونڊيو.",
        "noemailcreate": "توهان کي قابل ڪار برق ٽپال پتو مهيا ڪرڻو پوندو.",
        "passwordsent": "يوزر \"$1\" لاءِ هڪ نئون ڳجھو لفظ برق ٽپال ذريعي اماڻيو ويو آهي.  مهرباني ڪري اهو حاصل ڪرڻ بعد لاگ اِن ٿيندا.",
        "mailerror": "ٽپال اماڻڻ ۾ چُڪَ: $1",
-       "acct_creation_throttle_hit": "توهان جي آءِ پي پتي تان هن وڪيءَ تي پوئين ڏينهن {{PLURAL:$1|1 کاتو|$1 کاتا}} کلي چڪا آهن، جيڪو وڌ ۾ وڌ اجازت ڏنل وقت آهي. \nنتيجتاً ساڳي آءِ پي پتي تان في‌الوقت وڌيڪ کاتا کولي نٿا سگھجن.",
+       "acct_creation_throttle_hit": "توهان جي آءِپي پتي تان هن وڪيءَ تي پوئين $2، کان {{PLURAL:$1|1 کاتو|$1 کاتا}} کلي چڪا آهن، جيڪو وڌ ۾ وڌ اجازت ڏنل وقت آهي. \nنتيجتاً ساڳي آءِپي پتي تان في‌الوقت وڌيڪ کاتا کولي نٿا سگھجن.",
        "emailauthenticated": "توهان جي برق ٽپال پتي جي تصديق $2 تي $3 بجي ڪئي وئي.",
        "emailnotauthenticated": "توهان جو برق ٽپال پتي جي تصديق اڃا ٿي نہ سگھي آهي.",
        "noemailprefs": "انهن فيچرس کي فعال بڻائڻ لاءِ پنهنجي ترجيحات ۾ برق ٽپال پتو ڄاڻايو.",
        "botpasswords-label-cancel": "رد",
        "botpasswords-label-delete": "ڊاهيو",
        "botpasswords-label-resetpassword": "ڳجھولفظ ٻيھر مقرر ڪريو",
+       "botpasswords-label-grants-column": "منظور",
        "resetpass_forbidden": "ڳجھالفظ بدلائي نٿا سگھجن",
        "resetpass_forbidden-reason": "ڳجھالفظ بدلائي نٿا سگھجن:$1",
        "resetpass-no-info": "هيءُ صفحو پڙهڻ لاءِ داخل ٿيڻ ضروري آهي.",
        "passwordreset-emaildisabled": "هن وڪيءَ تي برق‌ٽپال واريون خصوصيتون غير فعال بڻايون ويون آهن.",
        "passwordreset-username": "يُوزرنانءُ:",
        "passwordreset-domain": "ميدان:",
-       "passwordreset-capture": "برق ٽپال ڏسڻ چاهيندا؟",
        "passwordreset-email": "برق ٽپال پتو:",
        "passwordreset-emailtitle": "{{SITENAME}} واري کاتي جا تفصيل",
        "passwordreset-emailelement": "يُوزر نانءُ: \n$1\n\nعارضي ڳجھو لفظ:\n$2",
+       "passwordreset-invalidemail": "ناقابل ڪار برق ٽپال پتو",
        "changeemail": "برق ٽپال پتو مِٽايو يا بدلايو",
        "changeemail-oldemail": "هاڻوڪو برق ٽپال پتو:",
        "changeemail-newemail": "نئون برق ٽپال پتو:",
        "preview": "پيش نگاھ",
        "showpreview": "پيش نگاھ",
        "showdiff": "تبديليون ڏيکاريو",
-       "anoneditwarning": "<strong>خبردار:</strong> توهان داخل ٿيل نہ آهيو. جيڪڏهن توهان ڪي ترميمون ڪيون تہ هن صفحي جي سوانح ۾ توهان جو آءِ پي پتو درج ڪيو ويندو. جي توهان <strong>[$1 داخل]</strong> ٿيو ٿا < يا strong>[$2 کاتو کوليو] </strong> ٿا، تہ توهان جو ترميمون توهان جي يوزرنانءُ سن منسوب ڪيون وينديون، جنهن جا ٻيا بہ فائدا ٿي سگھن ٿا.",
+       "anoneditwarning": "<strong>خبردار:</strong> توهان داخل ٿيل نہ آهيو. جيڪڏهن توهان ڪي ترميمون ڪيون تہ هن صفحي جي سوانح ۾ توهان جو آءِ پي پتو درج ڪيو ويندو. جي توهان <strong>[$1 داخل]</strong> ٿيو ٿا < يا strong>[$2 کاتو کوليو] </strong> ٿا، تہ توهان جو ترميمون توهان جي يوزرنانءُ سان منسوب ڪيون وينديون، جنهن جا ٻيا بہ فائدا ٿي سگھن ٿا.",
        "anonpreviewwarning": "توهان داخل ٿيل نہ آهيو. جيڪڏهن توهان صفحي ۾ تبديليون سانڍيون تہ اهڙين تبديلين ساڻ توهان جو آءِپي پتو درج ڪيو ويندو.",
        "missingcommenttext": "براءِ مهرباني هيٺ پنهنجا تاثرات درج ڪندا.",
        "summary-preview": "تت تي پيش نگاھ:",
        "templatesusedpreview": "هن پيش نگاھ ۾ استعمال ٿيل {{PLURAL:$1|سانچو|سانچا}}:",
        "templatesusedsection": "هن سيڪشن ۾ استعمال ٿيل {{PLURAL:$1|سانچو|سانچا}}:",
        "template-protected": "(تحفظيل)",
-       "template-semiprotected": "(نيم تحفظيل)",
+       "template-semiprotected": "(نيم-تحفظيل)",
        "hiddencategories": "هيءُ صفحو  {{PLURAL:$1|1 لڪل زمري|$1 لڪل زمرن}}: جو رڪن آهي:",
        "nocreatetext": "{{SITENAME}} نوان صفحا سرجڻ جي روڪَ ڪئي آهي.\nتوهان اڳي ئي موجود صفحن کي سنواري سگھو ٿا، يا [[Special:UserLogin|لاگ اِن ٿي يا نئون کاتو کولي سگھو ٿا]].",
        "nocreate-loggedin": "توهان کي نوان صفحا سرجڻ جي اجازت حاصل ڪانهي.",
        "rev-deleted-user": "(يُوزرنانءُ ڊاٺو ويو)",
        "rev-deleted-event": "(لاگ تفصيل هٽايا ويا)",
        "rev-deleted-user-contribs": "[يُوزرنانءُ يا آءِ پِي پتو مِٽايو ويو - ڀاڱيدارين مان ترميمون لڪايون ويون]",
+       "rev-suppressed-no-diff": "توهان اهو تفاوت ڏسي نہ ٿا سگھو، ڇاڪاڻ تہ ڪا هڪ ترميم <strong> ڊهي چڪي </strong> آهي.",
        "rev-delundel": "نمائش تبديل ڪريو",
        "rev-showdeleted": "ڏيکاريو",
        "revisiondelete": "مسوادا ڊاهيو/اڻ‌ڊاهيو",
        "search-redirect": "($1 کان چوريو)",
        "search-section": "(سيڪشن $1)",
        "search-category": "(ذمرو $1)",
-       "search-suggest": "ڇا توهان جو مطلب $1 آهي؟",
+       "search-suggest": "ڇا توهان جو مطلب ھيو: $1",
        "search-interwiki-caption": "برادر رٿائون",
        "search-interwiki-default": "$1 مان نتيجا",
        "search-interwiki-more": "(وڌيڪ)",
        "recentchangescount": "عدم پيروي جي صورت ۾ ڏيکارڻ جي لاءِ ترميمون:",
        "prefs-help-recentchangescount": "ان ۾ تازيون تبديليون، صفحن جي سوانح، ۽ لاگ شامل آهن.",
        "savedprefs": "توهان جون ترجيحات سانڍجي چڪيون آهن.",
-       "savedrights": "{{GENDER:$1|$1}} نالي يوزر جا حق سانڇجي چڪا آهن.",
+       "savedrights": "{{GENDER:$1|$1}} جا يوزر گروھ سانڍجي چڪا آھن.",
        "timezonelegend": "اوقاتي زون:",
        "localtime": "مقامي وقت:",
        "timezoneuseserverdefault": "وڪي عدم پيروي استعمال ڪريو ($1)",
        "userrights-reason": "سبب:",
        "userrights-no-interwiki": "توهان کي ٻين وڪيز تي يُوزر حقن ۾ ترميم ڪرڻ جو حق حاصل نہ آهي.",
        "userrights-nodatabase": "اعداخانو $1 يا تہ وجود نہ ٿو رکي يا تہ اهو مقامي اعدادخانو نہ آهي.",
-       "userrights-notallowed": "توهان کي يوزر جا حق شامل يا هٽائڻ جي اجازت نه آهي.",
        "userrights-changeable-col": "گروپَ جيڪي توهان تبديل ڪري سگھو ٿا",
        "userrights-unchangeable-col": "گروپَ جيڪي توهان تبديل نٿا ڪري سگھو",
        "group": "گروپ:",
        "right-upload": "فائيل چاڙهيو",
        "right-reupload": "موجوده فائيلن مٿان",
        "right-upload_by_url": "ڪنهن يُوآرايل تان فائيل چاڙهيو",
-       "right-writeapi": "اي پر آءِ لکڻ جو استعمال",
+       "right-writeapi": "ايپيآءِ لکڻ جو استعمال",
        "right-delete": "صفحا ڊاهيو",
        "right-bigdelete": "ڊگھيون سوانح رکندڙ صفحا ڊاهيو",
        "right-browsearchive": "ڊاٺل صفحا ڳوليو",
        "right-siteadmin": "اعدادخانو بنديو ۽ کوليو",
        "right-override-export-depth": "5ئين اونهائيءَ تائين ڳنڍيل صفحن سميت صفحا برآمديو",
        "right-sendemail": "ٻين يوزرس ڏانهن ايميل موڪليو",
-       "right-passwordreset": "ڳجھو لفظ مقرري برق ٽپالون ڏسو",
        "right-managechangetags": "[[Special:Tags|ٽيگس]] سرجيو ۽ ڊاهيو.",
        "grant-group-email": "برق ٽپال اماڻيو",
        "grant-blockusers": "يُوزرس کي بندشيو ۽ اڻبندشيو",
        "uploaded-script-svg": "اسڪرپٽ جوڳو ايليمينٽ ”$1” مليو آهي، اپلوڊ ٿيل ايس وي جي فائيل ۾.",
        "uploaded-hostile-svg": "اپلوڊ ٿيل ايس وي جي فائيل جو غير محفوظ سي ايس ايس ۾ اسٽائيل ايلمينٽ مليو",
        "uploaded-event-handler-on-svg": "ايس وي جي فائيل ۾ ايوينٽ هينڊلر خصوصيتون <code>$1=\"$2\"</code> مقرر ڪرڻ جي اجازت نہ آهي.",
-       "uploaded-href-unsafe-target-svg": "href جو غير محفوظ نشانو مليو آهي <code>&lt;$1 $2=\"$3\"&gt;</code> اپلوڊ ٿيل ايس وي جي فائيل ۾",
+       "uploaded-href-unsafe-target-svg": "href جو غير محفوظ ڊيٽا: يوآرآءِ نشانو مليو آهي <code>&lt;$1 $2=\"$3\"&gt;</code> چاڙھيل اَيسوِيجِي فائيل ۾",
        "uploaded-animate-svg": "”اينيميٽ“ ٽيگ ڳوليو  جيڪا ٿي سگهي ٿو href کي تبديل ڪري رهي هجي. \"form\" وصف استعمال ڪندي <code>&lt;$1 $2=\"$3\"&gt;</code> اپلوڊ ٿيل ايس وي جي فائيل ۾",
        "uploaded-setting-event-handler-svg": "واقعي کي هينڊل ڪندڙ جي سيٽنگ جون وصفون بلاڪ ٿيل آهن. \n<code>&lt;$1 $2=\"$3\"&gt;</code> اپلوڊ ٿيل ايس وي جي فائيل ۾ مليو",
        "uploaded-setting-href-svg": "\"set\"  ٽيگ کي \"href\" وصف استعمال ڪندي بنيادي عنصر کي بلاڪ ڪيو ويو آهي",
        "prevpage": "پويون صفحو ($1)",
        "allpagesfrom": "ھتان شروع ٿيندڙ صفحا نمايو",
        "allpagesto": "ان تي ختم ٿيندڙ صفحا نُمايو:",
-       "allarticles": "سمورا مضمون",
+       "allarticles": "سڀ صفحا",
        "allinnamespace": "سمورا صفحا ($1 نانءُپولار)",
        "allpagessubmit": "ھلو",
        "allpagesprefix": "صفحا نمايو بمع اڳياڙي:",
        "listusers-noresult": "ڪو بہ يُوزر نہ لڌو",
        "listusers-blocked": "(بندشيل)",
        "activeusers": "سرگرم يُوزرس جي فهرست",
-       "activeusers-hidebots": "بوٽس لڪايو",
-       "activeusers-hidesysops": "منتظمن کي لڪايو",
        "activeusers-noresult": "ڪي بہ يُوزرس نہ لڌا.",
        "activeusers-submit": "سرگرم يُوزرس ڏيکاريو",
        "listgrouprights": "يوزر گروپ جا حق",
        "whatlinkshere": "هتان ڇا ڳنڍيل آهي",
        "whatlinkshere-title": "$1 سان ڳنڍيل صفحا",
        "whatlinkshere-page": "صفحو:",
-       "linkshere": "هيٺيان صفحا '''[[:$1]]''' سان ڳنڍيل آهن:",
+       "linkshere": "هيٺيان صفحا <strong>[[:$1]]</strong> سان ڳنڍيل آهن:",
        "nolinkshere": "'''[[:$1]]''' سان ڪو بہ صفحو ڳنڍيل ناهي.",
        "isredirect": "چورڻو صفحو",
        "istemplate": "شموليت",
        "tooltip-ca-talk": "موادي صفحي تي بحث",
        "tooltip-ca-edit": "هيءُ صفحو سنواريو",
        "tooltip-ca-addsection": "نئون سيڪشن شروع ڪريو",
-       "tooltip-ca-viewsource": "هيءُ صفحو تحفظيل آهي. توهان ان جو ذريعو ڏسي سگھو ٿا.",
+       "tooltip-ca-viewsource": "هيءُ صفحو تحفظيل آهي.\nتوهان ان جو ذريعو ڏسي سگھو ٿا",
        "tooltip-ca-history": "هن صفحي جا اڳوڻا ڀيرا",
        "tooltip-ca-protect": "هيءُ صفحو تحفظيو",
        "tooltip-ca-delete": "هيءُ صفحو ڊاهيو",
        "tooltip-n-portal": "ھن رٿا بابت، توھان ڇا ٿا ڪري سگھو، شيون ڪٿي ڳولھجن",
        "tooltip-n-currentevents": "تازن واقعن تي تفصيلي ڄاڻ لھو",
        "tooltip-n-recentchanges": "ھن وڪيءَ ۾ تازين تبديلين جي فھرست",
-       "tooltip-n-randompage": "ڪو بہ بلاترتيب صفحو اتاريو",
+       "tooltip-n-randompage": "ڪو بلاترتيب صفحو اتاريو",
        "tooltip-n-help": "ڳولي لھڻ جي جاءِ",
        "tooltip-t-whatlinkshere": "ھتان ڳنڍيل سمورن وڪي صفحن جي فھرست",
        "tooltip-t-recentchangeslinked": "ويجھڙائيءَ ۾ صفحن ۾ ٿيل تبديليون هن صفحي سان ڳنڍيل آهن",
index bfd5492..faafcb4 100644 (file)
        "yourname": "Innòmu utenti",
        "yourpassword": "Paràura d'órdhini",
        "yourpasswordagain": "Ripeti la paràura d'órdhini",
-       "remembermypassword": "Ammenta la me' paràura d'órdhini in chisthu nabiggadori (par un màssimu di $1 {{PLURAL:$1|dì|dì}})",
        "yourdomainname": "Ippizzificà lu dumìniu",
        "externaldberror": "S'è verifiggaddu un errori cu lu server di autentificazioni esthernu, oppuru nò si diponi di l'autorizazioni nezzessàri pa aggiornà la propria registhrazioni estherna.",
        "login": "Intra",
        "undo-success": "Chistha mudìfigga pò assé annulladda. Verifiggà lu sighenti cuntrasthu prisintaddu pa s'azzirthà chi lu cuntinuddu curripundi a cantu disizaddu e dunca saivvà li mudìfigghi pa cumprità la procedura di annullamentu.",
        "undo-failure": "Impussìbiri annullà la mudìfigga a càusa d'un cuntrasthu cun mudìfigghi intermédi.",
        "undo-summary": "Annulladda la mudìfigga $1 di [[Special:Contributions/$2|$2]] ([[User talk:$2|Dischussioni]])",
-       "cantcreateaccounttitle": "Impussìbiri registhrà un utenti",
        "cantcreateaccount-text": "Criazioni di registhrazioni da chistu indirizzu IP ('''$1''') è isthadda broccadda da [[User:$3|$3]].\n\nLa rasgioni frunidda da $3 è ''$2''",
        "viewpagelogs": "Visuarizza li rigisthri reratibi a chistha pàgina.",
        "nohistory": "Cronologia di li versioni di chistha pàgina nò riperìbiri.",
index 5d38477..86d1f66 100644 (file)
        "userlogin-yourpassword-ph": "تێپەڕوشەگەت بنۊس",
        "createacct-yourpassword-ph": "تێپەڕوشەێگ بنۊس",
        "yourpasswordagain": "دیسان تێپەڕوشەگە بنۊسەو:",
-       "remembermypassword": "تێپەروشەگەم لەسەر ئەی کامپیوترە پاشدەس بکە (ئەو پەڕی $1 {{PLURAL:$1|ڕووژ}}ە)",
        "login": "بچووە ناو",
        "nav-login-createaccount": "بچووە ناو / ھەژمار درس بکە",
        "userlogin": "بچووە ناو / ھەژمار درس بکە",
index 79eccff..0b2b10c 100644 (file)
        "yourname": "Geavaheaddjidovddaldat",
        "yourpassword": "Suollemassátni:",
        "yourpasswordagain": "Čále suollemassáni ođđasit:",
-       "remembermypassword": "Muite mu (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "yourdomainname": "Fierbmenamma",
        "login": "Čálligoađe sisa",
        "nav-login-createaccount": "Daga ođđa geavaheaddjidovddaldaga dahje čálligoađe sisa",
        "template-protected": "(suodjáluvvon)",
        "template-semiprotected": "(suodjáluvvon anonyma ja ođđa geavaheddjiin)",
        "edittools": "<!-- Teaksta mii lea dás, čájehuvvo rievdadanskovi vuolábealde. -->",
-       "cantcreateaccounttitle": "Dovddaldaga ráhkadeapmi ii lihkosmuvvan",
        "viewpagelogs": "Čájet dán siiddu loggaid",
        "nohistory": "Dán siiddus ii leat rievdadanhistorjá.",
        "currentrev": "Dálá veršuvdna",
        "activeusers-intro": "Dát lea listu geavaheddjiin, mat leat bargan juoidá maŋimus $1 {{PLURAL:$1|beaivvi|beaivvi}} siste.",
        "activeusers-count": "$1 {{PLURAL:$1|rievdadus|rievdadusa}} maŋimus $3 beaivvi siste",
        "activeusers-from": "Čájet geavaheddjiid dán rájes:",
-       "activeusers-hidebots": "Čiega bohtaid",
-       "activeusers-hidesysops": "Čiega administráhtoriid",
        "listgrouprights-members": "(listu miellahtuin)",
        "mailnologin": "Sáddejeaddji čujuhus váilo",
        "mailnologintext": "Don fertet leat [[Special:UserLogin|čálligoahtán sisa]] ja du [[Special:Preferences|ásahusain]] ferte leat gelbbolaš ja <strong>sihkarastojuvvon</strong> e-poastačujuhus, ovdalgo sáhtat sáddet e-poasta eará geavaheddjiide.",
index f031e4e..62ecd78 100644 (file)
        "yourname": "Caitom ID:",
        "yourpassword": "Quimx canj:",
        "yourpasswordagain": "Vanquimx canj:",
-       "remembermypassword": "Qualtiinii he quimx canj jan ordinator iti (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "yourdomainname": "Hedomino:",
        "externaldberror": "Pos-römjde authenticacionde database extername jöx me necoccebj permiccionde updatan mecaitom externom.",
        "login": "Caápo",
        "undo-success": "Ticpatlöx zo pos-coccebj iixponintöx. Controlar comparicion zo !-cmaade verifiatom jan coccebj yazuáxiim ö xuniim quiíx zo !-cmaade fini iixponintöx ticpatlöx zo.",
        "undo-failure": "Ticpatlöx zo necoccebj ticpatlöxde ticpatlöxám iti-am conflictom.",
        "undo-summary": "Iixponintöx revicion $1 'de [[Special:Contributions/$2|$2]] ([[User talk:$2|Czaxö]])",
-       "cantcreateaccounttitle": "Nexuatláminop",
        "cantcreateaccount-text": "Creacionde caitomde jan adressade IP ('''$1''') coccebj blockom [[User:$3|$3]] mii.\n\nRae' zo xuniim $3 mii coccebj ''$2''",
        "viewpagelogs": "Cohuatlöx logámde jan páhina",
        "nohistory": "Jan páhina necoccebj históriade ticpatlöx.",
index caddb8a..c3817d5 100644 (file)
        "yourpasswordagain": "Šennikufal hantum taaga:",
        "createacct-yourpasswordagain": "Šennikufal tabatandi",
        "createacct-yourpasswordagain-ph": "Šennikufal dam taaga",
-       "remembermypassword": "Hong'ay huruyan tammaasa ceecikaa woo ga (a ma ši bisa {PLURAL:$1|jirbi|jirbi}}) $1",
        "userlogin-remembermypassword": "Ay goywaatoo ma gaabandi ka feera",
        "userlogin-signwithsecure": "Ciya nda saajaw",
        "yourdomainname": "Ni zunbu dogoo:",
        "passwordreset-emailtext-user": "Goykaw $1 {{SITENAME}} wiri ka war sennikufaloo yeeti {{SITENAME}} se\n($4). Goykaa woo {{PLURAL:$3|kontoo ga|kontey ga}} marga nda nda bataga aderesoo woo:\n\n$2\n\n {{PLURAL:$3|Šiiyan šennikufaloo woo|Šiiyan šennikufaley wey}} ga buu {{PLURAL:$5|jirbi foo|jirbi $5}} ra.\nWar ga hima ka huru  nda šennikufal taaga suuba sohõ. Nda boro waani ka ceeci\n ka woo tee wala war ga honga wara šennikufal žeenaa nda war ši boona koyne\n k'a barma, war ga hin ka šaawaroo woo muray nda gaabandi ka goy nda war\n šennikufal žeenaa.",
        "passwordreset-emailelement": "Goykaw maa: \n$1\n\nŠiiyan šennikufal: \n$2",
        "passwordreset-emailsentemail": "Šennikufal yeetiyan bataga n' ka sanbandi war se.",
-       "passwordreset-emailsent-capture": "Šennikulal yeetiyan bataga n' ka sanbandi war se, kaŋ ga cebandi ne ganda.",
-       "passwordreset-emailerror-capture": "Šennikufal yeetiyan bataga n' ka teendi, kaŋ ga cebandi ne ganda, amm'a mana hin ka sanbandi {{GENDER:$2|goykaw}} do: $1",
        "changeemail": "Bataga aderesu barmay",
        "changeemail-header": "Takaddaa woo toonandi ka war bataga aderesoo barmay. War ka hima ka war šennikufaloo dam ka barmayyanoo tabatandi.",
        "changeemail-no-info": "War ga hima ka huru ka hin duu moɲoo woo.",
        "undo-nochange": "A ga hima kaŋ barmaa n' ka taafeeri ka ben.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|deede]]) na $1 fillaa taafeeri",
        "undo-summary-username-hidden": "Goykaw tugante na $1 fillaa taafeeri",
-       "cantcreateaccounttitle": "Ši hin ha kontu tee",
        "cantcreateaccount-text": "[User:$3|$3]] ganji kontu ma tee IP aderesu (<strong>$1</strong>) ga.\n\nDaliloo kaŋ $3 n'a noo ti <em>$2</em>",
        "cantcreateaccount-range-text": "[[User:$3|$3]] ganji kaŋ kontu ma tee IP aderesey kaŋyaŋ goo <strong>$1</strong> laamaa ra ga, sanda war IP aderesoo (<strong>$4</strong>).\n\nDaliloo kaŋ $3 n'a noo ti <em>$2</em>",
        "viewpagelogs": "Hantum taarikey guna moɲoo woo se",
        "activeusers-intro": "Wey ti goykey kaŋ cindi goymee tana ra {{PLURAL:$1|jirbi}} $1 kaŋ kokor ra.",
        "activeusers-count": "{{PLURAL:$1|teera}} $1 {{PLURAL:$3|jirbi|$3}} kaŋ kokor ra.",
        "activeusers-from": "Goykey cebe kaŋ ga šintin ne:",
-       "activeusers-hidebots": "Maršin berekey tugu",
-       "activeusers-hidesysops": "Juwalkey tugu",
        "activeusers-noresult": "Goykaw kul mana duwandi.",
        "listgrouprights": "Goykaw kuray alhakey",
        "listgrouprights-summary": "The following is a list of user groups defined on this wiki, with their associated access rights.\nA ga hin ka tee [[{{MediaWiki:Listgrouprights-helppage}}|alhabar tontoni]] ga bara boro alhakey ga.",
        "htmlform-cloner-create": "Tonton koyne",
        "htmlform-cloner-delete": "Kaa",
        "htmlform-cloner-required": "Nd'ajaase hinna foo ga waažibandi.",
-       "sqlite-has-fts": "$1 nda hantum-timmante ceeci gaakašinay",
-       "sqlite-no-fts": "$1 bila nda hantum-timmante  ceeci gaakašinay",
        "logentry-delete-delete": "$1  {{GENDER:$2|na}} moo $3 tuusu",
        "logentry-delete-restore": "$1 {{GENDER:$2|na}} moo yeeti $3",
        "logentry-delete-event": "$1 {{GENDER:$2|na}} diira sahã barmay {{PLURAL:$5|taariki teera $5}} se $3 ga: $4",
index 5bd2832..8b905f2 100644 (file)
@@ -23,6 +23,7 @@
        "tog-watchdefault": "Pridietė poslapius, katrūs keito, keravuojamu sārošap",
        "tog-watchmoves": "Pridietė poslapius, katrūs parvadėno, keravuojamu sārošap",
        "tog-watchdeletion": "Pridietė poslapius, katrūs ėštrėno, keravuojamu sārošap",
+       "tog-watchuploads": "I keravuojamu sāraša pridietė mona ožkrautus abruozdielius",
        "tog-watchrollback": "Pridietė poslapius, katrūs keitėmus grōžėno atgal, keravuojamu sārošap",
        "tog-minordefault": "Kāp prėgol pažīmietė pakeitėmus mažās",
        "tog-previewontop": "Ruodītė parvaiza vėrš taisīmu lauka",
@@ -40,6 +41,7 @@
        "tog-watchlisthidebots": "Kavuotė robotu pakeitėmos keravuojamu sārošė",
        "tog-watchlisthideminor": "Kavuotė mažus pakeitėmus keravuojamu sārošė",
        "tog-watchlisthideliu": "Kavuotė prėsėjongosiu nauduotuoju keitėmus keravuojamu sārošė",
+       "tog-watchlistreloadautomatically": "Parkrautė keravuojamu poslapiu sāraša kap tik kuoštovis būn pakeists (rēk JavaScript)",
        "tog-watchlisthideanons": "Kavuotė anonimėniu nauduotuoju keitėmus keravuojamu sārošė",
        "tog-watchlisthidepatrolled": "Kavuotė sodabuotus pakeitėmus keravuojamu sārošė",
        "tog-watchlisthidecategorization": "Kavuotė poslapiu kateguorėzacėjė",
        "actions": "Vēksmā",
        "namespaces": "Vardū srėtis",
        "variants": "Atmainā",
-       "navigation-heading": "Naršīma pasėrinkėmā",
+       "navigation-heading": "Naršīma pasirinkėmā",
        "errorpagetitle": "Klaida",
        "returnto": "Grīžtė i $1.",
        "tagline": "Straipsnis ėš {{SITENAME}}.",
        "edit-local": "Taisītė vėitėni aprašīma",
        "create": "Padėrbtė",
        "create-local": "Prėkergtė vėitėni aprašīma",
-       "editthispage": "Taisītė ton poslapė",
+       "editthispage": "Taisītė ton poslapi",
        "create-this-page": "Dėrbtė ton poslapi",
        "delete": "Trintė",
-       "deletethispage": "Trintė ton poslapė",
+       "deletethispage": "Trintė ton poslapi",
        "undeletethispage": "Ton poslapi padėrbtė apent",
        "undelete_short": "Dėrbtė apent $1 {{PLURAL:$1:pakeitėma|pakeitėmus|pakeitėmu}}",
        "viewdeleted_short": "Veizietė $1 {{PLURAL:$1|ėštrinta keitėma|ėštrintus keitėmus|ėštrintū keitėmu}}",
        "talk": "Aptarėms",
        "views": "Parveizė̄jėmā",
        "toolbox": "Rakondā",
+       "tool-link-userrights": "Mainītė {{GENDER:$1|nauduotuoja|nauduotuojės}} gropės",
+       "tool-link-emailuser": "Rašītė gromata {{GENDER:$1|tamou nauduotuojou}}",
        "userpage": "Ruodītė nauduotuojė poslapi",
        "projectpage": "Ruodītė pruojekta poslapi",
        "imagepage": "Veizietė abruozdielė poslapi",
        "jumptonavigation": "naršīms",
        "jumptosearch": "paėiška",
        "view-pool-error": "Atsėprašuom, bat serverē daba īr parkrautė.\nNuognē pardaug nauduotoju skait ton poslapi.\nPrašuom palaukat ė mieginkat i ton poslapi patekt apent.\n\n$1",
+       "generic-pool-error": "Atsėprašuom, ale serverē daba īr parkrautė.\nNuognē pardaug nauduotoju skaita ton poslapi.\nPrašuom palaukat ė mieginkat i ton poslapi patekt apent.\n\n$1",
        "pool-errorunknown": "Nežėnuoma klaida",
        "poolcounter-usage-error": "Naudojėma soklīdėms: $1",
        "aboutsite": "Aple {{SITENAME}}",
        "createacct-yourpasswordagain-ph": "Apent ožrašīkat slaptažuodi",
        "userlogin-remembermypassword": "Ka liktō prisėjongis",
        "userlogin-signwithsecure": "Apsauguots rīšīs",
+       "cannotlogin-title": "Nēn prisijongtė",
+       "cannotlogin-text": "Nie galam prisijongtė.",
        "cannotloginnow-title": "Nēn prėsijongtė",
        "yourdomainname": "Tamstas domens:",
        "password-change-forbidden": "Negalat tuo wiki keistė slaptažuodiu.",
        "nav-login-createaccount": "Prėsėjongtė / padėrbtė paskīra",
        "userlogin": "Prėsėjongtė / padėrbtė paskīra",
        "userloginnocreate": "Prėsėjongtė",
-       "logout": "Atsėjongtė",
-       "userlogout": "Atsėjongtė",
+       "logout": "Atsijongtė",
+       "userlogout": "Atsijongtė",
        "notloggedin": "Neprėsėjongis",
        "userlogin-noaccount": "Netorat paskīruos?",
        "userlogin-joinproject": "Jonkėtėis prī {{SITENAME}}",
        "userlogin-resetpassword-link": "Ožmiršat sava slaptažuodi?",
        "userlogin-helplink2": "Prėsėjongėma pagelba",
        "userlogin-loggedin": "Tamsta jau īr prėsijongė̄s kāp {{GENDER:$1|$1}}.\nJēb nuorat prisėjongtė kāp kėts žmuogos, nauduokat skvarma apatiuo.",
+       "userlogin-reauth": "Tamsta torat prisijongtė apent, ka būtom aiško, ka esat {{GENDER:$1|$1}}.",
        "userlogin-createanother": "Padėrbtė kėta paskīra",
        "createacct-emailrequired": "El. pašta adresos",
        "createacct-emailoptional": "El. paštos (nie būtėns)",
        "createacct-reason-ph": "Kūdie dėrbat kėta nauduotojė poslapi",
        "createacct-submit": "Padėrbkat savėi paskīra",
        "createacct-another-submit": "Padėrbtė paskīra",
+       "createacct-continue-submit": "Tuoliaus dėrbtė nauduotuoja paskīra",
+       "createacct-another-continue-submit": "Tuoliaus dėrbtė nauduotuoja paskīra",
        "createacct-benefit-heading": "{{SITENAME}} īr sokorta prietėliu, tuokiu, kāp Tamsta.",
        "createacct-benefit-body1": "{{PLURAL:$1|pataisīms|pataisīmā|pataisīmu}}",
        "createacct-benefit-body2": "{{PLURAL:$1|poslapis|poslapē|poslapiu}}",
        "createaccounterror": "Nė̄šiejė padėrbtė paskīruos: $1",
        "nocookiesnew": "Nauduotuojė paskīra bova sokurta, bat Tamsta nēsot prėsėjongis. {{SITENAME}} nauduo pakavukus (''cookies''), ka prėkergtom nauduotuojus. Tamsta esot ėšjongis anūs. Prašuom ijongtė pakavukus, tumet prisėjonkat so sava naujo nauduotuojė vardo ė slaptažuodio.",
        "nocookieslogin": "{{SITENAME}} nauduo pakavukus (''cookies''), ka prėkergtom nauduotuojus. Tamsta esat ėšjongis anūs. Prašuom ijongtė pakavukus ė pamiegītė apent.",
+       "noname": "Naožrašėt tinkama nauduotuoja varda!",
        "loginsuccesstitle": "Prisijongiet gerā",
        "loginsuccess": "'''Dabā Tamsta esat prėsėjongis prī {{SITENAME}} kāp „$1“.'''",
        "nosuchuser": "Nier anėjuokė nauduotuojė, katrou vards būtom „$1“ (dėdliuosės rādės svarbo ī).\nPatikrinkėt rašība aba [[Special:CreateAccount|padėrbkėt naujė paskīra]].",
        "eauthentsent": "Patvėrtėnėma gruomata bova nusiōsta i paskėrta el. pašta adresa.\nPrīš ėšsiontiant kėta gruomata i Tamstas diežote, Tamsta torėt vīkdītė nuruodīmus gruomatuo, kū patvėrtėntomiet, kū diežotė tėkrā īr Tamstas.",
        "throttled-mailpassword": "Slaptažuodžė priminims jau bova ėšsiōsts, par paskotėnės {{PLURAL:$1|adīna|$1 adīnas}}. Nuorint apsėsauguotė nū pėktnaudēvėma, slaptažuodė priminėms gal būt ėšsiōsts tėk kas {{PLURAL:$1|adīna|$1 adīnas}}.",
        "mailerror": "Bieda siontiont gromata: $1",
-       "acct_creation_throttle_hit": "Ton pruojekta lankītuojē, katrėi nauduo Tamstas IP adresa, padėrba {{PLURAL:$1|$1 paskīra|$1 paskīras|$1 paskīrū}} par paskotėnta dėina, a tas īr dėdliausis leidams skaitlios par ta čiesa.\nTudie šėton čieso lankītuojē, katrėi nauduo tou IP adresa, daugiau paskīrū dėrbtė nagal.",
+       "acct_creation_throttle_hit": "Ton pruojekta lankītuojē, katrėi nauduo Tamstas IP adresa, padėrba {{PLURAL:$1|$1 paskīra|$1 paskīras|$1 paskīrū}} par paskotėnta $2, a tas īr dėdliausis leidams skaitlios par ta čiesa.\nTudie šėton čieso lankītuojē, katrėi nauduo tou IP adresa, daugiau paskīrū dėrbtė nagal.",
        "emailauthenticated": "Tamstas el. pašta adresos bova ožtvirtėnts $2 d. $3.",
        "emailnotauthenticated": "Tamstas el. pašta adresos da nier patvėrtėnts. Anėjuokės gruomatas\nnebus siontamas ni vėinam žemiau ėšvardėntam puoslaugiō.",
        "noemailprefs": "Nuruodėkīt el. pašta adresa, kū vėiktu šėtos funkcėjės.",
        "pt-login-button": "Prėsėjongtė",
        "pt-login-continue-button": "Tuoliau prisijongėnietė",
        "pt-createaccount": "Pasėdėrbtė paskīra",
-       "pt-userlogout": "Atsėjongtė",
+       "pt-userlogout": "Atsijongtė",
        "changepassword": "Pakeistė slaptažuodė",
        "resetpass_announce": "Ka ožbengtomiet jongtėis, torėt sokortė naujė slaptažuodi.",
        "resetpass_header": "Keistė paskīruos slaptažuodi",
        "resetpass_submit": "Nostatītė slaptažuodi ė prėsėjongtė",
        "changepassword-success": "Tamstas slaptažuodis pamainīts gerā!",
        "changepassword-throttled": "Baisē daug čiesu mieginot prisėjongtė.\nDaba palaukėt $1 prīš mieginant vie.",
+       "resetpass-no-info": "Ka ētomiet tėisē ont tou poslapė, Tamstā rēk prisijongtė.",
        "resetpass-submit-loggedin": "Keistė slaptažuodi",
        "resetpass-submit-cancel": "Pabengtė",
+       "resetpass-wrong-oldpass": "Bluogs laikėns aba esams slaptažuodis.\nTamsta, rasietās, anou pamainėt aba ožprašiet naujė laikėna slaptažuodi.",
+       "resetpass-recycled": "Pamainīkat sava slaptažuodi i kėtuoki, nego daba ī.",
+       "resetpass-temp-emailed": "Tamsta prisijongėt so laikėno kuodo, ėš al. gruomatas.\nKa ožbengtomėt prisijongėma, Tamstā rēk ožrašītė nauja slaptažuodi.",
        "resetpass-temp-password": "Laikėns slaptažuodis:",
        "resetpass-expired": "Tamstas slaptažuodis bengė vēktė. Padirbkėt nauja slaptažuodi, ka prisijongtomiet.",
        "passwordreset": "Apent padėrbtė slaptažuodi",
        "passwordreset-username": "Nauduotuojė vards:",
        "passwordreset-domain": "Domens:",
        "passwordreset-email": "El. pašta adresos:",
+       "passwordreset-emailtitle": "{{SITENAME}} paskīruos aprašīms",
        "passwordreset-emailtext-ip": "Kažėkas (mosietās Tamsta, ėš IP adresa $1) ožprašė pamainītė slaptažuodi tinklapie {{SITENAME}} ($4). Tou nauduotuojė {{PLURAL:$3|poslapis|poslapio|poslapē|poslapiu}}\nsorištė so tou al. pašta adreso ī:\n\n$2\n\n{{PLURAL:$3|Tas čiesėškos slaptažuodis|čiesėški slaptažuodē}} bengs vēktė pu {{PLURAL:$5|dėinuos|$5 dėinū}}.\nTamsta prisijonkėt ė pamainīkėt sava slaptažuodi. Jēb kas tā kėts padirba tou prašīma, aba jēb atminiet sava sena slaptažuodi, ta galėt nakrēptė atėdies i tou gromata ė jongtėis so sava seno slaptažuodio.",
+       "passwordreset-emailtext-user": "Nauduotuos $1 ėš {{SITENAME}} ožprašė, ka būtom atgrōžints Tamstas {{SITENAME}} slaptažuodis ($4). Ton nauduotuoja {{PLURAL:$3|paskīra|paskīras}} prigol prī ton al. pašta adresa:\n\n$2\n\n{{PLURAL:$3|Tas laikėns slaptažuodis|Tėi laikėni slaptažuodē}} bengs vēktė ož {{PLURAL:$5|vėinuos dėinuos|$5 dėinū}}.\n\nTamsta galat prisijongtė ė pasirinktė nauja slaptažuodi. Jēb kon tās kėts ožprašė šėton, aba jēb atmėniet sava slaptažuodi ė nabnuorat anou mainītė, ta galat nakrēptė diemesė i šėton gruomata ė pu senuobie nauduotė sava slaptažuodi.",
        "passwordreset-emailelement": "Nauduotuos:\n$1\n\nČiesėšks slaptažuodis:\n$2",
+       "passwordreset-invalidemail": "Bluogs alektruonėnė pašta adresos",
        "changeemail": "Keistė aba trintė el. pašta adresa",
+       "changeemail-no-info": "Ka ētomiet tėisē ont tou poslapė, Tamstā rēk prisijongtė.",
        "changeemail-oldemail": "Vielībs el. pašta adresosː",
        "changeemail-newemail": "Naus el. pašta adresosː",
        "changeemail-none": "(nie)",
        "changeemail-password": "Tamstas {{SITENAME}} slaptažuodis:",
        "changeemail-submit": "Keistė el. pašta",
        "changeemail-throttled": "Tamsta nuognē daug sīkiu miegėnat prėsėjongtė.\nPalaukat $1 prīš miegėnont apent.",
+       "changeemail-nochange": "Irašīkat kėtuoki nauja al. pašta adresa.",
        "bold_sample": "Pastuorints raštos",
        "bold_tip": "Pastuorints raštos",
        "italic_sample": "Pasviris raštos",
        "summary": "Keitėma paāškėnėms:",
        "subject": "Tema/ontraštė:",
        "minoredit": "Mažos pakeitėms",
-       "watchthis": "Keravuotė ton poslapė",
+       "watchthis": "Keravuotė ton poslapi",
        "savearticle": "Ėšsauguotė poslapi",
+       "savechanges": "Ėšsauguotė pakeitėmus",
        "publishpage": "Padėrbtė ton poslapi",
        "publishchanges": "Ožrašītė poslapė pamainīmus",
        "preview": "Parveiza",
        "missingsummary": "'''Priminėms:''' Tamsta nenuruodiet pakeitėma kuomentara. Jēgo viel paspausėt ''Ėšsauguotė'', Tamstas pakeitėms bus ėšsauguots ba anuo.",
        "selfredirect": "<strong>Atėdės:</strong> Tamsta dėrbat poslapė nosokėma savėsp.\nParašīkat tėkslē, kor ons poslapis tor soktė.\nJēgo apent mīgsat \"{{int:savearticle}}\", ta ons poslapis vės vėin bos padėrbts.",
        "missingcommenttext": "Duokat pāiškėnėma apatiuo.",
+       "missingcommentheader": "'''Primėnėms:''' Tamsta nadaviet pakeitėma paaiškėnėma. Jēgo apent paspausat \"{{int:savearticle}}\", Tamstas pakeitėms būs ėšsauguots ba anuo.",
        "summary-preview": "Pāiškėnėma parvaiza:",
        "subject-preview": "Skėrsnelė/ontraštės parvaiza:",
+       "previewerrortext": "Miegėnant parveizietė pakeitėmus nūtėka klaida.",
        "blockedtitle": "Nauduotuos īr ožgints",
        "blockedtext": "'''Tamstas nauduotuojė vards aba IP adresos ožgints īr.'''\n\nOžgīnė nauduotuos $1.\nDingstės ''$2''.\n\n* Ožgīnėms prasėdė̄jė: $8\n* Ožgīnėms pasėbengs: $6\n* Kas tor būtė ožgints: $7\n\nTamsta galat parašītė $1 aba kėtėim\n[[{{MediaWiki:Grouppage-sysop}}|admėnėstratuorėm]], jēgo mīslėjat, ka Tamstā ožgīnė ba grieka.\nTamsta negalat „rašītė gromata ton nauduotuojō“, jēgo nasat davis tėkra sava el. pašta adresa sava [[Special:Preferences|paskīruos nustatīmūs]] ė nasat ožgints nu anuos nauduojėma.\nTamstas dabartėnis IP adresos īr $3, vuo ožgīnėma ID īr #$5. Prašuom nuruodītė ton, kumet prašīsėt atgėnoms.",
        "autoblockedtext": "Tamstas IP adresos bova liuosā ožgints, tudie, ka ana nauduojė kėts nauduotuos, katra ožgīnė $1.\nDouta dingstės īr tuokė:\n\n:''$2''\n\n* Ožgīnėms prasėdė̄jė: $8\n* Ožgīnėms pasėbengs: $6\n* Kas tor būtė ožgints: $7\n\nTamsta galėt sosėsėiktė so $1 aba kėtu [[{{MediaWiki:Grouppage-sysop}}|adminėstratuoriom]], kū aprokoutomėt biedas diel bluokavėma.\n\nTamsta galat parašītė $1 aba kėtėim\n[[{{MediaWiki:Grouppage-sysop}}|admėnėstratuorėm]], jēgo mīslėjat, ka Tamstā ožgīnė ba grieka.\nTamsta negalat „rašītė gromata ton nauduotuojō“, jēgo nasat davis tėkra sava el. pašta adresa sava [[Special:Preferences|paskīruos nustatīmūs]] ė nasat ožgints nu anuos nauduojėma.\nTamstas dabartėnis IP adresos īr $3, vuo ožgīnėma ID īr #$5. Prašuom nuruodītė ton, kumet prašīsėt atgėnoms.",
        "blockednoreason": "dingstėis nie douta",
        "whitelistedittext": "Tamstā rēk $1, ka dėrbtomiet poslapius.",
        "nosuchsectiontitle": "Nier tuokė skėrsnė",
+       "nosuchsectiontext": "Tamsta miegėnuot keistė skėrsni, katruo daba jau nabie.\nRasietās, kas tā par ton čiesa anou ėštrīnė aba parvadėna.",
        "loginreqtitle": "Rēk prėsėjongtė",
        "loginreqlink": "prėsėjongtė",
        "loginreqpagetext": "Rēk $1, paveiziejėmō kėtū poslapiu.",
        "postedit-confirmation-saved": "Tamstas padėrbts pakeitėms ėšsauguots īr.",
        "edit-already-exists": "Nie galam padėrbtė poslapė. Ons jau īr.",
        "defaultmessagetext": "Tekstos kāp prėklaus",
+       "content-model-wikitext": "viki tekstos",
+       "content-model-text": "paprasts tekstos",
+       "content-model-javascript": "JavaScript",
+       "content-json-empty-object": "Dīks dākts",
        "post-expand-template-inclusion-warning": "Perspiejėms: Šabluonu īterpėma dėdoms īr par dėdelis.\nKāp katrėi šabluonā nebus ītrauktė.",
        "post-expand-template-inclusion-category": "Poslapē, kur šabluonu īterpėma dėdoms viršėjams",
        "post-expand-template-argument-warning": "Perspiejėms: Tas poslapis tor nuors vėina šabluona argomenta, katros tor per dėdli ėšplietėma dėdoma.\nTė argomentā bova praleistė.",
        "history-feed-title": "Versėju istuorėjė",
        "history-feed-item-nocomment": "$1 $2",
        "history-feed-empty": "Prašuoms poslapis nēgzėstuo.\nAns galiejė būtė ėštrėnts ėš pruojekta, aba parvardėnts.\nPamiegīkėt [[Special:Search|ėiškoutė pruojektė]] sosėjosiu naujū poslapiu.",
+       "rev-deleted-comment": "(keitėma aprašīms ėštrints)",
+       "rev-deleted-user": "(nauduotuoja vards ėštrints)",
        "rev-delundel": "ruodītė/kavuotė",
        "rev-showdeleted": "ruodītė",
        "revisiondelete": "Trintė/atkortė versėjės",
+       "revdelete-show-file-confirm": "A ėš tėkrā nuorat parveizietė ėštrinta abruozdielė „<nowiki>$1</nowiki>“ $2 $3 atmaina?",
        "revdelete-show-file-submit": "Tēp",
+       "revdelete-selected-text": "[[:$2]] {{PLURAL:$1|pasirinkts atmains|pasirinkti atmainā}}:",
        "logdelete-selected": "{{PLURAL:$2|Pasėrinkts|Pasėrinktė|Pasėrinktė}} $1 istuorėjės {{PLURAL:$2|atėtėkims|atsėtėkimā|atsėtėkimā}}:",
+       "revdelete-legend": "Nūstatītė veizėmoma aprėbuojėmus",
+       "revdelete-hide-text": "Atmaina tekstos",
+       "revdelete-hide-image": "Kavuotė abruozdielė torėni",
+       "revdelete-hide-name": "Kavuotė tiksla ė doumenis",
        "revdelete-hide-comment": "Keitėma pāiškėnėms",
        "revdelete-hide-user": "Nauduotojė vardos/IP adresos",
+       "revdelete-radio-same": "(namainītė)",
+       "revdelete-radio-set": "Pakavuots",
+       "revdelete-radio-unset": "Veizėms",
        "revdelete-unsuppress": "Šalėntė apribuojėmos atkortuos versėjės",
+       "revdelete-log": "Dingstės:",
        "revdel-restore": "Keistė veizėmuma",
        "pagehist": "Poslapė istuorėjė",
        "deletedhist": "Ėštrinta istuorėjė",
        "mergehistory-from": "Kėlėma poslapisː",
        "mergehistory-into": "Tiksla poslapisː",
        "mergehistory-done": "$3 $1 versėju siekmėngā sojongta so [[:$2]].",
+       "mergehistory-autocomment": "[[:$1]] parnešts ont [[:$2]]",
+       "mergehistory-comment": "[[:$1]] parnešts ont [[:$2]]: $3",
+       "mergehistory-reason": "Dingstės:",
        "revertmerge": "Atskėrtė",
        "history-title": "Poslapė „$1“ istuorėjė",
        "difference-title": "$1 – skėrtoms terp pakeitėmu.",
        "searchprofile-advanced-tooltip": "Ėiškoutė skėrtingūs vardū sėtīs",
        "search-result-size": "$1 ({{PLURAL:$2|1 žuodis|$2 žuodē|$2 žuodiu}})",
        "search-result-category-size": "{{PLURAL:$1|1 narīs|$1 nariū}} ({{PLURAL:$2|1 subkateguorėjuo|$2 subkateguorėju}}, {{PLURAL:$3|1 fails|$3 failu}})",
-       "search-redirect": "(nosokėms $1)",
+       "search-redirect": "(nūsokėms ėš $1)",
        "search-section": "(skėrsnis $1)",
        "search-category": "(kateguorėjė $1)",
        "search-file-match": "(atėtėnk abruozdielė torėni)",
        "prefs-rc": "Vielībė̅jė pakeitėmā",
        "prefs-watchlist": "Keravuojamu sārašos",
        "prefs-editwatchlist": "Keistė keravuojamu sāroša",
+       "prefs-editwatchlist-label": "Mainītė keravuojamu poslapiu īrašėmus:",
        "prefs-editwatchlist-clear": "Ėštrintė keravuojamu sāroša",
        "prefs-watchlist-days": "Kėik dėinū ruodītė keravuojamu sārošė:",
        "prefs-watchlist-days-max": "(daugiausē $1 {{PLURAL:$1|dėina|dėinas|dėinū}})",
        "prefs-watchlist-edits-max": "Dėdliausis skaitlios: 1000",
        "prefs-misc": "Ivairė nustatīmā",
        "prefs-resetpass": "Keistė slaptažuodi",
-       "prefs-changeemail": "Keistė el. pašta adresa",
+       "prefs-changeemail": "Mainītė aba ėšimtė al. pašta adresa",
        "prefs-setemail": "El. pašta adresa parkeitėms",
        "prefs-email": "El. pašta nustatīmā",
        "prefs-rendering": "Ėšruoda",
        "columns": "Štolpalē:",
        "searchresultshead": "Paėiškuos nustatīmā",
        "stub-threshold": "Minimums <a href=\"#\" class=\"stub\">nabėngta poslapė</a> fuormatavėmō:",
+       "stub-threshold-sample-link": "pavīzdīs",
        "stub-threshold-disabled": "Ėšjongta īr",
        "recentchangesdays": "Ruodomas dėinas vielībūju pakeitėmu sārošė:",
        "recentchangesdays-max": "(daugiausē $1 {{PLURAL:$1|dėina|dėinū|dėinas}})",
        "prefs-files": "Abruozdielē",
        "prefs-custom-css": "Asabėšks CSS",
        "prefs-custom-js": "Asabėšks JavaScript",
+       "prefs-common-css-js": "Bendros CSS/JavaScript vėsuom aplinkuom:",
+       "prefs-reset-intro": "Čiuonās galat grōžintė vėsus sava nūstatīmus ont pradėniu (kap būn tiktās prisijongus).\nTas dalīks nab'atšaukiams.",
        "prefs-emailconfirm-label": "Tėkrā tuokis el. paštos?",
        "youremail": "El. paštos:",
        "username": "{{GENDER:$1|Nauduotuojė vards}}:",
        "yourlanguage": "Aplėnkuos kalba:",
        "yourvariant": "Torėnė kalba:",
        "yournick": "Pasėrinkts slapīvardis:",
+       "prefs-help-signature": "Kap rašuot kon tās i aptarėmu poslapius, pasirašīkat tap: \"<nowiki>~~~~</nowiki>\". Tas dākts atvirs i Tamstas paraša ė parašīma čiesa znuoka.",
        "badsig": "Neteisings parašas; patėkrinkėt HTML žīmės.",
        "badsiglength": "Tamstas parašos īr par ėlgs.\nAna gal sodarītė ne daugiau kāp $1 {{PLURAL:$1|sėmbuolis|sėmbuolē|sėmbuoliu}}.",
        "yourgender": "Lītės:",
-       "gender-unknown": "Nier nuruodīta",
+       "gender-unknown": "Nier nūruodīta",
        "gender-male": "Vīrs",
        "gender-female": "Muoterėška",
+       "prefs-help-gender": "Gėmėnies pasirinkėms nie būtėns.\nJēb ana nūruodīsat, svetainės aplinka kreipsis i Tamsta palē Tamstas gėmėnė. \nTas būs vėsiem žėnuoma.",
        "email": "El. paštos:",
-       "prefs-help-realname": "Tėkrs vards nier privaluoms, vuo jēgo Tamsta ana ivesėt, ons bus nauduojams Tamstas darba pažīmiejėmō.",
+       "prefs-help-realname": "Tėkros vards nier privaluoms, ale jēgo Tamsta ana ivesėt, ons bus nauduojams Tamstas darba pažīmiejėmou.",
        "prefs-help-email": "El. pašta adresos nier būtėns, bat ons leid Tamstā gautė naujė slaptažuodi, jēgo pamėršuot kuoks ons bova, ė tēpuogi Tamsta galėt leistė kėtėims pasėiktė Tamsta par Tamstas nauduotuojė aba nauduotuojė aptarėma poslapi tāp, ka anėi nežėnuotom Tamstas el. pašta adresa.",
        "prefs-help-email-required": "Rēk el. pašta adresa",
        "prefs-info": "Pagrindėnės žėnės",
        "prefs-displayrc": "Ruodītė nustatīmus",
        "prefs-displaywatchlist": "Ruodītė nustatīmus",
        "prefs-diffs": "Skėrtomā",
+       "prefswarning-warning": "Tamsta pamainėt sava nūstatīmus, ale anūm da naėšsauguojėt.\nJēb paliksat poslapi napaspaudus ont $1, Tamstas nūstatīmā napasikeis.",
        "userrights": "Nauduotuoju teisiu valdīms",
        "userrights-lookup-user": "Tvarkītė nauduotuojė gropės",
        "userrights-user-editname": "Iveskėt nauduotuojė varda:",
-       "editusergroup": "Redagoutė nauduotuojė gropes",
+       "editusergroup": "Mainītė nauduotuoja gropės",
        "editinguser": "Teisiu keitėms {{GENDER:$1|Nauduotuojō}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Keistė nauduotuoju gropes",
-       "saveusergroups": "Sauguotė nauduotuoju gropes",
+       "saveusergroups": "Sauguotė nauduotuoja gropės",
        "userrights-groupsmember": "Narīs:",
        "userrights-reason": "Dingstės:",
        "group": "Gropė:",
        "grouppage-bureaucrat": "{{ns:project}}:Biorokratā",
        "right-read": "Skaitītė poslapius",
        "right-edit": "Keistė poslapius",
+       "right-minoredit": "Žīmietė ketėmus kap mažus",
+       "right-move": "Parvadintė poslapius",
+       "right-move-subpages": "Parvadinė poslapius ėr anūm pūposlapius",
+       "right-move-categorypages": "Parvadintė kateguorėjės",
+       "right-movefile": "Parvadintė abruozdielius",
        "right-upload": "Ikeltė failus",
        "right-writeapi": "Nauduotė API rašīmō",
        "right-delete": "Trintė poslapius",
        "right-browsearchive": "Ėiškuotė ėštrintū poslapiu",
        "right-undelete": "Tou poslapi padėrbtė apent",
+       "grant-createeditmovepage": "Dėrbtė, keistė ė parvadintė poslapius",
        "newuserlogpage": "Nauduotuojė kūrėma sārašos",
        "rightslog": "Nauduotuoju teisiu istuorėjė",
        "rightslogtext": "Pateikiams nauduotuoju teisiu pakeitėmu sārašos.",
        "action-move-categorypages": "parvadintė kateguorėjes",
        "action-movefile": "parvadintė šėta faila",
        "action-upload": "ikeltė šėta faila",
-       "action-delete": "trintė ton poslapė",
+       "action-delete": "trintė ton poslapi",
        "action-undelete": "atkortė ta poslapi",
        "action-patrol": "pažīmietė kėtū keitėmus kāp patikrėntus",
        "action-userrights": "keistė vėsū nauduotuoju teises",
+       "action-purge": "atšvėižintė poslapi",
        "nchanges": "$1 {{PLURAL:$1|pakeitėms|pakeitėmā|pakeitėmu}}",
+       "enhancedrc-since-last-visit": "$1 {{PLURAL:$1|nug paskotėnė apsilonkėma}}",
        "enhancedrc-history": "istuorėjė",
        "recentchanges": "Vielībė̄jė pakeitėmā",
-       "recentchanges-legend": "Vielībūju pakeitėmu pasėrinkėmā",
+       "recentchanges-legend": "Vielībūju pakeitėmu pasirinkėmā",
        "recentchanges-summary": "Keravuokat patius vielībuosius wiki pakeitėmus tamė poslapie.",
+       "recentchanges-noresult": "Par nūruodīta čiesa napradėrbts anēvėins Tamstas nuorams pakeitėms.",
        "recentchanges-feed-description": "Keravuokėt patius vielībiausius pakeitėmus pruojektō tamė šaltėnī.",
        "recentchanges-label-newpage": "Šėtuo keitėmuo padėrbts naus poslapis",
        "recentchanges-label-minor": "Tas īr mažos pataisīms",
        "recentchanges-label-plusminus": "Anuo baitu skaitliom pakeists straipsnė apmiers",
        "recentchanges-legend-heading": "<strong>Pāiškėnėmā:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (dā veiziekat [[Special:NewPages|vielībūju straipsniu sāroša]])",
+       "recentchanges-submit": "Ruodītė",
        "rcnotefrom": "Apatiuo {{PLURAL:$5|ruodoms pakeitėms|ruodomė pakeitėmā}} nug <strong>$3, $4</strong> (ne daugiau kāp <strong>$1</strong> ruodoma īr).",
        "rclistfrom": "Ruodītė vielībus pakeitėmus pradedont nug $3 $2",
        "rcshowhideminor": "$1 mažus pakeitėmus",
        "rcshowhidebots": "$1 robuotus",
        "rcshowhidebots-show": "Ruodītė",
        "rcshowhidebots-hide": "Kavuotė",
-       "rcshowhideliu": "$1 prėsėjongusiūm nauduotuojūm pakeitėmus",
+       "rcshowhideliu": "$1 prisijongusiu nauduotuoju pakeitėmus",
        "rcshowhideliu-show": "Ruodītė",
        "rcshowhideliu-hide": "Kavuotė",
        "rcshowhideanons": "$1 nažėnomus nauduotuojus",
        "rcshowhidemine-show": "Ruodītė",
        "rcshowhidemine-hide": "Kavuotė",
        "rcshowhidecategorization": "$1, kap poslapiam doud kateguorėjės",
+       "rcshowhidecategorization-show": "Ruodītė",
+       "rcshowhidecategorization-hide": "Kavuotė",
        "rclinks": "Ruodītė vielībus $1 pakeitėmu par paskuojės $2 dėinas<br />$3",
        "diff": "skėrt",
        "hist": "ist",
        "recentchangeslinked-summary": "Tamė specēliam poslapi sogol vielībė̄jė pakeitėmā poslapiūs, i katrūs īr nuruodoma. Poslapē ėš Tamstas [[Special:Watchlist|keravuojamu sāroša]] ėšruod '''stuorā'''.",
        "recentchangeslinked-page": "Poslapė pavadėnėms:",
        "recentchangeslinked-to": "Ruodītė anūs poslapiu pakeitėmus, katrėi prėgol prī douta poslapė",
+       "recentchanges-page-added-to-category": "[[:$1]] pridieta i kateguorėjė",
        "upload": "Ožkrautė abruozdieli",
        "uploadbtn": "Ikeltė faila",
        "reuploaddesc": "Sogrīžtė i ikielima fuorma.",
        "upload-file-error-text": "Ivīka vėdėnė klaida bandont sokortė laikinaji faila serverī. Prašuom sosėsėiktė so sistemuos admėnėstratuoriom.",
        "upload-misc-error": "Nažėnuoma ikielėma klaida",
        "upload-misc-error-text": "Ivīka nežėnuoma klaida vīkstont ikielėmō. Prašuom patėkrėnt, kū URL teisėngs teipuogi pasėikiams ėr pamiegīkit viel. Jē bieda ėšlėik, sosėsėikėt so sistemuos admėnėstratuoriom.",
+       "upload-http-error": "Nūtėka HTTP klaida: $1",
        "upload-dialog-title": "Ožkrautė abruozdieli",
        "upload-dialog-button-cancel": "Pabengtė",
+       "upload-dialog-button-back": "Atgaliuos",
        "upload-dialog-button-done": "Padėrbt",
        "upload-dialog-button-save": "Ėšsauguotė",
        "upload-dialog-button-upload": "Ožkrautė",
        "upload-form-label-infoform-description": "Aprašīms",
        "upload-form-label-usage-title": "Nauduojėms",
        "upload-form-label-usage-filename": "Abruozdielė pavadėnėms",
+       "upload-form-label-own-work": "Tas muona darbs ī",
+       "upload-form-label-infoform-categories": "Kateguorėjės",
+       "upload-form-label-infoform-date": "Čiesos",
+       "upload-form-label-own-work-message-generic-local": "Sotinko, ka ikeldams ton abruozdieli darou ton palē {{SITENAME}} taisīklės.",
        "backend-fail-notexists": "Abruozdielė „$1“ nie.",
        "backend-fail-alreadyexists": "Abruozdielis „$1“ jau īr.",
+       "uploadstash-thumbnail": "veizietė somažinta",
        "img-auth-accessdenied": "Ožgint prė̄tė",
        "upload-curl-error6": "Napavīkst pasėiktė URL",
        "upload-curl-error6-text": "Pataikts URL nagal būt pasėikts. Prašuom patėkrėntė, kū URL īr teisings ėr svetainė veik.",
        "upload_source_file": " (fails Tamstas kompioterī)",
        "listfiles-delete": "trintė",
        "listfiles-summary": "Tas specēlus poslapis ruod vėsus ikeltus failus.\nPalē numatīma paskiausē ikeltė failā īr ruoduomė sāroša vėršou.\nPaspaude ont štolpelė ontraštės pakeisėt ėšruokavėma.",
+       "listfiles-userdoesnotexist": "Nie tuokė nauduotuoja varda kap „$1“",
        "imgfile": "abruozdielis",
        "listfiles": "Failu sārašos",
        "listfiles_thumb": "Somažints",
        "linkstoimage": "{{PLURAL:$1|Ons poslapis|Anėi poslapē}} ruod ton abruozdielin:",
        "nolinkstoimage": "Abruozdielėp neruod anėjuoks poslapis.",
        "morelinkstoimage": "Veizietė [[Special:WhatLinksHere/$1|daugiau nūruodu]] ton abruozdielėn.",
+       "linkstoimage-redirect": "$1 (abruozdielė nūsokėms) $2",
        "sharedupload": "Tas fails īr ėš $1 ė gal būtė nauduojams kėtūs pruojektūs.",
        "sharedupload-desc-here": "Tas abruozdielis īr nug $1 ė gal būtė nauduojams kėtūs poslapiūs.\nŽinės nug [$2 abruozdielė aprašīma poslapė] prėgol apatiuo.",
        "sharedupload-desc-create": "Šėts abruozdielis īr ėš $1 ė gal būtė nauduonams kėtūs pruojektūs. \nMaž nuorat pamainītė anuo aprašīma [$2 anuo poslapie]?",
        "download": "parsėsiūstė",
        "unwatchedpages": "Nekeravuojėmė poslapē",
        "listredirects": "Paradresavėmu sārašos",
+       "listduplicatedfiles": "Abruozdieliu so doblėkatās sārašos",
        "unusedtemplates": "Nenauduojamė šabluonā",
        "unusedtemplatestext": "Tas poslapis ruod sāraša poslapiu, esontiu vardū srėtie „{{ns:template}}“, katrėi nie iterptė i juoki kėta poslapi. Nepamėrškat patikrėntė kėtū nūruodu prīš anas ėštrėnont.",
        "unusedtemplateswlh": "kėtas nūruodas",
        "randompage": "Bikuoks poslapis",
        "randompage-nopages": "Šėtuo vardū srėti nier anėjuokiu poslapiu.",
        "randomincategory": "Bikuoks poslapis kateguorėjuo",
+       "randomincategory-invalidcategory": "\"$1\" nie gers kateguorėjės pavadėnėms.",
+       "randomincategory-nopages": "[[:Category:$1|$1]] kateguoriejuo poslapiu nie.",
        "randomincategory-category": "Kateguorėjė:",
        "randomincategory-legend": "Bikuoks poslapis kateguorėjuo",
        "randomincategory-submit": "Ēk",
        "randomredirect": "Bikuoks nusokims",
-       "randomredirect-nopages": "Šėtuo vardū srėtie nie anėjuokiu nusokėmu.",
+       "randomredirect-nopages": "Šėtuo vardū srėtie $1 nie anėjuokiu nūsokėmu.",
        "statistics": "Skaitlē",
        "statistics-header-pages": "Poslapiu sklaitlē",
        "statistics-header-edits": "Keitėmu skaitlē",
        "specialloguserlabel": "Nauduotuos:",
        "speciallogtitlelabel": "Pavadėnims:",
        "log": "Specēliūju vīksmū istuorėjė",
-       "all-logs-page": "Vėsos istuorėjės",
+       "all-logs-page": "Vėsas istuorėjės",
        "alllogstext": "Bėndra idietu failu, ėštrīnėmu, ožrakėnėmu, bluokavėmu ė prėvėlėju soteikėmu istuorėjė.\nĪr galėmībė somažintė rezoltatu skaitliu patėkslėnont vēksma tėpa, nauduotuojė a sosėjosė poslapė.",
        "logempty": "Istuorėjuo nier anėjuokiū atitinkontiu atsėtėkimu.",
        "log-title-wildcard": "Ėiškuotė pavadinėmu, katrė prasėded šėtuo teksto",
        "showhideselectedlogentries": "Ruodītė/kavuotė sāraša ponktus, katrūs pasėrėnkot",
        "checkbox-select": "Rinktėis: $1",
        "checkbox-all": "Viskos",
+       "checkbox-none": "Nieka",
+       "checkbox-invert": "Apverstė",
        "allpages": "Vėsė straipsnē",
        "nextpage": "Kėts poslapis ($1)",
        "prevpage": "Onkstesnis poslapis ($1)",
        "categoriesfrom": "Ruodītė kateguorėjės pradedont nu:",
        "deletedcontributions": "Ėštrints nauduotuojė duovis",
        "deletedcontributions-title": "Ėštrints nauduotuojė duovis",
-       "linksearch": "Ėšuorėnės nūruodas",
+       "sp-deletedcontributions-contribs": "duovē",
+       "linksearch": "Ėšuorėniu nūruodu ėiškuojėms",
        "linksearch-ns": "Vardū srėtės:",
        "linksearch-ok": "Ėiškuotė",
        "linksearch-line": "$1 īr sosėits ėš $2",
        "listusers-noresult": "Nerast anėjuokiū nauduotuoju.",
        "listusers-blocked": "(ožgints)",
        "activeusers": "Vēkōs nauduotuojē",
+       "activeusers-count": "$1 {{PLURAL:$1|darbs|darbū}} par {{PLURAL:$3|paskotėnė dėina|$3 paskotėnės dėinas|$3 paskotėniu dėinū}}",
+       "activeusers-from": "Ruodītė nauduotuojus pradedont nug:",
        "activeusers-noresult": "Nerast anėjuokiu nauduotuoju.",
+       "activeusers-submit": "Ruodītė darbštius nauduotuojus",
        "listgrouprights": "Nauduotuoju gropiu teisės",
        "listgrouprights-group": "Gropė",
        "listgrouprights-rights": "Teisės",
        "listgrouprights-members": "(nariū sārašos)",
+       "listgrouprights-namespaceprotection-namespace": "Vardū srėtės",
+       "listgrants-grant": "Leidėms",
+       "listgrants-rights": "Teisės",
        "trackingcategories": "Pruogramėnės keravuojėma kateguorėjės",
        "mailnologin": "Nier adresa",
        "mailnologintext": "Tamstā reik būtė [[Special:UserLogin|prisėjongosiam]]\nė tor būtė ivests teisings el. pašta adresos Tamstas [[Special:Preferences|nustatīmuos]],\nkū siōstomiet el. gruomatas kėtėm nauduotuojam.",
        "wlheader-enotif": "El. pašta primėnėmā ijongtė īr.",
        "wlheader-showupdated": "Poslapē, katrėi pakeistė nu Tamstas paskotėnė apsėlonkėma čiesa anūs, īr pažīmietė '''pastuorintā'''",
        "wlnote": "Ruoduoma '''$1''' paskotėniu pakeitėmu, atlėktū par '''$2''' paskotėniu adīnu.",
-       "wlshowlast": "Ruodītė paskotėniu $1 adīnu, $2 dėinū a  pakeitėmus",
-       "watchlist-options": "Keravuojamu sāroša pasėrinkėmā",
+       "wlshowlast": "Ruodītė paskotėniu $1 adīnu, $2 dėinū pakeitėmus",
+       "watchlist-hide": "Kavuotė",
+       "watchlist-submit": "Ruodītė",
+       "wlshowhideminor": "maži pakeitėmā",
+       "wlshowhidebots": "buotā",
+       "wlshowhideliu": "prisijongė̄ nauduotuojē",
+       "wlshowhideanons": "naprisijongė̄ nauduotuojē",
+       "wlshowhidemine": "mona keitėmā",
+       "watchlist-options": "Keravuojamu sāraša pasirinkėmā",
        "watching": "Kergiama keravuojamu sārošon...",
        "unwatching": "Šalėnama ėš keravuojamu sāraša...",
        "enotif_reset": "Pažīmietė vėsus poslapius kāp aplonkītus",
        "enotif_impersonal_salutation": "{{SITENAME}} nauduotuos",
+       "enotif_subject_deleted": "{{SITENAME}} poslapis $1 bova ėštrints $2",
+       "enotif_subject_created": "{{SITENAME}} poslapis $1 bova padėrbts $2",
+       "enotif_subject_moved": "{{SITENAME}} poslapis $1 bova parvadints $2",
+       "enotif_subject_restored": "{{SITENAME}} poslapis $1 bova grōžints $2",
+       "enotif_subject_changed": "{{SITENAME}} poslapis $1 bova paminīts $2",
+       "enotif_body_intro_deleted": "{{SITENAME}} poslapi $1 $PAGEEDITDATE ėštrīnė $2, veiziekėt $3.",
+       "enotif_body_intro_created": "{{SITENAME}} poslapi $1 $PAGEEDITDATE padėrba $2, veiziekėt vielībiausia atmaina $3.",
+       "enotif_body_intro_moved": "{{SITENAME}} poslapi $1 $PAGEEDITDATE parvadėna $2, veiziekėt vielībiausia atmaina $3.",
+       "enotif_body_intro_restored": "{{SITENAME}} poslapi $1 $PAGEEDITDATE grōžėna $2, veiziekėt vielībiausia atmaina $3.",
+       "enotif_body_intro_changed": "{{SITENAME}} poslapi $1 $PAGEEDITDATE pamainė $2, veiziekėt vielībiausia atmaina $3.",
+       "enotif_lastvisited": "Veiziekėt $1, ka žėnuotomėt vėsus pakeitėmus nug Tamstas paskotėnė apsilonkīma.",
+       "enotif_lastdiff": "Veiziekėt $1, ka paveizietomėt ton pakeitėma.",
        "enotif_anon_editor": "anuonėminis nauduotuos $1",
        "created": "sokūrė",
        "changed": "pakeitė",
        "deletepage": "Trintė poslapi",
        "confirm": "Tėkrā tāp",
        "excontent": "bovis torėnīs: „$1“",
-       "excontentauthor": "bovis torėnīs: „$1“ (dėrba tėktās „[[Special:Contributions/$2|$2]]“)",
+       "excontentauthor": "bovė̄s torėnīs: „$1“ (dėrba tėktās „[[Special:Contributions/$2|$2]] [[User talk:$2|aptarėms]]“)",
        "exbeforeblank": "prīš ėštrinont torėnīs bova: „$1“",
        "delete-confirm": "Trintė „$1“",
        "delete-legend": "Trīnėms",
        "historywarning": "<strong>Atėdės:</strong> Poslapis, katron nuorat ėštrintė, bova pakeists $1 {{PLURAL:$1|sīki|sīkius|sīkiu}}:",
+       "historyaction-submit": "Ruodītė",
        "confirmdeletetext": "Tamsta pasėrėnkuot ėštrėntė poslapi a abruozdieli draugum so vėsa anuo istuorėjė.\nPrašuom patvėrtėntė, kū Tamsta tėkrā nuorėt šėtu padarītė, žėnuot aple galėmus padarėnius, ė kū Tamsta šėtā daruot atsėžvelgdamė i [[{{MediaWiki:Policy-url}}|puolitėka]].",
        "actioncomplete": "Vēksmos padėrbts īr",
        "actionfailed": "Vēksmos atšaukts īr",
        "deletereasonotherlist": "Kėta dingstės",
        "deletereason-dropdown": "* Tonkiausės ėštrėnėma dingstisː\n** Šiokšlėnėms\n** Zaunū/bikuo rašīms\n** Pažeistas dėrbieju teisės\n** Patėis nauduotuojė prašīms\n** Bluogs poslapė nusokėms",
        "delete-edit-reasonlist": "Mainītė trīnėma dingstis",
+       "deleteprotected": "Tamsta nagalėt ėštrintė ton poslapė, ba ons apsergiets ī.",
+       "deleting-backlinks-warning": "<strong>Atėduos:</strong> [[Special:WhatLinksHere/{{FULLPAGENAME}}|Kėti poslapē]] tora nūruodas aba apjėm ton poslapi, katra nuorėt trintė.",
        "rollback": "Atmestė pakeitėmus",
        "rollbacklink": "atmestė",
        "rollbacklinkcount": "sogrōžintė $1 {{PLURAL:$1|pakeitėma|pakeitėmo|pakeitėmus|pakeitėmu}}",
        "editcomment": "Padėrbėma paāškėnėms bova: <em>$1</em>.",
        "revertpage": "Atmests [[Special:Contributions/$2|$2]] ([[User talk:$2|aptarėms]]) pakeitėms; sogrōžints atmains, katron padėrba nauduotuos [[User:$1|$1]]",
        "rollback-success": "Atmestė $1 padėrbtė keitėmā; grōžints $2 padėrbts atmains.",
+       "rollback-success-notify": "Atmestė $1 padėrbtė keitėmā; grōžints $2 padėrbts atmains. [$3 ruodītė keitėmus]",
+       "sessionfailure-title": "Sesėjės klaida",
        "sessionfailure": "Atruod ka īr biedū so Tamstas prėsėjongėmo; tas vēksmos bova grōžints kāp atsargoma prėimonė nu sesėjės vuogėma.\nPrašoum mīgtė „atgal“ ėr parkrautė poslapi ėš katruo atiejėt, ė pamieginkėt apent.",
        "changecontentmodel-title-label": "Poslapė pavadėnėms",
        "changecontentmodel-reason-label": "Dingstės:",
        "modifiedarticleprotection": "pamainīts „[[$1]]“ apserguos miers",
        "unprotectedarticle": "nujėmė apserga nug „[[$1]]“",
        "movedarticleprotection": "apsergiejėma nustatīma parkeltė nug \"[[$2]]\" i \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|Apsergiejė}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Pamainė}} \"[[$1]]\" apserga",
+       "unprotectedarticle-comment": "{{GENDER:$2|Bengė}} \"[[$1]]\" apserga",
        "protect-title": "Nustatuoms apsauguojėma līgis poslapiō „$1“",
+       "protect-title-notallowed": "Veizietė \"$1\" apserga",
        "prot_1movedto2": "Straipsnis [[$1]] parvadints i [[$2]]",
        "protect-legend": "Tėkrā tuokis apsergiejėms?",
        "protectcomment": "Dingstės:",
        "sp-contributions-username": "IP adresos a nauduotuojė vards:",
        "sp-contributions-toponly": "Ruodītė tėktās paskiausius keitėmus",
        "sp-contributions-newonly": "Ruodītė tėktās tūs keitėmus, katrās padėrbtė straipsnē",
+       "sp-contributions-hideminor": "Kavuotė mažus pakeitėmus",
        "sp-contributions-submit": "Ėiškuotė",
        "whatlinkshere": "Sosėjė̄ straipsnē",
        "whatlinkshere-title": "Poslapē, katrėi ruod i \"$1\"",
        "whatlinkshere-hidelinks": "$1 nūruodas",
        "whatlinkshere-hideimages": "$1 abruozdieliu nūruodas",
        "whatlinkshere-filters": "Kuošeklē",
+       "whatlinkshere-submit": "Ēk",
        "block": "Ožgintė nauduotuoji",
        "unblock": "Nauduotuojė ožgīnėma bengtė",
        "blockip": "Ožgintė {{GENDER:$1|nauduotoji}}",
        "blockip-legend": "Ožgintė nauduotuoji",
-       "blockiptext": "Nauduokėt šėta fuorma noriedamė oždraustė redagavėma teises nuruodīto IP adreso a nauduotuojo. Tas torietu būt atlėikama tam, kū sostabdītomiet vandalėzma, ė vagol [[{{ns:project}}:Puolitėka|puolitėka]].\nŽemiau nuruodīkėt tėkslē prižastė.",
+       "blockiptext": "Nauduokėt šėta skvarma kap nuorėt ožgintė redagavėma teisės nūruodītou IP adresou a nauduotuojou. Tas torietom būtė dėrbama, ka apsergietomėt poslapius nug gadėnėma, ė palē [[{{MediaWiki:Policy-url}}|sotarėma]].\n\nKap ožgėnat, nūruodīkėt tikslē, ož kon.",
        "ipaddressorusername": "IP adresos a nauduotuojė vards",
        "ipbexpiry": "Vēkėma čiesos",
        "ipbreason": "Dingstės:",
        "ipbreason-dropdown": "*Tonkiausės ožgīnėma dingstisː\n** Neteisībės rašīms\n** Torėnė trīnims ėš poslapiu\n** Šiokšlėnėms\n** Zaunu/bikuo rašīms i poslapius\n** Gondėnėmā/Pėktžuodiavėmā\n** Nauduojėms daugiaus kāp vėinuos paskīruos\n** Natinkams nauduotuojė vards",
+       "ipb-hardblock": "Nalaistė prisijongosėm nauduotuojėm dėrbtė pakeitėmu ėš ton IP adresa",
        "ipbcreateaccount": "Nelaistė dėrbtė paskīrū",
        "ipbemailban": "Nelaistė nauduotuojō siōstė el. gromatas",
        "ipbenableautoblock": "Autuomatėškā blokoutė tuo nauduotuojė paskiausē nauduota IP adresa, ė bikuokius paskesnius IP adresus, ėš katrū ons miegin redagoutė",
        "ipbsubmit": "Ožgintė ton nauduotuoji",
        "ipbother": "Kėtuoks čiesos",
        "ipboptions": "2 adīnė:2 hours,1 dėina:1 day,3 dėinas:3 days,1 nedielė:1 week,2 nedielė:2 weeks,1 mienou:1 month,3 mienesē:3 months,6 mienesē:6 months,1 metā:1 year,omžėms:infinite",
+       "ipbhidename": "Kavuotė nauduotuoja varda pakeitėmūs ė sārašūs",
        "ipbwatchuser": "Keravuotė tuo nauduotuojė poslapi ėr anuo aptarėma poslapi",
+       "ipb-disableusertalk": "Nalaistė nauduotuojou rašītė i sava aptarėmu poslapi kap ons ožgints ī",
        "ipb-change-block": "Parblokoutė ta nauduotuoja so šėtās nustatīmās",
        "ipb-confirm": "Tėkrā ožgintė?",
        "badipaddress": "Nelaistėns IP adresos",
        "blockipsuccesssub": "Nauduotuos bova ožgints",
        "blockipsuccesstext": "[[Special:Contributions/$1|$1]] bova ožgints.\n<br />Aplonkīkat [[Special:BlockList|IP ožginėmu istuorėjė]], jēgo nuorat anou parveizietė.",
+       "ipb-blockingself": "Tamsta tūjaus ožginsėt savėi pati! A tėkrā tap nuorėt?",
        "ipb-edit-dropdown": "Mainītė ožgīnėma dingstis",
        "ipb-unblock-addr": "Nug $1 nujėmtė ožgīnėma",
        "ipb-unblock": "Nug nauduotuojė varda a IP adresa nujėmtė ožgīnėma",
        "ipb-blocklist": "Ruodītė vielībousius ožgīnėmus",
        "ipb-blocklist-contribs": "$1 duovis",
+       "ipb-blocklist-duration-left": "palėka $1",
        "unblockip": "Nauduotuojė ožgīnėma bengtė",
        "unblockiptext": "Nauduokėt šėta fuorma, kū atkortomiet rašīma teises\nonkstiau ožbluokoutam IP adresō a nauduotuojō.",
        "ipusubmit": "Ton ožgīnėma nojėmtė",
        "block-log-flags-angry-autoblock": "vēk prapliests ožgīnėms",
        "block-log-flags-hiddenname": "nauduotuojė vards pakavuots īr",
        "ipb_expiry_invalid": "Galiuojėma čiesos nelaistėns.",
+       "ipb_expiry_old": "Galiuojėma čiesos īr praeitie.",
        "ipb_already_blocked": "„$1“ jau ožgints",
        "ipb-needreblock": "$1 jau īr ožblokouts. A nuorėt pakeistė nustatīmus?",
        "ipb-otherblocks-header": "{{PLURAL:$1|Kėts ožgīnėms|Kėtė ožgīnėmā}}",
        "move-page": "Parvadintė $1",
        "move-page-legend": "Poslapė parvadėnėms",
        "movepagetext": "Nauduojont ta skvarma, katra apatiuo īr, parvadinsat poslapi ėr ėšlaikīsat anuo istuorėjė.\nOnkstesnis pavadėnėms palėks nosokėmo - ons ruodīs poslapin naujė varda.\nTamsta esat atsakėngs, ka nūruodas ruodītom tenā, kor ė rēk.\n\nAtminkat, ka poslapis '''nabus''' parvadints, jēgo jau īr poslapis naujo pavadinėmo, tėktās jēgo ons īr dīks aba netor keitėmu istuorėjės.\nTumet, Tamsta galat parvadintė poslapi seniou nauduoto vardo, jēgo priš šėta ons bova par klaida parvadints, ar esontiu poslapiu sogadintė negalat.\n\n'''ATĖDĖS!'''\nJēgo parvadinat tonkē nauduojama poslapi, ta galat prėdėrbtė ėškadas. Tudie kervauokat, ka dėrbat.",
+       "movepagetext-noredirectfixer": "So ton skvarma apatiuo Tamsta parvadinsat poslapi ė parkelsat vėsa anou istuorėjė.\nSens poslapis paliks nūsokėmo i nauja straipsnė varda.\nSotikrinkėt, ka napalėikat [[Special:DoubleRedirects|dvėgobu]] aba [[Special:BrokenRedirects|navēkontiu nūsokėmu]].\nTamsta pasilėikat atsakings, ka nūruodas ė tuoliaus ruodītom tenās, kor ė rēk.\n\nToriekat uomenie, ka poslapis '''nabūs''' parvadins, jēb jau poslapis so tuokio vardo ī (nabentās, ons būtom tėktās nūsokėms ba istuorėjės).\nTas rēšk, ka Tamsta galiesat sogrōžintė poslapi ont sena anou varda, jēb padarīsat klaida.\n\n'''ATĖDĖS:'''\nJēb parvadinat gausē nauduojama poslapi, ta galat prīdėrbtė ėškadas;\nTudie kervauokat, ka dėrbat!",
        "movepagetalktext": "Sosėits aptarėma poslapis bus autuomatėškā parkelts draugom so ano, '''ėšskīrus:''':\n*Poslapis nauju pavadinėmo tor netoštė aptarėma poslapi, a\n*Paliksėt žemiau asontė varnale nepažīmieta.\nŠėtās atviejās Tamsta sava nužiūra torėt parkeltė a apjongtė aptarėma poslapi.",
        "moveuserpage-warning": "<strong>Atėdės:</strong> Tamsta parvadėnsat nauduotuojė poslapi. Žėnuokat, ka tėktās poslapis bat <em>ne patsā nauduotuos</em> bos parvadints.",
        "movecategorypage-warning": "<strong>Atėdės:</strong> Tamsta parvadinsat kateguorėjės poslapi. Žėnuokat, ka tėktas poslapis bos parvadints, bat <em>poslapē, katrėi anon prėgol,</em> tor būtė sokergtė apent.",
        "tooltip-pt-watchlist": "Poslapiu, katrūs Tamsta pasirinkuot keravuotė, sārašos.",
        "tooltip-pt-mycontris": "Tamstas dėrbtū keitėmu sārašos",
        "tooltip-pt-login": "Kvėitam prėsėjongtė, nuors tas ė nie būtėna.",
-       "tooltip-pt-logout": "Atsėjongtė",
+       "tooltip-pt-logout": "Atsijongtė",
        "tooltip-pt-createaccount": "Tamstā kvėitam padėrbtė paskīra ė prėsėjongtė; bat tas nie būtėina",
        "tooltip-ca-talk": "Poslapė torėnė aptarėms",
-       "tooltip-ca-edit": "Taisītė ton poslapė",
+       "tooltip-ca-edit": "Taisītė ton poslapi",
        "tooltip-ca-addsection": "Pradietė naujė skėrsneli",
        "tooltip-ca-viewsource": "Ons poslapis apsergiets īr. Galat tėktās parveiziet kas anamė ožrašīta.",
        "tooltip-ca-history": "Onkstesnė ton poslapė atmainā.",
index 09392ad..6e3d91c 100644 (file)
        "yourpasswordagain": "Ponovo upišite šifru / Поново упишите шифру",
        "createacct-yourpasswordagain": "Potvrdite lozinku/zaporku",
        "createacct-yourpasswordagain-ph": "Unesite lozinku/zaporku ponovno",
-       "remembermypassword": "Upamti moju lozinku na ovom kompjuteru (za maksimum od $1 {{PLURAL:$1|dan|dana}})",
        "userlogin-remembermypassword": "Zapamti prijavu",
        "userlogin-signwithsecure": "Koristite sigurnu vezu",
        "yourdomainname": "Vaš domen:",
        "activeusers-intro": "Ovo je spisak korisnika koji su napravili neku aktivnost u {{PLURAL:$1|zadnji $1 dan|zadnja $1 dana|zadnjih $1 dana}}.",
        "activeusers-count": "{{PLURAL:$1|$1 izmjena|$1 izmjene|$1 izmjena}} u {{PLURAL:$3|posljednji $3 dan|posljednja $3 dana|posljednjih $3 dana}}",
        "activeusers-from": "Prikaži korisnike koji počinju sa:",
-       "activeusers-hidebots": "Sakrij botove",
-       "activeusers-hidesysops": "Sakrij administratore",
        "activeusers-noresult": "Nije pronađen korisnik.",
        "listgrouprights": "Prava korisničkih grupa",
        "listgrouprights-summary": "Slijedi spisak korisničkih grupa na ovoj wiki, s njihovim pravima pristupa.\nO svakoj od njih postoje i [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]].",
        "htmlform-no": "Ne",
        "htmlform-yes": "Da",
        "htmlform-chosen-placeholder": "Odaberi opciju",
-       "sqlite-has-fts": "$1 sa podrškom pretrage cijelog teksta",
-       "sqlite-no-fts": "$1 bez podrške pretrage cijelog teksta",
        "logentry-delete-delete": "$1 je {{GENDER:$2|obrisao|obrisala}} stranicu $3",
        "logentry-delete-restore": "$1 je {{GENDER:$2|vratio|vratila}} stranicu $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|promijenio|promijenila}} vidljivost {{PLURAL:$5|događaja|$5 događaja}} u evidenciji na $3: $4",
index 71a8157..f84e6e2 100644 (file)
        "yourname": "smiyt o-msxdam:",
        "yourpassword": "awal iḥdan:",
        "yourpasswordagain": "Зawd ara awal iḥdan:",
-       "remembermypassword": "Askti nu ukcum ɣ Urdinaturad (Iɣ kullu tggut $1 {{PLURAL:$1|Ass|Ass}})",
        "yourdomainname": "Taɣult nek",
        "externaldberror": "Imma tlla ɣin kra lafut ɣu ukcumnk ulla urak ittuyskar at tsbddelt lkontnk nbrra.",
        "login": "Kcm ɣid",
index 5105d79..eafaea6 100644 (file)
        "passwordreset-emailelement": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း:\n$1\n\nၶေႃႈလပ်ႉ ၸူဝ်ႈၵႅပ်ႉ:\n$2",
        "passwordreset-emailsentemail": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ဢၼ်ၼႆႉၼႆႉ မၼ်းၵပ်းၵၢႆႇၵၼ်တင်း ဢၶွင်ႉၸဝ်ႈၵဝ်ႇ၊ ဢၼ်ပဵၼ် ဢီးမေးလ် တႃႇတင်ႈၶိုၼ်းမၢႆလပ်ႉၼၼ်ႉ တေထုၵ်ႇသူင်ႇၸူးယူႇ.",
        "passwordreset-emailsentusername": "ႁဵင်းလိၵ်ႈ ဢီးမေးလ်ဢၼ်ၼႆႉၼႆႉ မၼ်းၵပ်းၵၢႆႇၵၼ်တင်း ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်း ဢၼ်ၼႆႉ၊ ဢၼ်ပဵၼ် ဢီးမေးလ် တႃႇတင်ႈၶိုၼ်းမၢႆလပ်ႉၼၼ်ႉ တေထုၵ်ႇသူင်ႇၸူးယူႇ.",
-       "passwordreset-invalideamil": "ႁဵင်းလိၵ်ႈ ဢီႈမေးလ် ၽိတ်းဝႆႉ။",
+       "passwordreset-invalidemail": "ႁဵင်းလိၵ်ႈ ဢီႈမေးလ် ၽိတ်းဝႆႉ။",
        "passwordreset-nodata": "ၸိုဝ်ႈၽူႈၸႂ်ႉတိုဝ်းလႄႈ ႁဵင်းလိၵ်ႈဢီးမေးလ် ဢမ်ႇလႆႈၵမ်ႉထႅမ်ဝႆႉ သေဢၼ်။",
        "changeemail": "လႅၵ်ႈလၢႆႈ ဢမ်ႇၼၼ် ထွၼ်ပႅတ်ႈ ႁဵင်းလိၵ်ႈ ဢီးမေးလ်",
        "changeemail-no-info": "တႃႇၸဝ်ႈၵဝ်ႇ တေၸၢင်ႈၸႂ်ႉလႆႈ ၼႃႈလိၵ်ႈၼႆႉ ၵမ်းသိုဝ်ၼၼ်ႉၼႆ ၸဝ်ႈၵဝ်ႇ တေလႆႈ ၶဝ်ႈလွၵ်ႉဢိၼ်ႇဝႆႉဢေႃႈ။",
index cb5735d..59a3ba6 100644 (file)
        "yourpasswordagain": "මුරපදය යළි ඇතුළු කරන්න:",
        "createacct-yourpasswordagain": "මුරපදය සනාථ කරන්න",
        "createacct-yourpasswordagain-ph": "මුරපදය යළි ඇතුළු කරන්න",
-       "remembermypassword": "මාගේ පිවිසීම මෙම ගවේෂක මතකයෙහි (උපරිම ලෙස {{PLURAL:$1|දින|දින}}) $1 ක් මතක තබාගන්න",
        "userlogin-remembermypassword": "මා ප්‍රවිසීම් තත්වයේම තබන්න",
        "userlogin-signwithsecure": "ආරක්‍ෂිත සබඳතාව භාවිතා කරන්න",
        "cannotloginnow-title": "දැන් පිවිසීමට නොහැකිය",
        "passwordreset-emailtext-user": "{{SITENAME}} හි පරිශීලක $1,{{SITENAME}}($4)සඳහා මුරපදය යලි පිහිටුවීමට ඉල්ලා ඇත.\n\n$2\n\n{{PLURAL:$3|මෙම මුරපදය|මෙම මුරපද}}{{PLURAL:$5|එක් දිනකින්|දවස්$5කින්}}කල් ඉකුත් වනු ඇත.\nඔබ දැන් ඇතුළු වී නව මුරපදයක් තේරිය යුතුය.මෙම ඉල්ලීම වෙන කෙනෙකු විසින් හෝ ඔබට ඔබගේ මුල් මුරපදය මතක නම් හෝ ඔබ තව දුරටත් එය වෙනස් කිරීමට අදහස් නොකරයි නම් හෝ ඔබ මෙම පනිවිඩය නොසලකාහැර ඔබගේ පැරණි මුරපදය භාවිතා කරන්න.",
        "passwordreset-emailelement": "පරිශීලක නාමය: \n$1\n\nතාවකාලික මුරපදය: \n$2",
        "passwordreset-emailsentemail": "මුර-පදය නැවත සකස් කිරීම පිළිබඳව විද්‍යුත් තැපෑලක් යවන ලදී.",
-       "passwordreset-invalideamil": "වලංගු නැති ඊමේල් ලිපිනය",
+       "passwordreset-invalidemail": "වලංගු නැති ඊමේල් ලිපිනය",
        "changeemail": "විද්‍යුත් තැපෑල වෙනස් කරන්න හෝ ඉවත් කරන්න",
        "changeemail-header": "ගිණුම් විද්‍යුත් තැපැල් ලිපිනය වෙනස් කරන්න",
        "changeemail-no-info": "මෙම පිටුව සෘජු ලෙස සම්ප්‍රවේශය කෙරුමට පළමුව ඔබ ප්‍රවිෂ්ටව සිටිය යුතුය.",
        "activeusers-intro": "මෙය පසුගිය $1 {{PLURAL:$1|දිනය|දින}}තුළ යම් ක්‍රියාකාරකමක් කළ පරිශීලකයන්ගේ ලැයිස්තුවකි.",
        "activeusers-count": "{{PLURAL:$1|එක් පියවරක්|පියවර $1 ක්}} අවසන් {{PLURAL:$3|දිනය|දින $3}} තුළ",
        "activeusers-from": "මෙයින් ඇරඹෙන පරිශීලකයන් පෙන්වන්න:",
-       "activeusers-hidebots": " bots සඟවන්න",
-       "activeusers-hidesysops": "පරිපාලකයින් සඟවන්න",
        "activeusers-noresult": "කිසිදු පරිශීලකයෙකු හමුනොවිණි.",
        "activeusers-submit": "ක්‍රියාකාරී පරිශීලකයන් පෙන්වන්න",
        "listgrouprights": "පරිශීලක කාණ්ඩ හිමිකම්",
        "htmlform-cloner-create": "තව එක් කරන්න",
        "htmlform-cloner-delete": "ඉවත් කරන්න",
        "htmlform-cloner-required": "අවම වශයෙන් එක් වටිනාකම අවශ්ය වේ.",
-       "sqlite-has-fts": "$1 සම්පූර්ණ-පෙළ සෙවුම් සහය සමග",
-       "sqlite-no-fts": "$1 සම්පූර්ණ-පෙළ සෙවුම් සහය රහිතව",
        "logentry-delete-delete": "$1 විසින් $3 පිටුව {{GENDER:$2|මකා දමන ලදී}}",
        "logentry-delete-restore": "$1 {{GENDER:$2|නැවත පිහිටුවන ලදී}} පිටු $3",
        "logentry-delete-event-legacy": "$1 විසින් $3 හී ලඝු සිදුවීම් වල දෘශ්‍යතාවය වෙනස් කරන ලදී",
index 7843dc1..8e8c7fb 100644 (file)
@@ -39,8 +39,8 @@
        },
        "tog-underline": "Podčiarkovať odkazy:",
        "tog-hideminor": "V posledných úpravách nezobrazovať drobné úpravy",
-       "tog-hidepatrolled": "Skryť strážené úpravy v Posledných úpravách",
-       "tog-newpageshidepatrolled": "Skryť strážené stránky zo zoznamu nových stránok",
+       "tog-hidepatrolled": "Skryť preverené úpravy v Posledných úpravách",
+       "tog-newpageshidepatrolled": "Skryť preverené stránky v zozname nových stránok",
        "tog-hidecategorization": "Skryť kategorizáciu stránok",
        "tog-extendwatchlist": "Rozšíriť zoznam sledovaných stránok, aby zobrazoval všetky úpravy, nie len posledné",
        "tog-usenewrc": "Zoskupiť zmeny v posledných úpravách a na zozname sledovaných stránok podľa stránky",
@@ -72,7 +72,7 @@
        "tog-watchlisthideliu": "Skryť úpravy prihlásených používateľov zo zoznamu sledovaných stránok",
        "tog-watchlistreloadautomatically": "Po zmene nastavení automaticky aktualizovať zoznam sledovaných (vyžaduje JavaScript)",
        "tog-watchlisthideanons": "Skryť úpravy anonymných používateľov zo zoznamu sledovaných stránok",
-       "tog-watchlisthidepatrolled": "Skryť strážené úpravy Zozname sledovaných stránok",
+       "tog-watchlisthidepatrolled": "Skryť preverené úpravy v zozname sledovaných stránok",
        "tog-watchlisthidecategorization": "Skryť kategorizáciu stránok",
        "tog-ccmeonemails": "Posielať mi kópie e-mailov, ktoré pošlem ostatným používateľom",
        "tog-diffonly": "Nezobrazovať obsah stránky pod rozdielmi",
        "passwordreset-emaildisabled": "E-mailové funkcie boli na tejto wiki vypnuté.",
        "passwordreset-username": "Používateľské meno:",
        "passwordreset-domain": "Doména:",
-       "passwordreset-capture": "Zobraziť výsledný e-mail?",
-       "passwordreset-capture-help": "Ak označíte toto políčko, bude e-mail (s dočasným heslom) okrem zaslania používateľovi zobrazený aj vám.",
        "passwordreset-email": "Emailová adresa:",
        "passwordreset-emailtitle": "Podrobnosti o účte na {{GRAMMAR:lokál|{{SITENAME}}}}",
        "passwordreset-emailtext-ip": "Niekto (pravdepodobne vy z IP adresy $1) požiadal o obnovenie vášho hesla na {{GRAMMAR:genitív|{{SITENAME}}}} ($4). {{PLURAL:$3|Nasledujúci používateľský účet je spojený|Nasledujúce používateľské účty sú spojené}}\ns touto emailovou adresou:\n\n$2\n\n{{PLURAL:$3|Platnosť tohto dočasného hesla vyprší|Platnosť týchto dočasných hesiel vyprší}} o {{PLURAL:$5|jeden deň|$5 dni|$5 dní}}.\nMali by ste sa prihlásiť teraz a zvoliť nové heslo. Ak túto žiadosť podal niekto iný alebo\nak ste si spomenuli svoje pôvodné heslo a už ho chcete zmeniť, môžete túto správu\nignorovať a ďalej používať vaše staré heslo.",
        "passwordreset-emailelement": "Používateľské meno: \n$1\n\nDočasné heslo:\n$2",
        "passwordreset-emailsentemail": "Pokiaľ je toto e-mailová adresa zaregistrovaná k vášmu účtu, bude na ňu zaslaný e-mail pre získanie nového hesla.",
        "passwordreset-emailsentusername": "Pokiaľ je príslušná mailová adresa zaregistrovaná, bude na ňu zaslaný e-mail s novým heslom.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Email|Emaily}} na obnovenie hesla {{PLURAL:$1|bol odoslaný|boli odoslané}}. {{PLURAL:$1|Používateľské meno a heslo|Zoznam používateľských mien a hesiel}} je uvedený nižšie.",
        "changeemail": "Zmeniť alebo odstrániť e-mailovú adresu",
        "changeemail-header": "Vyplňte tento formulár, ak chcete zmeniť svoju emailovú adresu. Ak chcete odstrániť priradenie akejkoľvek emailovej adresy k vášmu účtu, nechajte pri odosielaní formulára emailovú adresu nevyplnenú",
        "changeemail-no-info": "Na prístup k tejto stránke musíte byť prihlásený.",
        "userrights-reason": "Dôvod:",
        "userrights-no-interwiki": "Nemáte oprávnenie upravovať práva používateľov na iných wiki.",
        "userrights-nodatabase": "Databáza $1 neexistuje alebo nie je lokálna.",
-       "userrights-nologin": "Aby ste mohli prideľovať používateľom oprávnenia, musíte sa [[Special:UserLogin|prihlásiť]] s účtom správcu.",
-       "userrights-notallowed": "Nemáte oprávnenie prideľovať alebo odoberať používateľom oprávnenia.",
        "userrights-changeable-col": "Skupiny, ktoré môžete zmeniť",
        "userrights-unchangeable-col": "Skupiny, ktoré nemôžete zmeniť",
        "userrights-conflict": "Konflikt zmien práv používateľov! Prosím, skontrolujte ho a potvrďte svoje zmeny.",
-       "userrights-removed-self": "Úspešne ste odstránili svoje vlastné práva. Z toho dôvodu už nebudete mať prístup k tejto stránke.",
        "group": "Skupina:",
        "group-user": "Používatelia",
        "group-autoconfirmed": "zaregistrovaní používatelia",
        "right-noratelimit": "Neovplyvnené obmedzeniami",
        "right-import": "Importovať stránky z iných wiki",
        "right-importupload": "Importovať stránky nahraním súboru",
-       "right-patrol": "Označiť úpravy ako strážené",
-       "right-autopatrol": "Nechať úpravy automaticky označiť ako strážené",
-       "right-patrolmarks": "Používať možnosti stráženia posledných úprav",
+       "right-patrol": "Označovanie cudzích úprav ako preverených",
+       "right-autopatrol": "Automatické označovanie vlastných úprav ako preverených",
+       "right-patrolmarks": "Zobrazovanie záznamov o prevereniach v Posledných úpravách",
        "right-unwatchedpages": "Zobraziť zoznam nesledovaných stránok",
        "right-mergehistory": "Zlučovať histórie stránok",
        "right-userrights": "Upravovať oprávnenia ostatných používateľov",
        "right-siteadmin": "Zamykať a odomykať databázu",
        "right-override-export-depth": "Exportovať stránky vrátane okdazovaných stránok do hĺbky 5 odkazov",
        "right-sendemail": "Posielať e-mail ostatným používateľom",
-       "right-passwordreset": "Prezeranie e-mailov pre znovunastavovanie hesla",
+       "right-managechangetags": "Vytvárenie a (de)aktivácia [[Special:Tags|značiek]]",
+       "right-applychangetags": "Pridávanie [[Special:Tags|značiek]] k vlastným úpravám",
+       "right-changetags": "Pridávanie ľubovoľných [[Special:Tags|značiek]] na jednotlivé revízie a záznamy a ich odoberanie",
+       "right-deletechangetags": "Mazanie [[Special:Tags|značiek]] z databázy",
        "grant-generic": "balík práv „$1“",
        "grant-group-page-interaction": "Interagovať so stránkami",
        "grant-group-file-interaction": "Interagovať s multimédiami",
        "grant-basic": "Základné oprávnenia",
        "grant-viewdeleted": "Zobrazovať vymazané súbory a stránky",
        "grant-viewmywatchlist": "Zobrazovať váš zoznam sledovaných stránok",
+       "grant-viewrestrictedlogs": "Prehliadať skryté záznamy",
        "newuserlogpage": "Záznam vytvorených používateľov",
        "newuserlogpagetext": "Toto je záznam naposledy vytvorených používateľských účtov.",
        "rightslog": "Záznam používateľských práv",
        "action-rollback": "rýchlo vrátiť úpravy posledného používateľa, ktorý upravoval danú stránku",
        "action-import": "importovať stránky z inej wiki",
        "action-importupload": "importovať stránky z nahraného súboru",
-       "action-patrol": "označiť úpravy iných ako strážené",
-       "action-autopatrol": "označiť vlastné úpravy ako strážené",
+       "action-patrol": "označovať cudzie úpravy ako preverené",
+       "action-autopatrol": "označovať vlastné úpravy ako preverené",
        "action-unwatchedpages": "zobraziť zoznam nesledovaných stránok",
        "action-mergehistory": "zlúčiť históriu tejto stránky",
        "action-userrights": "upravovať práva všetkých používateľov",
        "recentchanges-label-newpage": "Táto úprava vytvorila novú stránku",
        "recentchanges-label-minor": "Toto je drobná úprava",
        "recentchanges-label-bot": "Túto úpravu vykonal bot",
-       "recentchanges-label-unpatrolled": "Táto úprava zatiaľ nebola strážená",
+       "recentchanges-label-unpatrolled": "Táto úprava zatiaľ nebola preverená",
        "recentchanges-label-plusminus": "Veľkosť stránky sa zmenila o toľkoto bajtov",
        "recentchanges-legend-heading": "<strong>Legenda:</strong>",
        "recentchanges-legend-newpage": "{{int:recentchanges-label-newpage}} (pozri tiež [[Special:NewPages|zoznam nových stránok]])",
        "rcshowhideanons": "$1 anonymov",
        "rcshowhideanons-show": "Zobraziť",
        "rcshowhideanons-hide": "Skryť",
-       "rcshowhidepatr": "$1 úpravy strážených stránok",
+       "rcshowhidepatr": "$1 preverené úpravy",
        "rcshowhidepatr-show": "Zobraziť",
        "rcshowhidepatr-hide": "Skryť",
        "rcshowhidemine": "$1 moje úpravy",
        "booksources-search": "Hľadať",
        "booksources-text": "Nižšie je zoznam odkazov na iné stránky, ktoré predávajú nové a použité knihy a tiež môžu obsahovať ďalšie informácie o knihách, ktoré hľadáte:",
        "booksources-invalid-isbn": "Zdá sa, že dané ISBN nie je platné. Skontrolujte, či ste neurobili chybu pri kopírovaní z pôvodného zdroja.",
+       "magiclink-tracking-rfc": "Stránky s magickými odkazmi RFC",
+       "magiclink-tracking-pmid": "Stránky s magickými odkazmi PMID",
+       "magiclink-tracking-isbn": "Stránky s magickými odkazmi ISBN",
        "specialloguserlabel": "Pôvodca:",
        "speciallogtitlelabel": "Cieľ (názov alebo {{ns:user}}:Používateľské meno):",
        "log": "Záznamy",
        "modifiedarticleprotection": "zmenená úroveň ochrany „[[$1]]“",
        "unprotectedarticle": "odstránil ochranu stránky „[[$1]]“",
        "movedarticleprotection": "nastavenia zamknutia stránky presunuté z „[[$2]]” na „[[$1]]”",
+       "protectedarticle-comment": "{{GENDER:$2|Zamkol|Zamkla}} stránku „[[$1]]“",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|Zmenil|Zmenila}} úroveň ochrany stránky „[[$1]]“",
+       "unprotectedarticle-comment": "{{GENDER:$2|Odomkol|Odomkla}} stránku „[[$1]]“",
        "protect-title": "Zamykám „$1“",
        "protect-title-notallowed": "Zobraziť úroveň ochrany \" $1 \"",
        "prot_1movedto2": "[[$1]] premiestnená na [[$2]]",
        "movelogpagetext": "Tu je zoznam posledných presunutí.",
        "movesubpage": "{{PLURAL:$1|Podstránka|Podstránky}}",
        "movesubpagetext": "Táto stránka má $1 {{PLURAL:$1|podstránku, ktorá je zobrazená nižšie|podstránky, ktoré sú zobrazené nižšie|podstránok, ktoré sú zobrazené nižšie}}.",
+       "movesubpagetalktext": "Zodpovedajúca diskusná stránka má {{PLURAL:$1|jednu podstránku, zobrazenú|$1 podstránky, zobrazené|$1 podstránok, zobrazených}} nižšie.",
        "movenosubpage": "Táto stránka nemá podstránky.",
        "movereason": "Dôvod:",
        "revertmove": "obnoviť",
        "pageinfo-category-pages": "Počet stránok",
        "pageinfo-category-subcats": "Počet podkategórií",
        "pageinfo-category-files": "Počet súborov",
-       "markaspatrolleddiff": "Označiť ako stráženú",
-       "markaspatrolledtext": "Označiť túto stránku ako stráženú",
-       "markedaspatrolled": "Označené ako strážené",
-       "markedaspatrolledtext": "Vybraná verzia [[:$1]] bola označená ako strážená.",
+       "pageinfo-user-id": "ID používateľa",
+       "markaspatrolleddiff": "Označiť ako preverené",
+       "markaspatrolledtext": "Označiť túto stránku ako preverenú",
+       "markaspatrolledtext-file": "Označiť túto revíziu súboru ako preverenú",
+       "markedaspatrolled": "Označené ako preverené",
+       "markedaspatrolledtext": "Zvolená revízia stránky [[:$1]] bola označená ako preverená.",
        "rcpatroldisabled": "Stráženie posledných úprav bolo vypnuté",
        "rcpatroldisabledtext": "Funkcia stráženia posledných úprav je momentálne vypnutá.",
-       "markedaspatrollederror": "Nie je možné označiť ako strážené",
-       "markedaspatrollederrortext": "Pre označenie ako strážený je potrebné uviesť revíziu, ktorá sa má označiť ako strážená.",
-       "markedaspatrollederror-noautopatrol": "Nie je vám umožnené označiť vlastné úpravy za strážené.",
-       "markedaspatrollednotify": "Táto zmena stránky $1 bola označená ako strážená.",
-       "markedaspatrollederrornotify": "Označenie ako strážená zlyhalo.",
-       "patrol-log-page": "Záznam strážení",
-       "patrol-log-header": "Toto je záznam strážených revízií.",
-       "log-show-hide-patrol": "záznam stráženia $1",
-       "log-show-hide-tag": "záznam značiek $1",
+       "markedaspatrollederror": "Nie je možné označiť ako preverené",
+       "markedaspatrollederrortext": "Musíte zvoliť revíziu, ktorá má byť označená ako preverená.",
+       "markedaspatrollederror-noautopatrol": "Nemáte povolené označovať vlastné úpravy ako preverené.",
+       "markedaspatrollednotify": "Táto úprava stránky $1 bola označená ako preverená.",
+       "markedaspatrollederrornotify": "Nepodarilo sa označiť ako preverené.",
+       "patrol-log-page": "Záznam preverených úprav",
+       "patrol-log-header": "Toto je záznam preverených revízií.",
+       "log-show-hide-patrol": "$1 záznam preverených úprav",
+       "log-show-hide-tag": "$1 záznam značiek",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Označiť revíziu $3 stránky $2 ako preverenú?",
        "deletedrevision": "Zmazať staré verzie $1",
        "filedeleteerror-short": "Chyba pri mazaní súboru: $1",
        "filedeleteerror-long": "Vyskytli sa chyby pri mazaní súboru:\n\n$1",
index e51eee1..290a8b8 100644 (file)
        "views": "Pogled",
        "toolbox": "Orodja",
        "tool-link-userrights": "Spremeni {{GENDER:$1|uporabnikove|uporabničine}} skupine",
+       "tool-link-userrights-readonly": "Ogled {{GENDER:$1|uporabnikovih|uporabničinih}} skupin",
        "tool-link-emailuser": "Pošlji e-pošto {{GENDER:$1|uporabniku|uporabnici}}",
        "userpage": "Prikaži uporabnikovo stran",
        "projectpage": "Prikaži projektno stran",
        "passwordreset-emaildisabled": "Na tem wikiju so možnosti e-pošte onemogočene.",
        "passwordreset-username": "Uporabniško ime:",
        "passwordreset-domain": "Domena:",
-       "passwordreset-capture": "Ogled nastale e-pošte?",
-       "passwordreset-capture-help": "Če potrdite to polje, vam bodo e-pošte (z začasnim geslom) pokazane in poslane uporabniku.",
        "passwordreset-email": "E-poštni naslov:",
        "passwordreset-emailtitle": "Podrobnosti računa na {{SITENAME}}",
        "passwordreset-emailtext-ip": "Nekdo (verjetno vi, z IP-naslova $1) je zahteval ponastavitev vašega\ngesla na {{SITENAME}} ($4). S tem e-poštnim naslovom\n{{PLURAL:$3|je povezan naslednji uporabniški račun|sta povezana naslednja uporabniška računa|so povezani naslednji uporabniški računi}}:\n\n$2\n\n{{PLURAL:$3|Začasno geslo bo poteklo|Začasni gesli bosta potekli|Začasna gesla bodo potekla}} v {{PLURAL:$5|enem dnevu|$5 dneh}}.\nPrijavite se in izberite novo geslo. Če je zahtevo podal\nnekdo drug ali pa ste se spomnili svojega prvotnega gesla in ga več\nne želite spremeniti, lahko to sporočilo prezrete in nadaljujete z uporabo\nsvojega starega gesla.",
        "passwordreset-emailelement": "Uporabniško ime: \n$1\n\nZačasno geslo: \n$2",
        "passwordreset-emailsentemail": "Če je e-poštni naslov povezan z vašim računom, vam bomo poslali e-pošto za postavitev gesla.",
        "passwordreset-emailsentusername": "Če obstaja e-poštni naslov, povezan s tem uporabniškim imenom, vam bomo poslali e-pošto za postavitev gesla.",
-       "passwordreset-emailsent-capture2": "Poslali smo {{PLURAL:$1|e-pošto|e-pošti|e-pošte}} za ponastavitev gesla. {{PLURAL:$1|Uporabniško ime in geslo sta navedena tukaj.|Seznam uporabniških imen in gesel je naveden tukaj.}}",
-       "passwordreset-emailerror-capture2": "Pošiljanje e-pošte {{GENDER:$2|uporabniku|uporabnici}} je spodletelo: $1 {{PLURAL:$3|Uporabniško ime in geslo sta navedena tukaj.|Seznam uporabniških imen in gesel je naveden tukaj.}}",
        "passwordreset-nocaller": "Podati morate klicatelja",
        "passwordreset-nosuchcaller": "Klicatelj ne obstaja: $1",
        "passwordreset-ignored": "Ponastavitve gesla nismo izvedli. Morda ni nastavljen noben ponudnik?",
-       "passwordreset-invalideamil": "Neveljavni e-poštni naslov",
+       "passwordreset-invalidemail": "Neveljavni e-poštni naslov",
        "passwordreset-nodata": "Navedli niste ne uporabniškega imena ne e-poštnega naslova",
        "changeemail": "Sprememba ali odstranitev e-poštnega naslova",
        "changeemail-header": "Izpolnite obrazec za spremembo vašega e-poštnega naslova. Če želite s svojega računa odstraniti povezavo s katerim koli e-poštnim naslovom, pustite polje za nov e-poštni naslov med potrjevanje obrazca prazno.",
        "prefs-help-recentchangescount": "Vključuje zadnje spremembe, zgodovine strani in dnevniške zapise.",
        "prefs-help-watchlist-token2": "To je skrivni ključ do spletnega vira vašega spiska nadzorov. Kdor ve zanj, lahko bere vaš spisek nadzorov, zato ključa ne delite. [[Special:ResetTokens|Kliknite tukaj, če ga želite ponastaviti]].",
        "savedprefs": "Spremembe smo uspešno shranili.",
-       "savedrights": "Uporabniške pravice {{GENDER:$1|$1}} smo shranili.",
+       "savedrights": "Uporabniške skupine {{GENDER:$1|$1}} smo shranili.",
        "timezonelegend": "Časovni pas",
        "localtime": "Krajevni čas:",
        "timezoneuseserverdefault": "Uporabi privzeti wiki čas ($1)",
        "prefswarning-warning": "V svojih nastavitvah ste naredili spremembe, ki jih še niste shranili. Če odidete s strani brez da bi kliknili »$1«, vaših nastavitev ne bomo posodobili.",
        "prefs-tabs-navigation-hint": "Namig: Za krmarjenje med zavihki na seznamu zavihkov lahko uporabite levo in desno smerno tipko.",
        "userrights": "Upravljanje s pravicami uporabnikov",
-       "userrights-lookup-user": "Upravljanje z uporabniškimi skupinami",
+       "userrights-lookup-user": "Izberite uporabnika",
        "userrights-user-editname": "Vpišite uporabniško ime:",
-       "editusergroup": "Uredi {{GENDER:$1|uporabnikove|uporabničine}} skupine",
+       "editusergroup": "Naloži uporabniške skupine",
        "editinguser": "Urejanje pravic {{GENDER:$1|uporabnika|uporabnice}} <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Urejanje uporabniških skupin",
        "saveusergroups": "Shrani {{GENDER:$1|uporabnikove|uporabničine}} skupine",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Za urejanje pravic uporabnikov na drugih wikijih nimate dovoljenja.",
        "userrights-nodatabase": "Podatkovna baza $1 ne obstaja ali ni lokalna.",
-       "userrights-nologin": "Za dodeljevanje uporabniških pravic se morate [[Special:UserLogin|prijaviti]] s skrbniškim računom.",
-       "userrights-notallowed": "Za dodajanje ali odstranjevanje uporabniških pravic nimate dovoljenja.",
        "userrights-changeable-col": "Skupine, ki jih lahko spremenite",
        "userrights-unchangeable-col": "Skupine, ki jih ne morete spremeniti",
        "userrights-conflict": "Spor sprememb uporabniških pravic! Prosimo, da pregledate in potrdite svoje spremembe.",
-       "userrights-removed-self": "Odstranili ste svoje pravice. Tako sedaj ne morete več dostopati do te strani.",
        "group": "Skupina:",
        "group-user": "Uporabniki",
        "group-autoconfirmed": "Samodejno potrjeni uporabniki",
        "right-siteadmin": "Zaklepanje in odklepanje baze podatkov",
        "right-override-export-depth": "Izvoz strani, vključno s povezaimi straneh do globine 5",
        "right-sendemail": "Pošiljanje e-pošte drugim uporabnikom",
-       "right-passwordreset": "Ogled e-pošt ponastavitve gesel",
        "right-managechangetags": "Ustvarjanje in (dez)aktivacijo [[Special:Tags|oznak]]",
        "right-applychangetags": "Uveljavitev [[Special:Tags|oznak]] skupaj s spremembami",
        "right-changetags": "Dodajanje in odstranjevanje poljubnih [[Special:Tags|oznak]] na posameznih redakcijah in dnevniških vnosih",
        "apisandbox-continue": "Nadaljuj",
        "apisandbox-continue-clear": "Počisti",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} bo [https://www.mediawiki.org/wiki/API:Query#Continuing_queries nadaljevalo] zadnjo zahtevo; {{int:apisandbox-continue-clear}} bo počistilo parametre, povezane z nadaljevanjem.",
+       "apisandbox-param-limit": "Vnesite <kbd>max</kbd>, da uporabite največjo omejitev.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Vsi imenski prostori)",
+       "apisandbox-multivalue-all-values": "$1 (Vse vrednosti)",
        "booksources": "Viri knjig",
        "booksources-search-legend": "Išči knjižne vire",
        "booksources-search": "Išči",
        "activeusers-count": "$1 {{PLURAL:$1|dejanje|dejanji|dejanja|dejanj}} v {{PLURAL:$3|preteklem dnevu|preteklih $3 dneh}}",
        "activeusers-from": "Prikaži uporabnike začenši z:",
        "activeusers-groups": "Prikaži uporabnike, ki pripadajo skupinam:",
+       "activeusers-excludegroups": "Izključi uporabnike, ki pripadajo skupinam:",
        "activeusers-noresult": "Noben uporabnik ni bil najden.",
        "activeusers-submit": "Prikaži dejavne uporabnike",
        "listgrouprights": "Pravice uporabniških skupin",
        "javascripttest": "Preizkušanje JavaScripta",
        "javascripttest-pagetext-unknownaction": "Neznano dejanje »$1«.",
        "javascripttest-qunit-intro": "Oglejte si [$1 dokumentacijo o preizkušanju] na mediawiki.org.",
-       "tooltip-pt-userpage": "{{GENDER:|Vaša}} uporabniška stran",
+       "tooltip-pt-userpage": "{{GENDER:|Tvoja}} uporabniška stran",
        "tooltip-pt-anonuserpage": "Uporabniška stran IP-naslova, ki ga uporabljate",
-       "tooltip-pt-mytalk": "{{GENDER:|Vaša}} pogovorna stran",
+       "tooltip-pt-mytalk": "{{GENDER:|Tvoja}} pogovorna stran",
        "tooltip-pt-anontalk": "Pogovor o urejanjih s tega IP-naslova",
-       "tooltip-pt-preferences": "{{GENDER:|Vaše}} nastavitve",
-       "tooltip-pt-watchlist": "Seznam strani, katerih spremembe spremljate",
-       "tooltip-pt-mycontris": "Seznam {{GENDER:|vaših}} prispevkov",
+       "tooltip-pt-preferences": "{{GENDER:|Tvoje}} nastavitve",
+       "tooltip-pt-watchlist": "Seznam strani, katerih spremembe spremljaš",
+       "tooltip-pt-mycontris": "Seznam {{GENDER:|tvojih}} prispevkov",
        "tooltip-pt-anoncontribs": "Seznam urejanj s tega IP-naslova",
        "tooltip-pt-login": "Prijava ni obvezna, vendar je zaželena",
-       "tooltip-pt-logout": "Odjavite se",
+       "tooltip-pt-logout": "Odjavi se",
        "tooltip-pt-createaccount": "Predlagamo vam, da ustvarite račun in se prijavite, vendar pa to ni obvezno.",
        "tooltip-ca-talk": "Pogovor o strani",
        "tooltip-ca-edit": "Uredi stran",
        "patrol-log-header": "To je dnevnik nadzorovanih redakcij.",
        "log-show-hide-patrol": "$1 dnevnik nadzora",
        "log-show-hide-tag": "$1 dnevnik oznak",
+       "confirm-markpatrolled-button": "V redu",
+       "confirm-markpatrolled-top": "Označimo redakcijo $3 strani $2 kot nadzorovano?",
        "deletedrevision": "Prejšnja redakcija $1 je izbrisana",
        "filedeleteerror-short": "Napaka pri brisanju datoteke: $1",
        "filedeleteerror-long": "Pri brisanju datoteke so se pojavile napake:\n\n$1",
        "tags-deactivate": "dezaktiviraj",
        "tags-hitcount": "$1 {{PLURAL:$1|sprememba|spremembi|spremembe|sprememb|sprememb}}",
        "tags-manage-no-permission": "Nimate dovoljenja za upravljanje z oznakami sprememb.",
-       "tags-manage-blocked": "Med blokado ne morete upravljati oznak sprememb.",
+       "tags-manage-blocked": "Med blokado {{GENDER:$1|ne morete}} upravljati oznak sprememb.",
        "tags-create-heading": "Ustvari novo oznako",
        "tags-create-explanation": "Privzeto bodo novo ustvarjene oznake na voljo uporabnikom in botom.",
        "tags-create-tag-name": "Ime oznake:",
        "tags-deactivate-not-allowed": "Oznake »$1« ni možno dezaktivirati.",
        "tags-deactivate-submit": "Dezaktiviraj",
        "tags-apply-no-permission": "Nimate dovoljenja za uveljavljanje sprememb oznak skupaj z vašimi spremembami.",
-       "tags-apply-blocked": "Med blokado ne morete uveljaviti oznak sprememb skupaj s svojimi spremembami.",
+       "tags-apply-blocked": "Med blokado {{GENDER:$1|ne morete}} uveljaviti oznak sprememb skupaj s svojimi spremembami.",
        "tags-apply-not-allowed-one": "Oznake »$1« ni mogoče uveljaviti ročno.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Naslednje oznake|Naslednji oznaki|Naslednjih oznak}} ni mogoče ročno uveljaviti: $1",
        "tags-update-no-permission": "Nimate dovoljenja za dodajanje ali odstranjevanje oznak na posameznih redakcijah ali dnevniških vnosih.",
-       "tags-update-blocked": "Med blokado ne morete dodati ali odstraniti oznak sprememb.",
+       "tags-update-blocked": "Med blokado {{GENDER:$1|ne morete}} dodati ali odstraniti oznak sprememb.",
        "tags-update-add-not-allowed-one": "Oznake »$1« ni mogoče dodati ročno.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Naslednje oznake|Naslednji oznaki|Naslednjih oznak}} ni mogoče dodati ročno: $1",
        "tags-update-remove-not-allowed-one": "Oznake »$1« ni mogoče odstraniti.",
        "htmlform-float-invalid": "Vrednost, ki ste jo vnesli, ni število.",
        "htmlform-int-toolow": "Vrednost, ki ste jo vnesli, je manjša od najmanjše dovoljene vrednosti $1",
        "htmlform-int-toohigh": "Vrednost, ki ste jo vnesli, je večja od največje dovoljene vrednosti $1",
-       "htmlform-required": "Ta vrednost je zahtevana",
+       "htmlform-required": "To je zahtevana vrednost.",
        "htmlform-submit": "Pošlji",
        "htmlform-reset": "Razveljavi spremembe",
        "htmlform-selectorother-other": "Drugo",
        "htmlform-user-not-exists": "<strong>$1</strong> ne obstaja.",
        "htmlform-user-not-valid": "<strong>$1</strong> ni veljavno uporabniško ime.",
        "logentry-delete-delete": "$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} stran $3",
+       "logentry-delete-delete_redir": "$1 je {{GENDER:$2|izbrisal|izbrisala|izbrisal(-a)}} preusmeritev $3 s prepisom",
        "logentry-delete-restore": "$1 je {{GENDER:$2|obnovil|obnovila|obnovil(-a)}} stran $3",
        "logentry-delete-event": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|dnevniškega dogodka|dnevniških dogodkov}} na $3: $4",
        "logentry-delete-revision": "$1 je {{GENDER:$2|spremenil|spremenila|spremenil(-a)}} vidljivost $5 {{PLURAL:$5|redakcije|redakcij}} na strani $3: $4",
        "mw-widgets-dateinput-placeholder-month": "LLLL-MM",
        "mw-widgets-titleinput-description-new-page": "stran še ne obstaja",
        "mw-widgets-titleinput-description-redirect": "preusmeritev na $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Dodaj kategorijo ...",
        "sessionmanager-tie": "Ne morem združiti več vrst overitvenih zahtev: $1.",
        "sessionprovider-generic": "sej $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "sej, ki temeljijo na piškotkih",
        "log-action-filter-contentmodel-change": "Sprememba Modelastrani",
        "log-action-filter-contentmodel-new": "Ustvarjanje strani z nestandardnim Modelomstrani",
        "log-action-filter-delete-delete": "Izbris strani",
+       "log-action-filter-delete-delete_redir": "Prepis preusmeritve",
        "log-action-filter-delete-restore": "Obnovitev strani",
        "log-action-filter-delete-event": "Dnevnik brisanja",
        "log-action-filter-delete-revision": "Izbris redakcije",
        "usercssispublic": "Pomnite: Podstrani CSS naj ne vsebujejo zaupnih podatkov, saj so vidne tudi drugim uporabnikom.",
        "restrictionsfield-badip": "Neveljaven IP-naslov ali obseg: $1",
        "restrictionsfield-label": "Dovoljeni IP-obsegi:",
-       "restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Napaka: $1",
-       "edit-error-long": "Napake:\n\n$1"
+       "restrictionsfield-help": "En IP-naslov ali CIDR-območje na vrstico. Da omogočite vse, uporabite<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index cd2f351..5e04c16 100644 (file)
        "yourname": "Benutzernoame:",
        "yourpassword": "Passwort:",
        "yourpasswordagain": "Passwort wiederhola:",
-       "remembermypassword": "Mit diesem Browser dauerhaft angemeldet bleiben (maximal $1 {{PLURAL:$1|Tag|Tage}})",
        "yourdomainname": "Denne Domain:",
        "externaldberror": "Entweder is leit a Fahler bei der externa Authentifizierung vur, oder du darfst dei externes Benutzerkonto ne aktualisiera.",
        "login": "Oanmelda",
        "undo-failure": "De Änderung konnte ne rickgängig gemacht waan, do dar betroffene Obschnitt zwischazeitlich verändert wurde.",
        "undo-norev": "De Beoarbeetung konnte ne rickgängig gemacht waan, do se ne vorhanden ies oder geläscht wurde.",
        "undo-summary": "Änderung $1 vu [[Special:Contributions/$2|$2]] ([[User talk:$2|Dischkur]]) wurde rickgängig gemacht.",
-       "cantcreateaccounttitle": "Nutzerkonto koan ne erstallt waan",
        "cantcreateaccount-text": "De Erstellung annes Nutzerkontos vu dar IP-Atresse '''($1)''' aus wurde durch [[User:$3|$3]] gesperrt.\n\nGrund dar Sperre: ''$2''",
        "viewpagelogs": "Logbicher fier diese Seite oazeega",
        "nohistory": "'S gitt kenne Versionsgeschichte fier diese Seite.",
index 2697621..f3f52f1 100644 (file)
        "activeusers-intro": "Kjo është një listë e përdoruesve që kanë qenë aktivë për $1 {{PLURAL:$1|ditë|ditë}}.",
        "activeusers-count": "$1 {{PLURAL:$1|redaktim|redaktime}} në {{PLURAL:$3|ditën|$3 ditët}} e fundit",
        "activeusers-from": "Trego përdoruesit duke filluar prej te:",
-       "activeusers-hidebots": "Fshih robotët",
-       "activeusers-hidesysops": "Fshih administratorët",
        "activeusers-noresult": "Asnjë përdorues nuk u gjet.",
        "listgrouprights": "Grupime përdoruesish me privilegje",
        "listgrouprights-summary": "Më poshtë jepet grupimi i përdoruesve sipas privilegjeve që ju janë dhënë në këtë wiki. Më shumë informacion rreth privilegjeve në veçanti mund të gjendet [[{{MediaWiki:Listgrouprights-helppage}}|këtu]].",
index fe210a8..4446e01 100644 (file)
        "passwordreset-emaildisabled": "Имејл је онемогућен на овом викију.",
        "passwordreset-username": "Корисничко име:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Погледати крајњи имејл?",
-       "passwordreset-capture-help": "Ако означите ову кућицу, имејл (с привременом лозинком) ће бити приказан и послат кориснику.",
        "passwordreset-email": "Имејл адреса:",
        "passwordreset-emailtitle": "Детаљи налога на викију {{SITENAME}}",
        "passwordreset-emailtext-ip": "Неко (вероватно Ви, са ИП адресе $1) је затражио нову лозинку на викију {{SITENAME}} ($4).\nСледећи {{PLURAL:$3|кориснички налог је повезан|кориснички налози су повезани}} с овом имејл адресом:\n\n$2\n\n{{PLURAL:$3|Привремена лозинка истиче|Привремене лозинке истичу}} за {{PLURAL:$5|један дан|$5 дана}}.\nПријавите се и изаберите нову лозинку. Ако је неко други захтевао ову радњу или сте се сетили лозинке и не желите да је мењате, занемарите ову поруку и наставите користити стару лозинку.",
        "userrights-reason": "Разлог:",
        "userrights-no-interwiki": "Немате овлашћења да мењате корисничка права на другим викијима.",
        "userrights-nodatabase": "База података $1 не постоји или није локална.",
-       "userrights-nologin": "Морате се [[Special:UserLogin|пријавити]] с администраторским налогом да бисте мењали корисничка права.",
-       "userrights-notallowed": "Немате овлашћења да додајете или уклањате корисничка права.",
        "userrights-changeable-col": "Групе које можете да промените",
        "userrights-unchangeable-col": "Групе које не можете да промените",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Сукоб промена корисничких права! Молимо проверите ваше измене.",
-       "userrights-removed-self": "Скинули сте себи права. Због тога Вам није дозвољен приступ овој страници.",
        "group": "Група:",
        "group-user": "Корисници",
        "group-autoconfirmed": "Аутоматски потврђени корисници",
        "right-siteadmin": "закључавање и откључавање базе података",
        "right-override-export-depth": "извоз страница укључујући и повазене странице до дубине од пет веза",
        "right-sendemail": "Пошаљи имејл другим корисницима",
-       "right-passwordreset": "прегледање порука за обнављање лозинке",
        "right-managechangetags": "прављење и (де)активирање [[Special:Tags|ознака]]",
        "right-applychangetags": "примењивање [[Special:Tags|ознака]] на нечије измене",
        "right-changetags": "додавање и уклањање разних [[Special:Tags|ознака]] на појединачним изменама и уносима у дневницима",
        "patrol-log-header": "Ово је дневник патролираних измена.",
        "log-show-hide-patrol": "$1 дневник патролирања",
        "log-show-hide-tag": "$1 дневник ознака",
+       "confirm-markpatrolled-button": "У реду",
+       "confirm-markpatrolled-top": "Означити измену $3 странице $2 патролираном?",
        "deletedrevision": "Обрисана стара измена $1.",
        "filedeleteerror-short": "Грешка при брисању датотеке: $1",
        "filedeleteerror-long": "Дошло је до грешака при брисању датотеке:\n\n$1",
index 6bdd3b5..3fad564 100644 (file)
        "passwordreset-emaildisabled": "Imejl je onemogućen na ovom vikiju.",
        "passwordreset-username": "Korisničko ime:",
        "passwordreset-domain": "Domen:",
-       "passwordreset-capture": "Pogledati krajnji imejl?",
-       "passwordreset-capture-help": "Ako označite ovo polje, imejl (s privremenom lozinkom) će biti prikazana i poslata korisniku.",
        "passwordreset-email": "Imejl adresa:",
        "passwordreset-emailtitle": "Detalji naloga na vikiju {{SITENAME}}",
        "passwordreset-emailtext-ip": "Neko (verovatno Vi, sa IP adrese $1) je zatražio novu lozinku na vikiju {{SITENAME}} ($4).\nSledeći {{PLURAL:$3|korisnički nalog je povezan|korisnički nalozi su povezani}} s ovom imejl adresom:\n\n$2\n\n{{PLURAL:$3|Privremena lozinka ističe|Privremene lozinke ističu}} za {{PLURAL:$5|jedan dan|$5 dana}}.\nPrijavite se i izaberite novu lozinku. Ako je neko drugi zahtevao ovu radnju ili ste se setili lozinke i ne želite da je menjate, zanemarite ovu poruku i nastavite koristiti staru lozinku.",
        "userrights-reason": "Razlog:",
        "userrights-no-interwiki": "Nemate ovlašćenja da menjate korisnička prava na drugim vikijima.",
        "userrights-nodatabase": "Baza podataka $1 ne postoji ili nije lokalna.",
-       "userrights-nologin": "Morate se [[Special:UserLogin|prijaviti]] s administratorskim nalogom da biste menjali korisnička prava.",
-       "userrights-notallowed": "Nemate ovlašćenja da dodajete ili uklanjate korisnička prava.",
        "userrights-changeable-col": "Grupe koje možete da promenite",
        "userrights-unchangeable-col": "Grupe koje ne možete da promenite",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Sukob promena korisničkih prava! Molimo proverite vaše izmene.",
-       "userrights-removed-self": "Uspešno ste sebi skinuli prava. Zbog toga nije vam dozvoljen pristup ovoj stranici.",
        "group": "Grupa:",
        "group-user": "Korisnici",
        "group-autoconfirmed": "Automatski potvrđeni korisnici",
        "right-siteadmin": "zaključavanje i otključavanje baze podataka",
        "right-override-export-depth": "izvoz stranica uključujući i povazene stranice do dubine od pet veza",
        "right-sendemail": "Pošalji imejl drugim korisnicima",
-       "right-passwordreset": "pregledanje poruka za obnavljanje lozinke",
        "right-managechangetags": "pravljenje i (de)aktiviranje [[Special:Tags|oznaka]]",
        "grant-group-page-interaction": "Uređivanje stranica",
        "grant-group-file-interaction": "Uređivanje datoteka",
index 499ddeb..6b3bcec 100644 (file)
        "yourname": "Kebroikiman nen:",
        "yourpassword": "Psa wortu:",
        "yourpasswordagain": "Psa wortu ete wan leysi:",
-       "remembermypassword": "Tan memre mi kebroikiman nen nanga psa wortu (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "yourdomainname": "Yu domein:",
        "login": "Psa kon",
        "nav-login-createaccount": "Psa kon / meki wan account",
        "template-semiprotected": "(sroto wan pisi)",
        "nocreatetext": "{{SITENAME}} puru den primisi fu meki nyun papira.\nYu kan go baka fu kenki papira di de kba, noso yu kan [[Special:UserLogin|psa kon noso meki wan account]].",
        "recreate-moveddeleted-warn": "'''Warskow: yu e meki wan papira, di ben puru fu dyaso kaba, baka.'''\n\nDenki fosi efu na wan bun sani fu meki a papira disi baka. A log buku fu puru sori dyaso gi yepi:",
-       "cantcreateaccounttitle": "Kan masyin ni skopu.",
        "viewpagelogs": "Luku a log buku fu a papira disi",
        "currentrev": "A versi disi",
        "revisionasof": "Versi tapu $1",
index 3853940..68b29f0 100644 (file)
        "yourname": "Benutsernoome:",
        "yourpassword": "Paaswoud:",
        "yourpasswordagain": "Paaswoud wierhoalje:",
-       "remembermypassword": "Ap dissen Computer duurhaft ounmälded blieuwe (Maximoal foar $1 {{PLURAL:$1|Dai|Deege}})",
        "yourdomainname": "Dien Domain:",
        "externaldberror": "Äntweeder deer lait n Failer bie ju externe Authentifizierenge foar, of du duurst din extern Benutzerkonto nit aktualisierje.",
        "login": "Anmäldje",
        "undo-failure": "Ju Annerenge kuud nit tourääch annerd wäide, deer ju betroffene Oudeelenge intwisken ferannerd wuude.",
        "undo-norev": "Ju Beoarbaidenge kuud nit räägels troald wäide, deer ju nit foarhounden is of läsked wuude.",
        "undo-summary": "Annerenge $1 fon [[Special:Contributions/$2|$2]] ([[User talk:$2|Diskussion]]) wuude tourääch annerd.",
-       "cantcreateaccounttitle": "Benutserkonto kon nit moaked wäide",
        "cantcreateaccount-text": "Dät Moakjen fon n Benutserkonto fon ju IP-Adresse '''$1''' uut wuude fon [[User:$3|$3]] speerd.\n\nGruund fon ju Speere: ''$2''",
        "viewpagelogs": "Logbouke foar disse Siede anwiese",
        "nohistory": "Dät rakt neen fröiere Versione fon dissen Artikkel.",
        "activeusers-intro": "Dit is ne Lieste fon Benutsere, do binne {{PLURAL:$1|dän lääste Dai|do lääste $1 Deege}} Aktivitäte apwiese.",
        "activeusers-count": "$1 {{PLURAL:$1|Beoarbaidenge|Beoarbaidengen}} in do {{PLURAL:$3|lääste 24 Uuren|fergeene $3 Deege}}",
        "activeusers-from": "Wies Benutsere ounfangend mäd:",
-       "activeusers-hidebots": "Bots fersteete",
-       "activeusers-hidesysops": "Administratore fersteete",
        "activeusers-noresult": "Neen Benutsere fuunen.",
        "listgrouprights": "Benutsergruppen-Gjuchte",
        "listgrouprights-summary": "Dit is ne Lieste fon do in dissen Wiki definierde Benutsergruppen un do deermäd ferbuundene Gjuchte.\nInformatione uurhäär uur eenpelde Gjuchte konnen [[{{MediaWiki:Listgrouprights-helppage}}|hier]] fuunen wäide.",
        "htmlform-submit": "Uurdreege",
        "htmlform-reset": "Annerengen touräächtraale",
        "htmlform-selectorother-other": "Uur",
-       "sqlite-has-fts": "Version $1 mäd Unnerstutsenge foar ju Fultäkstsäike",
-       "sqlite-no-fts": "Version $1 sunner Unnerstutsenge foaar ju Fultäkstsäike",
        "revdelete-restricted": "Einskränkengen jäilde uk foar Administratore",
        "revdelete-unrestricted": "Ienskränkengen foar Administratore wächhoald",
        "rightsnone": "(-)",
index ed76949..f191865 100644 (file)
        "yourpasswordagain": "Ketik deui sandi anjeun",
        "createacct-yourpasswordagain": "Konfirmasi kecap sandi",
        "createacct-yourpasswordagain-ph": "Asupkeun deui kecap sandi",
-       "remembermypassword": "Apalkeun login kuring dina ieu komputer (pikeun paling lila $1 {{PLURAL:$1|poé|poé}})",
        "userlogin-remembermypassword": "Jaga ngarah angger asup log",
        "userlogin-signwithsecure": "Paké sambungan aman",
        "yourdomainname": "Domain anjeun",
        "passwordreset-emailtext-user": "Pamaké $1 di {{SITENAME}} ménta nyetél ulang sandi anjeun di {{SITENAME}} ($4). {{PLURAL:$3|Akun}} di handap tumali jeung alamat surélék ieu:\n\n$2\n\n{{PLURAL:$3|Ieu sandi saheulaanan}} bakal kadaluwarsa dina témpo {{PLURAL:$5|sapoé|$5 poé}}.\nAnjeun kudu asup sarta milih sandi anyar ayeuna. Lamun henteu rumasa nyieun ieu pamundut atawa lamun geus inget sandi asli sarta moal ngarobah deui, ieu talatah teu kudu dipaliré.",
        "passwordreset-emailelement": "Sandiasma: \n$1\n\nSandi saheulaanan: \n$2",
        "passwordreset-emailsentemail": "Surélék pikeun nyetél ulang kecap sandi geus dikirim.",
-       "passwordreset-emailsent-capture": "Surélék pikeun nyetél ulang kecap sandi geus dikirim, sakumaha ditémbongkeun di handap.",
-       "passwordreset-emailerror-capture": "Surélék pikeun nyetél ulang kecap sandi geus dijieun, sakumaha ditémbongkeun di handap, tapi gagal ngirim ka {{GENDER:$2|pamaké}}: $1",
        "changeemail": "Ganti alamat surélék",
        "changeemail-header": "Ganti alamat surélék akun",
        "changeemail-no-info": "Anjeun kudu asup log pikeun bisa muka ieu kaca sacara langsung.",
        "undo-norev": "Éditan ieu henteu bisa bolaykeun alatan kaca henteu kapanggih atawa geus dihapus.",
        "undo-summary": "←Ngabolaykeun révisi $1 ku [[Special:Contributions/$2|$2]] ([[User talk:$2|Obrolan]])",
        "undo-summary-username-hidden": "Bolaykeun révisi $1 ku pamaké nyumput",
-       "cantcreateaccounttitle": "Rekening teu bisa dijieun",
        "cantcreateaccount-text": "Nyieun rekening ti ieu alamat IP ('''$1''') dipeungpeuk ku [[User:$3|$3]].\n\nAlesanana $3 cenah ''$2''.",
        "cantcreateaccount-range-text": "Nyieun akun ti alamat IP dina rentang <strong>$1</strong>, kaasup alamat IP anjeun (<strong>$4</strong>), dipeungpeuk ku [[User:$3|$3]].\n\nAlesan $3 nyaéta <em>$2</em>",
        "viewpagelogs": "Tempo log kaca ieu",
        "activeusers-intro": "Ieu béréndélan kontributor anu geus ngoprék $1 {{PLURAL:$1|poé|poé}} panungtung.",
        "activeusers-count": "$1 {{PLURAL:$1|édit|édit}}an salila {{PLURAL:$3|poé|$3 poé}} panungtung",
        "activeusers-from": "Témbongkeun kontributor dimimitian ku:",
-       "activeusers-hidebots": "Sumputkeun bot",
-       "activeusers-hidesysops": "Sumputkeun kuncén",
        "activeusers-noresult": "Teu kapendak.",
        "listgrouprights": "Hak-hak grup pamaké",
        "listgrouprights-summary": "Ieu mangrupa daptar jumplukan pamaké anu aya di wiki ieu, kalawan daptar hak aksés maranéhanana.\nÉmbaran leuwih luyu ngeunaan hak pamaké bisa ditingali di [[{{MediaWiki:Listgrouprights-helppage}}|dieu]].",
index 333ab9f..c24dcb6 100644 (file)
        "botpasswords-label-delete": "Radera",
        "botpasswords-label-resetpassword": "Återställ lösenordet",
        "botpasswords-label-grants": "Tillgängliga beviljanden:",
-       "botpasswords-help-grants": "Varje beviljande ger åtkomst till listade användarrättigheter som ett användarkonto redan har. Se [[Special:ListGrants|tabellen över beviljanden]] för mer information.",
+       "botpasswords-help-grants": "Beviljande ger åtkomst till användarrättigheter som ditt användarkonto redan har. När ett beviljande aktiveras här ger det inte åtkomst till de användarrättigheter som ditt användarkonto inte annars skulle ha. Se [[Special:ListGrants|tabellen över beviljanden]] för mer information.",
        "botpasswords-label-grants-column": "Beviljas",
        "botpasswords-bad-appid": "Botnamnet \"$1\" är inte giltigt.",
        "botpasswords-insert-failed": "Kunde inte lägga till botnamnet \"$1\". Har det redan lagts till?",
        "passwordreset-emaildisabled": "E-postfunktioner har inaktiverats på denna wiki.",
        "passwordreset-username": "Användarnamn:",
        "passwordreset-domain": "Domän:",
-       "passwordreset-capture": "Visa resulterande e-post?",
-       "passwordreset-capture-help": "Om du markerar den här rutan kommer e-postmeddelandet (med det tillfälliga lösenordet) visas för dig och skickas till användaren.",
        "passwordreset-email": "E-postadress:",
        "passwordreset-emailtitle": "Kontouppgifter på {{SITENAME}}",
        "passwordreset-emailtext-ip": "Någon (förmodligen du, från IP-adressen $1) begärde en återställning av ditt lösenord för {{SITENAME}} ($4). Följande användar{{PLURAL:$3|konto är förknippad|konton är förknippade}} med denna e-postadress:\n\n$2\n\n{{PLURAL:$3|Detta|Dessa}} tillfälliga lösenord kommer att gå ut om {{PLURAL:$5|en dag|$5 dagar}}.\nDu bör logga in och välja ett nytt lösenord nu. Om någon annan gjorde denna begäran, eller om du kommer ihåg ditt ursprungliga lösenord, och inte längre önskar ändra det, kan du ignorera detta meddelande och fortsätta använda ditt gamla lösenord.",
        "passwordreset-emailelement": "Användarnamn: \n$1\n\nTillfälligt lösenord: \n$2",
        "passwordreset-emailsentemail": "Om denna e-postadress är associerad med ditt konto kommer en lösenordsåterställning skickas via e-post.",
        "passwordreset-emailsentusername": "Om det finns en e-postadress som associeras med detta användarnamn kommer en lösenordsåterställning skickas via e-post.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|E-postmeddelande|E-postmeddelanden}} för återställning av lösenord har skickats. {{PLURAL:$1|Användarnamnet och lösenordet|Listan över användarnamn och lösenord}} visas här.",
-       "passwordreset-emailerror-capture2": "Kunde inte skicka e-post till {{GENDER:$2|användaren}}: $1 {{PLURAL:$3|Användarnamnet och lösenordet|Listan över användarnamn och lösenord}} listas här.",
        "passwordreset-nocaller": "En användare måste anges",
        "passwordreset-nosuchcaller": "Användare finns inte: $1",
        "passwordreset-ignored": "Lösenordsåterställningen hanterades inte. Kanske ingen leverantör har konfigurerats?",
-       "passwordreset-invalideamil": "Ogiltig e-postadress",
+       "passwordreset-invalidemail": "Ogiltig e-postadress",
        "passwordreset-nodata": "Varken ett användarnamn eller en e-postadress angavs",
        "changeemail": "Ändra eller ta bort e-postadress",
        "changeemail-header": "Fyll i detta formulär för att ändra din e-postadress. Om du vill ta bort en associerad e-postadress från ditt konto lämnar du fältet för ny e-postadress tomt när formuläret skickas in.",
        "prefs-help-recentchangescount": "Detta inkluderar senaste ändringarna, sidhistorik och loggar.",
        "prefs-help-watchlist-token2": "Detta är den hemliga nyckeln till webbflödet i din bevakningslista.\nNågon som vet den kommer att kunna läsa din bevakningslista, så dela inte ut den.\n[[Special:ResetTokens|Klicka här om du behöver återställa den]].",
        "savedprefs": "Dina inställningar har sparats",
-       "savedrights": "Användarrättigheterna för {{GENDER:$1|$1}} har sparats.",
+       "savedrights": "Användargrupperna för {{GENDER:$1|$1}} har sparats.",
        "timezonelegend": "Tidszon:",
        "localtime": "Lokal tid:",
        "timezoneuseserverdefault": "Använd wikins standard ($1)",
        "userrights-reason": "Anledning:",
        "userrights-no-interwiki": "Du har inte behörighet att ändra användarrättigheter på andra wikis.",
        "userrights-nodatabase": "Databasen $1 finns inte eller så är den inte lokal.",
-       "userrights-nologin": "Du måste [[Special:UserLogin|logga in]] med ett administratörskonto för att ändra användarrättigheter.",
-       "userrights-notallowed": "Du har inte behörighet till att lägga till eller ta bort användarrättigheter.",
        "userrights-changeable-col": "Grupper du kan ändra",
        "userrights-unchangeable-col": "Grupper du inte kan ändra",
        "userrights-conflict": "Konflikt vid ändringar av användarrättigheter! Var god granska och bekräfta dina ändringar.",
-       "userrights-removed-self": "Du tog bort dina egna rättigheter. Du kan därför inte längre komma åt denna sida.",
        "group": "Grupp:",
        "group-user": "Användare",
        "group-autoconfirmed": "Automatiskt bekräftade användare",
        "right-siteadmin": "Lås och öppna databasen",
        "right-override-export-depth": "Exportera sidor inklusive länkade sidor till ett djup på 5",
        "right-sendemail": "Skicka e-post till andra användare",
-       "right-passwordreset": "Visa e-postmeddelanden med lösenordsåterställning",
        "right-managechangetags": "Skapa och (in)aktivera [[Special:Tags|märken]]",
        "right-applychangetags": "Tillämpa [[Special:Tags|märken]] tillsammans med ens ändringar",
        "right-changetags": "Lägg till och ta bort godtyckliga [[Special:Tags|märken]] på individuella sidversioner och loggposter.",
        "apisandbox-continue": "Fortsätt",
        "apisandbox-continue-clear": "Rensa",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} kommer att [https://www.mediawiki.org/wiki/API:Query#Continuing_queries fortsätta] den sista begäran; {{int:apisandbox-continue-clear}} kommer att rensa fortsättningsrelaterade parametrar.",
+       "apisandbox-param-limit": "Ange <kbd>max</kbd> för att använda den maximala gränsen.",
+       "apisandbox-multivalue-all-namespaces": "$1 (alla namnrymder)",
+       "apisandbox-multivalue-all-values": "$1 (alla värden)",
        "booksources": "Bokkällor",
        "booksources-search-legend": "Sök efter bokkällor",
        "booksources-search": "Sök",
        "activeusers-count": "$1 {{PLURAL:$1|handling|handlingar}} {{PLURAL:$3|det senaste dygnet|de senaste $3 dygnen}}",
        "activeusers-from": "Visa användare från och med:",
        "activeusers-groups": "Visa användare som tillhör grupper:",
+       "activeusers-excludegroups": "Exkludera användare som tillhör grupper:",
        "activeusers-noresult": "Inga användare funna.",
        "activeusers-submit": "Visa aktiva användare",
        "listgrouprights": "Behörigheter för användargrupper",
        "patrol-log-header": "Detta är en logg över patrullerade sidversioner.",
        "log-show-hide-patrol": "$1 patrulleringslogg",
        "log-show-hide-tag": "$1 märkeslogg",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Markera sidversionen $3 av $2 som patrullerad?",
        "deletedrevision": "Raderade gammal sidversion $1",
        "filedeleteerror-short": "Fel vid radering av fil: $1",
        "filedeleteerror-long": "Fel inträffade vid raderingen av filen:\n\n$1",
        "tags-deactivate": "inaktivera",
        "tags-hitcount": "$1 {{PLURAL:$1|ändring|ändringar}}",
        "tags-manage-no-permission": "Du har inte behörighet att hantera förändringsmärken.",
-       "tags-manage-blocked": "Du kan inte hantera förändringsmärken när du är blockerad.",
+       "tags-manage-blocked": "Du kan inte hantera förändringsmärken när {{GENDER:$1|du}} är blockerad.",
        "tags-create-heading": "Skapa ett nytt märke",
        "tags-create-explanation": "Som standard, kommer nyskapade märken att bli tillgängliga för användning av användare och botar.",
        "tags-create-tag-name": "Märkesnamn:",
        "tags-deactivate-not-allowed": "Det är inte möjligt att inaktivera märket \"$1\".",
        "tags-deactivate-submit": "Inaktivera",
        "tags-apply-no-permission": "Du har inte behörighet att tillämpa ändringsmärken på dina ändringar.",
-       "tags-apply-blocked": "Du kan inte ange ändringsmärken med dina ändringar medans du är blockerad.",
+       "tags-apply-blocked": "Du kan inte ange ändringsmärken med dina ändringar när {{GENDER:$1|du}} är blockerad.",
        "tags-apply-not-allowed-one": "Märket \"$1\" kan inte läggas till manuellt.",
        "tags-apply-not-allowed-multi": "Följande {{PLURAL:$2|märke|märken}} kan inte läggas till manuellt: $1",
        "tags-update-no-permission": "Du har inte behörighet att lägga till eller ta bort märken från individuella sidversioner eller loggposter.",
-       "tags-update-blocked": "Du kan inte lägga till eller ta bort ändringsmärken när du är blockerad.",
+       "tags-update-blocked": "Du kan inte lägga till eller ta bort ändringsmärken när {{GENDER:$1|du}} är blockerad.",
        "tags-update-add-not-allowed-one": "Märket \"$1\" kan inte läggas till manuellt.",
        "tags-update-add-not-allowed-multi": "Följande {{PLURAL:$2|märke|märken}} kan inte läggas till manuellt: $1",
        "tags-update-remove-not-allowed-one": "Märket \"$1\" får inte tas bort.",
        "htmlform-user-not-exists": "<strong>$1</strong> finns inte.",
        "htmlform-user-not-valid": "<strong>$1</strong> är inte ett giltigt användarnamn.",
        "logentry-delete-delete": "$1 {{GENDER:$2|raderade}} sidan $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|raderade}} omdirigeringen $3 genom att skriva över den",
        "logentry-delete-restore": "$1 {{GENDER:$2|återställde}} sidan $3",
        "logentry-delete-event": "$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en logghändelse|$5 logghändelser}} på $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|ändrade}} synligheten för {{PLURAL:$5|en version|$5 versioner}} på sidan $3: $4",
        "mw-widgets-dateinput-placeholder-month": "ÅÅÅÅ-MM",
        "mw-widgets-titleinput-description-new-page": "sidan existerar inte ännu",
        "mw-widgets-titleinput-description-redirect": "omdirigerar till $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Lägg till en kategori...",
        "sessionmanager-tie": "Kan inte kombinera flera begäransautentiseringstyper: $1.",
        "sessionprovider-generic": "$1-sessioner",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "cookiebaserade sessioner",
        "log-action-filter-contentmodel-change": "Ändring av innehållsmodell",
        "log-action-filter-contentmodel-new": "Skapande av sida med icke-standardiserad innehållsmodell",
        "log-action-filter-delete-delete": "Radering av sida",
+       "log-action-filter-delete-delete_redir": "Överskrivning av omdirigering",
        "log-action-filter-delete-restore": "Återställning av sida",
        "log-action-filter-delete-event": "Radering av logg",
        "log-action-filter-delete-revision": "Radering av sidversion",
        "authmanager-authn-autocreate-failed": "Kunde inte skapa ett lokalt konto automatiskt: $1",
        "authmanager-change-not-supported": "De angivna inloggningsuppgifterna kan inte ändras, då ingenting kan använda dem.",
        "authmanager-create-disabled": "Kontoregistrering är inaktiverat.",
-       "authmanager-create-from-login": "Fyll i fälten nedan för att skapa ditt konto.",
+       "authmanager-create-from-login": "Fyll i fälten för att skapa ditt konto.",
        "authmanager-create-not-in-progress": "Skapande av konto pågår inte eller så har sessionsdata förlorats. Var god börja om från början igen.",
        "authmanager-create-no-primary": "De angivna inloggningsuppgifterna kunde inte användas för att skapa ett konto.",
        "authmanager-link-no-primary": "De angivna inloggningsuppgifterna kunde inte användas för att länka ett konto.",
        "usercssispublic": "Observera: CSS-undersidor bör inte innehålla konfidentiella uppgifter eftersom de kan ses av andra användare.",
        "restrictionsfield-badip": "Ogiltig IP-adress eller intervall: $1",
        "restrictionsfield-label": "Tillåtna IP-intervall:",
-       "restrictionsfield-help": "En IP-adress eller CIDR-intervall per rad. För att aktivera allting, använd<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Fel: $1",
-       "edit-error-long": "Fel:\n\n$1"
+       "restrictionsfield-help": "En IP-adress eller CIDR-intervall per rad. För att aktivera allting, använd<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 6ab227a..44b15e8 100644 (file)
@@ -17,7 +17,8 @@
                        "Rich Farmbrough",
                        "Kipala",
                        "Kwisha",
-                       "Macofe"
+                       "Macofe",
+                       "Muddyb"
                ]
        },
        "tog-underline": "Wekea mstari viungo:",
        "yourpasswordagain": "Andika tena neno la siri",
        "createacct-yourpasswordagain": "Thibitisha neno la siri",
        "createacct-yourpasswordagain-ph": "Weka neno la siri tena",
-       "remembermypassword": "Kumbuka kuingia kwangu katika kivinjari hiki (kwa muda usiozidi {{PLURAL:$1|siku}} $1)",
        "userlogin-remembermypassword": "Niweke kama nimeingia",
        "userlogin-signwithsecure": "Tumia muunganisho salama",
        "yourdomainname": "Tovuti yako:",
        "passwordreset-emailtext-user": "Mtumiaji $1 kwenye {{SITENAME}} ameomba neno la siri la akaunti yako liwekwe upya katika {{SITENAME}} ($4). {{PLURAL:$3|Akaunti inayofuata imeunganishwa|Akaunti zinazofuata zimeunganishwa}} na anwani ya barua pepe hii:\n\n$2\n\n{{PLURAL:$3|Neno la siri hili litakwisha|Maneno ya siri haya yatakwisha}} baada ya siku {{PLURAL:$5|one day|$5 siku}}.\nTafadhali ingia sasa na uchague neno jipya la siri. Kama mtu mwingine ameomba hili, au ikiwa umekumbuka neno lako la siri na hutaki kulibadilisha tena, basi usijali ujumbe huu, na uendelee kutumia neno la siri lako la zamani.",
        "passwordreset-emailelement": "Jina la mtumiaji: \n$1\n\nNeno la siri la muda: \n$2",
        "passwordreset-emailsentemail": "Barua pepe ya ukumbusho wa neno la siri imetumwa.",
-       "passwordreset-emailsent-capture": "Barua pepe ya ukukumbusho wa neno la siri imetumwa, ambayo inaonekana hapo chini.",
-       "passwordreset-emailerror-capture": "Barua pepe ya ukukumbusho wa neno la siri imetengenezwa, ambayo inaonekana hapo chini, lakini kuituma kwa mtumiaji {{GENDER:$2|user}} kumeshindikana: $1",
        "changeemail": "Badilisha anwani ya barua pepe",
        "changeemail-header": "Badilisha anwani ya barua pepe ya akaunti yako",
        "changeemail-no-info": "Lazima uwe umeingia ili kuweza kutumia kurasa hii moja kwa moja.",
        "undo-nochange": "Hariri inaonekana kuwa tayari imerudishwa tena.",
        "undo-summary": "Tengua pitio $1 lililoandikwa na [[Special:Contributions/$2|$2]] ([[User talk:$2|Majadiliano]])",
        "undo-summary-username-hidden": "Tednua toleo $1 na mtumiaji aliyejificha",
-       "cantcreateaccounttitle": "Kushindwa kusajili akaunti",
        "cantcreateaccount-text": "Kusajili akaunti kwa kutumia anwani ya IP hii ('''$1''') imezuiwa na [[User:$3|$3]].\n\nSababu iliyotolewa na $3 ni ''$2''",
        "viewpagelogs": "Tazama kumbukumbu kwa ukurasa huu",
        "nohistory": "Hakuna historia ya kuhariri kwa ajili ya ukurasa huu.",
        "activeusers-intro": "Hii ni orodha ya watumiaji walioshughulika jambo fulani ndani ya siku $1 {{PLURAL:$1|iliyopita|zilizopita}}.",
        "activeusers-count": "{{PLURAL:$1|haririo|maharirio}} $1 katika siku $3 {{PLURAL:$3|iliyopita|zilizopita}}",
        "activeusers-from": "Onyesha watumiaji kuanzia:",
-       "activeusers-hidebots": "Ficha boti",
-       "activeusers-hidesysops": "Ficha wakabidhi",
        "activeusers-noresult": "Watumiaji hawakupatikana.",
        "listgrouprights": "Wezo za kundi za watumiaji",
        "listgrouprights-summary": "Inafuata orodha ya kundi za watumiaji wa wiki hii, pamoja na maelezo ya wezo zao za kushughulika mambo.\nLabda patakuwa na [[{{MediaWiki:Listgrouprights-helppage}}|maelezo mengine]] kuhusu wezo zingine.",
        "feedback-back": "Rudi",
        "feedback-cancel": "Batilisha",
        "feedback-close": "Tayari",
-       "feedback-error-title": "Kosa",
        "feedback-error1": "Hitilafu: Hatokeo ya API hayafahamiki",
        "feedback-error2": "Hitilafu: Hariri haikufaulu",
        "feedback-error3": "Hitilafu: API ya wiki haitoi majibu",
index c065fce..7fd903d 100644 (file)
        "botpasswords-label-resetpassword": "கடவுச்சொலை மீளமை",
        "botpasswords-label-grants": "பொருந்தும் மானியங்கள்:",
        "botpasswords-help-grants": "ஒவ்வொரு மானியம் ஏற்கனவே உள்ள பயனர் கணக்குக்கு வரையறுக்கப்பட்ட பயனர் உரிமைகள் அணுக கொடுக்கிறது. மேலதிக விபரங்ளுக்கு [[சிறப்பு:ListGrants|மானியங்களின் அட்டவணையை]] பார்க்க.",
-       "botpasswords-label-restrictions": "பயன்பாட்டு வரையறைகள்:",
        "botpasswords-label-grants-column": "வழங்கப்பட்டது",
        "botpasswords-bad-appid": "\"$1\" என்ற தானியங்கி பெயர் பயன்படாதது.",
        "botpasswords-insert-failed": "\"$1\" என்ற தானியங்கி பெயரை இணைக்க முடியவில்லை. ஏற்கனவே இருக்குமோ?",
        "activeusers-intro": "கடைசி $1 {{PLURAL:$1|நாள்|நாட்கள்}} ஏதேனும் செயலை செய்த பயனர்களின் பட்டியல் இது.",
        "activeusers-count": "$1 {{PLURAL:$1|திருத்தம்|திருத்தங்கள்}} கடைசி {{PLURAL:$3|நாள்|$3 நாட்கள்}}",
        "activeusers-from": "பின்வரும் எழுத்துடன் தொடங்கும் பயனர்களைக் காட்டு:",
-       "activeusers-hidebots": "தானியங்கிகளை மறை",
-       "activeusers-hidesysops": "நிர்வாகிகளை மறை",
        "activeusers-noresult": "எந்தவொரு பயனர்களும் காணப்படவில்லை.",
        "activeusers-submit": "தொடர் பங்களிப்பாளர்களை காட்டு",
        "listgrouprights": "பயனர் குழு உரிமைகள்",
        "feedback-close": "முடிந்தது",
        "feedback-external-bug-report-button": "ஒரு தொழில்நுட்ப பணியைச் சமர்ப்பி",
        "feedback-dialog-title": "பின்னூட்டத்தை சமர்ப்பி",
-       "feedback-error-title": "பிழை",
        "feedback-error1": "பிழை: API லிருந்து அங்கீகரிக்கப்படாத முடிவு.",
        "feedback-error2": "பிழை: திருத்தல்  தோல்வியடைந்தது",
        "feedback-error3": "பிழை: API லிருந்து பதிற்குறிப்பு எதுவும் இல்லை.",
index 315a732..9277032 100644 (file)
        "passwordreset-username": "ಸದಸ್ಯೆರ್ನ ಪುದರ್:",
        "passwordreset-domain": "ಕ್ಷೇತ್ರೊ:",
        "passwordreset-email": "ಇ-ಅಂಚೆ ವಿಳಾಸೊ",
-       "passwordreset-invalideamil": "ಇಮೇಲ್ ಸರಿ ಇಜ್ಜಿ",
+       "passwordreset-invalidemail": "ಇಮೇಲ್ ಸರಿ ಇಜ್ಜಿ",
        "changeemail-oldemail": "ಇತ್ತೆತಾ ಈಮೇಲ್ ವಿಳಾಸೊ:",
        "changeemail-newemail": "ಪೊಸ ಇ-ಅಂಚೆ ವಿಳಾಸೊ:",
        "changeemail-none": "ಒವ್ವುಲಾ ಇಜ್ಜಿ",
        "searchprofile-everything-tooltip": "ಮಾತ ಮಾಹಿತಿಲೆನ್ ನಾಡ್‍ಲೆ (ಪಾತೆರದ ಪುಟೊಲ ಸೇರ್ದ್)",
        "searchprofile-advanced-tooltip": "ಬಳಕೆದ ನಾಮೊವರ್ಗೊಡು ನಾಡ್‍ಲೆ",
        "search-result-size": "$1 ({{PLURAL:$2|೧ ಪದೊ|$2 ಪದೊಕುಲು}})",
-       "search-redirect": "(ಪಿರ ನಿರ್ದೇಶನೊ $1)",
+       "search-redirect": "($1 ಡ್ದ್ ಪಿರ ನಿರ್ದೇಸನೊದ)",
        "search-section": "(ವಿಬಾಗೊ $1)",
        "search-suggest": "ಇಂದೆನ್ ನಾಡೊಂದುಲ್ಲರೆ: $1",
        "search-interwiki-caption": "ಬಳಗದ ಇತರ ಯೋಜನೆಲು",
        "logentry-move-move": "$1 {{GENDER:$2|ಜಾರಲೆ}} ಪುಟೊ $3 ಡ್ದ್ $4",
        "logentry-newusers-create": "ಬಳಕೆದಾರೆರೆ ಕಾತೆ $1 ನ್ನು {{GENDER:$2|ಸ್ರಿಸ್ಟಿ ಮಲ್ತಾಂಡ್}}",
        "logentry-upload-upload": "$1 {{GENDER:$2|ಅಪ್ಲೋಡ್ ಮಲ್ತ್‌ದೆರ್}} $3",
-       "searchsuggest-search": "ನಾಡ್‍ಲೆ"
+       "searchsuggest-search": "{{SITENAME}}ನ್ ನಾಡ್‍ಲೆ"
 }
index 3ec4110..f45a897 100644 (file)
        "views": "చూపులు",
        "toolbox": "పనిముట్లు",
        "tool-link-userrights": "{{GENDER:$1|వాడుకరి}} గుంపులను మార్చు",
+       "tool-link-userrights-readonly": "{{GENDER:$1|వాడుకరి}} గుంపులను చూడండి",
        "tool-link-emailuser": "ఈ {{GENDER:$1|వాడుకరికి}} ఈమెయిలు పంపు",
        "userpage": "వాడుకరి పేజీని చూడండి",
        "projectpage": "ప్రాజెక్టు పేజీని చూడు",
        "passwordreset-emaildisabled": "ఈ వికీలో ఈమెయిలు విశేషాలను అశక్తం చేసాం.",
        "passwordreset-username": "వాడుకరి పేరు:",
        "passwordreset-domain": "డొమైన్:",
-       "passwordreset-capture": "ఈమెయిలు ఎలా ఉంటుందో చూస్తారా?",
-       "passwordreset-capture-help": "ఈ పెట్టెను చెక్ చేస్తే, ఈమెయిలును (తాత్కాలిక సంకేతపదంతో) వాడుకరికి పంపిస్తూనే, మీకూ చూపిస్తాం.",
        "passwordreset-email": "ఈ-మెయిలు చిరునామా:",
        "passwordreset-emailtitle": "{{SITENAME}}లో ఖాతా వివరాలు",
        "passwordreset-emailtext-ip": "ఎవరో (బహుశా మీరే, ఐపీ అడ్రసు $1 నుంచి)  {{SITENAME}} ($4) లో మీ సంకేతపదాన్ని మార్చమంటూ అడిగారు. కింది వాడుకరి {{PLURAL:$3|ఖాతా|ఖాతాలు}}\nఈ ఈమెయిలు చిరునామాతో అనుసంధింపబడి ఉన్నాయి:\n\n$2\n\n{{PLURAL:$3|ఈ సంకేతపదానికి|ఈ సంకేతపదాలకు}} {{PLURAL:$5|ఒక్కరోజులో|$5 రోజుల్లో}} కాలం చెల్లుతుంది.\nఇప్పుడు మీరు లాగినై కొత్త సంకేతపదాన్ని ఎంచుకోవాల్సి ఉంటుంది. ఈ అభ్యర్ధన చేసింది మరెవరైనా అయినా, లేక మీ అసలు సంకేతపదం మీకు గుర్తొచ్చి దాన్ని మార్చాల్సిన అవసరం లేదని అనుకున్నా, మీరీ సందేశాన్ని పట్టించుకోనక్కర్లేదు. పాత సంకేతపదాన్నే వాడుకోవచ్చు.",
        "passwordreset-emailelement": "వాడుకరిపేరు: \n$1\n\nతాత్కాలిక సంకేతపదం: \n$2",
        "passwordreset-emailsentemail": "ఈ ఈమెయిలు చిరునామా మీ ఖాతాకు అనుసంధించి ఉంటే, సంకేతపదం మార్పు ఈమెయిలు పంపించబడుతుంది.",
        "passwordreset-emailsentusername": "ఈ వాడుకరిపేరుకు ఏదైనా ఈమెయిలు చిరునామా అనుసంధించి ఉంటే, సంకేతపదం మార్పు ఈమెయిలు పంపించబడుతుంది.",
-       "passwordreset-emailsent-capture2": "సంకేతపదం మార్పు {{PLURAL:$1|ఈమెయిలును|ఈమెయిళ్ళను}} పంపించాం. {{PLURAL:$1|వాడుకరిపేరు, సంకేతపదాన్ని|వాడుకరిపేర్లు, సంకేతపదాల జాబితాను}} ఇక్కడ చూపించాం.",
-       "passwordreset-emailerror-capture2": "{{GENDER:$2|వాడుకరికి}} ఈమెయిలు పంపడం విఫలమైంది: $1 {{PLURAL:$3|వాడుకరిపేరు, సంకేతపదాన్ని|వాడుకరిపేర్లు, సంకేతపదాల జాబితాను}} ఇక్కడ చూపించాం.",
-       "passwordreset-invalideamil": "తప్పు ఈ-మెయిలు చిరునామా",
+       "passwordreset-invalidemail": "తప్పు ఈ-మెయిలు చిరునామా",
        "passwordreset-nodata": "వాడుకరిపేరుగానీ, ఈ-మెయిలు చిరునామా గానీ ఇవ్వలేదు",
        "changeemail": "ఈ-మెయిలు చిరునామా మార్పు లేదా తొలగింపు",
        "changeemail-header": "మీ ఈ-మెయిల్ చిరునామాను మార్చుకునేందుకు ఈ ఫారమును నింపండి. అసలు మీ ఖాతాకు ఈ-మెయిలు చిరునామా దేన్నీ జోడించ వద్దనుకుంటే, కొత్త ఈ-మెయిలు చిరునామాను ఖాళీగా ఉంచి, ఫారాన్ని సమర్పించండి.",
        "bold_tip": "బొద్దు అక్షరాలు",
        "italic_sample": "వాలు పాఠ్యం",
        "italic_tip": "వాలు పాఠ్యం",
-       "link_sample": "లిà°\82à°\95à±\81 పేరు",
-       "link_tip": "à°\85à°\82తరà±\8dà°\97à°¤ à°²à°¿à°\82à°\95à±\81",
+       "link_sample": "à°²à°\82à°\95à±\86 పేరు",
+       "link_tip": "à°\85à°\82తరà±\8dà°\97à°¤ à°²à°\82à°\95à±\86",
        "extlink_sample": "http://www.example.com లింకు పేరు",
        "extlink_tip": "బయటి లింకు (దీనికి ముందు http:// ఇవ్వటం మరువకండి)",
        "headline_sample": "శీర్షిక పాఠ్యం",
        "prefs-help-recentchangescount": "ఇది ఇటీవలి మార్పులు, పేజీ చరిత్రలు, మరియు చిట్టాలకు వర్తిస్తుంది.",
        "prefs-help-watchlist-token2": "మీ వీక్షణజాబితా యొక్క జాలవడ్డింపుకు చెందిన రహస్య తాళమిది.\nఈ తాళం తెలిసిన ఎవరైనా మీ వీక్షణజాబితాను చదవగలుగుతారు. అందుచేత దీన్ని ఎవరికీ ఇవ్వకండి.\n[[Special:ResetTokens|దాన్ని మార్చాలంటే ఇక్కడ నొక్కండి]].",
        "savedprefs": "మీ అభిరుచులను భద్రపరిచాం.",
-       "savedrights": "{{GENDER:$1|$1}} à°µà°¾à°¡à±\81à°\95à°°à°¿ à°¹à°\95à±\8dà°\95à±\81లనà±\81 à°­à°¦à±\8dరపరà°\9aà°¾à°\82.",
+       "savedrights": "{{GENDER:$1|$1}} à°µà°¾à°¡à±\81à°\95à°°à°¿ à°\97à±\81à°\82à°ªà±\81à°²à±\81 à°­à°¦à±\8dరమయà±\8dయాయి.",
        "timezonelegend": "కాల మండలం:",
        "localtime": "స్థానిక సమయం:",
        "timezoneuseserverdefault": "వికీ అప్రమేయాన్ని ఉపయోగించు ($1)",
        "prefswarning-warning": "మీ అభిరుచులలో మీరు చేసిన మార్పులను ఇంకా భద్రపరచలేదు. మీరు \"$1\" ను నొక్కకుండా ఈ పేజీని వదలి వెళ్తే, మీ అభిరుచులు భద్రం కావు.",
        "prefs-tabs-navigation-hint": "చిట్కా: ట్యాబుల జాబితాలో ఓ ట్యాబు నుండి మరోదానికి వెళ్ళేందుకు కుడి ఎడమ బాణాల కీలను వాడవచ్చు.",
        "userrights": "వాడుకరి హక్కుల నిర్వహణ",
-       "userrights-lookup-user": "వాడుకరి సమూహాలను నిర్వహించండి",
+       "userrights-lookup-user": "వాడుకరిని ఎంచుకోండి",
        "userrights-user-editname": "వాడుకరిపేరును ఇవ్వండి:",
-       "editusergroup": "{{GENDER:$1|వాడుకరి}} గుంపులను మార్చు",
-       "editinguser": "{{GENDER:$1|వాడుకరి}} <strong>[[వాడుకరి:$1|$1]]</strong> $2 యొక్క వాడుకరి హక్కులను మారుస్తున్నారు",
+       "editusergroup": "వాడుకరి గుంపులను చూపించు",
+       "editinguser": "{{GENDER:$1|user}} వాడుకరి హక్కులను మారుస్తున్నారు <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "వాడుకరి సమూహాలను మార్చండి",
        "saveusergroups": "{{GENDER:$1|వాడుకరి}} గుంపులను భద్రపరచు",
        "userrights-groupsmember": "సభ్యులు:",
        "userrights-reason": "కారణం:",
        "userrights-no-interwiki": "ఇతర వికీలలో వాడుకరి హక్కులను మార్చడానికి మీకు అనుమతి లేదు.",
        "userrights-nodatabase": "$1 అనే డేటాబేసు లేదు లేదా అది స్థానికం కాదు.",
-       "userrights-nologin": "వాడుకరి హక్కులను ఇవ్వడానికి మీరు తప్పనిసరిగా ఓ నిర్వాహక ఖాతాతో [[Special:UserLogin|లాగినవ్వాలి]].",
-       "userrights-notallowed": "వాడుకరి హక్కులను చేర్చే మరియు తొలగించే అనుమతి మీకు లేదు.",
        "userrights-changeable-col": "మీరు మార్చదగిన గుంపులు",
        "userrights-unchangeable-col": "మీరు మార్చలేని గుంపులు",
        "userrights-conflict": "వాడుకరి హక్కుల మార్పులలో ఘర్షణ! మీ మార్పులను సమీక్షించి, నిర్ధారించండి.",
-       "userrights-removed-self": "మీ హక్కులను మీరు తొలగించుకున్నారు. ఇక, మీరీ పేజీని చూడలేరు.",
        "group": "గుంపు:",
        "group-user": "వాడుకరులు",
        "group-autoconfirmed": "ఆటోమాటిగ్గా నిర్ధారించబడిన వాడుకరులు",
        "right-siteadmin": "డేటాబేసును లాక్, అన్‌లాక్ చెయ్యి",
        "right-override-export-depth": "5 లింకుల లోతు వరకు ఉన్న పేజీలతో సహా, పేజీలను ఎగుమతి చెయ్యి",
        "right-sendemail": "ఇతర వాడుకరులకు ఈ-మెయిలు పంపించడం",
-       "right-passwordreset": "సంకేతపదం మార్పు ఈమెయిళ్ళను చూడడం",
        "right-managechangetags": "డేటాబేసులో [[Special:Tags|ట్యాగుల]]ను సృష్టించడం, తొలగించడం",
        "right-applychangetags": "తన మార్పులతో [[Special:Tags|ట్యాగుల]]ను ఆపాదించడం",
        "right-changetags": "విడి కూర్పులకు, చిట్టా పద్దులకు ఏవైనా [[Special:Tags|ట్యాగుల]]ను చేర్చడం, తొలగించడం",
        "upload-http-error": "ఒక HTTP పొరపాటు జరిగింది: $1",
        "upload-copy-upload-invalid-domain": "ఈ డొమెయిన్ నుంచి కాపీ ఎక్కింపులు కుదరదు.",
        "upload-dialog-button-cancel": "రద్దుచేయి",
+       "upload-dialog-button-back": "వెనుకకు",
        "upload-dialog-button-done": "పూర్తయ్యింది",
        "upload-dialog-button-save": "భద్రపరచు",
        "upload-dialog-button-upload": "ఎక్కించు",
        "apisandbox-results": "ఫలితాలు",
        "apisandbox-request-url-label": "అభ్యర్థన URL:",
        "apisandbox-request-time": "అభ్యర్ధన సమయం: $1",
+       "apisandbox-continue": "కొనసాగించు",
+       "apisandbox-continue-clear": "తుడిచివేయి",
+       "apisandbox-multivalue-all-namespaces": "$1 (అన్ని పేరుబరులు)",
+       "apisandbox-multivalue-all-values": "$1 (అన్ని విలువలు)",
        "booksources": "పుస్తక మూలాలు",
        "booksources-search-legend": "పుస్తక మూలాల కోసం వెతుకు",
        "booksources-search": "వెతుకు",
        "contributions": "{{GENDER:$1|వాడుకరి}} రచనలు",
        "contributions-title": "$1 యొక్క మార్పులు-చేర్పులు",
        "mycontris": "నా మార్పులు",
-       "anoncontribs": "à°¯à±\8bà°\97దానములు",
+       "anoncontribs": "మారà±\8dà°ªà±\81à°\9aà±\87à°°à±\8dà°ªులు",
        "contribsub2": "{{GENDER:$3|$1}} ($2) కొరకు",
        "contributions-userdoesnotexist": "వాడుకరి ఖాతా \"$1\" నమోదుకాలేదు.",
        "nocontribs": "ఈ విధమైన మార్పులేమీ దొరకలేదు.",
        "whatlinkshere-hideredirs": "$1 దారిమార్పులు",
        "whatlinkshere-hidetrans": "$1 ట్రాన్స్‌క్లూజన్లు",
        "whatlinkshere-hidelinks": "$1 లింకులు",
-       "whatlinkshere-hideimages": "$1 à°¦à°¸à±\8dà°¤à±\8dరాల లంకెలు",
+       "whatlinkshere-hideimages": "$1 à°¦à°¸à±\8dà°¤à±\8dà°°à°ªà±\81 లంకెలు",
        "whatlinkshere-filters": "వడపోతలు",
        "whatlinkshere-submit": "వెళ్ళు",
        "autoblockid": "tanaDDu #$1",
        "patrol-log-header": "ఇది పర్యవేక్షించిన కూర్పుల చిట్టా.",
        "log-show-hide-patrol": "$1 పర్యవేక్షణ చిట్టా",
        "log-show-hide-tag": "ట్యాగుల చిట్టాను $1",
+       "confirm-markpatrolled-button": "సరే",
        "deletedrevision": "పాత సంచిక $1 తొలగించబడినది.",
        "filedeleteerror-short": "ఫైలు తొలగించడంలో పొరపాటు: $1",
        "filedeleteerror-long": "ఫైలుని తొలగించడంలో పొరపాట్లు జరిగాయి:\n\n$1",
        "watchlistedit-raw-done": "మీ వీక్షణ జాబితాను తాజాకరించాం.",
        "watchlistedit-raw-added": "{{PLURAL:$1|1 శీర్షికను|$1 శీర్షికలను}} చేర్చాం:",
        "watchlistedit-raw-removed": "{{PLURAL:$1|1 శీర్షికను|$1 శీర్షికలను}} తీసివేశాం:",
-       "watchlistedit-clear-title": "à°µà±\80à°\95à±\8dà°·à°£à°\9cాబితా à°\9aà±\86రిపివà±\87యబడిà°\82ది",
+       "watchlistedit-clear-title": "వీక్షణజాబితా చెరిపివేయి",
        "watchlistedit-clear-legend": "వీక్షణజాబితా చెరిపివేయి",
        "watchlistedit-clear-titles": "శీర్షికలు:",
        "watchlistedit-clear-submit": "వీక్షణ జాబితా శుభ్రం చేయి (ఇది శాశ్వతం!)",
        "tags-edit-add": "ఈ ట్యాగులను చేర్చు:",
        "tags-edit-remove": "ఈ ట్యాగులను తొలగించు:",
        "tags-edit-reason": "కారణం:",
-       "tags-edit-success": "మారà±\8dà°ªà±\81à°²à±\81 à°µà°¿à°\9cయవà°\82à°¤à°\82à°\97à°¾ à°\86పాదిà°\82à°\9aబడà±\8dడాయి.",
+       "tags-edit-success": "మార్పులు ఆపాదించబడ్డాయి.",
        "comparepages": "పుటల పోలిక",
        "compare-page1": "పుట 1",
        "compare-page2": "పుట 2",
        "htmlform-cloner-create": "ఇంకా చేర్చు",
        "htmlform-cloner-delete": "తొలగించు",
        "htmlform-cloner-required": "కనీసం ఒక విలువు అయినా ఇవ్వాలి.",
+       "htmlform-date-placeholder": "YYYY-MM-DD",
+       "htmlform-time-placeholder": "HH:MM:SS",
+       "htmlform-datetime-placeholder": "YYYY-MM-DD HH:MM:SS",
        "logentry-delete-delete": "$1 $3 పేజీని {{GENDER:$2|తొలగించారు}}",
        "logentry-delete-restore": "పేజీ $3 ని $1 {{GENDER:$2|పునస్థాపించారు}}",
        "logentry-delete-event": "$3 లో {{PLURAL:$5|ఒక లాగ్ ఘటన|$5 లాగ్ ఘటనల}} యొక్క కన్పట్టటాన్ని (విజిబిలిటీ) $1 {{GENDER:$2|మార్చారు}}: $4",
        "expand_templates_generate_xml": "XML పార్స్ ట్రీని చూపించు",
        "expand_templates_generate_rawhtml": "ముడి HTML ను చూపించు",
        "expand_templates_preview": "మునుజూపు",
-       "pagelanguage": "పేజీ భాష ఎంపిక",
+       "pagelanguage": "పేజీ భాషను మార్చు",
        "pagelang-name": "పేజీ",
        "pagelang-language": "భాష",
        "pagelang-use-default": "అప్రమేయ భాషను వాడు",
        "action-pagelang": "పేజీ భాషను మార్చే",
        "log-name-pagelang": "భాష మార్పుల చిట్టా",
        "log-description-pagelang": "ఇది పేజీ భాష మార్పుల చిట్టా.",
-       "logentry-pagelang-pagelang": "$3 à°ªà±\87à°\9cà±\80 à°­à°¾à°·à°¨à±\81 $4 à°¨à±\81à°\82à°¡à°¿ $5 à°\95à°¿ $1 {{GENDER:$2|మారà±\8dà°\9aారà±\81}}.",
+       "logentry-pagelang-pagelang": "$3 భాషను $4 నుండి $5 కి $1 {{GENDER:$2|మార్చారు}}.",
        "default-skin-not-found-row-enabled": "* <code>$1</code> / $2 (చేతనం)",
        "default-skin-not-found-row-disabled": "* <code>$1</code> / $2 (<strong>అచేతనం</strong>)",
        "mediastatistics": "మాధ్యమ గణాంకాలు",
        "mw-widgets-dateinput-no-date": "ఏ తేదీనీ ఎంచుకోలేదు",
        "mw-widgets-titleinput-description-new-page": "పేజీ ఇంకా లేదు",
        "log-action-filter-all": "అన్నీ",
+       "authmanager-email-label": "ఈమెయిలు",
+       "authmanager-email-help": "ఈమెయిలు చిరునామా",
        "authmanager-realname-label": "అసలు పేరు",
        "authmanager-realname-help": "వాడుకరి అసలు పేరు",
        "authmanager-provider-temporarypassword": "తాత్కాలిక సంకేతపదం",
index a224d42..15341c8 100644 (file)
        "nocreate-loggedin": "Ó la bele kria pájina foun.",
        "permissionserrorstext": "Ó la bele halo ne'e; {{PLURAL:$1|motivu|motivu sira}}:",
        "permissionserrorstext-withaction": "Ita la bele $2. {{PLURAL:$1|Razaun|Razaun sira}}:",
-       "cantcreateaccounttitle": "La bele registrar uza-na'in",
        "currentrev": "Versaun atuál",
        "revisionasof": "Versaun $1 nian",
        "revision-info": "Revisaun loron $4, tempu $5, husi $2",
        "linksearch-ns": "Espasu pájina nian:",
        "linksearch-ok": "Buka",
        "listusers-submit": "Hatudu",
-       "activeusers-hidebots": "Subar bot sira",
-       "activeusers-hidesysops": "Subar administradór sira",
        "listgrouprights-group": "Grupu",
        "listgrouprights-rights": "Priviléjiu",
        "listgrouprights-members": "(lista membru nian)",
index f7826ab..77ac744 100644 (file)
        "yourpasswordagain": "Калимаи убурро боз нависед",
        "createacct-yourpasswordagain": "Тасдиқи гузарвожа",
        "createacct-yourpasswordagain-ph": "Гузарвожаро бори дигар ворид кунед",
-       "remembermypassword": "Вуруди манро дар ин мурургар дар хотир нигоҳ дор (то ҳадди аксар $1 {{PLURAL:$1|рӯз|рӯз}})",
        "userlogin-remembermypassword": "Вурудшуда манро нигоҳ дор",
        "userlogin-signwithsecure": "Истифодаи пайвастшавии амн",
        "yourdomainname": "Домейни Шумо",
        "undo-success": "Ин вироиш метавонад ботил шавад. Лутфан муқоисаи зеринро барои таъйид кардани амалӣ худ, баррасӣ кунед, ва баъдан барои анҷом додани ботилкунии вироиш тағйироти зеринро захира кунед.",
        "undo-failure": "Ба иллати бархӯрдани вироишҳои дар миён омада, ин вироишро ботил наметавон кард.",
        "undo-summary": "Ботили нусхаи $1 аз тарафи [[Special:Contributions/$2|$2]] ([[User talk:$2|Баҳс]])",
-       "cantcreateaccounttitle": "Ҳисобе сохта наметавонам",
        "cantcreateaccount-text": "Имкони сохтани ҳисоби корбарӣ аз ин нишонаи IP ('''$1''') аз тарафи [[User:$3|$3]] баста шудааст.\n\nДалели $3 чунин аст ''$2''",
        "viewpagelogs": "Намоиши гузоришҳои марбута ба ин саҳифа",
        "nohistory": "Таърихи вироиш барои ин саҳифа вуҷуд надорад.",
index 6340644..a577ebe 100644 (file)
        "yourname": "Nomi korbar",
        "yourpassword": "Kalimai ubur\\parolь",
        "yourpasswordagain": "Kalimai uburro boz navised",
-       "remembermypassword": "Vurudi manro dar in mururgar dar xotir nigoh dor (to haddi aksar $1 {{PLURAL:$1|rūz|rūz}})",
        "yourdomainname": "Domejni Şumo",
        "externaldberror": "Xatoe dar irtibot bo pojgohi doda rux doda ast jo in ki şumo içozat ba rūzrasoniji hisobi beruniji xudro nadored.",
        "login": "Vurud",
        "undo-success": "In viroiş metavonad botil şavad. Lutfan muqoisai zerinro baroi ta'jid kardani amalī xud, barrasī kuned, va ba'dan baroi ançom dodani botilkuniji viroiş taƣjiroti zerinro zaxira kuned.",
        "undo-failure": "Ba illati barxūrdani viroişhoi dar mijon omada, in viroişro botil nametavon kard.",
        "undo-summary": "Botili nusxai $1 az tarafi [[Special:Contributions/$2|$2]] ([[User talk:$2|Bahs]])",
-       "cantcreateaccounttitle": "Hisobe soxta nametavonam",
        "cantcreateaccount-text": "Imkoni soxtani hisobi korbarī az in nişonai IP ('''$1''') az tarafi [[User:$3|$3]] basta şudaast.\n\nDaleli $3 cunin ast ''$2''",
        "viewpagelogs": "Namoişi guzorişhoi marbuta ba in sahifa",
        "nohistory": "Ta'rixi viroiş baroi in sahifa vuçud nadorad.",
index 656ea39..3be834f 100644 (file)
@@ -26,7 +26,8 @@
                        "Pilarbini",
                        "Matma Rex",
                        "B20180",
-                       "Pon44695"
+                       "Pon44695",
+                       "Aefgh39622"
                ]
        },
        "tog-underline": "การขีดเส้นใต้ลิงก์:",
        "yourpasswordagain": "พิมพ์รหัสผ่านอีกครั้ง:",
        "createacct-yourpasswordagain": "ยืนยันรหัสผ่าน",
        "createacct-yourpasswordagain-ph": "กรอกรหัสผ่านอีกครั้ง",
-       "remembermypassword": "จำการล็อกอินของฉันบนเบราเซอร์นี้ (นานสุด $1 วัน)",
        "userlogin-remembermypassword": "ให้ฉันอยู่ในระบบต่อ",
        "userlogin-signwithsecure": "ใช้การเชื่อมต่อที่ปลอดภัย",
        "cannotloginnow-title": "ไม่สามารถล็อกเอาต์ได้ขณะนี้",
        "passwordreset-emaildisabled": "วิกินี้ปิดใช้งานคุณลักษณะอีเมล",
        "passwordreset-username": "ชื่อผู้ใช้:",
        "passwordreset-domain": "โดเมน:",
-       "passwordreset-capture": "ดูอีเมลที่ได้หรือไม่",
-       "passwordreset-capture-help": "หากคุณเลือกกล่องนี้ จะแสดงอีเมลดังกล่าว (พร้อมรหัสผ่านชั่วคราว) แก่คุณ เช่นเดียวกับส่งไปยังผู้ใช้",
        "passwordreset-email": "ที่อยู่อีเมล:",
        "passwordreset-emailtitle": "รายละเอียดบัญชีบน {{SITENAME}}",
        "passwordreset-emailtext-ip": "บางคน (ซึ่งอาจเป็นคุณ จากเลขที่อยู่ไอพี $1) ขอตั้งรหัสผ่านของคุณใหม่บน{{SITENAME}} ($4) บัญชีผู้ใช้ดังกล่าวเกี่ยวข้องกับที่อยู่อีเมลนี้:\n\n$2\n\n{{PLURAL:$3|รหัสผ่านชั่วคราวนี้|รหัสผ่านชั่วคราวเหล่านี้}}จะหมดอายุใน $5 วัน\nตอนนี้คุณควรล็อกอินและเลือกรหัสผ่านใหม่ หากบุคคลอื่นขอตั้งรหัสผ่านใหม่นี้ หรือคุณจำรหัสผ่านเดิมของคุณได้แล้ว และคุณไม่ต้องการเปลี่ยนรหัสผ่านอีก คุณอาจละเลยข้อความนี้และใช้รหัสผ่านเดิมของคุณต่อไป",
        "searchprofile-advanced-tooltip": "ค้นหาในเนมสเปซที่เลือกเอง",
        "search-result-size": "$1 ($2 คำ)",
        "search-result-category-size": "$1 สมาชิก ($2 หมวดหมู่ย่อย, $3 ไฟล์)",
-       "search-redirect": "(เปลี่ยนทาง $1)",
+       "search-redirect": "(เปลี่ยนทางจาก $1)",
        "search-section": "(ส่วน $1)",
        "search-category": "(หมวดหมู่ $1)",
        "search-file-match": "(เนื้อหาไฟล์ตรง)",
        "userrights-reason": "เหตุผล:",
        "userrights-no-interwiki": "คุณไม่มีสิทธิแก้ไขสิทธิผู้ใช้บนวิกิอื่น",
        "userrights-nodatabase": "ไม่มีฐานข้อมูล $1 หรือฐานข้อมูลอยู่บนเครื่องอื่น",
-       "userrights-nologin": "คุณต้อง[[Special:UserLogin|ล็อกอิน]]ด้วยบัญชีผู้ดูแลระบบก่อน จึงจะกำหนดสิทธิผู้ใช้ได้",
-       "userrights-notallowed": "บัญชีของคุณไม่มีสิทธิเพิ่มหรือเพิกถอนสิทธิผู้ใช้",
        "userrights-changeable-col": "กลุ่มที่คุณสามารถเปลี่ยนได้",
        "userrights-unchangeable-col": "กลุ่มที่คุณไม่สามารถเปลี่ยนได้",
        "userrights-conflict": "พบการเปลี่ยนแปลงสิทธิผู้ใช้ขัดกัน! โปรดทบทวนและยืนยันการเปลี่ยนแปลงของคุณ",
-       "userrights-removed-self": "คุณเพิกถอนสิทธิของคุณสำเร็จแล้ว ฉะนั้น คุณจึงไม่สามารถเข้าถึงหน้านี้ได้อีก",
        "group": "กลุ่ม:",
        "group-user": "ผู้ใช้",
        "group-autoconfirmed": "ผู้ใช้ทั่วไป",
        "right-siteadmin": "ล็อกและปลดล็อกฐานข้อมูล",
        "right-override-export-depth": "ส่งออกหน้า รวมหน้าที่เชื่อมโยงกับหน้านี้สูงสุด 5 ลำดับชั้น",
        "right-sendemail": "ส่งอีเมลหาผู้ใช้อื่น",
-       "right-passwordreset": "ดูอีเมลตั้งรหัสผ่านใหม่",
        "grant-group-email": "ส่งอีเมล",
        "grant-createaccount": "สร้างบัญชี",
        "grant-createeditmovepage": "สร้าง แก้ไข และย้ายหน้า",
        "activeusers-intro": "นี่คือรายการผู้ใช้ที่มีกิจกรรมใด ๆ ในช่วง $1 วันหลังสุด",
        "activeusers-count": "$1 ปฏิบัติการ{{PLURAL:$1|}} ในช่วง $3 วันหลังสุด",
        "activeusers-from": "แสดงผู้ใช้เริ่มจาก:",
-       "activeusers-hidebots": "ซ่อนบอต",
-       "activeusers-hidesysops": "ซ่อนผู้ดูแลระบบ",
        "activeusers-noresult": "ไม่พบผู้ใช้",
        "activeusers-submit": "แสดงผู้ใช้ที่ยังมีกิจกรรม",
        "listgrouprights": "สิทธิกลุ่มผู้ใช้",
        "htmlform-title-not-exists": "ไม่มี $1",
        "htmlform-user-not-exists": "ไม่มี <strong>$1</strong>",
        "htmlform-user-not-valid": "<strong>$1</strong> มิใช่ชื่อผู้ใช้ที่สมเหตุสมผล",
-       "sqlite-has-fts": "รุ่น $1 พร้อมการสนับสนุนการค้นหาข้อความแบบเต็ม",
-       "sqlite-no-fts": "รุ่น $1 โดยไม่มีการสนับสนุนการค้นหาข้อความแบบเต็ม",
        "logentry-delete-delete": "$1 ลบหน้า $3",
        "logentry-delete-restore": "$1 กู้คืนหน้า $3",
        "logentry-delete-event": "$1 เปลี่ยนทัศนวิสัยของ $5 รายการปูมใน $3: $4",
        "feedback-subject": "เรื่อง:",
        "feedback-submit": "ตกลง",
        "feedback-thanks": "ขอบคุณ! ผลป้อนกลับของคุณถูกโพสต์ไปยังหน้า \"[$2 $1]\" แล้ว",
-       "searchsuggest-search": "ค้นหา",
+       "searchsuggest-search": "ค้นหา {{SITENAME}}",
        "searchsuggest-containing": "มี...",
        "api-error-badaccess-groups": "คุณไม่ได้รับอนุญาตให้อัปโหลดไฟล์มายังวิกินี้",
        "api-error-empty-file": "ไฟล์ที่คุณส่งมานั้นว่าง",
index 7ec316c..5d6b0b2 100644 (file)
        "yourname": "Ulanyjy adyňyz:",
        "yourpassword": "Parolyňyz:",
        "yourpasswordagain": "Paroly gaýtadan ýaz:",
-       "remembermypassword": "Sessiýamy şu kompýuterde ýatda sakla  (iň köp $1 {{PLURAL:$1|günläp|günläp}})",
        "yourdomainname": "Siziň domeniňiz:",
        "externaldberror": "Ýa tassyklama maglumat bazasynyň säwligi bar ýa-da öz ulanyjy hasabyňyzy täzelemegiňize rugsat berilmeýär.",
        "login": "Hasaba gir",
        "undo-failure": "Gapma-garşylykly aralyk özgerdişler zerarly bu özgerdişi yzyna alyp bolmaýar.",
        "undo-norev": "Özgerdişi yzyna alyp bolmaýar, sebäbi ol ýok ýa-da öçürilipdir.",
        "undo-summary": "$1 wersiýasy [[Special:Contributions/$2|$2]] ([[User talk:$2|Çekişme]]) tarapyndan yzyna alyndy.",
-       "cantcreateaccounttitle": "Hasap döredip bolmaýar",
        "cantcreateaccount-text": "Bu IP adresinden ('''$1''') ulanyjy hasaby döretmeklik [[User:$3|$3]] tarapyndan blokirlenipdir.\n\n$3 tarapyndan görkezilen sebäp: ''$2''",
        "viewpagelogs": "Bu sahypanyň gündeliklerini görkez",
        "nohistory": "Bu sahypanyň özgerdişler geçmişi ýok.",
        "activeusers-intro": "Bu sanawda soňky $1 {{PLURAL:$1|günüň|günüň}} dowamynda nähilidir bir iş geçiren ulanyjylar görkezilýär.",
        "activeusers-count": "Soňky {{PLURAL:$3|günde|$3 günde}} $1 sany {{PLURAL:$1|özgerdiş|özgerdiş}}",
        "activeusers-from": "Şunuň bilen başlaýan ulanyjylary görkez:",
-       "activeusers-hidebots": "Botlary gizle",
-       "activeusers-hidesysops": "Administratorlary gizle",
        "activeusers-noresult": "Ulanyjy tapylmady.",
        "listgrouprights": "Ulanyjy topary hukuklary",
        "listgrouprights-summary": "Aşakda şu wikide kesgitlenen ulanyjy toparlarynyň hem-de olaryň degişli ulanmak hukuklarynyň sanawy berilýär.\nŞahsy hukuklar barada [[{{MediaWiki:Listgrouprights-helppage}}|goşmaça maglumat]] bar bolup biler.",
        "htmlform-submit": "Tabşyr",
        "htmlform-reset": "Üýtgeşmeleri yzyna al",
        "htmlform-selectorother-other": "Başga",
-       "sqlite-has-fts": "$1 (doly tekstli gözleg goldawly)",
-       "sqlite-no-fts": "$1 (doly tekstli gözleg goldawsyz)",
        "revdelete-restricted": "administratorlara goýlan çäklendirmeler",
        "revdelete-unrestricted": "administratorlardan aýyrylan çäklendirmeler",
        "rightsnone": "(hiç biri)",
index d8af709..405d823 100644 (file)
        "tags-create-submit": "Lumikha/Lumalang",
        "tags-activate-reason": "Dahilan:",
        "tags-deactivate-reason": "Dahilan:",
+       "tags-apply-blocked": "Hindi pwedeng i-apply ang mga tarheta (kasama ng pagbago) habang ikaw ay sinupalpal.",
        "comparepages": "Paghambingin ang mga pahina",
        "compare-page1": "Pahina 1",
        "compare-page2": "Pahina 2",
index 6a78e81..b9f1bc2 100644 (file)
        "yourname": "Иштирокәкә ном:",
        "yourpassword": "Парол:",
        "yourpasswordagain": "Пароли сәнибәтон гырдә карде:",
-       "remembermypassword": "Мыни ым компутерәдә јодәдә огәт (максимум $1 {{PLURAL:$1|руж|руж}})",
        "login": "Ыштәни едаштеј",
        "nav-login-createaccount": "Ыштәни едаштеј / ыштәни ғејд кардовнијеј",
        "userlogin": "Ыштәни едаштеј / ыштәни ғејд кардовнијеј",
index dd64e03..812e34d 100644 (file)
        "yourname": "Hingoa ʻetita",
        "yourpassword": "Leatapu",
        "yourpasswordagain": "Toe ʻai leatapu",
-       "remembermypassword": "Manatuʻi au (for a maximum of $1 {{PLURAL:$1|day|days}})",
        "yourdomainname": "ho ngāueʻanga",
        "login": "Kau ki ai",
        "nav-login-createaccount": "Kau ki ai",
        "templatesusedpreview": "Ngaahi sīpinga ʻoku ngāueʻaki he vakaí ni:",
        "templatesusedsection": "Ngaahi sīpinga ʻoku ngāueʻaki he kongá ni:",
        "nocreatetext": "Naʻe fakangatangata ʻe he tuʻuʻangá ni ʻa e lava ke fakatupu ha peesi foʻou. ʻOku ke lava ke foki pea fatu ha peesi tuʻu, pe [[Special:UserLogin|kau-ki-ai, pe fakatupu ha tohi-kau-ki-ai]].",
-       "cantcreateaccounttitle": "ʻOku ʻikai lava fakatupu e tohi kau-ki-ai",
        "viewpagelogs": "Vakai ki he ngaahi tohinoa ʻo e pēsí ni",
        "nohistory": "ʻOku ʻikai ʻi ai ha hisitōlia fatu maʻa e kupú ni.",
        "currentrev": "Paaki taka",
index 0e572ce..abde066 100644 (file)
        "viewsource": "Lukim as tok",
        "yourname": "Yusanem:",
        "yourpassword": "Paswot:",
-       "remembermypassword": "Holim yusanem bilong mi long dispela komputa (holim pas longpela taim $1 {{PLURAL:$1|de|de}})",
        "login": "Log in",
        "userloginnocreate": "Log in",
        "logout": "Logaut",
index 735038a..b272865 100644 (file)
        "passwordreset-emaildisabled": "Bu wiki'deki e-posta özellikleri devre dışı bırakıldı.",
        "passwordreset-username": "Kullanıcı adı:",
        "passwordreset-domain": "Domain:",
-       "passwordreset-capture": "Sonuç e-postasını görüntüle?",
-       "passwordreset-capture-help": "Bu kutuyu işaretlerseniz, e-posta (geçici şifre ile) size ve yanı sıra kullanıcıya gönderiliyor.",
        "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-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-invalideamil": "Geçersiz e-posta adresi",
+       "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-header": "E-posta adresinizi değiştirmek için bu formu doldurun. Eğer e-posta adresini hesabınızdan kaldırmak istiyorsanız formu gönderirken e-posta adresi bölümünü boş bırakın.",
        "userrights-reason": "Neden:",
        "userrights-no-interwiki": "Diğer vikilerdeki kullanıcıların izinlerini değiştirmeye yetkiniz yok.",
        "userrights-nodatabase": "$1 veritabanı mevcut veya bölgesel değil",
-       "userrights-nologin": "Kullanıcı haklarını atamak için hizmetli hesabı ile [[Special:UserLogin|giriş yapmanız gerekir]].",
-       "userrights-notallowed": "Kullanıcı hakları eklemek veya kaldırmak için izniniz yok.",
        "userrights-changeable-col": "Değiştirebildiğiniz gruplar",
        "userrights-unchangeable-col": "Değiştirebilmediğiniz gruplar",
        "userrights-conflict": "Kullanıcı hakları değişikliklerinde çakışma! Lütfen değişikliklerinizi gözden geçirin ve onaylayın.",
-       "userrights-removed-self": "Kendi haklarınız başarıyla kaldırıldı. Bu nedenle, artık bu sayfaya erişemeyeceksiniz.",
        "group": "Grup:",
        "group-user": "Kullanıcılar",
        "group-autoconfirmed": "Otomatik onaylanmış kullanıcılar",
        "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-sendemail": "Diğer kullanıcılara e-posta gönder",
-       "right-passwordreset": "Parola sıfırlama e-postalarını görür",
        "right-managechangetags": "Veritabanında [[Special:Tags|etiket]] oluşturma veya silme",
        "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",
        "booksources-search": "Ara",
        "booksources-text": "Aşağıdaki, yeni ve kullanılmış kitap satan diğer sitelere bağlantıların listesidir, ve aradığınız kitaplar hakkında daha fazla bilgiye sahip olabilirler:",
        "booksources-invalid-isbn": "Verilen ISBN geçersiz gibi görünüyor; orijinal kaynaktan kopyalama hataları için kontrol edin.",
+       "magiclink-tracking-rfc": "RFC sihirli bağlantısını kullanan sayfalar",
+       "magiclink-tracking-pmid": "PMID sihirli bağlantısını kullanan sayfalar",
+       "magiclink-tracking-isbn": "ISBN sihirli bağlantısını kullanan sayfalar",
        "specialloguserlabel": "Kullanıcı:",
        "speciallogtitlelabel": "Hedef (başlık ya da kullanıcı):",
        "log": "Kayıtlar",
index 702c294..a32a979 100644 (file)
        "yourname": "Işme duHadomo:",
        "yourpassword": "Qliḍo:",
        "yourpasswordagain": "Naqla ḥreto kṭaw uQliḍo:",
-       "remembermypassword": "Dxar uQliḍayḍi buBrowser (buSowudo $1 {{PLURAL:$1|Yawmo|Yawme}})",
        "login": "3bar",
        "nav-login-createaccount": "3bar / Hway Hadomo",
        "userlogin": "3bar / Hway Hadomo",
index d41c469..6d971d5 100644 (file)
        "yourname": "Vito ra vutirhisi",
        "yourpassword": "Vito-mpfungulo:",
        "yourpasswordagain": "Thlela u hoxa ritompfungulo ra wena:",
-       "remembermypassword": "Tsundzuka ku nghena eka Khompuyuta leyi (kufikela eka $1 {{PLURAL:$1|siku|masiku}})",
        "login": "Pfula u nghena",
        "nav-login-createaccount": "Pfula unghena / Tumbuluxa akhawunti",
        "userlogin": "Pfula unghena / Tumbuluxa akhawunti",
index b7cadee..5ea66b8 100644 (file)
@@ -25,7 +25,8 @@
                        "Macofe",
                        "Selimcan",
                        "Исмаил Садуев",
-                       "Matma Rex"
+                       "Matma Rex",
+                       "Irus"
                ]
        },
        "tog-underline": "Сылтамаларның астына сызу:",
        "searchprofile-advanced-tooltip": "Бирелгән исемнәр мәйданында эзләү",
        "search-result-size": "$1 ({{PLURAL:$2|$2 сүз}})",
        "search-result-category-size": "$1 {{PLURAL:$1|әгъза}} ($2 {{PLURAL:$2|астөркем}}, $3 {{PLURAL:$3|файл}})",
-       "search-redirect": "(юнәлтү $1)",
+       "search-redirect": "($1 битеннән юнәлтү)",
        "search-section": "($1 бүлеге)",
        "search-category": "($1 категориясе)",
        "search-file-match": "(файл эчтәлеге белән туры килә)",
        "listusers-noresult": "Кулланучыларны табылмады.",
        "listusers-blocked": "(тыелган)",
        "activeusers": "Актив кулланучылар исемлеге",
-       "activeusers-hidebots": "Ботларны яшер",
-       "activeusers-hidesysops": "Идарәчеләрне яшер",
        "activeusers-noresult": "Кулланучылар табылмады.",
        "listgrouprights": "Кулланучы төркемнәренең хокуклары",
        "listgrouprights-key": "Легенда:\n* <span class=\"listgrouprights-granted\">Бирелгән хокуклар</span>\n* <span class=\"listgrouprights-revoked\">Алынган хокуклар</span>",
        "blocklogpage": "Тыю көндәлеге",
        "blocklogentry": "[[$1]] $2 вакытка тыелды $3",
        "unblocklogentry": "$1 кулланучысының тыелу вакыты бетте",
+       "block-log-flags-anononly": "аноним кулланучылар гына",
        "block-log-flags-nocreate": "яңа хисап язмасы теркәү тыелган",
        "block-log-flags-noemail": "хат җибәрү тыелган",
        "block-log-flags-hiddenname": "кулланучының исеме яшерелгән",
        "feedback-submit": "Җибәрү",
        "feedback-thanks": "Рәхмәт! Сезнең фикер \"[$2 $1]\" сәхифәсенә куелды.",
        "feedback-thanks-title": "Рәхмәт!",
-       "searchsuggest-search": "Эзләү",
+       "searchsuggest-search": "{{SITENAME}} эчендә эзләү",
        "searchsuggest-containing": "эчтәлек...",
        "api-error-badaccess-groups": "Сезгә бу викигә файллар өстәү рөхсәт ителмәгән",
        "api-error-badtoken": "Эчке хата: дөрес булмаган токен.",
index 3b5ff02..8e77204 100644 (file)
        "yourpasswordagain": "Sersüzne qabat kertü:",
        "createacct-yourpasswordagain": "Sersüzegezne raslağız",
        "createacct-yourpasswordagain-ph": "Sersüzne yañadan kertegez",
-       "remembermypassword": "Xisap yazmamnı bu brauzerda saqlansın (iñ küp $1 {{PLURAL:$1|kön|kön|kön}}gä qädär)",
        "yourdomainname": "Sezneñ domenığız:",
        "externaldberror": "Tışqı mäğlümat bazası yärdämendä awtentifikatsiä ütkändä xata çıqtı, yäisä tışqı xisap yazmağızğa üzgäreşlär kertü xoquqığız yuq.",
        "login": "Kerü",
        "undo-failure": "Aralıqtağı üzgärtülär turı kilmäw säbäple, üzgärtüdän baş tartıp bulmıy.",
        "undo-norev": "Üzgärtü yuq yäisä ul beterelgän, şuña annan baş tartıp bulmıy.",
        "undo-summary": "[[Special:Contributions/$2|$2]] qullanuçısınıñ ([[User talk:$2|bäxäs]]) $1 üzgärtüennän baş tartu",
-       "cantcreateaccounttitle": "Xisap yazmasın tözep bulmıy",
        "cantcreateaccount-text": "Bu IP adresınnan (<b>$1</b>) xisap yazmaları tözü tıyıla. Tıyuçı: [[User:$3|$3]].\n\n$3 kürsätkän säbäp: ''$2''",
        "viewpagelogs": "Bu bitneñ köndäleklären qaraw",
        "nohistory": "Bu bitneñ üzgärtülär tarixı yuq.",
        "listusers-noresult": "Qullanuçılarnı tabılmadı.",
        "listusers-blocked": "(tıyılğan)",
        "activeusers": "Aktiv qullanuçılar isemlege",
-       "activeusers-hidebots": "Botlarnı yäşer",
-       "activeusers-hidesysops": "İdaräçelärne yäşer",
        "activeusers-noresult": "Qullanuçılar tabılmadı.",
        "listgrouprights": "Qullanuçı törkemnäreneñ xoquqları",
        "listgrouprights-group": "Törkem",
        "feedback-back": "Kire qaytu",
        "feedback-cancel": "Baş tartu",
        "feedback-close": "Yasaldı",
-       "feedback-error-title": "Xata",
        "feedback-message": "Xäbär:",
        "feedback-subject": "Tema:",
        "feedback-submit": "Cibärü",
index 5fff7f1..bac27db 100644 (file)
        "linksearch-ok": "Дилээри",
        "linksearch-line": "$2-де бижиттинген $1 деп тускай айтыг",
        "listusers-submit": "Көргүзери",
-       "activeusers-hidebots": "Роботтарны чажырары",
-       "activeusers-hidesysops": "Эргелекчыларны чажырары",
        "listgrouprights-group": "Бөлүк",
        "listgrouprights-members": "(кежигүннүң даңзызы)",
        "emailuser": "Бо ажыглакчыга э-чагааны чорудаары",
index 5ced470..3a5a537 100644 (file)
@@ -10,7 +10,8 @@
                        "AlnashPiyash2",
                        "Irus",
                        "Shklyaev",
-                       "Wadorgurt"
+                       "Wadorgurt",
+                       "Zpizza"
                ]
        },
        "tog-underline": "Чӧлсконъёсыз ултӥз гожен сызоно",
        "noindex-category": "Индексировать каронтэм бамъёс",
        "about": "Та сярысь",
        "article": "Статья",
+       "newwindow": "(усьтӥськоз выль укноын)",
        "cancel": "Берытсконо",
        "mypage": "Бам",
        "mytalk": "Викиавтор сярысь вераськон",
        "view-foreign": "$1 сайтын учконы",
        "edit": "тупатыны",
        "create": "Кылдытоно",
+       "create-local": "Интыысь описаниез ватсаны",
        "editthispage": "Та бамез тупатыны",
        "create-this-page": "Та бамез кылдытыны",
        "delete": "Быдтыны",
        "viewtalkpage": "Вераськонэз учкыны",
        "otherlanguages": "Мукет кылъёсын",
        "redirectedfrom": "(Перенаправлять $1)",
-       "redirectpagesub": "Ð\92Ñ\8bжÑ\8bÑ\82он бам",
+       "redirectpagesub": "ЫÑ\81Ñ\82Ó¥Ñ\81Ñ\8c бам",
        "redirectto": "Выжытон:",
        "lastmodifiedat": "Та бамлэн берпуметӥ воштонэз: $2, $1.",
        "protectedpage": "Утем бам",
        "currentevents-url": "Project:Выль иворъёс",
        "disclaimers": "Кыл кутыны пумит луон",
        "disclaimerpage": "Project:Кыл кутыны пумит луон",
+       "edithelp": "Тупатонъя юрттэт",
        "helppage-top-gethelp": "Юрттэт",
        "mainpage": "Кутскон бам",
        "mainpage-description": "Кутскон бам",
        "databaseerror-query": "Курон: $1",
        "databaseerror-function": "Функция: $1",
        "databaseerror-error": "Янгыш: $1",
+       "badtitletext": "Курем бам ним луэ мыдлань, буш либо кылъёс куспын яке викиос куспын нимыз умойтэм герӟамын.\nНимын, вылды, ярантэм символъёс вань.",
        "viewsource": "Кодзэ учкыны",
        "viewsource-title": "Кодзэ учкыны бам $1",
        "actionthrottled": "Кекатыны ужъёс",
        "welcomecreation-msg": "Тӥляд гожъямъёсты учётной кылдытэмын вал.\nТӥ быгатӥськоды воштэ {{SITENAME}} [[Special:Preferences|параметръёсты]] ке потэ тӥледлы.",
        "yourname": "Пырон ним:",
        "userlogin-yourname": "Пырон ним:",
+       "userlogin-yourname-ph": "Гожтэ учётной записьтылэсь нимзэ",
        "createacct-another-username-ph": "Учётной книга нимъёс пыртэмын",
        "yourpassword": "Лушкемкыл:",
        "userlogin-yourpassword": "Лушкемкыл",
+       "createacct-yourpassword-ph": "Гожтэ паролез",
        "createacct-yourpasswordagain": "Пароль юнматэ",
+       "createacct-yourpasswordagain-ph": "Гожтэ паролез эшшо одӥг пол",
        "userlogin-remembermypassword": "Кылем сӧзнэтэз",
        "cannotcreateaccount-title": "Уг быгатиськы гожъян кылдӥз учётной",
        "yourdomainname": "Тӥ доменэн:",
        "userlogin-helplink2": "Пыронъя юрттэт",
        "createacct-emailrequired": "Электронной почталэн адресэз",
        "createacct-emailoptional": "Электронной почтаезлэн адресэз (необязательное)",
+       "createacct-email-ph": "Гожтэ асьтэлэн электрон почтадылэсь адрессэ",
        "createaccountmail": "Адрес электронной почта огдырлы кутӥ вылын возьматэм образъёсыныз но соослэн случайной сгенерировать пароль ыстыны",
        "createacct-submit": "Выль вики-авторлэн регистрациез",
        "createacct-another-submit": "Выль вики-авторлэн регистрациез",
+       "createacct-benefit-heading": "{{SITENAME}} — тӥ выллем адямиослэн валче ужамзы.",
        "loginerror": "Янгышъёс пырон",
        "createacct-error": "Янгышъёс бордын учётной книга кылдытыны",
        "createaccounterror": "Уг быгатиськы гожъян учётной кылдоз: $1",
        "oldpassword": "Вуж лушкемкыл:",
        "newpassword": "Выль лушкемкыл:",
        "passwordreset-username": "Пырон ним:",
+       "italic_sample": "Бекырес текст",
+       "italic_tip": "Бекырес текст",
+       "link_sample": "Чӧлсконлэн йыръянэз",
+       "link_tip": "Пуш чӧлскон",
+       "extlink_sample": "http://www.example.com чӧлсконлэн йыръянэз",
+       "extlink_tip": "Педпала чӧлскон (http:// префиксэз эн вунэтэ)",
+       "headline_sample": "Йыръян текст",
+       "headline_tip": "2-тӥ уровеньем йыръян",
+       "nowiki_sample": "Вики-пусъёсыз санэ басьтытэк кельтоно текстэз пуктэ татчы",
+       "nowiki_tip": "Вики-пусъёсыз лыдэ басьтоно ӧвӧл",
+       "image_tip": "Пыӵатэм файл",
+       "media_tip": "Файл чӧлскон",
+       "sig_tip": "Тӥляд гожтӥськонды но дыр пусъён",
+       "hr_tip": "Горизонтальной гож (эн пыртэ ӵем)",
        "summary": "Мар но малы тупатэмын? (вакчияк):",
        "minoredit": "Ичи воштон",
        "watchthis": "Та бамез чаклан списоке пыртыны",
        "preview": "Бамез эскерон",
        "showpreview": "Бамез эскерон",
        "showdiff": "Пыртэм воштонъёс",
+       "anoneditwarning": "<strong>Сак луэ!</strong> Тӥ сайтэ ӧд пырелэ. Тӥ котькыӵе тупатонъёсыз лэсьтоды бере, тӥляд IP-адресты ваньмызлы адӟытӥськоз. Тӥ <strong>[$1 пыроды]</strong> яке <strong>[$2 учётной записез кылдытоды]</strong> бере, тӥляд тупатонъёсты герӟаськозы нимдылы, мукет пайдаосын ӵош.",
        "blockedtitle": "Заблокировать пыриськисьёс",
        "blockedtext": "<strong>Книгае яке учётной IP-адрес заблокирован.</strong>\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Пожалуйста, аслэсьтым тодон-та вазиськонэз котьку возьмано.",
        "autoblockedtext": "Тон IP-адрес, герӟет автоматически заблокирован а со, мар солэн кутыны луоно азьвыл кин ке но пырисьёс пӧлысь, заблокирован {{GENDER:$4|участник|куакеч}} $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.\nПожалуйста, аслэсьтым тодон-та вазиськонэз котьку возьмано.",
        "blocked-notice-logextract": "Пользователь заблокирован сётӥз та учырлы.\nСправка понна радъяськылӥсь журнал блокировка лапег берпуметӥ гожтэт:",
        "continue-editing": "Тупатъянэз азьланьтоно",
        "editing": "Тупатон: $1",
+       "creating": "«$1» бамез кылдытон",
        "editingsection": "Тупатон: $1 (люкет)",
        "template-protected": "(утемын)",
-       "template-semiprotected": "(полузащищенный)",
+       "template-semiprotected": "(полуутемын)",
        "nocreatetext": "Та сайтлэн бамаз выль сюбегатэм луонлыкъёсын кылдытон.\nТон улыса, берлань вуэ быгатэ бам отредактировать, [[Special:UserLogin|тусбуяськыны книгае яке выль система кылдыто учётной]].",
        "nocreate-loggedin": "Тон доразы юаськыны кылдӥз выль бам ӧвӧл.",
        "permissionserrors": "Янгышъёс юаське",
        "cur": "али",
        "last": "азьв.",
        "history-show-deleted": "Ӵушылэмъёссэ гинэ",
+       "rev-delundel": "возьматыны/ватыны",
        "rev-showdeleted": "возьматоно",
        "revdelete-show-file-submit": "да",
        "revdelete-radio-set": "Ватэм",
        "nextn": "{{PLURAL:$1|$1-лы}} азьлань",
        "shown-title": "Адӟытылоно $1 {{PLURAL:$1|шедьтэмез}} бамлы быдэ",
        "viewprevnext": "Учкыны ($1 {{int:pipe-separator}} $2) ($3)",
+       "searchmenu-new": "<strong>Кылдытыны «[[:$1]]» бамез та вики-проектын!</strong> {{PLURAL:$2|0=|Со сяна утчанэныды шедьтэм бамез учке.|Со сяна шедьтэм бамъёсты учке.}}",
        "searchprofile-articles": "Валтӥсь бамъёс",
        "searchprofile-images": "Мультимедиа",
        "searchprofile-everything": "Котькытын",
        "searchprofile-everything-tooltip": "Вань бамъёсэтӥ утчан (вераськон бамъёсты пыртыса)",
        "search-result-size": "$1 ({{PLURAL:$2|$2 кыл}})",
        "search-redirect": "($1 бамысь ыстон)",
+       "search-section": "(«$1» люкет)",
        "search-interwiki-more": "(эшшо)",
        "searchall": "Ваньзэ",
+       "search-showingresults": "{{PLURAL:$4|<strong>$3</strong> пӧлысь <strong>$1-тӥ</strong> шедьтэм|<strong>$3</strong> пӧлысь <strong>$1—$2</strong> шедьтэмъёс}}",
        "search-nonefound": "Запрослы кельшись шедьтэмъёс ӧвӧл.",
        "powersearch-toggleall": "Ваньзэ",
        "powersearch-togglenone": "Номыре",
        "enhancedrc-history": "история",
        "recentchanges": "Выль тупатонъёс",
        "recentchanges-legend": "Выль тупатонъёслы настройкаос",
+       "recentchanges-summary": "Та бамын викилэн дыръя радъям выль воштонъёсыз возьматэмын.",
        "recentchanges-label-newpage": "Та тупатонэн выль бам кылдӥз",
        "recentchanges-label-minor": "Пичи воштон",
        "recentchanges-label-bot": "Та тупатонэз кариз бот",
        "recentchangeslinked": "Герӟаськем тупатонъёс",
        "recentchangeslinked-feed": "Герӟаськем тупатонъёс",
        "recentchangeslinked-toolbox": "Герӟаськем тупатонъёс",
+       "recentchangeslinked-title": "«$1» ласянь герӟаськем тупатонъёс",
        "recentchangeslinked-summary": "Татын алигес воштэм бамъёс адӟытэмын, кудъёссэ пусъем бам чӧлске (яке кудъёсыз пусъем категорие пыро).\n[[Special:Watchlist|Чаклан списокысьтыды]] бамъёс <strong>адӟиськытэмын</strong>.",
+       "recentchangeslinked-page": "Бамлэн нимыз:",
+       "recentchangeslinked-to": "Мыддоринтыны: та бамез чӧлскись бамъёсыз воштонъёсыз возьматыны",
        "upload": "Файл поныны",
        "uploadnologin": "Тон эн тусбуяськыны сӧзнэтэз",
        "uploadnologintext": "Тон кулэ $1, медаз загрузка файл сервер.",
+       "filedesc": "Вакчияк описаниез",
        "uploaddisabled": "Загрузка алӥзы",
        "copyuploaddisabled": "Загрузка URL disconnect.",
        "uploaddisabledtext": "Загрузка файл disconnect.",
        "upload-dialog-button-cancel": "Берытсконо",
+       "license-header": "Лицензия",
        "nolicense": "Ӧвӧл",
        "file-anchor-link": "Файл",
        "filehist": "Файллэн историез",
        "filehist-comment": "Валэктон",
        "imagelinks": "Файлэз уже кутон",
        "linkstoimage": "{{PLURAL:$1|$1 бам}} та файлэз чӧлске:",
+       "nolinkstoimage": "Та файл вылэ чӧлскись бамъёс ӧвӧл.",
        "sharedupload": "Та файл — $1-ысь, сое мукет проектъёсын но уже кутыны луэ.",
        "sharedupload-desc-here": "Та файл — $1-ысь, сое мукет проектъёсын но уже кутыны луэ.\n[$2 Файл гожъясь бамысьтыз] информация адӟытэмын улын.",
+       "upload-disallowed-here": "Тӥ та файлэз выльысь гожтыны уд быгатӥське.",
        "randompage": "Олокыӵе статья",
        "withoutinterwiki-submit": "Возьматыны",
        "nbytes": "{{PLURAL:$1|$1 байт}}",
        "newpages": "Выль бамъёс",
        "newpages-submit": "Возьматыны",
        "move": "Нимзэ воштыны",
+       "booksources": "Книгаосын источникъёс",
        "log": "Журналъёс",
        "logeventslist-submit": "Возьматыны",
        "showhideselectedlogentries": "Возьматыны/ватыны быръем журналъёсысь гожъямъёсыз",
        "listusers-submit": "Возьматыны",
        "listusers-blocked": "(заблокировать{{GENDER:$1||а}})",
        "listgrouprights": "Право группае пыриськисьёс",
-       "listgrouprights-summary": "Та группае пырисьёс возьматыны кулэ вики список улӥзы, право соответствующийгес солы возьматоно кариськиз. Оло, ас кожазы ватсаса ивортодэт улыны эрикрадэз сярысь.",
+       "listgrouprights-summary": "Та группае пырисьёс возьматыны кулэ вики список улӥзы, право соответствующийгес солы возьматоно кариськиз. Оло, ас [[{{MediaWiki:Listgrouprights-helppage}}|кожазы ватсаса ивортодэт]] улыны эрикрадэз сярысь.",
        "listgrouprights-members": "(список пыриськисьёс)",
        "emailuser": "Викиавторлы гожтэт",
        "emailmessage": "Ивортон:",
        "contributions": "{{GENDER:$1|Викиавтор}} гожтэмъёсы",
        "contributions-title": "$1 викиавтор гожтэмъёсы",
        "mycontris": "Гожтэмъёс",
+       "anoncontribs": "Гожтэмъёс",
        "nocontribs": "Критерии нокыӵе воштӥськонъёс та соответствующий шедьтыны уг луы.",
        "sp-contributions-blocklog": "блокировка",
        "sp-contributions-deleted": "шонертон палэнтыны {{GENDER:$1|участник|куакеч}}",
        "sp-contributions-blocked-notice": "Пользователь заблокирован сётӥз та учырлы. Справка понна радъяськылӥсь журнал блокировка лапег берпуметӥ гожтэт:",
        "sp-contributions-blocked-notice-anon": "Со ip-адрес вие заблокировать сётӥзы. Блокировка журналъёсты вайытэк улӥзы берпуметӥ книгаысь:",
        "whatlinkshere": "Татчы чӧлсконъёс",
+       "whatlinkshere-title": "«$1» вылэ чӧлскись бамъёс",
+       "whatlinkshere-page": "Бам:",
+       "linkshere": "Та бамъёс <strong>[[:$1]]</strong> вылэ чӧлско:",
+       "isredirect": "ыстӥсь бам",
+       "istemplate": "пыртон",
+       "whatlinkshere-prev": "{{PLURAL:$1|берлань|$1-лы берлань}}",
+       "whatlinkshere-next": "{{PLURAL:$1|азьлань|$1-лы азьлань}}",
+       "whatlinkshere-links": "← чӧлсконъёс",
+       "whatlinkshere-hidetrans": "$1 пыртонъёсты",
+       "whatlinkshere-hidelinks": "$1 чӧлсконъёсты",
+       "whatlinkshere-filters": "Фильтръёс",
        "block": "Блокировка пыриськисьёс",
-       "blockip": "Заблокировать пыриськисьёс",
+       "blockip": "Заблокировать {{GENDER:$1|пыриськисьёс}}",
        "ipbreason-dropdown": "* Блокировка мугез кабес\n** Полы информациез оскизы\n** Вордскем палэнэ бам\n** Спам-сайтъя педпал чӧлскон\n** Текстлэсь визьем ватсан/жуг-жаг\n** Кышкытлыклэсь, пыриськыны уйиськон\n** Злоупотребление кӧня ке книга учётной\n** Пыриськисьёслэн нимъёссы пыриськисьёс",
        "ipboptions": "2 час:2 hours,1 нуналлы:1 day,3 нуналлы:3 days,1 арняезлы:1 week,2 арняяз:2 weeks,1 толэзь:1 month,3 толэзь:3 months,6 толэзь:6 months,1 арлэн:1 year,бессрочно:infinite",
-       "unblocked": "$1 разблокировать",
+       "unblocked": "[[User:$1|$1]] разблокировать",
        "unblocked-id": "Блокировка $1 басьтоно луиз",
        "blocklist-target": "Ужпумъёс",
        "blocklist-reason": "Мугез",
        "block-log-flags-nousertalk": "тупатъяны ачиз уггес быгаты бамлэн обсуждениосаз",
        "range_block_disabled": "Администратор диапазонэз блокировать али.",
        "move-watch": "Чаклан списоке пыртоно инъет но валтӥсь бамъёсыз",
+       "export": "Бамъёсты поттон",
        "allmessagesname": "Ивортон",
        "allmessages-filter-all": "Ваньзэ",
        "thumbnail-more": "Будэтоно",
+       "tooltip-pt-userpage": "{{GENDER:|Тӥляд}} асьтэлэн бамды",
+       "tooltip-pt-mytalk": "{{GENDER:|Тӥляд}} вераськон бамды",
+       "tooltip-pt-preferences": "{{GENDER:|Тӥляд}} настройкаосты",
+       "tooltip-pt-watchlist": "Бамъёслы список, кудъёссэ воштонъёсты тӥ эскерылӥськоды",
+       "tooltip-pt-mycontris": "{{GENDER:|Тӥляд}} тупатонъёстылы список",
        "tooltip-pt-login": "Татын системае пырыны луоно, нош одно ик ӧвӧл",
+       "tooltip-pt-logout": "Йылпумъяны али ортчись ужанэз",
        "tooltip-pt-createaccount": "Татын учётной записез лэсьтыны но системае пырыны луоно, нош одно ик ӧвӧл",
        "tooltip-ca-talk": "Бамлэн контентэз сярысь вераськон",
        "tooltip-ca-edit": "Та бамез тупатъяно",
        "tooltip-ca-addsection": "Выль люкет кылдытоно",
        "tooltip-ca-viewsource": "Та бам воштонъёслэсь утемын.\nТӥ быгатӥськоды инъет текстсэ учкыны но кӧчырыны",
        "tooltip-ca-history": "Бамлэн воштонъёсыныз журнал",
+       "tooltip-ca-move": "Та бамлэсь нимзэ воштыны",
        "tooltip-ca-watch": "Та бамез чаклан списокады пыртоно",
        "tooltip-search": "Утчано {{SITENAME}}",
        "tooltip-search-go": "Выжоно сыӵе ик нимын баме",
        "tooltip-ca-nstab-user": "Викиавторлэн бамез",
        "tooltip-ca-nstab-special": "Та бам нимысьтыз, сое тупатон луонтэм",
        "tooltip-ca-nstab-image": "Файллэн бамез",
+       "tooltip-ca-nstab-template": "Шаблонлэн бамез",
        "tooltip-ca-nstab-category": "Категорилэн бамез",
+       "tooltip-save": "Возьыны воштонъёстэс",
+       "tooltip-preview": "Воштонъёстэс эскерон. Тауна, бамез гожтонлэсь азьло учкелэ соосыз.",
+       "tooltip-diff": "Возьматыны воштонъёсыз, кудъёссэ тӥ текстэ пыртӥды.",
        "tooltip-rollback": "Берло викиавторен лэсьтэм воштонъёсыз одӥг зӥбонэн палэнтыны",
+       "tooltip-undo": "Палэнтыны та тупатонэз но возьматыны воштон эскерымон бамез, кытын палэнтонлэсь мугзэ гожтыны луоз.",
+       "tooltip-summary": "Воштонъёсты сярысь вакчияк гожтэлэ",
+       "simpleantispam-label": "Анти-спам эскерон.\n<strong>Эн</strong> гожтэ татчы!",
        "pageinfo-header-edits": "Воштонъёслэн историзы",
        "pageinfo-toolboxlink": "Бам сярысь тодэтъёс",
+       "previousdiff": "← Вужгес тупатон",
        "file-info-size": "$1 × $2 пиксель, файллэн быдӟалаез: $3, MIME-тип: $4",
+       "file-nohires": "Бадӟымгес быдӟалаен суред ӧвӧл.",
+       "svg-long-desc": "SVG файл, номинально $1 × $2 пиксель, файллэн быдӟалаез: $3",
        "show-big-image": "Инъет файл",
        "show-big-image-preview": "Быдӟалаез та бамын: $1.",
        "show-big-image-other": "Мукет {{PLURAL:$2|быдӟалаез|быдӟалаосыз}}: $1.",
        "metadata": "Метаданнойёс",
        "metadata-help": "Файл пушкын информация вань на, кудзэ лыдпусо камераос яке сканеръёс файлэз кылдытыку огшоры ватсалляло.\nКылдытон бере файл воштӥськиз ке, куд-огез параметръёс воштэм суредлы ярантэм луыны быгато.",
        "metadata-fields": "Суредысь метаданнойёслэн та списоке пыртэм полеоссы адӟытӥськозы суред бам вылын, метаданнойёслэн таблицазы бинемын дыръя.\nМукет полеоссы ватскозы.\n* make\n* model\n* datetimeoriginal\n* exposuretime\n* fnumber\n* isospeedratings\n* focallength\n* artist\n* copyright\n* imagedescription\n* gpslatitude\n* gpslongitude\n* gpsaltitude",
+       "exif-xresolution": "Горизонтальной разрешение",
+       "exif-yresolution": "Вертикальной разрешение",
+       "exif-datetime": "Файлэз воштонлэн датаез но дырыз",
+       "exif-model": "Камералэн моделез",
+       "exif-software": "Компьютер программаос",
+       "exif-exifversion": "Exif версия",
+       "exif-colorspace": "Буёлъёслэн пространствозы",
        "exif-disclaimer": "Кыл кутыны пумит луон",
        "namespacesall": "ваньзэ",
        "monthsall": "ваньзэ",
        "confirmrecreate-noreason": "{{GENDER:$1|Участник|Куакеч|}}&nbsp;[[User:$1|$1]] ([[User talk:$1|обс]]) {{GENDER:$1|палэнтыны|палэнтыны}} таиз бере бам, кызьы тон сое редактировать карыны кутскиз. Пожалуйста, подтвердите, мар тон малпаськод та бамез зэм но выльысь кылдозы.",
        "confirm-watch-top": "Та бамез чаклан списокады пыртоно?",
        "autosumm-new": "Выль бам: «$1»",
+       "signature": "[[{{ns:user}}:$1|$2]] ([[{{ns:user_talk}}:$1|вераськон]])",
        "version": "Версия",
        "specialpages": "Ваньмыз панельёс",
        "specialpages-group-login": "Тусбуяськыны / Гожтӥськоно",
index f6381c2..edd0508 100644 (file)
        "yourpasswordagain": "پارولنى قايتا كىرگۈزۈڭ:",
        "createacct-yourpasswordagain": "پارولنى مۇقىملاشتۇرۇڭ",
        "createacct-yourpasswordagain-ph": "پارولنى قايتا كىرگۈزۈڭ",
-       "remembermypassword": "بۇ كومپيۇتېردا كىرگىنىمنى ئەستە ساقلا(ئەڭ ئۇزۇن بولغاندا $1 {{PLURAL:$1|كۈن|كۈن}})",
        "userlogin-remembermypassword": "مېنى ئەستە ساقلا",
        "userlogin-signwithsecure": "بىخەتەر ئۇلىنىشنى ئىشلەت",
        "yourdomainname": "دائىرە نامىڭىز:",
        "passwordreset-emailtext-user": "{{SITENAME}} دىكى ئىشلەتكۈچى $1 بېكەت {{SITENAME}} ($4) دىكى پارولىڭىزنى قايتا بېكىتىشنى ئىلتىماس قىلدى .\nتۆۋەندىكى ئىشلەتكۈچىنىڭ {{PLURAL:$3|ھېسابات|ھېسابات}}($4)ى مۇشۇ ئېلخەتكە باغلانغان:\n\n$2\n\n{{PLURAL:$3|بۇ ۋاقىتلىق پارول|بۇ ۋاقىتلىق پارول}} {{PLURAL:$5|بىر كۈن|$5 كۈن}}دە ۋاقتى ئۆتىدۇ. ئەگەر بۇ مەشغۇلاتنى سىز ئىلتىماس قىلغان بولسىڭىز، دەرھال تىزىمغا كىرىپ يېڭى پارولدىن بىرنى تاللاڭ.\nسىز بەلگىلىگەن يېڭى پارول {{PLURAL:$5|كۈن|$5 كۈن}}دە ۋاقتى توشىدۇ. ئەگەر باشقىلار ئىلتىماس قىلغان بولسا ياكى ئۆزىڭىز بەلگىلىگەن پارول ئېسىڭىزگە كېلىپ ئۇنى ئۆزگەرتمىسىڭىز، \nبۇ ئۇچۇرغا پەرۋا قىلماي ئۆزىڭىزنىڭ كونا پارولىنى ئىشلىتىۋېرىڭ.",
        "passwordreset-emailelement": "ئىشلەتكۈچى نامى: \n$1\n\nۋاقىتلىق پارول: \n$2",
        "passwordreset-emailsentemail": "پارولنى قايتا بېكىتىش ئېلخېتى يوللاندى.",
-       "passwordreset-emailsent-capture": "پارولنى قايتا بېكىتىش ئېلخېتى يوللاندى، تۆۋەندە كۆرسىتىلىدۇ.",
-       "passwordreset-emailerror-capture": "ھاسىل قىلىنغان پارولنى قايتا بېكىتىش ئېلخېتى تۆۋەندە كۆرسىتىلگەندەك ئەمما ئۇنى {{GENDER:$2|ئىشلەتكۈچى}}گە يوللىيالمىدى: $1",
        "changeemail": "ئېلخەت ئادرېس ئۆزگەرت",
        "changeemail-header": "ھېساباتنىڭ ئېلخەت ئادرېسىنى ئۆزگەرت",
        "changeemail-no-info": "سىز تىزىمغا كىرگەندىن كېيىن بىۋاسىتە بۇ بەتكە كىرىشىڭىز لازىم.",
        "undo-nochange": "بۇ قېتىملىق تەھرىرلەش ۋاز كېچىلدى.",
        "undo-summary": "[[Special:Contributions/$2|$2]] ([[User talk:$2|مۇنازىرە]]) ئېلىپ بارغان تۈزىتىش $1",
        "undo-summary-username-hidden": "بىر يوشۇرۇن ئىشلەتكۈچى تەرىپىدىن يېنىۋېلىندى $1.",
-       "cantcreateaccounttitle": "ھېسابات قۇرالمىدى",
        "cantcreateaccount-text": "بۇ IP ئادرېستىن قۇرۇلغان ('''$1''')  ھېسابات [[User:$3|$3]] تەرىپىدىن چەكلەنگەن.\n\n$3 تەمىنلىگەن چەكلەش سەۋەبى ''$2''",
        "viewpagelogs": "بۇ بەتنىڭ خاتىرىسىنى كۆرسەت",
        "nohistory": "بۇ بەتنىڭ تەھرىرلەش خاتىرىسى يوق.",
        "activeusers-intro": "بۇ يېقىنقى $1 {{PLURAL:$1| كۈن|كۈن}}دىكى مەشغۇلات قىلغان ئىشلەتكۈچىلەر تىزىملىكى.",
        "activeusers-count": "يېقىنقى {{PLURAL:$3|كۈن|$3 كۈن}}دىكى {{PLURAL:$1|مەشغۇلات}} قېتىم سانى $1",
        "activeusers-from": "باشلانغان ئىشلەتكۈچىنى كۆرسەت:",
-       "activeusers-hidebots": "ماشىنا ئادەمنى يوشۇر",
-       "activeusers-hidesysops": "باشقۇرغۇچىنى يوشۇر",
        "activeusers-noresult": "ئىشلەتكۈچى تېپىلمىدى.",
        "listgrouprights": "ئىشلەتكۈچى گۇرۇپپا ھوقۇقى",
        "listgrouprights-summary": "تۆۋەندىكىسى بۇ wiki دا ئېنىقلىما بېرىلگەن ئىشلەتكۈچى ھوقۇق چېكى تىزىملىكى ۋە ئۇلارنىڭ زىيارەت ھوقۇق چېكى.\nتېخىمۇ كۆپ قىسمەن ھوقۇقنىڭ تەپسىلاتىنى [[{{MediaWiki:Listgrouprights-helppage}}|بۇ جاي]] دىن تاپالايسىز.",
        "htmlform-no": "ياق",
        "htmlform-yes": "ھەئە",
        "htmlform-chosen-placeholder": "بىرنى تاللاڭ",
-       "sqlite-has-fts": "$1 پۈتۈن تېكست ئىزدەشنى قوللايدۇ",
-       "sqlite-no-fts": "$1 پۈتۈن تېكست ئىزدەشنى قوللىمايدۇ",
        "logentry-delete-delete": "$1 $3 بەتنى {{GENDER:$2|ئۆچۈرىۋەتتى}}",
        "logentry-delete-restore": "$1 $3 بەتنى {{GENDER:$2|ئەسلىگە قايتۇردى}}",
        "logentry-delete-event": "$1 ئىشلەتكۈچى $3 دىكى {{PLURAL:$5|خاتىرە ھادىسە}}سىنىڭ كۆۈنۈشچانلىقىنى ئۆزگەرتتى: $4",
index 1cdc62c..18ad10f 100644 (file)
@@ -67,7 +67,8 @@
                        "E.belykh",
                        "Visem",
                        "MMH",
-                       "Олександр"
+                       "Олександр",
+                       "Similartothissimilartothat"
                ]
        },
        "tog-underline": "Підкреслювання посилань:",
        "views": "Перегляди",
        "toolbox": "Інструменти",
        "tool-link-userrights": "Змінити групи {{GENDER:$1|користувачів}}",
+       "tool-link-userrights-readonly": "Перегляд груп {{GENDER:$1|користувача|користувачки}}",
        "tool-link-emailuser": "Надіслати електронного листа {{GENDER:$1|цьому користувачеві|цій користувачці}}",
        "userpage": "Переглянути сторінку користувача",
        "projectpage": "Переглянути сторінку проекту",
        "botpasswords-label-delete": "Видалити",
        "botpasswords-label-resetpassword": "Скинути пароль",
        "botpasswords-label-grants": "Придатні дозволи:",
-       "botpasswords-help-grants": "Ð\9aожен Ð´Ð¾Ð·Ð²Ñ\96л Ð´Ð°Ñ\94 Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð¾ Ð¿ÐµÑ\80елÑ\96Ñ\87ениÑ\85 Ð¿Ñ\80ав ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а, Ñ\8fкÑ\96 Ð²Ð¶Ðµ Ñ\94 Ñ\83 Ð¾Ð±Ð»Ñ\96кового Ð·Ð°Ð¿Ð¸Ñ\81Ñ\83 ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а. Див. [[Special:ListGrants|таблицю дозволів]] для отримання додаткової інформації.",
+       "botpasswords-help-grants": "Ð\94озволи Ð´Ð°Ñ\8eÑ\82Ñ\8c Ð´Ð¾Ñ\81Ñ\82Ñ\83п Ð´Ð¾ Ð¿Ñ\80ав, Ñ\8fкÑ\96 Ð²Ð¶Ðµ Ñ\94 Ñ\83 Ð\92аÑ\88ого Ð¾Ð±Ð»Ñ\96кового Ð·Ð°Ð¿Ð¸Ñ\81Ñ\83. Ð£Ð²Ñ\96мкненнÑ\8f Ð´Ð¾Ð·Ð²Ð¾Ð»Ñ\83 Ñ\82Ñ\83Ñ\82 Ð½Ðµ Ð½Ð°Ð´Ð°Ñ\81Ñ\82Ñ\8c Ð\92ам Ð´Ð¾Ñ\81Ñ\82Ñ\83пÑ\83 Ð´Ð¾ Ð±Ñ\83дÑ\8c\8fкиÑ\85 Ð¿Ñ\80ав, Ñ\8fкиÑ\85 Ð² Ñ\96нÑ\88омÑ\83 Ð²Ð¸Ð¿Ð°Ð´ÐºÑ\83 Ð½Ðµ Ð±Ñ\83ло Ð± Ñ\83 Ð\92аÑ\88ого Ð¾Ð±Ð»Ñ\96кового Ð·Ð°Ð¿Ð¸Ñ\81Ñ\83. Див. [[Special:ListGrants|таблицю дозволів]] для отримання додаткової інформації.",
        "botpasswords-label-grants-column": "Дозволено",
        "botpasswords-bad-appid": "Ім'я бота «$1» є недопустимим.",
        "botpasswords-insert-failed": "Не вдалось додати бота з іменем «$1». Можливо, він вже був доданий?",
        "passwordreset-emaildisabled": "В цій вікі вимкнуто Функції електронної пошти.",
        "passwordreset-username": "Ім'я користувача:",
        "passwordreset-domain": "Домен:",
-       "passwordreset-capture": "Продивитись результуючий електронний лист?",
-       "passwordreset-capture-help": "Якщо ви зробите помітку у віконці, вам буде показаний електронний лист (із тимчасовим паролем), який також буде надісланий користувачеві.",
        "passwordreset-email": "Адреса електронної пошти:",
        "passwordreset-emailtitle": "Деталі облікового запису на {{SITENAME}}",
        "passwordreset-emailtext-ip": "Хтось (імовірно ви, з IP-адреси $1) попросив нагадати деталі вашого облікового запису для {{SITENAME}} ($4). З вашою електронною скринькою пов'язан{{PLURAL:$3|1=ий такий запис|і такі записи}}:\n\n$2\n\n{{PLURAL:$3|1=Цей тимчасовий пароль стане недійсним|Ці тимчасові паролі стануть недійсними}} через $5 {{PLURAL:$5|день|дні|днів}}.\nВи маєте ввійти в систему і вибрати новий пароль. Якщо ж цей запит зробив хтось інший або ви згадали свій старий пароль і не бажаєте його змінювати, можете ігнорувати це повідомлення та продовжувати використовувати старий пароль.",
        "passwordreset-emailelement": "Ім'я користувача: \n$1\n\nТимчасовий пароль: \n$2",
        "passwordreset-emailsentemail": "Якщо ця електронна адреса асоційована з вашим обліковим записом, то лист для відновлення пароля буде відправлено на неї.",
        "passwordreset-emailsentusername": "Якщо існує електронна адреса, яка асоційована з цим обліковим записом, на неї буде надіслано лист для відновлення пароля.",
-       "passwordreset-emailsent-capture2": "{{PLURAL:$1|Електронний лист|Електронні листи}} скидання паролю було надіслано. {{PLURAL:$1|Ім'я користувача і пароль|Список імен користувачів і паролів}} показано тут.",
-       "passwordreset-emailerror-capture2": "Не вдалося надіслати листа {{GENDER:$2|користувачу|користувачці}}: $1 {{PLURAL:$3|Ім'я користувача і пароль|список імен користувачів і паролів}} показано тут.",
        "passwordreset-nocaller": "Має бути надане джерело виклику",
        "passwordreset-nosuchcaller": "Джерело виклику не існує: $1",
        "passwordreset-ignored": "Скидання пароля не відбулося. Можливо, не було налашатовано надавача?",
-       "passwordreset-invalideamil": "Недійсна адреса електронної пошти",
+       "passwordreset-invalidemail": "Недійсна адреса електронної пошти",
        "passwordreset-nodata": "Не надано ні імені користувача, ні електронної адреси",
        "changeemail": "Змінити або вилучити адресу електронної пошти",
        "changeemail-header": "Заповніть цю форму, щоб змінити адресу електронної пошти. Якщо Ви хочете взагалі прибрати зв'язок свого облікового запису з адресою електронної пошти, при надсиланні форми залиште поле нової електронної адреси порожнім.",
        "prefs-help-recentchangescount": "Це стосується нових редагувань, історій сторінок і журналів.",
        "prefs-help-watchlist-token2": "Це секретний ключ до веб-каналу вашого списку спостереження.\nБудь-хто, хто його знає, матиме можливість читати ваш список спостереження, тому не поширюйте його.\n[[Special:ResetTokens|Натисніть тут, якщо вам потрібно скинути його]].",
        "savedprefs": "Ваші налаштування збережено.",
-       "savedrights": "Ð\9fÑ\80ава ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87а {{GENDER:$1|$1}} Ð±Ñ\83ли Ð·Ð±ÐµÑ\80еженÑ\96.",
+       "savedrights": "Ð\93Ñ\80Ñ\83пи {{GENDER:$1|коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87а $1|коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87ки $1}} Ð±Ñ\83ло Ð·Ð±ÐµÑ\80ежено.",
        "timezonelegend": "Часовий пояс:",
        "localtime": "Місцевий час:",
        "timezoneuseserverdefault": "Використовувати стандартне налаштування вікі ($1)",
        "prefswarning-warning": "Ви внесли в свої налаштування зміни, які ще не були збережені.\nЯкщо ви залишите цю сторінку, не натиснувши \"$1\", налаштування не будуть оновлені.",
        "prefs-tabs-navigation-hint": "Порада: Ви можете використовувати клавіші стрілок вліво і вправо для переходу між вкладками в списку вкладок.",
        "userrights": "Керування правами користувачів",
-       "userrights-lookup-user": "Ð\9aеÑ\80Ñ\83ваннÑ\8f Ð³Ñ\80Ñ\83пами користувача",
+       "userrights-lookup-user": "Ð\92ибеÑ\80Ñ\96Ñ\82Ñ\8c користувача",
        "userrights-user-editname": "Введіть ім'я користувача:",
-       "editusergroup": "РедагÑ\83ваÑ\82и Ð³Ñ\80Ñ\83пи {{GENDER:$1|коÑ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в}}",
+       "editusergroup": "Ð\97аванÑ\82ажиÑ\82и Ð³Ñ\80Ñ\83пи ÐºÐ¾Ñ\80иÑ\81Ñ\82Ñ\83ваÑ\87Ñ\96в",
        "editinguser": "Зміна прав {{GENDER:$1|користувача}} <strong>[[User:$1|$1]]</strong> $2",
-       "userrights-editusergroup": "Змінити групи користувачів",
+       "userrights-editusergroup": "Змінити групи {{GENDER:$1|користувача|користувачки}}",
        "saveusergroups": "Зберегти групи {{GENDER:$1|користувачів}}",
        "userrights-groupsmember": "Член груп:",
        "userrights-groupsmember-auto": "Неявний член:",
        "userrights-reason": "Причина:",
        "userrights-no-interwiki": "У вас нема дозволу змінювати права користувачів на інших вікі.",
        "userrights-nodatabase": "База даних $1 не існує або не є локальною.",
-       "userrights-nologin": "Ви повинні [[Special:UserLogin|ввійти до системи]] з обліковим записом адміністратора, щоб призначати права користувачам.",
-       "userrights-notallowed": "У вас не має дозволів на додавання або зміну прав користувачів.",
        "userrights-changeable-col": "Групи, які ви можете змінити",
        "userrights-unchangeable-col": "Групи, які ви не можете змінити",
        "userrights-irreversible-marker": "$1*",
        "userrights-conflict": "Конфлікт зміни прав користувача! Будь ласка, перевірте та  підтвердіть зміни знову.",
-       "userrights-removed-self": "Ви позбавили себе власних прав. Через це Ви більше не маєте доступу до цієї сторінки.",
        "group": "Група:",
        "group-user": "Користувачі",
        "group-autoconfirmed": "Автопідтверджені користувачі",
        "right-siteadmin": "Блокування і розблокування бази даних",
        "right-override-export-depth": "експорт сторінок, включаючи пов'язані сторінки з глибиною до 5",
        "right-sendemail": "надсилання електронної пошти іншим користувачам",
-       "right-passwordreset": "Перегляд повідомлень електронної пошти для зміни паролю",
        "right-managechangetags": "створення та (де)активування [[Special:Tags|міток]]",
        "right-applychangetags": "додавання [[Special:Tags|міток]] разом зі змінами",
        "right-changetags": "додавання або вилучення будь-яких [[Special:Tags|міток]] для певних версій сторінок або записів журналів",
        "grant-basic": "Основні права",
        "grant-viewdeleted": "Перегляд видалених файлів і сторінок",
        "grant-viewmywatchlist": "Перегляд списку спостереження",
+       "grant-viewrestrictedlogs": "Показати записи журналу з обмеженим доступом",
        "newuserlogpage": "Журнал нових користувачів",
        "newuserlogpagetext": "Список нещодавно зареєстрованих користувачів.",
        "rightslog": "Журнал прав користувача",
        "apisandbox-continue": "Продовжити",
        "apisandbox-continue-clear": "Очистити",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} [https://www.mediawiki.org/wiki/API:Query#Continuing_queries продовжить] останній запит; {{int:apisandbox-continue-clear}} очистить параметри, пов'язані з продовженням.",
+       "apisandbox-param-limit": "Введіть <kbd>max</kbd>, щоб використати максимальний ліміт.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Усі простори назв)",
+       "apisandbox-multivalue-all-values": "$1 (Усі значення)",
        "booksources": "Джерела книг",
        "booksources-search-legend": "Пошук інформації про книгу",
        "booksources-isbn": "ISBN:",
        "booksources-search": "Пошук",
        "booksources-text": "На цій сторінці наведено список посилань на сайти, де ви, можливо, знайдете додаткову інформацію про книгу. Це інтернет-магазини й системи пошуку в бібліотечних каталогах.",
        "booksources-invalid-isbn": "Вказаний номер ISBN, судячи з усього, містить помилку. Будь ласка, перевірте, що при перенесенні номера з першоджерела не виникло спотворень.",
+       "magiclink-tracking-rfc": "Сторінки, що використовують магічні посилання RFC",
+       "magiclink-tracking-rfc-desc": "Ця сторінка використовує магічні посилання RFC. Див. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] про те, як перенести.",
+       "magiclink-tracking-pmid": "Сторінки, що використовують магічні посилання PMID",
+       "magiclink-tracking-pmid-desc": "Ця сторінка використовує магічні посилання PMID. Див. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] про те, як перенести.",
+       "magiclink-tracking-isbn": "Сторінки, що використовують магічні посилання ISBN",
+       "magiclink-tracking-isbn-desc": "Ця сторінка використовує магічні посилання ISBN. Див. [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] про те, як перенести.",
        "specialloguserlabel": "Виконавець:",
        "speciallogtitlelabel": "Ціль (назва сторінки або {{ns:user}}:Ім'я_користувача):",
        "log": "Журнали",
        "activeusers-intro": "Це список користувачів, які здійснювали які-небудь дії за {{PLURAL:$1|останній $1 день|останні $1 дні|останні $1 днів}}.",
        "activeusers-count": "$1 {{PLURAL:$1|дія|дії|дій}} за {{PLURAL:$3|останній $3 день|останні $3 дні|останні $3 днів}}",
        "activeusers-from": "Показувати користувачів, починаючи з:",
+       "activeusers-groups": "Показувати користувачів, належних до груп:",
+       "activeusers-excludegroups": "Виключити користувачів, що належать до груп:",
        "activeusers-noresult": "Не знайдено користувачів.",
        "activeusers-submit": "Показати активних користувачів",
        "listgrouprights": "Права груп користувачів",
        "modifiedarticleprotection": "змінено рівень захисту сторінки «[[$1]]»",
        "unprotectedarticle": "знято захист зі сторінки \"[[$1]]\"",
        "movedarticleprotection": "переніс налаштування захисту з «[[$2]]» на «[[$1]]»",
+       "protectedarticle-comment": "Захисти{{GENDER:$2|в|ла}} «[[$1]]»",
+       "modifiedarticleprotection-comment": "Зміни{{GENDER:$2|в|ла}} рівень захисту для \"[[$1]]\"",
+       "unprotectedarticle-comment": "Зня{{GENDER:$2|в|ла}} захист з \"[[$1]]\"",
        "protect-title": "Встановлення захисту для «$1»",
        "protect-title-notallowed": "Перегляд рівню захисту \"$1\"",
        "prot_1movedto2": "«[[$1]]» перейменована на «[[$2]]»",
        "patrol-log-header": "Це журнал перевірених змін.",
        "log-show-hide-patrol": "$1 журнал патрулювання",
        "log-show-hide-tag": "$1 мітку журналу",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Позначити версію $3 сторінки $2 як відпатрульовану?",
        "deletedrevision": "Вилучена стара версія $1",
        "filedeleteerror-short": "Помилка вилучення файлу: $1",
        "filedeleteerror-long": "Під час вилучення файлу виникли помилки:\n\n$1",
        "tags-deactivate": "вимкнути",
        "tags-hitcount": "$1 {{PLURAL:$1|зміна|зміни|змін}}",
        "tags-manage-no-permission": "У Вас нема дозволу керувати мітками змін.",
-       "tags-manage-blocked": "Не можна змінювати мітки під час блокування.",
+       "tags-manage-blocked": "Не можна змінювати теги, поки {{GENDER:$1|Вас}} заблоковано.",
        "tags-create-heading": "Створити нову мітку",
        "tags-create-explanation": "За замовчуванням, новостворені мітки будуть доступні для використання користувачами і ботами.",
        "tags-create-tag-name": "Назва мітки:",
        "tags-deactivate-not-allowed": "Неможливо вимкнути мітку «$1».",
        "tags-deactivate-submit": "Вимкнути",
        "tags-apply-no-permission": "Ви не маєте права міняти мітки вашого редагування.",
-       "tags-apply-blocked": "Ви не можете змінювати мітки редагувань, будучи заблокованим.",
+       "tags-apply-blocked": "Ви не можете змінювати теги редагувань, поки {{GENDER:$1|Вас}}  заблоковано.",
        "tags-apply-not-allowed-one": "Мітку «$1» не можна додавати вручну.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Таку мітку|Такі мітки}} не можна додавати вручну: $1",
        "tags-update-no-permission": "Ви не маєте права додавати або вилучати мітки окремих версій чи журнальних записів.",
-       "tags-update-blocked": "Ви не можете додати чи видалити мітки редагувань, будучи заблокованим.",
+       "tags-update-blocked": "Ви не можете додавати чи вилучати теги редагувань, поки {{GENDER:$1|Вас}} заблоковано.",
        "tags-update-add-not-allowed-one": "Мітку \"$1\" не можна додавати вручну.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Таку мітку|Такі мітки}} не можна додавати вручну: $1",
        "tags-update-remove-not-allowed-one": "Мітку «$1» не дозволено вилучати.",
        "htmlform-user-not-exists": "<strong>$1</strong> не існує.",
        "htmlform-user-not-valid": "<strong>$1</strong> не є дійсним іменем користувача.",
        "logentry-delete-delete": "$1 {{GENDER:$2|вилучив|вилучила}} сторінку $3",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2|вилучив|вилучила}} перенаправлення $3 шляхом перезапису",
        "logentry-delete-restore": "$1 {{GENDER:$2|відновив|відновила}} сторінку $3",
        "logentry-delete-event": "$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5 запису журналу|$5 записів журналу}} на $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2|змінив|змінила}} видимість {{PLURAL:$5|$5 версії|$5 версій}} на сторінці $3: $4",
        "mw-widgets-dateinput-placeholder-month": "РРРР-ММ",
        "mw-widgets-titleinput-description-new-page": "сторінка ще не існує",
        "mw-widgets-titleinput-description-redirect": "перенаправлення на $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Додати категорію...",
        "sessionmanager-tie": "Не можна поєднувати кілька типів автентифікації запиту: $1.",
        "sessionprovider-generic": "сесій $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "сесій на основі кук",
        "log-action-filter-contentmodel-change": "Зміна Contentmodel",
        "log-action-filter-contentmodel-new": "Створення сторінки з нестандартною моделлю Contentmodel",
        "log-action-filter-delete-delete": "Видалення сторінки",
+       "log-action-filter-delete-delete_redir": "Перезапис перенаправлення",
        "log-action-filter-delete-restore": "Відновлення сторінки",
        "log-action-filter-delete-event": "Вилучення журналу",
        "log-action-filter-delete-revision": "Вилучення версії",
        "authmanager-authn-autocreate-failed": "Автоматичне створення локального облікового запису не вдалося: $1",
        "authmanager-change-not-supported": "Надані облікові дані не можуть бути змінені, оскільки їх нічого не буде використовувати.",
        "authmanager-create-disabled": "Створення облікових записів вимкнене.",
-       "authmanager-create-from-login": "Щоб Ñ\81Ñ\82воÑ\80иÑ\82и Ð¾Ð±Ð»Ñ\96ковий Ð·Ð°Ð¿Ð¸Ñ\81, Ð±Ñ\83дÑ\8c Ð»Ð°Ñ\81ка, Ð·Ð°Ð¿Ð¾Ð²Ð½Ñ\96Ñ\82Ñ\8c Ð¿Ð¾Ð»Ñ\8f Ð½Ð¸Ð¶Ñ\87е.",
+       "authmanager-create-from-login": "Щоб Ñ\81Ñ\82воÑ\80иÑ\82и Ð¾Ð±Ð»Ñ\96ковий Ð·Ð°Ð¿Ð¸Ñ\81, Ð±Ñ\83дÑ\8c Ð»Ð°Ñ\81ка, Ð·Ð°Ð¿Ð¾Ð²Ð½Ñ\96Ñ\82Ñ\8c Ð¿Ð¾Ð´Ð°Ð½Ñ\96 Ð¿Ð¾Ð»Ñ\8f.",
        "authmanager-create-not-in-progress": "Створення облікового запису не виконується або втрачено дані сесії. Будь ласка, почніть знову з самого початку.",
        "authmanager-create-no-primary": "Надані облікові дані не можуть бути використані для створення облікового запису.",
        "authmanager-link-no-primary": "Надані облікові дані не можуть бути використані для прив'язки облікового запису.",
        "usercssispublic": "Будь ласка, зверніть увагу: підсторінки CSS не повинні містити конфіденційних даних, бо їх можуть бачити інші користувачі.",
        "restrictionsfield-badip": "Недійсна IP-адреса або діапазон: $1",
        "restrictionsfield-label": "Дозволені діапазони IP-адрес:",
-       "restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "Помилка: $1",
-       "edit-error-long": "Помилки:\n\n$1"
+       "restrictionsfield-help": "Одна IP-адреса або CIDR-діапазон на рядок. Щоб увімкнути все, використайте<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 1fcff99..de2ee22 100644 (file)
        "passwordreset-nocaller": "کالر کا فراہم کیا جانا لازمی ہے",
        "passwordreset-nosuchcaller": "کالر موجود نہیں: $1",
        "passwordreset-ignored": "پاس ورڈ کی ترتیب نو مکمل نہیں ہو سکی۔ شاید کوئی پرووائڈر فراہم نہیں کیا گیا؟",
-       "passwordreset-invalideamil": "نادرست برقی ڈاک پتا",
+       "passwordreset-invalidemail": "نادرست برقی ڈاک پتا",
        "passwordreset-nodata": "کوئی صارف نام اور نہ کوئی برقی ڈاک پتا فراہم کیا گیا",
        "changeemail": "برقی ڈاک پتے میں تبدیلی یا حذف شدگی",
        "changeemail-header": "اپنے برقی ڈاک پتے کو تبدیل کرنے کے لیے اس فارم کو پُر کریں۔ اگر آپ اپنے کھاتے سے منسلک کسی برقی ڈاک پتے کو ختم کرنا چاہتے ہیں تو فارم پُر کرنے کے دوران میں نئے برقی ڈاک پتے کا خانہ خالی چھوڑ دیں۔",
index 25b3d3d..99ab540 100644 (file)
        "listusers-blocked": "(chetlashtirilgan)",
        "activeusers": "Faol foydalanuvchilar roʻyxati",
        "activeusers-from": "Quyidagidan boshlanuvchi foydalanuvchilarni koʻrsatish:",
-       "activeusers-hidebots": "Botlarni yashirish",
-       "activeusers-hidesysops": "Maʼmurlarni yashirish",
        "activeusers-noresult": "Foydalanuvchilar topilmadi.",
        "listgrouprights": "Foydalanuvchilar guruhlari roʻyxati",
        "listgrouprights-summary": "Har bir viki-loyihada boʻlgani kabi, Oʻzbekcha Vikipediyada ham foydalanuvchilar bir nechta guruhlarga boʻlingan boʻlib, quyida ularning roʻyxati va tegishli huquqlari keltirilgan. Alohida huquqlar haqida [[{{MediaWiki:Listgrouprights-helppage}}|qoʻshimcha maʼlumotlar]] boʻlishi mumkin.",
index 0fdce19..f22471c 100644 (file)
        "yourpasswordagain": "Kirjutagat peitsana udes:",
        "createacct-yourpasswordagain": "Peitsanan vahvištoituz",
        "createacct-yourpasswordagain-ph": "Kirjutagat peitsana toškerdan",
-       "remembermypassword": "Panda muštho minun tulendandmused neciš kompjuteras (enintään $1 {{PLURAL:$1|päivä|päivää}})",
        "userlogin-remembermypassword": "Jäda sistemha",
        "yourdomainname": "Teiden domen:",
        "password-change-forbidden": "Teile ei sa vajehtada peitsanad neciš vikiš.",
        "undo-failure": "Ei voi tühjištada redakcijad, sikš miše läbiredakcijad konfliktuidas.",
        "undo-norev": "Ei voi endištada lehtpol't, sikš miše mugošt lehtpol't ei ole vai se om jo čutud.",
        "undo-summary": "Tühjitadud toižetuz $1, kudamban tegi $2 (arutelu)",
-       "cantcreateaccounttitle": "Ei voi säta registracijad",
        "viewpagelogs": "Ozutada aigkirjad necen lehtpolen täht",
        "nohistory": "Necen lehtpolen täht ei ole toižetusiden aigkirjad.",
        "currentrev": "Nügüdläine versii",
        "listusers-blocked": "(blokiruidud)",
        "activeusers": "Aktivižiden kävutajiden nimikirjutez",
        "activeusers-from": "Oyutada kävutajid, augotaden necišpäi:",
-       "activeusers-hidebots": "Peitta botid",
-       "activeusers-hidesysops": "Peitta administratorid",
        "activeusers-noresult": "Kävutajad ei olgoi löutud.",
        "listgrouprights": "Kävutajiden gruppiden oiktused",
        "listgrouprights-group": "Grupp",
        "htmlform-reset": "Tühjitada toižetused",
        "htmlform-selectorother-other": "Toine",
        "htmlform-yes": "Ka",
-       "sqlite-has-fts": " $1 täuz'tekstaižen ecindan tügedamiženke",
-       "sqlite-no-fts": " $1 täuz'tekstaižen ecindan tügedamižeta",
        "revdelete-restricted": "kaidendused administratoriden täht",
        "revdelete-unrestricted": "kaidendused heittud administratoriden täht",
        "logentry-newusers-create": "{{GENDER:$2|tegihe}} $1-kävutajaks",
index ccc7825..e613b7f 100644 (file)
        "views": "Các hiển thị",
        "toolbox": "Công cụ",
        "tool-link-userrights": "Thay đổi nhóm {{GENDER:$1}}người dùng",
+       "tool-link-userrights-readonly": "Xem {{GENDER:$1}}nhóm người dùng",
        "tool-link-emailuser": "Gửi thư cho {{GENDER:$1}}người dùng này",
        "userpage": "Xem trang thành viên",
        "projectpage": "Xem trang dự án",
        "botpasswords-label-delete": "Xoá",
        "botpasswords-label-resetpassword": "Đặt lại mật khẩu",
        "botpasswords-label-grants": "Các quyền có liên quan:",
-       "botpasswords-help-grants": "Các lượt cấp phép cho phép truy cập các quyền người dùng mà một tài khoản đã có sẵn. Xem thêm thông tin trong [[Special:ListGrants|bảng cấp phép]].",
+       "botpasswords-help-grants": "Các lượt cấp phép cho phép truy cập các quyền lợi mà tài khoản của bạn đã có. Việc cấp phép tại đây không có cho phép truy cập quyền nào mà tài khoản của bạn thường không có. Xem thêm thông tin trong [[Special:ListGrants|bảng cấp phép]].",
        "botpasswords-label-grants-column": "Cấp quyền",
        "botpasswords-bad-appid": "Bot có tên \"$1\" không hợp lệ.",
        "botpasswords-insert-failed": "Không thể thêm tên bot \"$1\". Nó đã được thêm vào chưa?",
        "passwordreset-emaildisabled": "Tính năng gửi thư điện tử không được kích hoạt trên wiki này.",
        "passwordreset-username": "Tên người dùng:",
        "passwordreset-domain": "Tên miền:",
-       "passwordreset-capture": "Xem thư điện tử có mật khẩu tạm",
-       "passwordreset-capture-help": "Nếu bạn kiểm hộp này, bạn sẽ xem thư điện tử có mật khẩu tạm lúc khi nó được gửi cho người dùng.",
        "passwordreset-email": "Địa chỉ thư điện tử:",
        "passwordreset-emailtitle": "Thông tin tài khoản tại {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ai đó (có thể là bạn, từ địa chỉ IP $1) đã yêu cầu tái tạo mật khẩu của bạn \ntại {{SITENAME}} ($4). {{PLURAL:$3|Tài khoản|Các tài khoản}} dưới đây gắn liền \nvới địa chỉ thư điện tử này:\n\n$2\n\n{{PLURAL:$3|Mật khẩu|Các mật khẩu}} tạm này sẽ hết hạn trong vòng {{PLURAL:$5|một ngày|$5 ngày}}. Bạn nên đăng nhập\nngay bây giờ để chọn mật khẩu mới. Nếu bạn không phải là người yêu cầu\nhoặc đã nhớ lại mật khẩu hiện hành, và bạn không còn\nmuốn thay đổi nó, xin vui lòng bỏ qua thông điệp này và tiếp tục sử dụng\nmật khẩu cũ.",
        "passwordreset-emailelement": "Tên người dùng: \n$1\n\nMật khẩu tạm: \n$2",
        "passwordreset-emailsentemail": "Nếu đây là đúng địa chỉ thư điện tử của tài khoản của bạn, một thư điện tử dùng để tái tạo mật khẩu sẽ được gửi cho bạn.",
        "passwordreset-emailsentusername": "Nếu một địa chỉ thư điện tử đã gắn với tên người dùng này thì một thư điện tử để đặt lại mật khẩu sẽ được gửi đến.",
-       "passwordreset-emailsent-capture2": "Đã gửi {{PLURAL:$1|thư điện tử|các thư điện tử}} để đặt lại mật khẩu. {{PLURAL:$1|Tên người dùng và mật khẩu|Các tên người dùng và mật khẩu}} được liệt kê dưới đây.",
-       "passwordreset-emailerror-capture2": "Không gửi được thư điện tử đến {{GENDER:$2}}người dùng: $1 {{PLURAL:$3|Tên người dùng và mật khẩu|Các tên người dùng và mật khẩu}} được liệt kê dưới đây.",
        "passwordreset-nocaller": "Yêu cầu hàm gọi",
        "passwordreset-nosuchcaller": "Hàm gọi không tồn tại: $1",
        "passwordreset-ignored": "Tác vụ đặt lại mật khẩu không được xử lý. Có lẽ trình cung cấp chưa được cấu hình?",
-       "passwordreset-invalideamil": "Địa chỉ thư điện tử không hợp lệ",
+       "passwordreset-invalidemail": "Địa chỉ thư điện tử không hợp lệ",
        "passwordreset-nodata": "Cả tên người dùng và địa chỉ thư điện tử bị thiếu",
        "changeemail": "Đổi hoặc gỡ địa chỉ thư điện tử",
        "changeemail-header": "Điền biểu mẫu này để đổi địa chỉ thư điện tử của bạn. Nếu bạn muốn gỡ địa chỉ thư điện tử nào khỏi tài khoản của bạn, để trống hộp địa chỉ thư điện tử mới và lưu biểu mẫu.",
        "prefs-help-recentchangescount": "Số này bao gồm các thay đổi gần đây, lịch sử trang, và nhật trình.",
        "prefs-help-watchlist-token2": "Đây là chìa khóa bí mật cho nguồn cấp dữ liệu danh sách theo dõi của bạn.\nBất cứ ai biết nó sẽ có thể để đọc danh sách theo dõi của bạn, vì vậy đừng chia sẻ nó.\n[[Special:ResetTokens|Nhấn chuột vào đây nếu bạn cần phải thiết lập lại nó]].",
        "savedprefs": "Đã lưu các tùy chọn cá nhân.",
-       "savedrights": "Đã lưu các quyền hạn của người dùng {{GENDER:$1}}$1.",
+       "savedrights": "Đã lưu các nhóm người dùng của {{GENDER:$1}}$1.",
        "timezonelegend": "Múi giờ:",
        "localtime": "Giờ hiện tại:",
        "timezoneuseserverdefault": "Sử dụng giờ mặc định của wiki ($1)",
        "prefswarning-warning": "Bạn chưa lưu những thay đổi tùy chọn đã thực hiện.\nNếu bạn rời khỏi trang này mà không bấm “$1”, các tùy chọn của bạn sẽ không được cập nhật.",
        "prefs-tabs-navigation-hint": "Mẹo: Bạn có thể bấm các phím mũi tên trái phải để luân chuyển qua các thẻ trong danh sách thẻ.",
        "userrights": "Quản lý quyền thành viên",
-       "userrights-lookup-user": "Quản lý nhóm thành viên",
+       "userrights-lookup-user": "Chọn thành viên",
        "userrights-user-editname": "Nhập tên thành viên:",
-       "editusergroup": "Sửa nhóm {{GENDER:$1}}người dùng",
+       "editusergroup": "Tải nhóm người dùng",
        "editinguser": "Thay đổi quyền hạn của người dùng <strong>[[User:$1|$1]]</strong> $2",
        "userrights-editusergroup": "Sửa nhóm thành viên",
        "saveusergroups": "Lưu nhóm {{GENDER:$1}}người dùng",
        "userrights-reason": "Lý do:",
        "userrights-no-interwiki": "Bạn không có quyền thay đổi quyền hạn của thành viên tại các wiki khác.",
        "userrights-nodatabase": "Cơ sở dữ liệu $1 không tồn tại hoặc nằm ở bên ngoài.",
-       "userrights-nologin": "Bạn phải [[Special:UserLogin|đăng nhập]] vào một tài khoản có quyền quản lý để gán quyền cho thành viên.",
-       "userrights-notallowed": "Bạn không có quyền gán hoặc bãi miễn quyền cho thành viên.",
        "userrights-changeable-col": "Những nhóm bạn có thể thay đổi",
        "userrights-unchangeable-col": "Những nhóm bạn không thể thay đổi",
        "userrights-conflict": "Mâu thuẫn thay đổi sửa nhóm thành viên! Xin vui lòng xem lại và xác nhận các thay đổi của bạn.",
-       "userrights-removed-self": "Bạn đã loại bỏ quyền của chính mình nên không còn truy cập được trang này.",
        "group": "Nhóm:",
        "group-user": "Thành viên thông thường",
        "group-autoconfirmed": "Thành viên tự xác nhận",
        "right-siteadmin": "Khóa và mở khóa cơ sở dữ liệu",
        "right-override-export-depth": "Xuất trang kèm theo các trang được liên kết đến với độ sâu tối đa là 5",
        "right-sendemail": "Gửi thư điện tử cho thành viên khác",
-       "right-passwordreset": "Xem các thư điện tử đặt lại mật khẩu",
        "right-managechangetags": "Tạo và bật/tắt [[Special:Tags|thẻ]]",
        "right-applychangetags": "Áp dụng [[Special:Tags|thẻ]], cùng với những thay đổi của một người",
        "right-changetags": "Thêm và loại bỏ tùy ý các [[Special:Tags|thẻ]] vào các phiên bản riêng và các mục nhật trình",
        "grant-basic": "Quyền cơ bản",
        "grant-viewdeleted": "Xem các trang và tập tin đã xóa",
        "grant-viewmywatchlist": "Xem danh sách theo dõi của bạn",
+       "grant-viewrestrictedlogs": "Xem mục nhật trình hạn chế",
        "newuserlogpage": "Nhật trình mở tài khoản",
        "newuserlogpagetext": "Đây là danh sách những tài khoản thành viên mở lên gần đây.",
        "rightslog": "Nhật trình cấp quyền thành viên",
        "apisandbox-continue": "Tiếp tục",
        "apisandbox-continue-clear": "Đặt lại",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} sẽ [https://www.mediawiki.org/wiki/API:Query#Continuing_queries tiếp tục] lời yêu cầu cuối cùng; {{int:apisandbox-continue-clear}} sẽ đặt lại các tham số có liên quan đến chức năng tiếp tục yêu cầu.",
+       "apisandbox-param-limit": "Nhập <kbd>max</kbd> để sử dụng hạn chế tối đa.",
+       "apisandbox-multivalue-all-namespaces": "$1 (Tất cả các không gian tên)",
+       "apisandbox-multivalue-all-values": "$1 (Tất cả các giá trị)",
        "booksources": "Nguồn sách",
        "booksources-search-legend": "Tìm kiếm nguồn sách",
        "booksources-search": "Tìm kiếm",
        "booksources-text": "Dưới đây là danh sách những trang bán sách mới và cũ, đồng thời có thể có thêm thông tin về những cuốn sách bạn đang tìm:",
        "booksources-invalid-isbn": "ISBN mà bạn cung cấp dường như không đúng; xin hãy kiểm tra lại xem có lỗi gì khi sao chép từ nội dung gốc hay không.",
+       "magiclink-tracking-rfc": "Trang sử dụng liên kết tự động RFC",
+       "magiclink-tracking-rfc-desc": "Trang sử dụng liên kết tự động RFC. Xem thông tin về cách chuyển đổi tại [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
+       "magiclink-tracking-pmid": "Trang sử dụng liên kết tự động PMID",
+       "magiclink-tracking-pmid-desc": "Trang sử dụng liên kết tự động PMID. Xem thông tin về cách chuyển đổi tại [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
+       "magiclink-tracking-isbn": "Trang sử dụng liên kết tự động ISBN",
+       "magiclink-tracking-isbn-desc": "Trang sử dụng liên kết tự động ISBN. Xem thông tin về cách chuyển đổi tại [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org].",
        "specialloguserlabel": "Người thực hiện:",
        "speciallogtitlelabel": "Mục tiêu (tiêu đề hoặc {{ns:user}}:Tên-người-dùng đối với người dùng):",
        "log": "Nhật trình",
        "activeusers-intro": "Dánh sách này liệt kê các thành viên đã hoạt động cách nào đó trong $1 ngày qua.",
        "activeusers-count": "$1 tác vụ trong {{PLURAL:$3|ngày|$3 ngày}} qua",
        "activeusers-from": "Hiển thị thành viên bắt đầu từ:",
-       "activeusers-hidebots": "Ẩn robot",
-       "activeusers-hidesysops": "Ẩn bảo quản viên",
+       "activeusers-groups": "Xem những người dùng theo nhóm:",
+       "activeusers-excludegroups": "Trừ những người dùng thuộc các nhóm:",
        "activeusers-noresult": "Không thấy thành viên.",
        "activeusers-submit": "Xem người dùng tích cực",
        "listgrouprights": "Nhóm thành viên",
        "modifiedarticleprotection": "đã đổi mức khóa cho “[[$1]]”",
        "unprotectedarticle": "đã mở khóa cho “[[$1]]”",
        "movedarticleprotection": "đã di chuyển thiết lập khóa trang từ “[[$2]]” đến “[[$1]]”",
+       "protectedarticle-comment": "{{GENDER:$2}}Đã khóa “[[$1]]”",
+       "modifiedarticleprotection-comment": "Đã {{GENDER:$2|thay đổi mức khóa}} của “[[$1]]”",
+       "unprotectedarticle-comment": "{{GENDER:$2}}Đã mở khóa “[[$1]]”",
        "protect-title": "Thiết lập mức khóa cho “$1”",
        "protect-title-notallowed": "Xem mức khóa cho “$1”",
        "prot_1movedto2": "[[$1]] đổi thành [[$2]]",
        "movelogpagetext": "Dưới đây là danh sách các trang đã được di chuyển.",
        "movesubpage": "{{PLURAL:$1|Trang con|Các trang con}}",
        "movesubpagetext": "Trang này có $1 trang con như hiển thị dưới đây.",
+       "movesubpagetalktext": "Trang thảo luận tương ứng có $1 trang con như hiển thị dưới đây.",
        "movenosubpage": "Trang này không có trang con.",
        "movereason": "Lý do:",
        "revertmove": "lùi lại",
        "pageinfo-category-pages": "Số trang",
        "pageinfo-category-subcats": "Số thể loại con",
        "pageinfo-category-files": "Số tập tin",
+       "pageinfo-user-id": "ID người dùng",
        "markaspatrolleddiff": "Đánh dấu tuần tra",
        "markaspatrolledtext": "Đánh dấu tuần tra trang này",
        "markaspatrolledtext-file": "Đánh dấu đã tuần tra phiên bản file này",
        "patrol-log-header": "Đây là nhật trình tuần tra phiên bản.",
        "log-show-hide-patrol": "$1 nhật trình tuần tra",
        "log-show-hide-tag": "Nhật trình đánh dấu $1",
+       "confirm-markpatrolled-button": "OK",
+       "confirm-markpatrolled-top": "Đánh dấu tuần tra phiên bản $3 của $2?",
        "deletedrevision": "Đã xóa phiên bản cũ $1",
        "filedeleteerror-short": "Lỗi xóa tập tin: $1",
        "filedeleteerror-long": "Có lỗi khi xóa tập tin:\n\n$1",
        "newimages-showbots": "Xem các tập tin do bot tải lên",
        "newimages-hidepatrolled": "Ẩn tập tin tải lên đã tuần tra",
        "noimages": "Chưa có hình.",
+       "gallery-slideshow-toggle": "Bật/tắt hình nhỏ",
        "ilsubmit": "Tìm kiếm",
        "bydate": "theo ngày",
        "sp-newimages-showfrom": "Trưng bày các tập tin từ $2 $1 trở về sau",
        "tags-deactivate": "vô hiệu",
        "tags-hitcount": "$1 thay đổi",
        "tags-manage-no-permission": "Bạn không có quyền hạn để quản lý các thẻ thay đổi.",
-       "tags-manage-blocked": "Bạn không thể quản lý thẻ đánh dấu trong lúc bị cấm.",
+       "tags-manage-blocked": "{{GENDER:$1}}Bạn không thể quản lý thẻ đánh dấu trong lúc bị cấm.",
        "tags-create-heading": "Tạo một thẻ mới",
        "tags-create-explanation": "Theo mặc định, các thẻ mới được tạo ra sẽ được hợp lệ hóa để người dùng và các bot sử dụng.",
        "tags-create-tag-name": "Tên thẻ:",
        "tags-deactivate-not-allowed": "Không thể vô hiệu hóa thẻ “$1”.",
        "tags-deactivate-submit": "Vô hiệu",
        "tags-apply-no-permission": "Bạn không có quyền áp dụng các thẻ thay đổi cùng các thay đổi của bạn.",
-       "tags-apply-blocked": "Bạn không thể thay đổi các thẻ đánh dấu cùng với các thay đổi của bạn trong lúc bị cấm.",
+       "tags-apply-blocked": "{{GENDER:$1}}Bạn không thể thay đổi các thẻ đánh dấu cùng với các thay đổi của bạn trong lúc bị cấm.",
        "tags-apply-not-allowed-one": "Thẻ “$1” không được phép được áp dụng thủ công.",
        "tags-apply-not-allowed-multi": "{{PLURAL:$2|Thẻ|Các thẻ}} sau không được phép áp dụng thủ công: $1",
        "tags-update-no-permission": "Bạn không có quyền thêm hoặc loại bỏ các thẻ thay đổi từ phiên bản riêng hoặc mục nhật trình.",
-       "tags-update-blocked": "Bạn không thể gắn hoặc gỡ thẻ đánh dấu trong lúc bị cấm.",
+       "tags-update-blocked": "{{GENDER:$1}}Bạn không thể gắn hoặc gỡ thẻ đánh dấu trong lúc bị cấm.",
        "tags-update-add-not-allowed-one": "Thẻ “$1” không được phép thêm vào thủ công.",
        "tags-update-add-not-allowed-multi": "{{PLURAL:$2|Thẻ|Các thẻ}} sau không được phép thêm thủ công: $1",
        "tags-update-remove-not-allowed-one": "Thẻ đánh dấu “$1” không được phép loại bỏ.",
        "htmlform-user-not-exists": "<strong>$1</strong> không tồn tại.",
        "htmlform-user-not-valid": "<strong>$1</strong> không phải là tên người dùng.",
        "logentry-delete-delete": "$1 {{GENDER:$2}}đã xóa trang “$3”",
+       "logentry-delete-delete_redir": "$1 {{GENDER:$2}}đã xóa trang đổi hướng $3 bằng cách ghi đè",
        "logentry-delete-restore": "$1 {{GENDER:$2}}đã phục hồi trang “$3”",
        "logentry-delete-event": "$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một mục nhật trình|$5 mục nhật trình}} về $3: $4",
        "logentry-delete-revision": "$1 {{GENDER:$2}}đã thay đổi mức hiển thị của {{PLURAL:$5|một phiên bản|$5 phiên bản}} trang $3: $4",
        "feedback-thanks": "Cảm ơn! Phản hồi của bạn đã được đăng lên trang “[$2 $1]”.",
        "feedback-thanks-title": "Cảm ơn!",
        "feedback-useragent": "Tác nhân người dùng:",
-       "searchsuggest-search": "Tìm kiếm",
+       "searchsuggest-search": "Tìm kiếm {{SITENAME}}",
        "searchsuggest-containing": "có chứa…",
        "api-error-autoblocked": "Địa chỉ IP của bạn bị cấm tự động vì nó đã được sử dụng bởi một người dùng bị cấm.",
        "api-error-badaccess-groups": "Bạn không được phép tải tập tin lên wiki này.",
        "mw-widgets-dateinput-placeholder-month": "YYYY-MM (năm-tháng)",
        "mw-widgets-titleinput-description-new-page": "trang này chưa tồn tại",
        "mw-widgets-titleinput-description-redirect": "đổi hướng đến $1",
+       "mw-widgets-categoryselector-add-category-placeholder": "Thêm thể loại…",
        "sessionmanager-tie": "Không thể kết hợp nhiều yêu cầu xác thực loại: $1.",
        "sessionprovider-generic": "phiên $1",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "phiên dựa trên cookie",
        "log-action-filter-contentmodel-change": "Thay đổi kiểu nội dung",
        "log-action-filter-contentmodel-new": "Tạo trang có kiểu nội dung không chuẩn",
        "log-action-filter-delete-delete": "Xóa trang",
+       "log-action-filter-delete-delete_redir": "Ghi đè trang đổi hướng",
        "log-action-filter-delete-restore": "Phục hồi trang",
        "log-action-filter-delete-event": "Xóa nhật trình",
        "log-action-filter-delete-revision": "Xóa phiên bản",
        "authmanager-authn-autocreate-failed": "Thất bại khi tự động tạo tài khoản địa phương: $1",
        "authmanager-change-not-supported": "Không thể thay đổi định danh được cung cấp, vì sẽ không có gì sử dụng nó.",
        "authmanager-create-disabled": "Chứng năng tạo tài khoản được tắt.",
-       "authmanager-create-from-login": "Để tạo tài khoản của mình, xin hãy điền vào các thông tin bên dưới.",
+       "authmanager-create-from-login": "Để tạo tài khoản của mình, xin hãy điền vào các thông tin.",
        "authmanager-create-not-in-progress": "Không phải đang tạo tài khoản, hoặc dữ liệu phiên làm việc bị mất. Xin hãy thử lại từ đầu.",
        "authmanager-create-no-primary": "Không thể sử dụng định danh được cung cấp để tạo tài khoản.",
        "authmanager-link-no-primary": "Không thể sử dụng định danh được cung cấp để liên kết tài khoản.",
index 0f2b80e..c4d76c3 100644 (file)
        "yourname": "Benudsârnôômâ",
        "yourpassword": "Bhaswôrd:",
        "yourpasswordagain": "Bassworrd widderhulln:",
-       "remembermypassword": "Miid den Brauser dauerhafd ogmeld bleim (maximal $1 {{PLURAL:$1|Dooch|Dooch}})",
        "login": "Ôômeldn",
        "nav-login-createaccount": "Oomeldn / Ghondoo ooleeng",
        "userlogin": "Ôômeldn / Als Bajdräächâr ajschrajm",
index 71f37b9..52d2d5b 100644 (file)
        "listusers-noresult": "Geban nonik petuvon.",
        "listusers-blocked": "(pebloköl)",
        "activeusers-count": "{{PLURAL:$1|dunot|dunots}} $1 ün {{PLURAL:$3|del lätik|dels lätik $3}}",
-       "activeusers-hidebots": "Klänedolöd elis bot",
-       "activeusers-hidesysops": "Klänedolöd guvanis",
        "activeusers-noresult": "Geban nonik petuvon.",
        "listgrouprights": "Gitäts gebanagrupa",
        "listgrouprights-summary": "Is palisedons gebanagrups in vük at dabinöls, sa gitäts tefik onsik.\nBa dabinons [[{{MediaWiki:Listgrouprights-helppage}}|nüns pluik]] tefü gebanagitäts patik.",
        "logentry-newusers-create": "Gebanakal: $1 pejafon",
        "rightsnone": "(nonik)",
        "revdelete-summary": "plän redakama",
-       "feedback-error-title": "Pöl",
        "feedback-subject": "Yegäd:",
        "searchsuggest-search": "Suk",
        "searchsuggest-containing": "ninädöl...",
index ef9200d..d1460b8 100644 (file)
        "yourname": "Cäüttijänimi:",
        "yourpassword": "Salasõna",
        "yourpasswordagain": "Tõissaga salain-sõna:",
-       "remembermypassword": "Mäleht minuu (enintään $1 {{PLURAL:$1|päivä|päivää}})",
        "login": "Cirjut süäme",
        "nav-login-createaccount": "Cirjut süäme vai registriiroit cäüttijässi",
        "userlogin": "Cirjut süäme",
index 9937693..de1dd5f 100644 (file)
        "booksources": "Sourdants po les lives",
        "booksources-search-legend": "Cweri des sourdants po des lives",
        "booksources-search": "Cweri",
+       "booksources-invalid-isbn": "L'ISBN ki vos avoz scrît n' est nén bon; sayîz del raveuri, s' i vs plait",
+       "magiclink-tracking-pmid": "Pådje avou des hårdêyes otomatikes PMID",
+       "magiclink-tracking-isbn": "Pådjes avou des hårdêyes otomatikes ISBN",
+       "magiclink-tracking-isbn-desc": "So cisse pådje cial, gn a ene hårdêye otomatike ISBN. Loukîz so [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] po vey kimint aler dsu",
        "specialloguserlabel": "Fwait pa:",
        "speciallogtitlelabel": "Såme (tite ou uzeu):",
        "log": "Djournås",
        "listusers-submit": "Vey",
        "listusers-noresult": "Nol uzeu di trové.",
        "listusers-blocked": "({{GENDER:$1|bloké|blokêye}})",
-       "activeusers-hidebots": "Catchî les robots",
        "listgrouprights-members": "(djivêye des mimbes)",
        "mailnologin": "Nole adresse d' evoyeu",
        "mailnologintext": "Po-z evoyî èn emile a èn ôte uzeu i vs fåt esse [[Special:UserLogin|elodjî]] eyet aveur ene adresse emile d' evoyeu ki soeye valide dins vos [[Special:Preferences|preferinces]].",
index 9f36244..9a4f66e 100644 (file)
        "yourpasswordagain": "Utroha pagbutang an tigaman-han-pagsakob:",
        "createacct-yourpasswordagain": "Igkompirma an tigaman-pagsakob",
        "createacct-yourpasswordagain-ph": "Igbutang an tigaman-pagsakob utro",
-       "remembermypassword": "Hinumdumi an akon pan-sakob dinhi nga panngaykay ''(browser)'' (para ha pinakamaiha $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}})",
        "userlogin-remembermypassword": "I-log-in la ako",
        "userlogin-signwithsecure": "Gamit hin koneksyon nga nakakasegurado",
        "cannotloginnow-title": "Diri nakakalog-in yana",
        "botpasswords-label-delete": "Paraa",
        "botpasswords-label-resetpassword": "Igreset an password",
        "botpasswords-label-grants": "Mga applicable grant",
-       "botpasswords-label-restrictions": "Mga gindidiri ha paggamit:",
        "botpasswords-label-grants-column": "Ginhatag",
        "botpasswords-bad-appid": "An ngaran han bot nga \"$1\" in diri puydi gamiton.",
        "botpasswords-insert-failed": "Pakyas han pagdugang han ngaran han bot nga \"$1\". Naidugang na ini?",
        "passwordreset-emailtext-ip": "Mayda gumaramit (bangin hi ikaw, tikang han IP adres nga $1) nga naghangyo hin reset han imo tigaman-pansulod han {{SITENAME}} ($4). An nasunod nga gumaramit {{PLURAL:$3|nga akawnt|nga mga akawnt}} nahanungod hini nga email nga adres: \n\n$2\n\n{{PLURAL:$3|Iní nga temporaryo nga tigaman-pansulod|Iní nga mga temporaryo nga tigaman-pansulod}} ma-waray bali hin {{PLURAL:$5|usa ka adlaw|$5 nga mga adlaw}}.\nAngay ka sumakob ngan pumílì hin bag-o nga tigaman-pansulod ha yanâ.  Kun mayda lain nga naghatag hini nga hangyo, o kun nahinumdoman mo an imo orihinal nga tigaman-pansulod, ngan nadírì ka na pagbalyo hiní, puyde mo pasagdan ini nga sumat ngan magpadayon hin paggamit han imo daan nga tigaman-pansulod.",
        "passwordreset-emailelement": "Agnay han gumaramit: \n$1\n\nTemporaryo nga tigaman han pagsakob: \n$2",
        "passwordreset-emailsentemail": "Kun inin nga email address in may pagkahisumpay ha imo account, papadangaton ka hin usa nga password reset email.",
-       "passwordreset-emailsent-capture": "Ginpadangat an password reset email, nga ginpakita ha ubos.",
-       "passwordreset-emailerror-capture": "Ginhimo an password reset email, kun diin nakikita ha ubos, pero pakyas an pagpadara ha  {{GENDER:$2|gumaramit}}: $1",
        "changeemail": "Igliwat o igtanggal an e-mail address",
        "changeemail-header": "Kompletoha ini nga form para masalyuan an imo email address. Kun karuyag nimo tanggalun an may pagkahisumpay han bisan ano nga email address tikang ha imo account, blankoha la an bag-o nga email address kun magsusumiti ka han form.",
-       "changeemail-passwordrequired": "Kinahanglan nim igbutang an imo password para igkompirma inin nga pagbag-o.",
        "changeemail-no-info": "Kinahanglanon mo mag-log-in para ka direkta makasakob hini nga pakli.",
        "changeemail-oldemail": "Yana nga e-mail address:",
        "changeemail-newemail": "Bag-o nga e-mail address:",
        "undo-norev": "An pagliwat in diri mapapawaray-buhat tungod waray ito dida o napara na.",
        "undo-summary": "Ginpawara-buhat an rebisyon nga $1 ni [[Special:Contributions/$2|$2]] ([[User talk:$2|himangrawi]])",
        "undo-summary-username-hidden": "Igpawara-an-ginbuhat nga rebisyon $1 han uska tago nga gumaramit",
-       "cantcreateaccounttitle": "Diri makakahimo hin akawnt",
        "cantcreateaccount-text": "An paghimo hin akawnt hini nga IP address  ('''$1''') in ginpugngan ni [[User:$3|$3]]. An rason nga ginhatag ni $3 in ''$2''",
        "viewpagelogs": "Kitaa an mga log para hini nga pakli",
        "nohistory": "Waray kaagi hin pagliwat hin nga pakli.",
        "listusers-blocked": "(ginpugngan)",
        "activeusers": "Taramdan hin mga gumaramit nga nanggigios",
        "activeusers-from": "Igpakita an mga gumaramit tikang ha:",
-       "activeusers-hidebots": "Igtago an mga bot",
-       "activeusers-hidesysops": "Igtago an mga magdudumara",
        "activeusers-noresult": "Waray gumaramit nga nahiagian.",
        "activeusers-submit": "Igpakita an mga gumaramit nga nangigios",
        "listgrouprights": "Mga katungod han grupo hin gumaramit",
        "feedback-back": "Balik",
        "feedback-cancel": "Pasagdi",
        "feedback-close": "Human na.",
-       "feedback-error-title": "Sayop",
        "feedback-error2": "Sayop: Pakyas an pagliwat",
        "feedback-message": "Mensahe:",
        "feedback-subject": "Himangrawon:",
index e9877a5..5197c00 100644 (file)
        "yourpasswordagain": "密码再打一遍:",
        "createacct-yourpasswordagain": "确认密码",
        "createacct-yourpasswordagain-ph": "再打一遍密码",
-       "remembermypassword": "来箇只浏览器上记牢我个登录状态(顶长$1天)",
        "userlogin-remembermypassword": "记牢我个登录状态",
        "userlogin-signwithsecure": "用保险链接",
        "yourdomainname": "侬个域名:",
index 7dae096..c27fc60 100644 (file)
        "yourname": "Демнәчнә нерн:",
        "yourpassword": "Нууц үг:",
        "yourpasswordagain": "Нууц үг давтн:",
-       "remembermypassword": "Намаг эн тоолдврд тодлх ($1 {{PLURAL:$1|1=өдрт|өдрмүдт}} икәр биш)",
        "yourdomainname": "Тана домен:",
        "login": "Орлһн",
        "nav-login-createaccount": "Орх/бүрткгдх",
index d67a289..51150e4 100644 (file)
        "yourpasswordagain": "კჷნე გეკორობით პაროლი:",
        "createacct-yourpasswordagain": "დადასურით პაროლი",
        "createacct-yourpasswordagain-ph": "ხოლო ართშა გენშიონით პაროლი",
-       "remembermypassword": "ქჷგიშინი ჩქიმი მიშულა თე ბრაუზერს (მაქსიმუმ $1 დღას)",
        "userlogin-remembermypassword": "ქუდომტე მიშულირო",
        "userlogin-signwithsecure": "უსაფრთხო კავშირის გამოყენება",
        "yourdomainname": "თქვან დომენ",
        "passwordreset-emailtext-user": "მომხმარებელმა $1 პროექტიდან {{SITENAME}} მოითხოვა თქვენი \nპაროლის თავიდან დაყენება საიტისათვის {{SITENAME}} ($4).\n{{PLURAL:$3|შემდეგი ანგარიში მიბმულია|შემდეგი ანგარიშები მიბმულია}} ამ ელ.ფოსტის მისამართზე:\n\n$2\n\n{{PLURAL:$3|ეს დროებითი პაროლი|ეს დროებითი პაროლები}} იმოქმედებს {{PLURAL:$5|ერთი დღე|$5 დღე}}.\nთქვენ უნდა შეხვიდეთ სისტემაში და აირჩიოთ ახალი პაროლი.\nთუ თქვენ არ გაგიკეთებიათ აღნიშნული მოთხოვნა, ან გაიხსენეთ თქვენი პაროლი\nდა აღარ გსურთ მისი შეცვლა, მაშინ შეგიძლიათ იგნორირება გაუკეთოთ ამ შეტყობინებას\nდა გააგრძელოთ თქვენი ძველი პაროლის გამოყენება.",
        "passwordreset-emailelement": "მომხმარებლის სახელი: \n$1\n\nდროებითი პაროლი: \n$2",
        "passwordreset-emailsentemail": "პაროლის თავიდან დასაყენებელი ელ.ფოსტა გაიგზავნა.",
-       "passwordreset-emailsent-capture": "ქვემოთ ნაჩვენები პაროლის თავიდან დასაყენებელი წერილი გაიგზავნა.",
-       "passwordreset-emailerror-capture": "ქვემოთ მოცემულია შექმნილი პაროლის დასაყენებელი წერილი, რომლის გაგზავნაც {{GENDER:$2|მომხმარებელთან}} ვერ მოხერხდა: $1 გამო",
        "changeemail": "გენშიონით თქვანი ელ. ფოსტაშ ოწურაფუ",
        "changeemail-header": "შეავსეთ ეს ფორმა თქვენი ელ-ფოსტის მისამართის შესაცვლელად. თქვენი პაროლის შეყვანა დაგჭირდებათ ამ ცვლილების დასადასტურებლად.",
        "changeemail-no-info": "კონკრეტულად ამ გვერდთან სამუშაოდ თქვენ უნდა წარადგინოთ თავი სისტემისადმი.",
        "undo-norev": "რედაქტირება ვერ გაუქმდება რადგანაც არ არსებობს ან წაშლილი იქნა.",
        "undo-nochange": "როგორც ჩანს, რედაქტირება უკვე გაუქმდა.",
        "undo-summary": "[[Special:Contributions/$2|$2-ის]]([[User talk:$2|განხილვა]]) ცვლილებების გაუქმება (№$1)",
-       "cantcreateaccounttitle": "ანგარიშის შექმნა ვერ ხერხდება",
        "cantcreateaccount-text": "ამ IP-მისამართიდან აიკრძალა (<strong>$1</strong>) მომხმარებელ [[User:$3|$3]]-ის მიერ.\n\n$3-მა მიუთითა შემდეგი მიზეზი: <em>$2</em>",
        "viewpagelogs": "თე ხასჷლაშო ორეგისტრაციე ჟურნალეფიშ ძირაფა",
        "nohistory": "ამ გვერდს განხილვის გვერდი ცარიელი აქვს.",
        "feedback-external-bug-report-button": "ტექნიკური დავალების გაგზავნა",
        "feedback-dialog-title": "გამოხმაურების გაგზავნა",
        "feedback-dialog-intro": "თქვენ შეგიძლიათ ისარგებლოთ ქვემოთ არსებული მარტივი ფორმით, რათა დატოვოთ თქვენი გამოძახილი. კომენტარები თქვენ მომხმარებლის სახელთან ერთად დამატებული იქნება \"$1\" გვერდზე",
-       "feedback-error-title": "ჩილათა",
        "feedback-error1": "შეცდომა. API-ს მოულოდნელი რეზულტატი",
        "feedback-error2": "შეცდომა: რედაქტირება ვერ განხორციელდა",
        "feedback-error3": "შეცდომა. არ არის API-ს პასუხი",
index d2f0247..8a9f6f1 100644 (file)
        "passwordreset-emailsentusername": "טאמער איז פאראן אן ע־פאסט אדרעס פארקניפט מיט דעם באניצער־נאמען, וועט מען שיקן א פאסווארט צוריקשטעלן ע-פּאָסט.",
        "passwordreset-nocaller": "מען דארף פֿארזארגן א רופֿער",
        "passwordreset-nosuchcaller": "רופֿער איז נישט פֿאראן: $1",
-       "passwordreset-invalideamil": "אומגילטיקער ע־פאסט אדרעס",
+       "passwordreset-invalidemail": "אומגילטיקער ע־פאסט אדרעס",
        "changeemail": "ענדערן אדער אראפנעמען ע-פּאָסט אַדרעס",
        "changeemail-header": "דערגאַנצט די פֿאָרעם צו ענדערן אייער ע-פּאָסט אַדרעס .\nטאמער ווילט איר אראפנעמען די צוארדנונג פון איינעם פון אייערע ע־פאסט אדרעסן פו אייער קאנטע, לאזט ליידיג דעם נייעם ע־פאסט אדרעס ווען איר גיט איין די פֿארעם.",
        "changeemail-no-info": "איר דאַרפֿט זיין אַרײַנלאגירט צוצוקומען גלײַך צו דעם דאָזיגן בלאַט.",
        "activeusers-intro": "דאָס איז א ליסטע פֿון באַניצער וואָס זענען געווען אַקטיוו אינערהאָלב  $1 {{PLURAL:$1|דעם לעצטן טאָג|די לעצטע $1 טעג}}.",
        "activeusers-count": "$1 {{PLURAL:$1|פעולה|פעולות}} אין  {{PLURAL:$3|דעם לעצטן טאָג|די לעצטע $3 טעג}}",
        "activeusers-from": "ווײַזן באַניצער אָנהייבנדיג פון:",
-       "activeusers-hidebots": "באַהאַלטן באטן",
-       "activeusers-hidesysops": "באַהאַלטן סיסאפן",
        "activeusers-noresult": "קיין באניצער נישט געטראפֿן.",
        "activeusers-submit": "ווייזן טעטיגע באניצער",
        "listgrouprights": "באַניצער גרופע רעכטן",
index 1c41e4a..bd8577c 100644 (file)
@@ -15,6 +15,7 @@
        "tog-hideminor": "Ìbòmọ́lẹ̀ àwọn àtúnṣe kékeré nínú àwọn àtúnse tuntun",
        "tog-hidepatrolled": "Ìbòmọ́lẹ̀ àwọn àtúnṣe oníìṣọ́ nínú àwọn àtúnṣe tuntun",
        "tog-newpageshidepatrolled": "Ìbòmọ́lẹ̀ àwọn ojúewé oníìṣọ́ lọ́dọ̀ àtòjọ ojúewé tuntun",
+       "tog-hidecategorization": "Ìbòmọ́lẹ̀ ìṣeẹ̀ka àwọn ojúewé",
        "tog-extendwatchlist": "Ìfẹ̀ àmójútó láti ṣ'àfihàn gbogbo àtúnṣe, kìí ṣe tuntun nìkan",
        "tog-usenewrc": "Ìtò àwọn àtúnṣe gẹ́gẹ́bí ojúewé nínú àwọn àtúnṣe tuntun àti ìmújútó",
        "tog-numberheadings": "Àwọn àkọlé nọmba-araẹni",
@@ -25,6 +26,7 @@
        "tog-watchdefault": "Ṣ'àfikún àwọn ojúewé àti fáìlì tí mo ṣ'àtúnse mọ́ ìmójútó mi",
        "tog-watchmoves": "Ṣ'àfikún àwọn ojúewé ati fáìlì tí mo yípò mọ́ ìmójútó mi",
        "tog-watchdeletion": "Ṣ'àfikún àwọn ojúewé àti fáìlì tí mo parẹ́ mọ́ ìmójútó mi",
+       "tog-watchuploads": "Ìdàpọ̀ àwọn fáìlì tuntun sí ìmójútó mi",
        "tog-minordefault": "Se àmì sí gbogbo àtúnse gẹ́gẹ́ bi kékeré lát'ìbẹ̀rẹ̀.",
        "tog-previewontop": "Se àyẹ̀wò kí ẹ tó s'àtúnṣe",
        "tog-previewonfirst": "S'àfihàn àgbéwò fún àtúnse àkọ́kọ́",
@@ -33,7 +35,7 @@
        "tog-enotifminoredits": "Fi e-mail ránṣẹ́ sí mi bákannà fún àtúnṣe kékékèé sí àwọn ojúewé àti fáìlì",
        "tog-enotifrevealaddr": "Ṣ'àfihàn àdírẹ́ẹ̀sì e-mail mi nínú àwọn ìránṣẹ́ e-mail",
        "tog-shownumberswatching": "S'àfihàn iye àwọn oníṣe tí wọn tẹjú mọ́ọ",
-       "tog-oldsig": "Ìtọwọ́bọ̀wé tówà:",
+       "tog-oldsig": "Ìtọwọ́bọ̀wé yín tówà lọ́wọ́:",
        "tog-fancysig": "Ṣe ìtọwọ́bọ̀wé bíi ìkọ wiki (láìní ìjápọ̀ fúnrararẹ̀)",
        "tog-uselivepreview": "Ìlo àkọ́kọ́yẹ̀wò lẹ́ṣẹ̀kẹṣẹ̀ (àdánwò)",
        "tog-forceeditsummary": "Kìlọ̀ fún mi tí àkótán àtúnṣe bá jẹ́ òfo",
        "passwordreset-emaildisabled": "Ìdálẹ́kun lílo email lórí wiki yìí.",
        "passwordreset-username": "Orúkọ oníṣe:",
        "passwordreset-domain": "Àbùgbé:",
-       "passwordreset-capture": "Wo e-mail tí yíò jáde?",
-       "passwordreset-capture-help": "Tí ẹ bá fagi sínú àpótí yìí, e-mail náà (pẹ̀lú ọ̀rọ̀ìpamọ́ onígbàdíẹ̀) yíò hàn si yín bákannáà yíò jẹ́ fífiránṣẹ́ sí oníṣe náà.",
        "passwordreset-email": "Àdírẹ̀sì e-mail:",
        "passwordreset-emailtitle": "Àwọn ẹ̀kúnrẹ́rẹ́ àpamọ́ lórí {{SITENAME}}",
        "passwordreset-emailtext-ip": "Ẹnìkan (bóyá ẹ̀yin ni, láti àdírẹ̀sì IP $1) tọrọ àtúntò ọ̀rọ̀ìpamọ́ yín fún {{SITENAME}} ($4). {{PLURAL:$3|Àkópamọ́|Àwọn àkópamọ́}} oníṣe ìsàlẹ̀ yìí ní ìbáṣe pọ̀ mọ́ àdírẹ̀sì e-mail yìí:\n\n$2\n\n{{PLURAL:$3|Ọ̀rọ̀ìpamọ́ onígbàdíẹ̀ yìí|Àwọn ọ̀rọ̀ìpamọ́ onígbàdíẹ̀ wọ̀nyí}} yíò dópin lẹ́yìn {{PLURAL:$5|ọjọ́ kan|ọjọ́ $5}}.\nẸ gbọ́dọ̀ lọ yan ọ̀rọ̀ìpamọ́ tuntun báyìí. Tóbá jẹ́ pé ẹ̀lòmíràn ló ṣe ìtọrọ yìí, tàbí tọ́bá jẹ́ pé ẹ ti rántí ọ̀rọ̀ìpamọ́ àtètèkọ́ṣe yín, tí ẹ kọ̀ sí fẹ́ yíipadà mọ́, ẹ lé ṣàìkàsí ìránṣẹ́ yìí, kí ẹ sì tẹ̀síwájú ní lo ọ̀rọ̀ìpamọ́ àtijọ́ yín.",
        "search-section": "(abala $1)",
        "search-suggest": "Ṣé ẹ fẹ́: $1",
        "search-interwiki-caption": "Àwọn iṣẹ́-ọwọ́ mìràn",
-       "search-interwiki-default": "èsì $1",
+       "search-interwiki-default": "Ã\81wá»\8dn Ã¨sì láti $1:",
        "search-interwiki-more": "(tókù)",
        "search-relatedarticle": "Tóbáramu",
        "searchrelated": "tóbáramu",
        "userrights-reason": "Ìdíẹ̀:",
        "userrights-no-interwiki": "Ẹ kò ní ìyọ̀nda láti ṣàtúnṣe àwọn ẹ̀tọ́ oníṣe lórí àwọn wiki míràn.",
        "userrights-nodatabase": "Ibùdó dátà $1 kò sí tàbí kò sí lábẹ́lé.",
-       "userrights-nologin": "Ẹ gbọ́dọ̀ [[Special:UserLogin|wọlé]] pẹ̀lú àpamọ́ alámòójútó láti pín àwọn ẹ̀tọ́ oníṣe.",
-       "userrights-notallowed": "Àpamọ́ yín kò ní ìyọ̀nda láti ṣàfikún tàbí ṣàyọkúrò àwọn ẹ̀tọ́ oníṣe.",
        "userrights-changeable-col": "Àwọn ẹgbẹ́ tí ẹ le túnṣe",
        "userrights-unchangeable-col": "Àwọn ẹgbẹ́ tí ẹ kò le túnṣe",
        "group": "Ìdìpọ̀:",
        "right-siteadmin": "Ìtìpa àti ìṣí ibùdó dátà",
        "right-override-export-depth": "Ìkójáde àwọn ojúewé lámùúpọ̀ mọ́ àwọn ojúewé jíjápọ̀ títí dé ìbú 5",
        "right-sendemail": "Fi e-mail ránṣẹ́ sí àwọn oníṣe míràn",
-       "right-passwordreset": "Ìwo àwọn e-mail fún ìtúntò ọ̀rọ̀ìpamọ́",
        "newuserlogpage": "Àkọsílẹ̀ ìdá oníṣe",
        "newuserlogpagetext": "Àkọọ́lẹ̀ àwọn ìdá oníṣe nì yí.",
        "rightslog": "Àwọn ẹ̀tọ́ oníṣe",
        "action-read": "wo ojúewé yìí",
        "action-edit": "ṣàtúnṣe ojúewé yìí",
        "action-createpage": "dá ojúewé yìí",
-       "action-createtalk": "dá ojúewé ìfọ̀rọ̀wérọ̀",
+       "action-createtalk": "dá ojúewé ìfọ̀rọ̀wérọ̀ yìí",
        "action-createaccount": "dá àpamọ́ oníṣe yìí",
        "action-minoredit": "fagisí àtúnṣe yìí gẹ́gẹ́ bíi kékeré",
        "action-move": "yípò ojúewé yìí",
        "upload-too-many-redirects": "URL náà ní àwọn àtúnjúwe pípọ̀jùlọ",
        "upload-http-error": "Àṣìṣe HTTP ti ṣẹlẹ̀: $1",
        "upload-copy-upload-invalid-domain": "Àwòkọ àwọn ìrùsókè kò sí láti apá yìí.",
+       "upload-dialog-title": "Ìrùsókè fáìlì",
+       "upload-dialog-button-cancel": "Fagilé",
+       "upload-dialog-button-back": "Ẹ̀yìn",
+       "upload-dialog-button-save": "Ìmúpamọ́",
+       "upload-dialog-button-upload": "Ìrùsókè",
+       "upload-form-label-infoform-title": "Àwọn ẹ̀kúnrẹ́rẹ́",
+       "upload-form-label-infoform-name": "Orúkọ",
+       "upload-form-label-infoform-description": "Ìjúwe",
+       "upload-form-label-usage-title": "Ìlò",
+       "upload-form-label-usage-filename": "Ọrúkọ fáìlì",
+       "upload-form-label-own-work": "Iṣẹ́-ọwọ́ mi ló jẹ́",
+       "upload-form-label-infoform-categories": "Àwọn ẹ̀ka",
+       "upload-form-label-infoform-date": "Ọjọ́ọdún",
        "backend-fail-stream": "Kò le ṣe ìgbéhànjáde fáìlì \"$1\".",
        "backend-fail-backup": "Kò le ṣe àwòkọpamọ́ fáìlì \"$1\".",
        "backend-fail-notexists": "Fáìlì $1 kò sí.",
        "license-nopreview": "(Àkọ́yẹ̀wò kò sí)",
        "upload_source_url": " (URL oníìbámu kan tó ṣe é bọ́sí látigboro)",
        "upload_source_file": "(fáìlì lórí kọ̀mpútà yín)",
-       "listfiles-summary": "Ojúewé pàtàkì yìí ṣe àfihàn gbogbo àwọn fáìlì àrùsókè.\nTó bá jẹ́ jíjọ̀ gẹ́gẹ́bí oníṣe, àwọn fáìlì tí oníṣe náà tí ru àtúnyẹ̀wò tuntun sòkè sí nìkan ni yíò hàn.",
+       "listfiles-delete": "ìparẹ́",
+       "listfiles-summary": "Ojúewé pàtàkì yìí ṣe àfihàn gbogbo àwọn fáìlì tí a rùsókè.",
        "listfiles_search_for": "Ṣàwàrí fún orúkọ amóhùnmáwòrán:",
        "imgfile": "fáìlì",
        "listfiles": "Àkójọ \tfáìlì",
        "mostrevisions": "Àwọn ojúewé pẹ̀lu àwọn àtúnyẹ̀wò tópọ̀jùlọ",
        "prefixindex": "Gbogbo ojúewé tó ní ìtọ́ka ìpele",
        "prefixindex-namespace": "Gbogbo ojúewé pẹ̀lú àlẹ̀mọ́wájú (orúkọàyè $1)",
+       "prefixindex-submit": "Ìfihàn",
        "shortpages": "Àwọn ojúewé kúkúrú",
        "longpages": "Ojúewé gúngùn",
        "deadendpages": "Àwọn ojúewé aláìníjàápọ́",
        "protectedpages-indef": "Àwọn àbò aláìlópin",
        "protectedpages-cascade": "Àwọn àbò atẹ̀léra nìkan",
        "protectedpagesempty": "Kò sí àwọn ojúewé kankan tó ní àbò pẹ̀lú àwọn pàrámítà wọ̀nyí.",
+       "protectedpages-page": "Ojúewé",
+       "protectedpages-expiry": "Ìparí",
        "protectedtitles": "Àwọn àkọlé ajẹ́dídáàbòbò",
        "protectedtitlesempty": "Kò sí àwọn àkolé kankan tó ní àbò pẹ̀lú àwọn pàrámítà wọ̀nyí.",
        "listusers": "Àkójọ àwọn oníṣe",
        "activeusers-intro": "Èyí ni àtòjọ àwọn oníṣe tí wọ́n ní irú àgbéṣe kan láàrin {{PLURAL:$1|ọjọ́|ọjọ́}} $1 sẹ́yìn.",
        "activeusers-count": "{{PLURAL:$1|Àtúnṣe|Àwọn àtúnṣe}} $1 ní {{PLURAL:$3|ọjọ́|ọjọ́}} $3 sẹ́yìn",
        "activeusers-from": "Ìfihàn àwọn oníṣe nípa bíbẹ̀rẹ̀ láti:",
-       "activeusers-hidebots": "Ìbòmọ́lẹ̀ àwọn bọt",
-       "activeusers-hidesysops": "Ìbòmọ́lẹ̀ àwọn olùmójútó",
        "activeusers-noresult": "Kò rí oníṣe kankan.",
        "listgrouprights": "Àwọn ẹ̀tọ́ ẹgbẹ́ oníṣe",
        "listgrouprights-summary": "Nísàlẹ̀ ni àtòjọ àwọn ẹgbẹ́ oníṣe tó nítumọ̀ lórí wiki yìí, pẹ̀lú àwọn ẹ̀tọ́ lílò wọn.\nÓ ṣe é ṣe kí [[{{MediaWiki:Listgrouprights-helppage}}|ẹ̀kúnrẹ́rẹ́]] ó wà nípa ẹ̀tọ́ kọ̀ọ̀kan.",
        "wlheader-showupdated": "Àwọn ojúewé tí wọn ti yípadà látìgbà tí ẹ ṣàbẹ̀wò wọn gbẹ̀yìn jẹ́ fífihàn ní ''kedere'''",
        "wlnote": "Lábẹ́ {{PLURAL:$1|ni àtúnṣe tó gbẹ̀yìn|ni àwọn àtúnṣe '''$1''' tí wọn gbẹ̀yìn}} ní {{PLURAL:$2|wákàtí kan|wákàtí '''$2'''}} sẹ́yìn, títí dí ọjọ́ $3, $4.",
        "wlshowlast": "Ìfihàn wákàtí $1 sẹ́yìn ọjọ́ $2 sẹ́yìn",
+       "watchlist-hide": "Ìbòmọ́lẹ̀",
+       "watchlist-submit": "Ìfihàn",
+       "wlshowhideminor": "àwọn àtúnṣe kékéèké",
+       "wlshowhidebots": "àwọn bot",
        "watchlist-options": "Àṣàyàn ìmójútọ́",
        "watching": "Ó ún mójútó...",
        "unwatching": "Jíjáwọ́ ìmójútó...",
        "rollback-success": "Ìdápadà àwọn àtúnṣe ti $1;\njẹ́ yíyípadà sí àtúnyẹ̀wò tógbẹ̀yìn látọwọ́ $2.",
        "sessionfailure-title": "Ìkùnà ètò iṣẹ́",
        "sessionfailure": "Ó dà wípé ìsòro wà pẹ̀lú ìwọlé yín;\na ti fagilé gbogbo ohun tí ẹ ti ṣe nísìnsinyì kí ẹlòmíràn ó mọ́ baà ji mú.\nẸ padà sí ojúewé tó kọjá, ẹ tún ojúewé náà gbéjáde, kí ẹ tó tún tó dán wó.",
+       "changecontentmodel-title-label": "Àkọlé ojúewé",
+       "changecontentmodel-reason-label": "Ìdíẹ̀:",
        "protectlogpage": "Àkọsílẹ̀ àbò",
        "protectlogtext": "Nísàlẹ̀ ni àtòjọ àwọn àtúnṣe sí àwọn àbò ojúewé.\nẸ wo [[Special:ProtectedPages|àtòjọ àwọn ojúewé aláàbò]] fún àtòjọ àwọn àbò ojúewé ìgbàyí.",
        "protectedarticle": "ti dá àbò bo \"[[$1]]\"",
        "whatlinkshere-hidelinks": "Ìjápọ̀ $1",
        "whatlinkshere-hideimages": "$1 àwọn ìjápọ̀ fáìlì",
        "whatlinkshere-filters": "Ajọ̀",
+       "whatlinkshere-submit": "Rìnsó",
        "autoblockid": "Ìdínàaláraẹni #$1",
        "block": "Dínà oníṣe",
        "unblock": "Ìmúkúrò ìdínà oníṣe",
        "movenotallowedfile": "Ẹ kò ní ìyọ̀nda láti yípò fáìlì.",
        "cant-move-user-page": "Ẹ kò ní ìyọ̀nda láti yípò àwọn ojúewé oníṣe (àyàfi láti ọ̀dọ̀ àwọn abẹ́ojúewé).",
        "cant-move-to-user-page": "Ẹ kò ní ìyọ̀nda láti yípò àwọn ojúewé sí ojúewé oníṣe (àyàfi sí abẹ́ojúewé oníṣe).",
-       "newtitle": "Sí àkọlé tuntun:",
+       "newtitle": "Àkọlé tuntun:",
        "move-watch": "Mójútó ojúewé yìí",
        "movepagebtn": "Yípò ojúewé",
        "pagemovedsub": "Ìyípò ti já sí rere",
        "movenosubpage": "Ojúewé yìí kò ní àwọn abẹ́ojúewé.",
        "movereason": "Ìdíẹ̀:",
        "revertmove": "dápadà",
-       "delete_and_move_text": "== Ìparẹ́ pọndandan ==\nOjúewé àdésí \"[[:$1]]\" wà tẹ́lẹ̀tẹ́lẹ̀.\nṢé ẹ fẹ́ paárẹ́ láti sínà fún ìyípò?",
+       "delete_and_move_text": "Ojúewé àdésí \"[[:$1]]\" wà tẹ́lẹ̀.\nṢé ẹ fẹ́ paárẹ́ láti sínà fún ìyípò?",
        "delete_and_move_confirm": "Bẹ́ẹ̀ni, pa ojúewé náà rẹ́",
        "delete_and_move_reason": "Jẹ́ píparẹ́ láti baà fi ayè lẹ̀ fún ìyípòdà láti \"[[$1]]\"",
        "selfmove": "Àwọn àkọlé orísun àti ibiàyè jẹ́ ọ̀kannáà;\nkò le yípò ojúewé padà sí ara rẹ̀.",
        "move-leave-redirect": "Ẹ fún ní àtúnjúwe",
        "protectedpagemovewarning": "'''Àkíyèsí:''' Ojúewé yìí ti jẹ́ dídáàbòbò nítoríẹ̀ àwọn olùmójútó tí wọ́n ní ẹ̀tọ́ nìkan ni wọ́n le yínípòpadà.\nÀkọọ́lẹ̀ àìpẹ́ nìyí nísàlẹ̀ fún ìtọ́kasí:",
        "semiprotectedpagemovewarning": "'''Àkíyèsí:''' Ojúewé yìí ti jẹ́ dídáàbòbò nítoríẹ̀ àwọn oníṣe tí wọ́n ti forúkọsílẹ̀ nìkan ni wọ́n le yínípòpadà.\nÀkọọ́lẹ̀ àìpẹ́ nìyí nísàlẹ̀ fún ìtọ́kasí:",
-       "move-over-sharedrepo": "==Fáìlì wà ==\n[[:$1]] wà lórí ibi-àkójọ àjọpín kan. Ìyípò fáìlì kan padà sí àkọlé yìí yíò gun fáìlì àjọpin náà lórí.",
+       "move-over-sharedrepo": "[[:$1]] wà lórí ibi-àkójọ àjọpín kan. Ìyípò fáìlì kan padà sí àkọlé yìí yíò gun fáìlì àjọpin náà lórí.",
        "file-exists-sharedrepo": "Orúkọ fáìlì tí ẹ yàn pilẹ̀ tí únjẹ́ lílò lórí ibi-àkójọ àjọpín kan.\nẸ jọ̀wọ́ ẹ yan orúkọ míràn.",
        "export": "Ìkójáde àwọn ojúewé",
        "exporttext": "Ẹ le ṣàkójáde ìkọ̀rọ̀ àti ìtàn àtúnṣe ojúewé pàtó kan tàbí àpapọ̀ àwọn ojúewé tí a fi XML yí.\nÈyí ṣe é kówọlé sínú wiki míràn pẹ̀lú MediaWiki láti orí [[Special:Import|ìkówọlé ojúewé]].\n\nLáti ṣàkójáde àwọn ojúewé, ẹ tẹ àkọlé wọn sínú àpótí ọ̀rọ̀ ìsàlẹ̀, àkọlé kan lórí ìlà kan, kí ẹ sì sọ bóyá ẹ fẹ́ àtúnyẹ̀wò ìwòyí àti àwọn àtúnyẹ̀wò tó ti pẹ́, pẹ̀lú ìlà ìtàn ojúewé, tàbí àtúnyẹ̀wò ìwòyí pẹ̀lú ẹ̀kúnrẹ́rẹ́ ọ̀rọ̀ nípa àtúnṣe tó gbẹ̀yìn.\n\nẸ tún le lo àjápọ̀, fún àpẹrẹ  [[{{#Special:Export}}/{{MediaWiki:Mainpage}}]] fún ojúewé \"[[{{MediaWiki:Mainpage}}]]\".",
        "allmessages-prefix": "Ajọ̀ pẹ̀lú àlẹ̀mọ́wájú:",
        "allmessages-language": "Èdè:",
        "allmessages-filter-submit": "Lọ",
+       "allmessages-filter-translate": "Y'édèpadà",
        "thumbnail-more": "Ìmútóbi",
        "filemissing": "Fáìlì kò sí",
        "thumbnail_error": "Asìṣẹ ìdá àwòrán kékeré: $1",
        "patrol-log-page": "Àkọọ́lẹ̀ ìsọ́",
        "patrol-log-header": "Àkọọ́lẹ̀ àwọn àtúnyẹ̀wò sísọ́ nì yí.",
        "log-show-hide-patrol": "$1 àkọọ́lẹ̀ ìsọ́",
+       "confirm-markpatrolled-button": "OK",
        "deletedrevision": "Àtúnyẹ̀wò àtijọ́ píparẹ́ $1",
        "filedeleteerror-short": "Àsìṣe ìparẹ́ fáílì: $1",
        "filedeleteerror-long": "Àwọn àsìṣe ṣẹlẹ̀ nígbà ìṣeìparẹ́ fáìlì náà:\n\n$1",
        "minutes": "{{PLURAL:$1|ìṣẹ́jú $1}}",
        "hours": "{{PLURAL:$1|wákàtí $1}}",
        "days": "{{PLURAL:$1|ọjọ́ $1}}",
+       "weeks": "{{PLURAL:$1|ọ̀sẹ̀ $1|ọ̀sẹ̀ $1}}",
        "months": "{{PLURAL:$1|oṣù $1|oṣù $1}}",
        "years": "{{PLURAL:$1|ọdún $1|ọdún $1}}",
        "ago": "$1 sẹ́yìn",
        "just-now": "nísinsìnyí",
+       "hours-ago": "{{PLURAL:$1|wákàtí|wákàtí}} $1 ṣẹ́yìn",
+       "minutes-ago": "{{PLURAL:$1|ìṣẹ́jú|ìṣẹ́jú}} $1 ṣẹ́yìn",
+       "seconds-ago": "{{PLURAL:$1|ìṣẹ́júàáyá|ìṣẹ́júàáyá}} $1 ṣẹ́yìn",
        "monday-at": "Ọjọ́ajé ní ago $1",
        "tuesday-at": "Ọjọ́ìṣẹ́gun ní ago $1",
        "wednesday-at": "Ọjọ́rú ní ago $1",
        "confirm-watch-top": "Ṣe ìfikún ojúewé yìí mọ́ ìmójútó yín?",
        "confirm-unwatch-button": "OK",
        "confirm-unwatch-top": "Yọ ojúewé yìí kúrò nínú ìmójútó yín?",
+       "quotation-marks": "\"$1\"",
        "imgmultipageprev": "← ojúewé tókọjá",
        "imgmultipagenext": "ojúewé tóúnbọ̀ →",
        "imgmultigo": "Lọ!",
        "special-characters-group-gujarati": "Gujarati",
        "special-characters-group-thai": "Thai",
        "special-characters-group-lao": "Lao",
-       "special-characters-group-khmer": "Khmer",
-       "edit-error-short": "Àṣìṣe: $1",
-       "edit-error-long": "Àwọn àsìṣe:\n\n\n$1"
+       "special-characters-group-khmer": "Khmer"
 }
index b3838a7..9a3a44f 100644 (file)
        "yourpassword": "Wachtwoôrd",
        "userlogin-yourpassword": "Wachtwoôrd",
        "yourpasswordagain": "Heef je wachtwoôrd opnieuw in:",
-       "remembermypassword": "Anmeldhehevens ontouwen (maximaal $1 {{PLURAL:$1|dag|daege}})",
        "yourdomainname": "Je domein:",
        "externaldberror": "Der is een fout opetreeën bie 't anmelden bie de database of je ei hin toestemmieng jen externe gebruker bie te werken.",
        "login": "Anmelden",
        "undo-success": "Ieronder sti de tekst wirin a de wiezigieng onedaene is emikt. Controleer voe 't opslaene of a 't resultaot ewenst is.",
        "undo-failure": "De wiezigieng kan nie onhedaen emikt worn vanwehe aore striedihe wiezigiengen.",
        "undo-summary": "Versie $1 van [[Special:Contributions/$2|$2]] ([[User talk:$2|overleg]]) onedaen emikt.",
-       "cantcreateaccounttitle": "Anmaeken gebruker mislukt.",
        "cantcreateaccount-text": "'t Anmaeken van gebrukers van dit IP-adres (<b>$1</b>) is eblokkeerd deur [[User:$3|$3]].\n\nDe deur $3 opeheven reeën is ''$2''",
        "viewpagelogs": "Bekiek de logboeken vò deêze bladzie",
        "nohistory": "Deêze pagina is nie bewerkt.",
index 42f5482..d17268d 100644 (file)
        "views": "视图",
        "toolbox": "工具",
        "tool-link-userrights": "更改{{GENDER:$1|用户}}组",
+       "tool-link-userrights-readonly": "查看{{GENDER:$1|用户}}组",
        "tool-link-emailuser": "电邮联系该{{GENDER:$1|用户}}",
        "userpage": "查看用户页面",
        "projectpage": "查看项目页面",
        "botpasswords-label-delete": "删除",
        "botpasswords-label-resetpassword": "重置密码",
        "botpasswords-label-grants": "应用授权:",
-       "botpasswords-help-grants": "æ¯\8f个æ\8e\88æ\9d\83å°\86ä¼\9aèµ\8bäº\88被å\88\97å\87ºã\80\81ä¸\94ç\94¨æ\88·è´¦æ\88·å·²æ\8b¥æ\9c\89权限的访问权。参见[[Special:ListGrants|授权表]]以获取更多信息。",
+       "botpasswords-help-grants": "æ\8e\88æ\9d\83å\85\81许对æ\82¨ç\9a\84ç\94¨æ\88·è´¦æ\88·å·²æ\8c\81æ\9c\89ç\9a\84æ\9d\83é\99\90è¿\9bè¡\8c访é\97®ã\80\82å\9c¨æ­¤å\90¯ç\94¨æ\8e\88æ\9d\83并ä¸\8dä¼\9aæ\8f\90ä¾\9bæ\82¨æ ¹æ\9c¬ä¸\8dä¼\9aæ\8b¥æ\9c\89ç\9a\84权限的访问权。参见[[Special:ListGrants|授权表]]以获取更多信息。",
        "botpasswords-label-grants-column": "已授权",
        "botpasswords-bad-appid": "机器人名“$1”无效。",
        "botpasswords-insert-failed": "无法添加机器人名“$1”。它是否已添加?",
        "passwordreset-emaildisabled": "此Wiki上无法使用邮件功能。",
        "passwordreset-username": "用户名:",
        "passwordreset-domain": "域:",
-       "passwordreset-capture": "查看生成的电子邮件吗?",
-       "passwordreset-capture-help": "如果您选中此框,电子邮件(包括临时密码)将显示,并发送给用户。",
        "passwordreset-email": "电子邮件地址:",
        "passwordreset-emailtitle": "在 {{SITENAME}} 的帐户详细信息",
        "passwordreset-emailtext-ip": "有人(可能是您,来自IP地址$1)请求重设{{SITENAME}}($4)上相关账户的密码。以下$3个账户与该电子邮件地址关联:\n\n$2\n\n这个临时密码将会在{{PLURAL:$5|一天|$5天}}后过期。请立即登录并设置新的密码。如果请求是其他人发出的,或者您已回忆起您的旧密码并不再需要更改,您可以忽略本条消息并继续使用原密码。",
        "passwordreset-emailelement": "用户名:\n$1\n\n临时密码:\n$2",
        "passwordreset-emailsentemail": "如果此邮件地址与您的账户相关联的话,将发送一封密码重置邮件。",
        "passwordreset-emailsentusername": "如果有邮件地址与此用户名相关联的话,将发送一封密码重置邮件。",
-       "passwordreset-emailsent-capture2": "密码重置{{PLURAL:$1|邮件}}已发送。{{PLURAL:$1|用户名和密码|用户名和密码列表}}在此显示。",
-       "passwordreset-emailerror-capture2": "向{{GENDER:$2|用户}}发送电子邮件失败:$1 {{PLURAL:$3|用户名和密码|用户名和密码列表}}在此显示。",
        "passwordreset-nocaller": "必须提供一个调用方",
        "passwordreset-nosuchcaller": "调用方不存在:$1",
        "passwordreset-ignored": "密码重置没有处理。也许没有配置提供者?",
-       "passwordreset-invalideamil": "无效的电子邮件地址",
+       "passwordreset-invalidemail": "无效的电子邮件地址",
        "passwordreset-nodata": "用户名和电子邮件地址均未提供",
        "changeemail": "更改或移除电子邮件地址",
        "changeemail-header": "完成此表格以更改您的电子邮件地址。如果您希望从您的账户中移除任何关联的电子邮件地址,请在提交表格时将新电子邮件地址留空。",
        "suppressionlogtext": "该列表列出了管理人员隐藏的删除与封禁。另参见[[Special:BlockList|封禁列表]]查询当前的封禁列表。",
        "mergehistory": "合并页面历史",
        "mergehistory-header": "此页面让您将来源页面的版本合并到新页面中去。请确保此次更改能继续保持历史页面的连续性。",
-       "mergehistory-box": "合并两个页面的版本历史:",
+       "mergehistory-box": "合并两个页面的修订版本:",
        "mergehistory-from": "来源页面:",
        "mergehistory-into": "目的页面:",
        "mergehistory-list": "可以合并的编辑历史",
        "prefs-help-recentchangescount": "这包括最近更改、页面历史和日志。",
        "prefs-help-watchlist-token2": "这是您的监视列表的网络feed密钥。\n任何拥有者均可以浏览您的监视列表,因此不要公开该密钥。\n如果有需要,[[Special:ResetTokens|您可以重置密钥]]。",
        "savedprefs": "您的系统设置已保存。",
-       "savedrights": "{{GENDER:$1|$1}}的用户权限已被保存。",
+       "savedrights": "{{GENDER:$1|$1}}的用户已被保存。",
        "timezonelegend": "时区:",
        "localtime": "当地时间:",
        "timezoneuseserverdefault": "使用wiki默认值($1)",
        "prefswarning-warning": "您对您的参数设置的更改尚未保存。如果您不点击“$1”就离开,您的设置就不会更新。",
        "prefs-tabs-navigation-hint": "提示:您可以通过左、右箭头键在选项卡之间切换。",
        "userrights": "用户权限管理",
-       "userrights-lookup-user": "管理用户组",
+       "userrights-lookup-user": "选择用户",
        "userrights-user-editname": "输入用户名:",
-       "editusergroup": "编辑{{GENDER:$1|用户}}组",
+       "editusergroup": "加载用户组",
        "editinguser": "更改{{GENDER:$1|用户}}<strong>[[User:$1|$1]]</strong>的用户权限$2",
        "userrights-editusergroup": "编辑用户组",
        "saveusergroups": "保存{{GENDER:$1|用户}}组",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "您并没有权限去编辑在其它wiki上的用户权限。",
        "userrights-nodatabase": "数据库$1不存在或并非为本地的。",
-       "userrights-nologin": "您必须要以管理员帐户[[Special:UserLogin|登录]]之后才可以指定用户权限。",
-       "userrights-notallowed": "您没有权限添加或移除用户权限。",
        "userrights-changeable-col": "您可以更改的用户组",
        "userrights-unchangeable-col": "您不能更改的用户组",
        "userrights-conflict": "用户权限的更改存在冲突!请检查并确认您的更改。",
-       "userrights-removed-self": "您已删除您自己的权利。因此,您不再能够访问此页。",
        "group": "用户组:",
        "group-user": "用户",
        "group-autoconfirmed": "自动确认用户",
        "right-siteadmin": "锁定和解锁数据库",
        "right-override-export-depth": "导出页面,包括最多5层链接",
        "right-sendemail": "发送电子邮件给其他用户",
-       "right-passwordreset": "查看密码重置电子邮件",
        "right-managechangetags": "创建和(取消)激活[[Special:Tags|标签]]",
        "right-applychangetags": "连同某人的更改一起应用[[Special:Tags|标签]]",
        "right-changetags": "在个别修订和日志记录中添加和移除任意[[Special:Tags|标签]]",
        "nrevisions": "$1个版本",
        "nimagelinks": "用于$1个页面中",
        "ntransclusions": "用于$1个页面中",
-       "specialpage-empty": "æ­¤æ\8a¥å\91\8aæ\97 结果。",
+       "specialpage-empty": "没æ\9c\89ç\94¨äº\8eæ­¤æ\8a¥å\91\8aç\9a\84结果。",
        "lonelypages": "孤立页面",
        "lonelypagestext": "以下页面没有被{{SITENAME}}的其它页面链接或包含。",
        "uncategorizedpages": "未归类页面",
        "mostimages": "最多链接文件",
        "mostinterwikis": "有最多跨wiki的页面",
        "mostrevisions": "有最多版本的页面",
-       "prefixindex": "所有前缀的页面",
-       "prefixindex-namespace": "所有前缀的页面($1名字空间)",
+       "prefixindex": "所有前缀的页面",
+       "prefixindex-namespace": "所有前缀的页面($1名字空间)",
        "prefixindex-submit": "显示",
        "prefixindex-strip": "在列表中除去前缀",
        "shortpages": "短页面",
        "apisandbox-continue": "继续",
        "apisandbox-continue-clear": "清除",
        "apisandbox-continue-help": "{{int:apisandbox-continue}}将[https://www.mediawiki.org/wiki/API:Query#Continuing_queries 继续]上次请求;{{int:apisandbox-continue-clear}}将清除继续相关的参数。",
+       "apisandbox-param-limit": "输入<kbd>max</kbd>以使用最大限制。",
+       "apisandbox-multivalue-all-namespaces": "$1(所有名字空间)",
+       "apisandbox-multivalue-all-values": "$1(所有值)",
        "booksources": "网络书源",
        "booksources-search-legend": "搜索图书来源",
        "booksources-isbn": "ISBN:",
        "allarticles": "所有页面",
        "allinnamespace": "所有页面($1名字空间)",
        "allpagessubmit": "提交",
-       "allpagesprefix": "显示有该前缀的页面:",
+       "allpagesprefix": "显示前缀的页面:",
        "allpagesbadtitle": "给定的页面标题是非法的,或者具有一个内部语言或内部 wiki 的前缀。它可能包含一个或更多的不能用于标题的字符。",
        "allpages-bad-ns": "在{{SITENAME}}中没有一个叫做\"$1\"的名字空间。",
        "allpages-hide-redirects": "隐藏重定向",
        "activeusers-count": "过去$3天有$1次操作",
        "activeusers-from": "显示用户开始于:",
        "activeusers-groups": "显示属于用户组的用户:",
+       "activeusers-excludegroups": "排除属于用户组的用户:",
        "activeusers-noresult": "找不到用户。",
        "activeusers-submit": "显示活跃用户",
        "listgrouprights": "用户组权限",
        "patrol-log-header": "这是已巡查版本的日志。",
        "log-show-hide-patrol": "$1巡查纪录",
        "log-show-hide-tag": "$1标签日志",
+       "confirm-markpatrolled-button": "确定",
+       "confirm-markpatrolled-top": "将$2的修订版本$3标记为已巡查么?",
        "deletedrevision": "已删除旧版本$1",
        "filedeleteerror-short": "删除文件发生错误:$1",
        "filedeleteerror-long": "删除文件时出错:\n\n$1",
        "confirmrecreate-noreason": "用户 [[User:$1|$1]]([[User talk:$1|talk]]) 在您开始编辑之后{{GENDER:$1|删除}}此页面。请确认您确实要重新创建此页面。",
        "recreate": "重新创建",
        "confirm_purge_button": "确定",
-       "confirm-purge-top": "要清除此页面的缓存吗?",
+       "confirm-purge-top": "要清除此页面的缓存吗",
        "confirm-purge-bottom": "清除页面数据会清除缓存并强制显示最近的版本。",
        "confirm-watch-button": "确定",
        "confirm-watch-top": "将此页添加到您的监视列表吗?",
        "tags-deactivate": "取消激活",
        "tags-hitcount": "$1个更改",
        "tags-manage-no-permission": "您没有权限管理更改标签。",
-       "tags-manage-blocked": "不能在被封禁的情况下管理更改标签。",
+       "tags-manage-blocked": "{{GENDER:$1|您}}不能在被封禁的情况下管理更改标签。",
        "tags-create-heading": "创建一个新标签",
        "tags-create-explanation": "默认情况下,新创建的标签将可供用户和机器人使用。",
        "tags-create-tag-name": "标签名称:",
        "tags-deactivate-not-allowed": "无法取消激活标签“$1”。",
        "tags-deactivate-submit": "取消激活",
        "tags-apply-no-permission": "您并无权限连带您的更改一起应用更改标签。",
-       "tags-apply-blocked": "不能在被封禁的情况下应用更改标签到您的更改中。",
+       "tags-apply-blocked": "{{GENDER:$1|您}}不能在被封禁的情况下应用更改标签到您的更改中。",
        "tags-apply-not-allowed-one": "标签“$1”不允许手动应用。",
        "tags-apply-not-allowed-multi": "以下{{PLURAL:$2|标签}}不允许手动应用:$1",
        "tags-update-no-permission": "您并无权限从个别修订或日志记录中添加或移除更改标签。",
-       "tags-update-blocked": "不能在被封禁的情况下添加或移除更改标签。",
+       "tags-update-blocked": "{{GENDER:$1|您}}不能在被封禁的情况下添加或移除更改标签。",
        "tags-update-add-not-allowed-one": "标签“$1”不被允许手动添加。",
        "tags-update-add-not-allowed-multi": "以下{{PLURAL:$2|标签}}不被允许手动添加:$1",
        "tags-update-remove-not-allowed-one": "标签“$1”不被允许移除。",
        "htmlform-user-not-exists": "<strong>$1</strong>不存在。",
        "htmlform-user-not-valid": "<strong>$1</strong>不是一个有效的用户名。",
        "logentry-delete-delete": "$1{{GENDER:$2|删除}}页面$3",
+       "logentry-delete-delete_redir": "$1通过覆盖{{GENDER:$2|删除}}了重定向$3",
        "logentry-delete-restore": "$1{{GENDER:$2|还原}}页面$3",
        "logentry-delete-event": "$1{{GENDER:$2|更改}}$3的{{PLURAL:$5|$5个日志事件}}的可见性:$4",
        "logentry-delete-revision": "$1{{GENDER:$2|更改}}页面$3的{{PLURAL:$5|$5个版本}}的可见性:$4",
        "mediastatistics-header-audio": "音频",
        "mediastatistics-header-video": "视频",
        "mediastatistics-header-multimedia": "富媒体",
-       "mediastatistics-header-office": "办公文件",
+       "mediastatistics-header-office": "文档",
        "mediastatistics-header-text": "文本",
        "mediastatistics-header-executable": "可执行文件",
        "mediastatistics-header-archive": "压缩格式",
        "mw-widgets-dateinput-no-date": "没有选定日期",
        "mw-widgets-titleinput-description-new-page": "页面不存在",
        "mw-widgets-titleinput-description-redirect": "重定向至$1",
+       "mw-widgets-categoryselector-add-category-placeholder": "添加分类...",
        "sessionmanager-tie": "不能结合多个请求的身份验证类型:$1。",
        "sessionprovider-generic": "$1会话",
        "sessionprovider-mediawiki-session-cookiesessionprovider": "基于cookie的会话",
        "log-action-filter-contentmodel-change": "内容类型的更改",
        "log-action-filter-contentmodel-new": "带有非标准内容模型的页面的更改",
        "log-action-filter-delete-delete": "页面删除",
+       "log-action-filter-delete-delete_redir": "重定向覆盖",
        "log-action-filter-delete-restore": "页面还原",
        "log-action-filter-delete-event": "日志删除",
        "log-action-filter-delete-revision": "修订版本删除",
        "usercssispublic": "请注意:CSS子页面不应包含机密数据,因为它们可以被其他用户查看。",
        "restrictionsfield-badip": "无效的IP地址或段:$1",
        "restrictionsfield-label": "允许的IP段:",
-       "restrictionsfield-help": "每行一个IP地址或CIDR段。要启用所有,可使用<br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "错误:$1",
-       "edit-error-long": "错误:\n\n$1"
+       "restrictionsfield-help": "每行一个IP地址或CIDR段。要启用所有,可使用<br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 314f811..dc85e91 100644 (file)
        "currentevents-url": "Project:Current events",
        "disclaimers": "免責聲明",
        "disclaimerpage": "Project:一般免責聲明",
-       "edithelp": "編輯説明",
-       "helppage-top-gethelp": "説明",
+       "edithelp": "編輯說明",
+       "helppage-top-gethelp": "說明",
        "mainpage": "首頁",
        "mainpage-description": "首頁",
        "policy-url": "Project:Policy",
        "botpasswords-label-delete": "刪除",
        "botpasswords-label-resetpassword": "重設密碼",
        "botpasswords-label-grants": "適用的權限:",
-       "botpasswords-help-grants": "æ¯\8få\80\8bæ\8e\88æ¬\8aæ\9c\83給äº\88æ\93\81æ\9c\89該æ\8e\88æ¬\8aç\9a\84使ç\94¨è\80\85帳è\99\9få\88\97æ\96¼è©²æ\8e\88æ¬\8aæ¸\85å\96®ç\9a\84使ç\94¨è\80\85æ¬\8aé\99\90ã\80\82 請參考 [[Special:ListGrants|授權表]] 取得更多資訊。",
+       "botpasswords-help-grants": "æ\8e\88æ¬\8aå\8f¯ä»¥å\85\81許æ\82¨å­\98å\8f\96æ\82¨ç\9a\84使ç\94¨è\80\85帳è\99\9få·²ç¶\93æ\93\81æ\9c\89ç\9a\84æ¬\8aé\99\90ï¼\8cä½\86å\9c¨æ­¤é\96\8bå\95\9fæ\8e\88æ¬\8a並ä¸\8dæ\9c\83è®\93æ\82¨ç\9a\84使ç\94¨è\80\85帳è\99\9få\8f¯ä»¥å­\98å\8f\96é\82£äº\9bæ\82¨ä¸¦æ\9cªæ\93\81æ\9c\89ç\9a\84æ¬\8aé\99\90ã\80\82請參考 [[Special:ListGrants|授權表]] 取得更多資訊。",
        "botpasswords-label-grants-column": "已授權",
        "botpasswords-bad-appid": "機器人名稱 \"$1\" 無效。",
        "botpasswords-insert-failed": "新增機器人名稱 \"$1\" 失敗,是否已新增過?",
        "botpasswords-update-failed": "更新機器人名稱 \"$1\" 失敗,是否已刪除過?",
        "botpasswords-created-title": "已建立機器人密碼",
-       "botpasswords-created-body": "使用者''$2\"所擁有的機器人\"$1\"之密碼已建立。",
+       "botpasswords-created-body": "給使用者 \"$2\" 的機器人 \"$1\" 的機器人密碼已建立。",
        "botpasswords-updated-title": "已更新機器人密碼",
-       "botpasswords-updated-body": "使用者''$2\"所擁有的機器人\"$1\"之密碼已更新。",
+       "botpasswords-updated-body": "給使用者 \"$2\" 的機器人 \"$1\" 的機器人密碼已更新。",
        "botpasswords-deleted-title": "已刪除機器人密碼",
-       "botpasswords-deleted-body": "使用者''$2\"所擁有的機器人\"$1\"之密碼已刪除。",
+       "botpasswords-deleted-body": "給使用者 \"$2\" 的機器人 \"$1\" 的機器人密碼已刪除。",
        "botpasswords-newpassword": "用來登入 <strong>$1</strong> 的新密碼為 <strong>$2</strong>。 <em>請記錄此密碼以供未來參考使用。</em> <br> (較舊的機器人的登入名稱需與最終使用者名稱相同,您也可使用 <strong>$3</strong> 做為使用者名稱 <strong>$4</strong> 做為密碼。)",
        "botpasswords-no-provider": "BotPasswordsSessionProvider 無法使用。",
        "botpasswords-restriction-failed": "機器人密碼限制已拒絕此次登入。",
        "passwordreset-emaildisabled": "此 Wiki 已停用電子郵件功能。",
        "passwordreset-username": "使用者名稱:",
        "passwordreset-domain": "網域名稱:",
-       "passwordreset-capture": "檢視電子郵件內容?",
-       "passwordreset-capture-help": "若您勾選此核選方塊,電子郵件 (包含臨時密碼) 將直接顯示,並寄給使用者。",
        "passwordreset-email": "電子郵件地址:",
        "passwordreset-emailtitle": "在 {{SITENAME}} 的帳號詳細資料",
        "passwordreset-emailtext-ip": "不明人士 (可能是您自己,來自 IP 位址 $1) 要求重設在 {{SITENAME}} ($4) 的密碼,下列是與此電子郵件地址有關的使用者{{PLURAL:$3|帳號}}:\n\n$2\n\n{{PLURAL:$3|這個臨時密碼|這些臨時密碼}}將會在{{PLURAL:$5|一天|$5 天}}內到期,\n您應立即登入並更改新的密碼。如果不是您要求重設密碼,或您已想起密碼,並不準備修改,\n您可以忽略本訊息並且繼續使用您原本的密碼。",
        "passwordreset-emailelement": "使用者名稱:\n$1\n\n臨時密碼:\n$2",
        "passwordreset-emailsentemail": "若此確實為您帳號所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
        "passwordreset-emailsentusername": "若此確實為您使用者名稱所登記的電子郵件地址,將會寄出重設密碼的信件給您。",
-       "passwordreset-emailsent-capture2": "密碼重設{{PLURAL:$1|郵件|郵件}}已寄出,{{PLURAL:$1|使用者名稱與密碼|使用者名稱與密碼清單}}如下顯示。",
-       "passwordreset-emailerror-capture2": "寄發電子郵件給{{GENDER:$2|使用者}}失敗:$1,{{PLURAL:$3|使用者名稱與密碼|使用者名稱與密碼清單}}如下顯示。",
        "passwordreset-nocaller": "必須提供 caller",
        "passwordreset-nosuchcaller": "Caller 不存在:$1",
        "passwordreset-ignored": "未處理密碼重設動作,可能尚未設定提供者?",
-       "passwordreset-invalideamil": "無效的電子郵件地址",
+       "passwordreset-invalidemail": "無效的電子郵件地址",
        "passwordreset-nodata": "未提供使用者名稱或是電子郵件地址",
        "changeemail": "變更或移除電子郵件地址",
        "changeemail-header": "請填寫此表單來變更您的電子郵件地址,若您想要移除您帳號所連結的所有電子郵件地址,請於新電子郵件地址欄位留空。",
        "accmailtitle": "密碼已寄出",
        "accmailtext": "[[User talk:$1|$1]] 的隨機密碼已經寄送至 $2,可登入後至 <em>[[Special:ChangePassword|變更密碼]] 頁面更改</em>。",
        "newarticle": "(新)",
-       "newarticletext": "您正連結至一頁不存在頁面。\n要建立該頁面,請在下方的編輯方塊中輸入內容 (詳情請參考 [$1 明頁面]) 。\n如果您是不小心來到此頁面,請點選瀏覽器的 <strong>返回</strong> 按鈕。",
+       "newarticletext": "您正連結至一頁不存在頁面。\n要建立該頁面,請在下方的編輯方塊中輸入內容 (詳情請參考 [$1 使用說明頁面]) 。\n如果您是不小心來到此頁面,請點選瀏覽器的 <strong>返回</strong> 按鈕。",
        "anontalkpagetext": "----\n<em>此討論頁面是給尚未建立帳號的匿名使用者使用</em>\n因此我們必須使用 IP 位址來辨識身份,但相同的 IP 位址可能由許多不同的使用者所共用。\n如果您是匿名使用者並且覺得評論的內容與您無關,請 [[Special:CreateAccount|建立新帳號]] 或 [[Special:UserLogin|登入]] 避免與其他匿名使用者混淆。",
        "noarticletext": "此頁面目前沒有內容,您可以在其它頁面中[[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>,但您沒有權限建立此頁面。",
        "revdelete-unsuppress": "移除已還原修訂上的顯示限制",
        "revdelete-log": "原因:",
        "revdelete-submit": "套用至已選取的{{PLURAL:$1|一筆|多筆}}修訂",
-       "revdelete-success": "å·²æ\88\90å\8a\9fæ\9b´æ\96°æª¢ç¤ºä¿®è¨\82å\85§å®¹ç\9a\84æ¬\8aé\99\90設å®\9a。",
+       "revdelete-success": "å·²æ\9b´æ\96°ä¿®è¨\82ç\9a\84å\8f¯è¦\8bæ\80§。",
        "revdelete-failure": "無法更新修訂的顯示設定:\n$1",
-       "logdelete-success": "已成功更新檢視日誌的權限設定。",
+       "logdelete-success": "已設定日誌的可見性。",
        "logdelete-failure": "無法更新日誌的顯示設定:\n$1",
-       "revdel-restore": "變更能見度",
+       "revdel-restore": "變更可見性",
        "pagehist": "頁面歷史",
        "deletedhist": "已刪除歷史",
        "revdelete-hide-current": "隱藏於 $1 $2 的項目錯誤:此為目前的修訂,不可隱藏。",
        "saveprefs": "儲存",
        "restoreprefs": "還原所有預設設定 (所有項目)",
        "prefs-editing": "編輯",
-       "rows": "橫行數:",
-       "columns": "直行數:",
+       "rows": "數:",
+       "columns": "數:",
        "searchresultshead": "搜尋",
        "stub-threshold": "短頁面連結格式門檻值 ($1):",
        "stub-threshold-sample-link": "樣本",
        "userrights-reason": "原因:",
        "userrights-no-interwiki": "您沒有權限去編輯其他 Wiki 上的使用者權限。",
        "userrights-nodatabase": "資料庫 $1 不存在或不在本地主機的。",
-       "userrights-nologin": "您必須 [[Special:UserLogin|登入]] 管理員帳號以指定使用者權限。",
-       "userrights-notallowed": "您沒有權限加入或刪除使用者權限。",
        "userrights-changeable-col": "您可變更的群組",
        "userrights-unchangeable-col": "您不可變更的群組",
        "userrights-conflict": "使用者權限變更發生衝突!請檢閱並確認你的變更。",
-       "userrights-removed-self": "您已移除自己的權限,故您已無法再次存取此頁面。",
        "group": "群組:",
        "group-user": "使用者",
        "group-autoconfirmed": "自動確認的使用者",
        "right-siteadmin": "鎖定和解除鎖定資料庫",
        "right-override-export-depth": "匯出頁面包含連結內容,深度上限為 5 層",
        "right-sendemail": "傳送電子郵件聯絡其他使用者",
-       "right-passwordreset": "檢視重設密碼電子郵件",
        "right-managechangetags": "建立並自資料庫 (取消) 啟用 [[Special:Tags|標籤]]",
        "right-applychangetags": "連同某個人的變更一起套用[[Special:Tags|標籤]]",
        "right-changetags": "加入與移除任何於各別修訂與日誌項目的[[Special:Tags|標籤]]",
        "action-applychangetags": "連同您的變更一起套用標籤",
        "action-changetags": "加入與移除任何於各別修訂與日誌項目的標籤",
        "action-deletechangetags": "從資料庫刪除標籤",
-       "action-purge": "刷新此頁面",
+       "action-purge": "清除此頁面",
        "nchanges": "$1 次變更",
        "enhancedrc-since-last-visit": "{{PLURAL:$1|自上次拜訪}}已有 $1",
        "enhancedrc-history": "歷史",
        "mostimages": "被連結最多的檔案",
        "mostinterwikis": "最多跨 Wiki 連結的頁面",
        "mostrevisions": "最多修訂的頁面",
-       "prefixindex": "æ\89\80æ\9c\89é \81é\9d¢è\88\87å­\97é¦\96",
-       "prefixindex-namespace": "æ\89\80æ\9c\89å\90«å­\97é¦\96ç\9a\84頁面 ($1 命名空間)",
+       "prefixindex": "æ\8c\89è©\9eé ­æ\9f¥è©¢é \81é\9d¢",
+       "prefixindex-namespace": "æ\8c\89è©\9eé ­æ\9f¥è©¢頁面 ($1 命名空間)",
        "prefixindex-submit": "顯示",
-       "prefixindex-strip": "於清單中省略首",
+       "prefixindex-strip": "於清單中省略首",
        "shortpages": "過短的頁面",
        "longpages": "過長的頁面",
        "deadendpages": "無連結頁面",
        "apisandbox-continue": "繼續",
        "apisandbox-continue-clear": "清除",
        "apisandbox-continue-help": "{{int:apisandbox-continue}} 會 [https://www.mediawiki.org/wiki/API:Query#Continuing_queries 繼續] 最後的請求,{{int:apisandbox-continue-clear}} 則會清除繼續相關的參數。",
+       "apisandbox-param-limit": "輸入 <kbd>max</kbd> 以使用最大限制。",
        "booksources": "圖書資源",
        "booksources-search-legend": "尋找圖書資源",
        "booksources-isbn": "國際標準書號:",
        "booksources-search": "搜尋",
        "booksources-text": "下列清單包含其他銷售新書籍或二手書籍的網站連結,可會有你想尋找書籍的進一部資訊:",
        "booksources-invalid-isbn": "您提供的 ISBN 不正確,請檢查複製的來源是否有誤。",
+       "magiclink-tracking-rfc": "使用 RFC 魔法連結的頁面",
+       "magiclink-tracking-rfc-desc": "此頁面使用 RFC 魔法連結的頁面,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] 的如何遷移。",
+       "magiclink-tracking-pmid": "使用 PMID 魔法連結的頁面",
+       "magiclink-tracking-pmid-desc": "此頁面使用 PMID 魔法連結的頁面,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] 的如何遷移。",
+       "magiclink-tracking-isbn": "使用 ISBN 魔法連結的頁面",
+       "magiclink-tracking-isbn-desc": "此頁面使用 ISBN 魔法連結的頁面,請參考 [https://www.mediawiki.org/wiki/Special:MyLanguage/Help:Magic_links mediawiki.org] 的如何遷移。",
        "specialloguserlabel": "執行者:",
        "speciallogtitlelabel": "目標 (標題或以 {{ns:user}}:使用者 表示使用者):",
        "log": "日誌",
        "allarticles": "所有頁面",
        "allinnamespace": "所有頁面 ($1 命名空間)",
        "allpagessubmit": "執行",
-       "allpagesprefix": "顯示以此為字首頁面:",
+       "allpagesprefix": "根據詞首查詢頁面",
        "allpagesbadtitle": "指定的頁面標題無效、包含內部語言或內部 Wiki 的字首。\n它可能包含一個或多個的不能用於標題的字元。",
        "allpages-bad-ns": "{{SITENAME}} 沒有 \"$1\" 命名空間。",
        "allpages-hide-redirects": "隱藏重新導向頁面",
        "activeusers-count": "最近 $3 天內有 $1 次動作",
        "activeusers-from": "顯示使用者開始自:",
        "activeusers-groups": "顯示屬於以下群組的使用者:",
+       "activeusers-excludegroups": "排除屬於以下群組的使用者:",
        "activeusers-noresult": "查無使用者。",
        "activeusers-submit": "顯示活動中的使用者",
        "listgrouprights": "使用者群組權限",
        "modifiedarticleprotection": "已變更 \"[[$1]]\" 的保護層級",
        "unprotectedarticle": "已解除 \"[[$1]]\" 的保護",
        "movedarticleprotection": "已移動 \"[[$2]]\" 的保護設定至 \"[[$1]]\"",
+       "protectedarticle-comment": "{{GENDER:$2|受保護}} \"[[$1]]\"",
+       "modifiedarticleprotection-comment": "{{GENDER:$2|已更改}} \"[[$1]]\" 的保護層級",
+       "unprotectedarticle-comment": "{{GENDER:$2|已移除}} \"[[$1]]\" 的保護",
        "protect-title": "變更 \"$1\" 的保護層級",
        "protect-title-notallowed": "檢視 \"$1\" 的保護層級",
        "prot_1movedto2": "已移動 [[$1]] 至 [[$2]]",
        "import-mapping-namespace": "匯入至命名空間:",
        "import-mapping-subpage": "匯入做為以下頁面的子頁面:",
        "import-upload-filename": "檔案名稱:",
-       "import-comment": "註解:",
+       "import-comment": "è©\95è«\96:",
        "importtext": "請使用 [[Special:Export|匯出工具]] 從來源 Wiki 匯出檔案,\n儲存至您的電腦後再上傳到這裡。",
        "importstart": "正在匯入頁面...",
        "import-revision-count": "$1 個修訂",
        "patrol-log-header": "這是已巡查的修訂版本的日誌。",
        "log-show-hide-patrol": "$1 巡查日誌",
        "log-show-hide-tag": "$1 標籤日誌",
+       "confirm-markpatrolled-button": "確定",
+       "confirm-markpatrolled-top": "標記 $2 的修訂 $3 為已巡查?",
        "deletedrevision": "已刪除舊修訂 $1",
        "filedeleteerror-short": "刪除檔案發生錯誤:$1",
        "filedeleteerror-long": "刪除檔案時發生錯誤:\n\n$1",
        "exif-colorspace": "色彩空間",
        "exif-componentsconfiguration": "每像素內含",
        "exif-compressedbitsperpixel": "影像壓縮模式",
-       "exif-pixelxdimension": "å\9c\96ç\89\87寬度",
-       "exif-pixelydimension": "å\9c\96ç\89\87高度",
+       "exif-pixelxdimension": "å½±å\83\8f寬度",
+       "exif-pixelydimension": "å½±å\83\8f高度",
        "exif-usercomment": "使用者評論",
        "exif-relatedsoundfile": "相關的音效檔案",
        "exif-datetimeoriginal": "資料產生的日期時間",
        "exif-source": "來源",
        "exif-editstatus": "圖片社評狀態",
        "exif-urgency": "緊急性",
-       "exif-fixtureidentifier": "夾具名稱",
+       "exif-fixtureidentifier": "Fixture 名稱",
        "exif-locationdest": "描繪地點",
        "exif-locationdestcode": "位置代碼描述",
        "exif-objectcycle": "媒體發生時間",
        "tags-deactivate": "停用",
        "tags-hitcount": "$1 次變更",
        "tags-manage-no-permission": "您沒有權限管理變更標籤。",
-       "tags-manage-blocked": "您無法在被封鎖的情況下管理變更標籤。",
+       "tags-manage-blocked": "您無法在{{GENDER:$1|您}}被封鎖的情況下管理變更標籤。",
        "tags-create-heading": "建立新標籤",
        "tags-create-explanation": "在預設情況下,新建立的標籤可被使用者及機器人使用。",
        "tags-create-tag-name": "標籤名稱:",
        "tags-deactivate-not-allowed": "無法停用標籤 \"$1\"。",
        "tags-deactivate-submit": "停用",
        "tags-apply-no-permission": "您沒有權限連同您的變更一起套用標籤。",
-       "tags-apply-blocked": "您無法在被封鎖的情況下套用變更標籤為您的變更。",
+       "tags-apply-blocked": "您無法在{{GENDER:$1|您}}被封鎖的情況下套用變更標籤為您的變更。",
        "tags-apply-not-allowed-one": "不允許手動套用標籤 \"$1\"。",
        "tags-apply-not-allowed-multi": "不允許手動套用以下{{PLURAL:$2|標籤|標籤}}:$1",
        "tags-update-no-permission": "您沒有權限加入與移除任何於各別修訂與日誌項目的標籤",
-       "tags-update-blocked": "您無法在被封鎖的情況下移除變更標籤。",
+       "tags-update-blocked": "您無法在{{GENDER:$1|您}}被封鎖的情況下移除變更標籤。",
        "tags-update-add-not-allowed-one": "不允許手動加入標籤 \"$1\"。",
        "tags-update-add-not-allowed-multi": "不允許手動加入以下{{PLURAL:$2|標籤|標籤}}:$1",
        "tags-update-remove-not-allowed-one": "不允許手動移除標籤 \"$1\"。",
        "authmanager-authn-autocreate-failed": "自動建立本地帳號失敗:$1",
        "authmanager-change-not-supported": "提供的憑證無法變更,因為尚無法使用。",
        "authmanager-create-disabled": "已關閉帳號自動建立。",
-       "authmanager-create-from-login": "要建立您的帳號,請先填寫以下欄位。",
+       "authmanager-create-from-login": "要建立您的帳號,請先填寫欄位。",
        "authmanager-create-not-in-progress": "帳號建立尚未進行或連線階段資料已遺失,請重頭再開始。",
        "authmanager-create-no-primary": "提供的憑證無使用在帳號建立。",
        "authmanager-link-no-primary": "提供的憑證無使用在帳號連結。",
        "usercssispublic": "請注意:CSS 子頁面可被其他使用者檢視,不應包含憑証資料。",
        "restrictionsfield-badip": "無效的 IP 位址或範圍:$1",
        "restrictionsfield-label": "允許的 IP 範圍:",
-       "restrictionsfield-help": "一個 IP 位址或 CIDR 範圍一行,要開啟所有範圍可使用 <br><code>0.0.0.0/0</code><br><code>::/0</code>",
-       "edit-error-short": "錯誤:$1",
-       "edit-error-long": "錯誤:\n\n$1"
+       "restrictionsfield-help": "一個 IP 位址或 CIDR 範圍一行,要開啟所有範圍可使用 <br><code>0.0.0.0/0</code><br><code>::/0</code>"
 }
index 5bc3590..6a719e5 100644 (file)
@@ -49,3 +49,127 @@ $digitTransformTable = [
 
 $digitGroupingPattern = "##,##,###";
 
+$specialPageAliases = [
+       'Activeusers'               => [ 'সক্রিয়_ব্যবহারকারী' ],
+       'Allmessages'               => [ 'সব_বার্তা' ],
+       'AllMyUploads'              => [ 'আমার_সব_আপলোড', 'আমার_সব_ফাইল' ],
+       'Allpages'                  => [ 'সব_পাতা', 'সব_পৃষ্ঠা', 'সব_পাতাসমূহ' ],
+       'ApiHelp'                   => [ 'এপিআই_সাহায্য' ],
+       'ApiSandbox'                => [ 'এপিআই_খেলাঘর' ],
+       'Ancientpages'              => [ 'পুরানো_পাতা', 'পুরানো_পৃষ্ঠা' ],
+       'Badtitle'                  => [ 'ত্রুটিযুক্ত_শিরোনাম' ],
+       'Blankpage'                 => [ 'খালি_পাতা', 'খালি_পৃষ্ঠা' ],
+       'Block'                     => [ 'বাধাদান', 'আইপি_বাধাদান', 'ব্যবহারকারী_বাধাদান' ],
+       'Booksources'               => [ 'বইয়ের_উৎস' ],
+       'BotPasswords'              => [ 'বট_পাসওয়ার্ড' ],
+       'BrokenRedirects'           => [ 'ভাঙ্গা_পুনর্নির্দেশ' ],
+       'Categories'                => [ 'বিষয়শ্রেণী' ],
+       'ChangeContentModel'        => [ 'বিষয়বস্তুর_মডেল_পরিবর্তন' ],
+       'ChangeCredentials'         => [ 'পরিচয়পত্র_পরিবর্তন' ],
+       'ChangeEmail'               => [ 'ইমেইল_পরিবর্তন' ],
+       'ChangePassword'            => [ 'পাসওয়ার্ড_পরিবর্তন', 'পাসপরিবর্তন', 'পাসওয়ার্ডপরিবর্তন' ],
+       'ComparePages'              => [ 'পাতার_তুলনা', 'পৃষ্ঠার_তুলনা' ],
+       'Confirmemail'              => [ 'ইমেইল_নিশ্চিতকরণ' ],
+       'Contributions'             => [ 'অবদান', 'অবদানসমূহ' ],
+       'CreateAccount'             => [ 'অ্যাকাউন্ট_তৈরি' ],
+       'Deadendpages'              => [ 'সংযোগহীন_পাতা', 'সংযোগহীন_পৃষ্ঠা' ],
+       'DeletedContributions'      => [ 'অপসারিত_অবদান' ],
+       'Diff'                      => [ 'পার্থক্য' ],
+       'DoubleRedirects'           => [ 'দ্বৈত_পুনর্নির্দেশ', 'দুইবার_করা_পুনর্নির্দেশ' ],
+       'EditTags'                  => [ 'ট্যাগ_সম্পাদনা' ],
+       'EditWatchlist'             => [ 'নজরতালিকা_সম্পাদনা' ],
+       'Emailuser'                 => [ 'ইমেইল_প্রেরণ', 'ইমেইল' ],
+       'ExpandTemplates'           => [ 'টেমপ্লেট_সম্প্রসারণ' ],
+       'Export'                    => [ 'রপ্তানি' ],
+       'Fewestrevisions'           => [ 'কমসংখ্যক_সংশোধন' ],
+       'FileDuplicateSearch'       => [ 'সদৃশ_ফাইল_অনুসন্ধান' ],
+       'Filepath'                  => [ 'ফাইলের_পথ' ],
+       'Import'                    => [ 'আমদানি' ],
+       'Invalidateemail'           => [ 'অবৈধ_ইমেইল' ],
+       'JavaScriptTest'            => [ 'জাভাস্ক্রিপ্ট_পরীক্ষা' ],
+       'BlockList'                 => [ 'বাধার_তালিকা', 'বাধার_তালিকাসমূহ', 'আইপি_বাধার_তালিকা' ],
+       'LinkSearch'                => [ 'সংযোগ_অনুসন্ধান' ],
+       'LinkAccounts'              => [ 'অ্যাকাউন্টের_তালিকা' ],
+       'Listadmins'                => [ 'প্রশাসকের_তালিকা' ],
+       'Listbots'                  => [ 'বটের_তালিকা' ],
+       'Listfiles'                 => [ 'ফাইলের_তালিকা', 'চিত্রের_তালিকা', 'ছবির_তালিকা' ],
+       'Listgrouprights'           => [ 'দলগত_অধিকারের_তালিকা', 'ব্যবহারকারীর_দলগত_অধিকার' ],
+       'Listgrants'                => [ 'অনুদানের_তালিকা', 'গ্র্যান্টের_তালিকা' ],
+       'Listredirects'             => [ 'পুনর্নির্দেশের_তালিকা', 'পুনঃনির্দেশের_তালিকা' ],
+       'ListDuplicatedFiles'       => [ 'সদৃশ_ফাইলের_তালিকা', 'অনুরূপ_ফাইলের_তালিকা' ],
+       'Listusers'                 => [ 'ব্যবহারকারীর_তালিকা', 'ব্যবহারকারী_তালিকা' ],
+       'Lockdb'                    => [ 'ডাটাবেস_অবরোধ', 'লকডিবি' ],
+       'Log'                       => [ 'লগ', 'লগসমূহ' ],
+       'Lonelypages'               => [ 'পিতৃহীন_পাতা', 'পিতৃহীন_পাতাসমূহ' ],
+       'Longpages'                 => [ 'দীর্ঘ_পাতাসমূহ' ],
+       'MediaStatistics'           => [ 'মিডিয়া_পরিসংখ্যান' ],
+       'MergeHistory'              => [ 'ইতিহাস_একত্রীকরণ' ],
+       'MIMEsearch'                => [ 'এমআইএমই_অনুসন্ধান' ],
+       'Mostcategories'            => [ 'সর্বাধিক_বিষয়শ্রেণীসমৃদ্ধ' ],
+       'Mostimages'                => [ 'সর্বাধিক_ফাইল', 'বেশী_ছবি' ],
+       'Mostinterwikis'            => [ 'সর্বাধিক_আন্তঃউইকি' ],
+       'Mostlinked'                => [ 'সর্বাধিক_সংযুক্ত_পাতা' ],
+       'Mostlinkedcategories'      => [ 'সর্বাধিক_সংযুক্ত_বিষয়শ্রেণী', 'সর্বাধিক_ব্যবহৃত_বিষয়শ্রেণী', 'সর্বাধিক_সংযুক্ত_বিষয়শ্রেণীসমূহ' ],
+       'Mostlinkedtemplates'       => [ 'সর্বাধিক_সংযুক্ত_টেমপ্লট', 'সর্বাধিক_সংযুক্ত_টেমপ্লটসমূহ', 'সর্বাধিক_ব্যবহৃত_টেমপ্লেট' ],
+       'Mostrevisions'             => [ 'সর্বাধিক_সংশোধন' ],
+       'Movepage'                  => [ 'পাতা_স্থানান্তর' ],
+       'Mycontributions'           => [ 'আমার_অবদান' ],
+       'MyLanguage'                => [ 'আমার_ভাষা' ],
+       'Mypage'                    => [ 'আমার_পাতা' ],
+       'Mytalk'                    => [ 'আমার_আলাপ' ],
+       'Myuploads'                 => [ 'আমার_আপলোড', 'আমার_ফাইল' ],
+       'Newimages'                 => [ 'নতুন_চিত্রসমূহ', 'নতুন_ছবিসমূহ' ],
+       'Newpages'                  => [ 'নতুন_পাতাসমূহ' ],
+       'PagesWithProp'             => [ 'বৈশিষ্ট্যযুক্ত_পাতা', 'বৈশিষ্ট্যযুক্ত_পৃষ্ঠা' ],
+       'PageLanguage'              => [ 'পাতার_ভাষা' ],
+       'PasswordReset'             => [ 'পাসওয়ার্ড_পুনঃস্থাপন' ],
+       'PermanentLink'             => [ 'স্থায়ী_সংযোগ', 'স্থায়ী_লিঙ্ক' ],
+       'Preferences'               => [ 'পছন্দসমূহ', 'আমার_পছন্দ' ],
+       'Prefixindex'               => [ 'উপসর্গ' ],
+       'Protectedpages'            => [ 'সুরক্ষিত_পাতা' ],
+       'Protectedtitles'           => [ 'সুরক্ষিত_শিরোনাম' ],
+       'Randompage'                => [ 'অজানা_পাতা', 'অজানা_যেকোন_পাতা' ],
+       'RandomInCategory'          => [ 'অজানা_বিষয়শ্রেণী' ],
+       'Randomredirect'            => [ 'অজানা_পুনর্নির্দেশ' ],
+       'Randomrootpage'            => [ 'অজানা_মূল_পাতা' ],
+       'Recentchanges'             => [ 'সাম্প্রতিক_পরিবর্তনসমূহ', 'সাম্প্রতিক_পরিবর্তন' ],
+       'Recentchangeslinked'       => [ 'সংযুক্ত_সাম্প্রতিক_পরিবর্তন', 'সংযুক্ত_সাম্প্রতিক_পরিবর্তনসমূহ', 'সম্পর্কিত_পরিবর্তন' ],
+       'Redirect'                  => [ 'পুনর্নির্দেশ' ],
+       'RemoveCredentials'         => [ 'পরিচয়পত্র_অপসারণ' ],
+       'ResetTokens'               => [ 'টোকেন_পরিবর্তন' ],
+       'Revisiondelete'            => [ 'অপসারিত_ইতিহাস' ],
+       'RunJobs'                   => [ 'রানজব' ],
+       'Search'                    => [ 'অনুসন্ধান' ],
+       'Shortpages'                => [ 'সংক্ষিপ্ত_পাতাসমূহ' ],
+       'Specialpages'              => [ 'বিশেষ_পাতাসমূহ' ],
+       'Statistics'                => [ 'পরিসংখ্যান' ],
+       'Tags'                      => [ 'ট্যাগ' ],
+       'TrackingCategories'        => [ 'বিষয়শ্রেণীসমূহ_অনুসরণ' ],
+       'Unblock'                   => [ 'বাধা_তোলা', 'বাধা_অপসারণ' ],
+       'Uncategorizedcategories'   => [ 'বিষয়শ্রেণীবিহীন_বিষয়শ্রেণী' ],
+       'Uncategorizedimages'       => [ 'বিষয়শ্রেণীবিহীন_চিত্র', 'বিষয়শ্রেণীবিহীন_ছবি' ],
+       'Uncategorizedpages'        => [ 'বিষয়শ্রেণীবিহীন_পাতা' ],
+       'Uncategorizedtemplates'    => [ 'বিষয়শ্রেণীবিহীন_টেমপ্লেট' ],
+       'Undelete'                  => [ 'পুনরুদ্ধার' ],
+       'UnlinkAccounts'            => [ 'অসংযুক্ত_অ্যাকাউন্ট' ],
+       'Unlockdb'                  => [ 'ডাটাবেস_মুক্তি', 'আনলকডিবি' ],
+       'Unusedcategories'          => [ 'অব্যবহৃত_বিষয়শ্রেণী' ],
+       'Unusedimages'              => [ 'অব্যবহৃত_চিত্র', 'অব্যবহৃত_ছবি' ],
+       'Unusedtemplates'           => [ 'অব্যবহৃত_টেমপ্লেট' ],
+       'Unwatchedpages'            => [ 'নজরহীন_পাতা', 'নজরে_না_রাখা_পাতা' ],
+       'Upload'                    => [ 'আপলোড' ],
+       'UploadStash'               => [ 'স্টাশ_আপলোড' ],
+       'Userlogin'                 => [ 'ব্যবহারকারী_প্রবেশ', 'প্রবেশ' ],
+       'Userlogout'                => [ 'ব্যবহারকারী_প্রস্থান', 'প্রস্থান' ],
+       'Userrights'                => [ 'ব্যবহারকারী_অধিকার', 'ব্যবহারকারীর_অধিকার' ],
+       'Version'                   => [ 'সংস্করণ' ],
+       'Wantedcategories'          => [ 'আবশ্যিক_বিষয়শ্রেণীসমূহ' ],
+       'Wantedfiles'               => [ 'আবশ্যিক_ফাইলসমূহ' ],
+       'Wantedpages'               => [ 'আবশ্যিক_পাতাসমূহ', 'ভাঙ্গা_লিংকসমূহ' ],
+       'Wantedtemplates'           => [ 'আবশ্যিক_টেমপ্লেটসমূহ' ],
+       'Watchlist'                 => [ 'নজরতালিকা' ],
+       'Whatlinkshere'             => [ 'সংযোগকারী_পৃষ্ঠাসমূহ' ],
+       'Withoutinterwiki'          => [ 'আন্তঃউইকিহীন' ],
+];
+
+$linkTrail = '/^([\x{0980}-\x{09FF}]+)(.*)$/sDu';
index 9d8b1bd..6d875ae 100644 (file)
@@ -19,8 +19,8 @@ $namespaceNames = [
        NS_PROJECT_TALK     => '$1討論',
        NS_FILE             => '文件',
        NS_FILE_TALK        => '文件討論',
-       NS_MEDIAWIKI        => '媒體維基',
-       NS_MEDIAWIKI_TALK   => '媒體維基討論',
+       NS_MEDIAWIKI        => 'MediaWiki',
+       NS_MEDIAWIKI_TALK   => 'MediaWiki討論',
        NS_TEMPLATE         => '模板',
        NS_TEMPLATE_TALK    => '模板討論',
        NS_HELP             => '幫助',
diff --git a/languages/messages/MessagesKrl.php b/languages/messages/MessagesKrl.php
new file mode 100644 (file)
index 0000000..b991899
--- /dev/null
@@ -0,0 +1,11 @@
+<?php
+/** Karelian (Karlaj)
+ *
+ * To improve a translation please visit https://translatewiki.net
+ *
+ * @ingroup Language
+ * @file
+ *
+ */
+
+$fallback = 'fi'; // T137415
index 14f5b6f..63c1e80 100644 (file)
@@ -8,7 +8,7 @@
  *
  */
 
-$fallback = 'ru';
+$fallback = 'fi'; // T146744#2678472
 
 $namespaceNames = [
        NS_MEDIA            => 'Medii',
index 838ea33..29627a6 100644 (file)
@@ -12,6 +12,8 @@
  * @author Reder
  */
 
+$fallback = 'it';
+
 $specialPageAliases = [
        'Allmessages'               => [ 'TutteLeMessagge' ],
        'Preferences'               => [ 'Preferenze' ],
index 369e0be..0c381e5 100644 (file)
@@ -58,7 +58,6 @@ $separatorTransformTable = [
        '.' => ','
 ];
 
-$fallback = 'ru';
 $fallback8bitEncoding = 'windows-1251';
 $linkPrefixExtension = true;
 
@@ -86,11 +85,23 @@ $namespaceAliases = [
        'Зображення' => NS_FILE,
        'Обговорення_зображення' => NS_FILE_TALK,
        'Обговорення_шаблона' => NS_TEMPLATE_TALK,
+       // Backwards compatibility from Russian
+       'Медиа' => NS_MEDIA,
+       'Служебная' => NS_SPECIAL,
+       'Обсуждение' => NS_TALK,
+       'Участник' => NS_USER,
+       'Обсуждение_участника' => NS_USER_TALK,
+       'Обсуждение_файла' => NS_FILE_TALK,
+       'Обсуждение_MediaWiki' => NS_MEDIAWIKI_TALK,
+       'Обсуждение_шаблона' => NS_TEMPLATE_TALK,
+       'Справка' => NS_HELP,
+       'Обсуждение_справки' => NS_HELP_TALK,
+       'Категория' => NS_CATEGORY,
+       'Обсуждение_категории' => NS_CATEGORY_TALK,
+       'Изображение' => NS_FILE,
+       'Обсуждение_изображения' => NS_FILE_TALK,
 ];
 
-// Remove Russian aliases
-$namespaceGenderAliases = [];
-
 $dateFormats = [
        'mdy time' => 'H:i',
        'mdy date' => 'xg j, Y',
@@ -113,108 +124,109 @@ $bookstoreList = [
        'Amazon.com' => 'http://www.amazon.com/exec/obidos/ISBN=$1'
 ];
 
+// Russian names are kept for backwards compatibility
 $specialPageAliases = [
-       'Activeusers'               => [ 'Активні_дописувачі' ],
-       'Allmessages'               => [ 'Системні_повідомлення' ],
-       'AllMyUploads'              => [ 'Усі_мої_файли' ],
-       'Allpages'                  => [ 'Усі_сторінки' ],
+       'Activeusers'               => [ 'Активні_дописувачі', 'Активные_участники' ],
+       'Allmessages'               => [ 'Системні_повідомлення', 'Системные_сообщения' ],
+       'AllMyUploads'              => [ 'Усі_мої_файли', 'Все_мои_файлы' ],
+       'Allpages'                  => [ 'Усі_сторінки', 'Все_страницы' ],
        'Ancientpages'              => [ 'Давні_сторінки' ],
-       'Badtitle'                  => [ 'Помилковий_заголовок' ],
-       'Blankpage'                 => [ 'Порожня_сторінка' ],
-       'Block'                     => [ 'Заблокувати' ],
-       'Booksources'               => [ 'Джерела_книг' ],
-       'BrokenRedirects'           => [ 'Розірвані_перенаправлення' ],
-       'Categories'                => [ 'Категорії' ],
-       'ChangeEmail'               => [ 'Змінити_e-mail' ],
-       'ChangePassword'            => [ 'Змінити_пароль' ],
-       'ComparePages'              => [ 'Порівняння_сторінок' ],
-       'Confirmemail'              => [ 'Підтвердити_e-mail' ],
-       'Contributions'             => [ 'Внесок' ],
-       'CreateAccount'             => [ 'Створити_обліковий_запис' ],
-       'Deadendpages'              => [ 'Сторінки_без_посилань' ],
-       'DeletedContributions'      => [ 'Вилучений_внесок' ],
-       'DoubleRedirects'           => [ 'Подвійні_перенаправлення' ],
-       'EditWatchlist'             => [ 'Редагувати_список_спостереження' ],
-       'Emailuser'                 => [ 'Лист_користувачеві' ],
-       'ExpandTemplates'           => [ 'Розгортання_шаблонів' ],
-       'Export'                    => [ 'Експорт' ],
-       'Fewestrevisions'           => [ 'Найменшредаговані' ],
-       'FileDuplicateSearch'       => [ 'Пошук_дублікатів_файлів' ],
-       'Filepath'                  => [ 'Шлях_до_файлу' ],
-       'Import'                    => [ 'Імпорт' ],
-       'Invalidateemail'           => [ 'Неперевірена_email-адреса' ],
-       'JavaScriptTest'            => [ 'JavaScript_тест' ],
-       'BlockList'                 => [ 'Список_блокувань', 'Блокування', 'Блокування_IP-адрес' ],
-       'LinkSearch'                => [ 'Пошук_посилань' ],
-       'Listadmins'                => [ 'Список_адміністраторів' ],
-       'Listbots'                  => [ 'Список_ботів' ],
-       'Listfiles'                 => [ 'Список_файлів' ],
-       'Listgrouprights'           => [ 'Список_прав_груп', 'Права_груп_користувачів' ],
-       'Listredirects'             => [ 'Список_перенаправлень' ],
-       'ListDuplicatedFiles'       => [ 'Список_дубльованих_файлів' ],
-       'Listusers'                 => [ 'Список_користувачів' ],
-       'Lockdb'                    => [ 'Заблокувати_базу_даних' ],
-       'Log'                       => [ 'Журнали' ],
-       'Lonelypages'               => [ 'Ізольовані_сторінки' ],
-       'Longpages'                 => [ 'Найдовші_сторінки' ],
-       'MergeHistory'              => [ 'Об\'єднання_історії' ],
-       'MIMEsearch'                => [ 'Пошук_за_MIME' ],
-       'Mostcategories'            => [ 'Найбільш_категоризовані' ],
-       'Mostimages'                => [ 'Найуживаніші_файли' ],
-       'Mostinterwikis'            => [ 'Найбільше_інтервікі' ],
-       'Mostlinked'                => [ 'Найуживаніші_сторінки', 'Найбільше_посилань' ],
-       'Mostlinkedcategories'      => [ 'Найуживаніші_категорії' ],
-       'Mostlinkedtemplates'       => [ 'Найуживаніші_шаблони' ],
-       'Mostrevisions'             => [ 'Найбільш_редаговані' ],
-       'Movepage'                  => [ 'Перейменувати' ],
-       'Mycontributions'           => [ 'Мій_внесок' ],
-       'MyLanguage'                => [ 'Моя_мова' ],
-       'Mypage'                    => [ 'Моя_сторінка' ],
-       'Mytalk'                    => [ 'Моє_обговорення' ],
-       'Myuploads'                 => [ 'Мої_завантаження' ],
-       'Newimages'                 => [ 'Нові_файли' ],
-       'Newpages'                  => [ 'Нові_сторінки' ],
-       'PasswordReset'             => [ 'Скинути_пароль' ],
-       'PermanentLink'             => [ 'Постійне_посилання' ],
-       'Preferences'               => [ 'Налаштування' ],
-       'Prefixindex'               => [ 'Покажчик_за_початком_назви' ],
-       'Protectedpages'            => [ 'Захищені_сторінки' ],
-       'Protectedtitles'           => [ 'Захищені_назви_сторінок' ],
-       'Randompage'                => [ 'Випадкова_сторінка' ],
-       'Randomredirect'            => [ 'Випадкове_перенаправлення' ],
-       'Recentchanges'             => [ 'Нові_редагування' ],
-       'Recentchangeslinked'       => [ 'Пов\'язані_редагування' ],
+       'Badtitle'                  => [ 'Помилковий_заголовок', 'Недопустимое_название' ],
+       'Blankpage'                 => [ 'Порожня_сторінка', 'Пустая_страница' ],
+       'Block'                     => [ 'Заблокувати', 'Заблокировать' ],
+       'Booksources'               => [ 'Джерела_книг', 'Источники_книг' ],
+       'BrokenRedirects'           => [ 'Розірвані_перенаправлення', 'Разорванные_перенаправления' ],
+       'Categories'                => [ 'Категорії', 'Категории' ],
+       'ChangeEmail'               => [ 'Змінити_e-mail', 'Сменить_e-mail', 'Сменить_почту' ],
+       'ChangePassword'            => [ 'Змінити_пароль', 'Сменить_пароль' ],
+       'ComparePages'              => [ 'Порівняння_сторінок', 'Сравнение_страниц' ],
+       'Confirmemail'              => [ 'Підтвердити_e-mail', 'Подтвердить_e-mail', 'Подтвердить_почту' ],
+       'Contributions'             => [ 'Внесок', 'Вклад' ],
+       'CreateAccount'             => [ 'Створити_обліковий_запис', 'Создать_учётную_запись', 'Создать_пользователя', 'Зарегистрироваться' ],
+       'Deadendpages'              => [ 'Сторінки_без_посилань', 'Тупиковые_страницы' ],
+       'DeletedContributions'      => [ 'Вилучений_внесок', 'Удалённый_вклад' ],
+       'DoubleRedirects'           => [ 'Подвійні_перенаправлення', 'Двойные_перенаправления' ],
+       'EditWatchlist'             => [ 'Редагувати_список_спостереження', 'Править_список_наблюдения' ],
+       'Emailuser'                 => [ 'Лист_користувачеві', 'Письмо_участнику', 'Отправить_письмо' ],
+       'ExpandTemplates'           => [ 'Розгортання_шаблонів', 'Развёртка_шаблонов' ],
+       'Export'                    => [ 'Експорт', 'Экспорт', 'Выгрузка' ],
+       'Fewestrevisions'           => [ 'Найменшредаговані', 'Редко_редактируемые' ],
+       'FileDuplicateSearch'       => [ 'Пошук_дублікатів_файлів', 'Поиск_дубликатов_файлов' ],
+       'Filepath'                  => [ 'Шлях_до_файлу', 'Путь_к_файлу' ],
+       'Import'                    => [ 'Імпорт', 'Импорт' ],
+       'Invalidateemail'           => [ 'Неперевірена_email-адреса', 'Отменить_подтверждение_адреса' ],
+       'JavaScriptTest'            => [ 'JavaScript_тест', 'Тестирование_JavaScript' ],
+       'BlockList'                 => [ 'Список_блокувань', 'Блокування', 'Блокування_IP-адрес', 'Список_блокировок', 'Блокировки' ],
+       'LinkSearch'                => [ 'Пошук_посилань', 'Поиск_ссылок' ],
+       'Listadmins'                => [ 'Список_адміністраторів', 'Список_администраторов' ],
+       'Listbots'                  => [ 'Список_ботів', 'Список_ботов' ],
+       'Listfiles'                 => [ 'Список_файлів', 'Список_файлов', 'Список_изображений' ],
+       'Listgrouprights'           => [ 'Список_прав_груп', 'Права_груп_користувачів', 'Права_групп_участников', 'Список_прав_групп' ],
+       'Listredirects'             => [ 'Список_перенаправлень', 'Список_перенаправлений' ],
+       'ListDuplicatedFiles'       => [ 'Список_дубльованих_файлів', 'Список_файлов-дубликатов' ],
+       'Listusers'                 => [ 'Список_користувачів', 'Список_участников' ],
+       'Lockdb'                    => [ 'Заблокувати_базу_даних', 'Заблокировать_БД', 'Заблокировать_базу_данных' ],
+       'Log'                       => [ 'Журнали', 'Журналы', 'Журнал' ],
+       'Lonelypages'               => [ 'Ізольовані_сторінки', 'Изолированные_страницы' ],
+       'Longpages'                 => [ 'Найдовші_сторінки', 'Длинные_страницы' ],
+       'MergeHistory'              => [ 'Об\'єднання_історії', 'Объединение_историй' ],
+       'MIMEsearch'                => [ 'Пошук_за_MIME', 'Поиск_по_MIME' ],
+       'Mostcategories'            => [ 'Найбільш_категоризовані', 'Самые_категоризованные' ],
+       'Mostimages'                => [ 'Найуживаніші_файли', 'Самые_используемые_файлы' ],
+       'Mostinterwikis'            => [ 'Найбільше_інтервікі', 'Наибольшее_количество_интервики-ссылок' ],
+       'Mostlinked'                => [ 'Найуживаніші_сторінки', 'Найбільше_посилань', 'Самые_используемые_страницы' ],
+       'Mostlinkedcategories'      => [ 'Найуживаніші_категорії', 'Самые_используемые_категории' ],
+       'Mostlinkedtemplates'       => [ 'Найуживаніші_шаблони', 'Самые_используемые_шаблоны' ],
+       'Mostrevisions'             => [ 'Найбільш_редаговані', 'Наибольшее_количество_версий' ],
+       'Movepage'                  => [ 'Перейменувати', 'Переименовать_страницу', 'Переименование', 'Переименовать' ],
+       'Mycontributions'           => [ 'Мій_внесок', 'Мой_вклад' ],
+       'MyLanguage'                => [ 'Моя_мова', 'Мой_язык' ],
+       'Mypage'                    => [ 'Моя_сторінка', 'Моя_страница' ],
+       'Mytalk'                    => [ 'Моє_обговорення', 'Моё_обсуждение' ],
+       'Myuploads'                 => [ 'Мої_завантаження', 'Мои_загрузки' ],
+       'Newimages'                 => [ 'Нові_файли', 'Новые_файлы' ],
+       'Newpages'                  => [ 'Нові_сторінки', 'Новые_страницы' ],
+       'PasswordReset'             => [ 'Скинути_пароль', 'Сброс_пароля' ],
+       'PermanentLink'             => [ 'Постійне_посилання', 'Постоянная_ссылка' ],
+       'Preferences'               => [ 'Налаштування', 'Настройки' ],
+       'Prefixindex'               => [ 'Покажчик_за_початком_назви', 'Указатель_по_началу_названия' ],
+       'Protectedpages'            => [ 'Захищені_сторінки', 'Защищённые_страницы' ],
+       'Protectedtitles'           => [ 'Захищені_назви_сторінок', 'Защищённые_названия' ],
+       'Randompage'                => [ 'Випадкова_сторінка', 'Случайная_страница', 'Случайная' ],
+       'Randomredirect'            => [ 'Випадкове_перенаправлення', 'Случайное_перенаправление' ],
+       'Recentchanges'             => [ 'Нові_редагування', 'Свежие_правки' ],
+       'Recentchangeslinked'       => [ 'Пов\'язані_редагування', 'Связанные_правки' ],
        'Redirect'                  => [ 'Перенаправлення' ],
-       'Revisiondelete'            => [ 'Вилучити_редагування' ],
-       'Search'                    => [ 'Пошук' ],
-       'Shortpages'                => [ 'Короткі_сторінки' ],
-       'Specialpages'              => [ 'Спеціальні_сторінки' ],
+       'Revisiondelete'            => [ 'Вилучити_редагування', 'Удаление_правки' ],
+       'Search'                    => [ 'Пошук', 'Поиск' ],
+       'Shortpages'                => [ 'Короткі_сторінки', 'Короткие_страницы' ],
+       'Specialpages'              => [ 'Спеціальні_сторінки', 'Спецстраницы' ],
        'Statistics'                => [ 'Статистика' ],
-       'Tags'                      => [ 'Мітки' ],
-       'Unblock'                   => [ 'Розблокувати' ],
-       'Uncategorizedcategories'   => [ 'Некатегоризовані_категорії' ],
-       'Uncategorizedimages'       => [ 'Некатегоризовані_файли' ],
-       'Uncategorizedpages'        => [ 'Некатегоризовані_сторінки' ],
-       'Uncategorizedtemplates'    => [ 'Некатегоризовані_шаблони' ],
-       'Undelete'                  => [ 'Відновити' ],
-       'Unlockdb'                  => [ 'Розблокувати_базу_даних' ],
-       'Unusedcategories'          => [ 'Порожні_категорії' ],
-       'Unusedimages'              => [ 'Невикористані_файли' ],
-       'Unusedtemplates'           => [ 'Невикористані_шаблони' ],
+       'Tags'                      => [ 'Мітки', 'Метки' ],
+       'Unblock'                   => [ 'Розблокувати', 'Разблокировка' ],
+       'Uncategorizedcategories'   => [ 'Некатегоризовані_категорії', 'Некатегоризованные_категории' ],
+       'Uncategorizedimages'       => [ 'Некатегоризовані_файли', 'Некатегоризованные_файлы' ],
+       'Uncategorizedpages'        => [ 'Некатегоризовані_сторінки', 'Некатегоризованные_страницы' ],
+       'Uncategorizedtemplates'    => [ 'Некатегоризовані_шаблони', 'Некатегоризованные_шаблоны' ],
+       'Undelete'                  => [ 'Відновити', 'Восстановить', 'Восстановление' ],
+       'Unlockdb'                  => [ 'Розблокувати_базу_даних', 'Разблокировка_БД' ],
+       'Unusedcategories'          => [ 'Порожні_категорії', 'Неиспользуемые_категории' ],
+       'Unusedimages'              => [ 'Невикористані_файли', 'Неиспользуемые_файлы' ],
+       'Unusedtemplates'           => [ 'Невикористані_шаблони', 'Неиспользуемые_шаблоны' ],
        'Unwatchedpages'            => [ 'Неспостережувані' ],
-       'Upload'                    => [ 'Завантаження' ],
-       'UploadStash'               => [ 'Приховане_завантаження' ],
-       'Userlogin'                 => [ 'Вхід' ],
-       'Userlogout'                => [ 'Вихід' ],
-       'Userrights'                => [ 'Керування_правами_користувачів' ],
-       'Version'                   => [ 'Версія' ],
-       'Wantedcategories'          => [ 'Потрібні_категорії' ],
-       'Wantedfiles'               => [ 'Потрібні_файли' ],
-       'Wantedpages'               => [ 'Потрібні_сторінки' ],
-       'Wantedtemplates'           => [ 'Потрібні_шаблони' ],
-       'Watchlist'                 => [ 'Список_спостереження' ],
-       'Whatlinkshere'             => [ 'Посилання_сюди' ],
-       'Withoutinterwiki'          => [ 'Без_інтервікі' ],
+       'Upload'                    => [ 'Завантаження', 'Загрузка' ],
+       'UploadStash'               => [ 'Приховане_завантаження', 'Скрытная_загрузка' ],
+       'Userlogin'                 => [ 'Вхід', 'Вход' ],
+       'Userlogout'                => [ 'Вихід', 'Завершение_сеанса', 'Выход' ],
+       'Userrights'                => [ 'Керування_правами_користувачів', 'Управление_правами' ],
+       'Version'                   => [ 'Версія', 'Версия' ],
+       'Wantedcategories'          => [ 'Потрібні_категорії', 'Требуемые_категории' ],
+       'Wantedfiles'               => [ 'Потрібні_файли', 'Требуемые_файлы' ],
+       'Wantedpages'               => [ 'Потрібні_сторінки', 'Требуемые_страницы' ],
+       'Wantedtemplates'           => [ 'Потрібні_шаблони', 'Требуемые_шаблоны' ],
+       'Watchlist'                 => [ 'Список_спостереження', 'Список_наблюдения' ],
+       'Whatlinkshere'             => [ 'Посилання_сюди', 'Ссылки_сюда' ],
+       'Withoutinterwiki'          => [ 'Без_інтервікі', 'Без_интервики' ],
 ];
 
 $magicWords = [
@@ -368,8 +380,8 @@ $magicWords = [
        'pagesincategory_all'       => [ '0', 'усе', 'все', 'all' ],
        'pagesincategory_pages'     => [ '0', 'сторінки', 'страницы', 'pages' ],
        'pagesincategory_subcats'   => [ '0', 'підкатегорії', 'подкатегории', 'subcats' ],
+       'pagesincategory_files'     => [ '0', 'файли', 'файлы', 'files' ],
 ];
 
 $linkTrail = '/^([a-zабвгґдеєжзиіїйклмнопрстуфхцчшщьєюяёъы“»]+)(.*)$/sDu';
 $linkPrefixCharset = '„«';
-
index 552bec0..3925efe 100644 (file)
@@ -498,7 +498,7 @@ abstract class Maintenance {
         */
        public function getConfig() {
                if ( $this->config === null ) {
-                       $this->config = ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+                       $this->config = MediaWikiServices::getInstance()->getMainConfig();
                }
 
                return $this->config;
index 38b8ba1..863d74a 100644 (file)
@@ -22,6 +22,8 @@
  * @author Roan Kattouw
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -41,7 +43,7 @@ class CleanupRemovedModules extends Maintenance {
 
        public function execute() {
                $dbw = $this->getDB( DB_MASTER );
-               $rl = new ResourceLoader( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $rl = new ResourceLoader( MediaWikiServices::getInstance()->getMainConfig() );
                $moduleNames = $rl->getModuleNames();
                $moduleList = implode( ', ', array_map( [ $dbw, 'addQuotes' ], $moduleNames ) );
                $limit = max( 1, intval( $this->getOption( 'batchsize', 500 ) ) );
index cd7a842..95bbe3d 100644 (file)
@@ -47,7 +47,7 @@ class UploadStashCleanup extends Maintenance {
                $repo = RepoGroup::singleton()->getLocalRepo();
                $tempRepo = $repo->getTempRepo();
 
-               $dbr = $repo->getSlaveDB();
+               $dbr = $repo->getReplicaDB();
 
                // how far back should this look for files to delete?
                $cutoff = time() - $wgUploadStashMaxAge;
index f3561b5..e649c9d 100644 (file)
@@ -98,7 +98,7 @@ $maintenance->finalSetup();
 require_once "$IP/includes/Setup.php";
 
 // Initialize main config instance
-$maintenance->setConfig( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+$maintenance->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
 
 // Sanity-check required extensions are installed
 $maintenance->checkRequiredExtensions();
index c06a72e..7979e7d 100644 (file)
@@ -36,7 +36,7 @@ class FindMissingFiles extends Maintenance {
                $lastName = $this->getOption( 'start', '' );
 
                $repo = RepoGroup::singleton()->getLocalRepo();
-               $dbr = $repo->getSlaveDB();
+               $dbr = $repo->getReplicaDB();
                $be = $repo->getBackend();
 
                $mtime1 = $dbr->timestampOrNull( $this->getOption( 'mtimeafter', null ) );
index abd170b..5980631 100644 (file)
@@ -75,7 +75,7 @@ class FindOrphanedFiles extends Maintenance {
                        return;
                }
 
-               $dbr = $repo->getSlaveDB();
+               $dbr = $repo->getReplicaDB();
 
                $curNames = [];
                $oldNames = [];
index 2894653..816e745 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance
  */
 
+use MediaWiki\MediaWikiServices;
+
 require_once __DIR__ . '/Maintenance.php';
 
 /**
@@ -129,7 +131,7 @@ class ImportTextFiles extends Maintenance {
                                }
                        }
 
-                       $rev = new WikiRevision( ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+                       $rev = new WikiRevision( MediaWikiServices::getInstance()->getMainConfig() );
                        $rev->setText( rtrim( $text ) );
                        $rev->setTitle( $title );
                        $rev->setUserObj( $user );
index c6bd794..b41e0e0 100644 (file)
@@ -28,6 +28,10 @@ require_once __DIR__ . '/Maintenance.php';
  *  populateContentModel.php --ns=1 --table=page
  */
 class PopulateContentModel extends Maintenance {
+       protected $wikiId;
+
+       protected $wanCache;
+
        public function __construct() {
                parent::__construct();
                $this->addDescription( 'Populate the various content_* fields' );
@@ -38,6 +42,11 @@ class PopulateContentModel extends Maintenance {
 
        public function execute() {
                $dbw = $this->getDB( DB_MASTER );
+
+               $this->wikiId = $dbw->getWikiID();
+
+               $this->wanCache = ObjectCache::getMainWANInstance();
+
                $ns = $this->getOption( 'ns' );
                if ( !ctype_digit( $ns ) && $ns !== 'all' ) {
                        $this->error( 'Invalid namespace', 1 );
@@ -57,6 +66,18 @@ class PopulateContentModel extends Maintenance {
                }
        }
 
+       protected function clearCache( $page_id, $rev_id ) {
+               $contentModelKey = $this->wanCache->makeKey( 'page', 'content-model', $rev_id );
+               $revisionKey =
+                       $this->wanCache->makeGlobalKey( 'revision', $this->wikiId, $page_id, $rev_id );
+
+               // WikiPage content model cache
+               $this->wanCache->delete( $contentModelKey );
+
+               // Revision object cache, which contains a content model
+               $this->wanCache->delete( $revisionKey );
+       }
+
        private function updatePageRows( Database $dbw, $pageIds, $model ) {
                $count = count( $pageIds );
                $this->output( "Setting $count rows to $model..." );
@@ -117,6 +138,7 @@ class PopulateContentModel extends Maintenance {
                        [ $key => $ids ],
                        __METHOD__
                );
+
                $this->output( "done.\n" );
        }
 
@@ -130,19 +152,27 @@ class PopulateContentModel extends Maintenance {
                        $fields = [ 'ar_namespace', 'ar_title' ];
                        $join_conds = [];
                        $where = $ns === 'all' ? [] : [ 'ar_namespace' => $ns ];
+                       $page_id_column = 'ar_page_id';
+                       $rev_id_column = 'ar_rev_id';
                } else { // revision
                        $selectTables = [ 'revision', 'page' ];
                        $fields = [ 'page_title', 'page_namespace' ];
                        $join_conds = [ 'page' => [ 'INNER JOIN', 'rev_page=page_id' ] ];
                        $where = $ns === 'all' ? [] : [ 'page_namespace' => $ns ];
+                       $page_id_column = 'rev_page';
+                       $rev_id_column = 'rev_id';
                }
 
                $toSave = [];
+               $idsToClear = [];
                $lastId = 0;
                do {
                        $rows = $dbw->select(
                                $selectTables,
-                               array_merge( $fields, [ $model_column, $format_column, $key ] ),
+                               array_merge(
+                                       $fields,
+                                       [ $model_column, $format_column, $key, $page_id_column, $rev_id_column ]
+                               ),
                                // @todo support populating format if model is already set
                                [
                                        $model_column => null,
@@ -174,9 +204,17 @@ class PopulateContentModel extends Maintenance {
                                if ( $dbModel === null && $dbFormat === null ) {
                                        // Set the defaults
                                        $toSave[$defaultModel][] = $row->{$key};
+                                       $idsToClear[] = [
+                                               'page_id' => $row->{$page_id_column},
+                                               'rev_id' => $row->{$rev_id_column},
+                                       ];
                                } else { // $dbModel === null, $dbFormat set.
                                        if ( $dbFormat === $defaultFormat ) {
                                                $toSave[$defaultModel][] = $row->{$key};
+                                               $idsToClear[] = [
+                                                       'page_id' => $row->{$page_id_column},
+                                                       'rev_id' => $row->{$rev_id_column},
+                                               ];
                                        } else { // non-default format, just update now
                                                $this->output( "Updating model to match format for $table $id of $title... " );
                                                $dbw->update(
@@ -186,6 +224,7 @@ class PopulateContentModel extends Maintenance {
                                                        __METHOD__
                                                );
                                                wfWaitForSlaves();
+                                               $this->clearCache( $row->{$page_id_column}, $row->{$rev_id_column} );
                                                $this->output( "done.\n" );
                                                continue;
                                        }
@@ -200,6 +239,10 @@ class PopulateContentModel extends Maintenance {
                foreach ( $toSave as $model => $ids ) {
                        $this->updateRevisionOrArchiveRows( $dbw, $ids, $model, $table );
                }
+
+               foreach ( $idsToClear as $idPair ) {
+                       $this->clearCache( $idPair['page_id'], $idPair['rev_id'] );
+               }
        }
 }
 
index 31b2101..f6bb253 100644 (file)
@@ -41,8 +41,8 @@ class Protect extends Maintenance {
        }
 
        public function execute() {
-               $userName = $this->getOption( 'u', false );
-               $reason = $this->getOption( 'r', '' );
+               $userName = $this->getOption( 'user', false );
+               $reason = $this->getOption( 'reason', '' );
 
                $cascade = $this->hasOption( 'cascade' );
 
index 615d1fe..3c0fc7e 100644 (file)
@@ -210,7 +210,7 @@ class PurgeChangedFiles extends Maintenance {
        }
 
        protected function purgeFromArchiveTable( LocalRepo $repo, LocalFile $file ) {
-               $dbr = $repo->getSlaveDB();
+               $dbr = $repo->getReplicaDB();
                $res = $dbr->select(
                        'filearchive',
                        [ 'fa_archive_name' ],
index 5d085a8..e00a55d 100644 (file)
@@ -32,6 +32,8 @@ require __DIR__ . '/Maintenance.php';
 class PurgeParserCache extends Maintenance {
        public $lastProgress;
 
+       private $usleep = 0;
+
        function __construct() {
                parent::__construct();
                $this->addDescription( "Remove old objects from the parser cache. " .
@@ -39,36 +41,44 @@ class PurgeParserCache extends Maintenance {
                $this->addOption( 'expiredate', 'Delete objects expiring before this date.', false, true );
                $this->addOption(
                        'age',
-                       'Delete objects created more than this many seconds ago, assuming $wgParserCacheExpireTime ' .
-                               'has been consistent.',
-                       false, true );
+                       'Delete objects created more than this many seconds ago, assuming ' .
+                               '$wgParserCacheExpireTime has remained consistent.',
+                       false,
+                       true );
+               $this->addOption( 'msleep', 'Milliseconds to sleep between purge chunks', false, true );
        }
 
        function execute() {
+               global $wgParserCacheExpireTime;
+
                $inputDate = $this->getOption( 'expiredate' );
                $inputAge = $this->getOption( 'age' );
                if ( $inputDate !== null ) {
                        $date = wfTimestamp( TS_MW, strtotime( $inputDate ) );
                } elseif ( $inputAge !== null ) {
-                       global $wgParserCacheExpireTime;
                        $date = wfTimestamp( TS_MW, time() + $wgParserCacheExpireTime - intval( $inputAge ) );
                } else {
                        $this->error( "Must specify either --expiredate or --age", 1 );
+                       return;
                }
+               $this->usleep = 1e3 * $this->getOption( 'msleep', 0 );
 
                $english = Language::factory( 'en' );
-               $this->output( "Deleting objects expiring before " . $english->timeanddate( $date ) . "\n" );
+               $this->output( "Deleting objects expiring before " .
+                       $english->timeanddate( $date ) . "\n" );
 
                $pc = wfGetParserCacheStorage();
-               $success = $pc->deleteObjectsExpiringBefore( $date, [ $this, 'showProgress' ] );
+               $success = $pc->deleteObjectsExpiringBefore( $date, [ $this, 'showProgressAndWait' ] );
                if ( !$success ) {
                        $this->error( "\nCannot purge this kind of parser cache.", 1 );
                }
-               $this->showProgress( 100 );
+               $this->showProgressAndWait( 100 );
                $this->output( "\nDone\n" );
        }
 
-       function showProgress( $percent ) {
+       public function showProgressAndWait( $percent ) {
+               usleep( $this->usleep ); // avoid lag; T150124
+
                $percentString = sprintf( "%.2f", $percent );
                if ( $percentString === $this->lastProgress ) {
                        return;
index a5e7a2f..f8eedb3 100644 (file)
@@ -34,26 +34,74 @@ class BatchedQueryRunner extends Maintenance {
        public function __construct() {
                parent::__construct();
                $this->addDescription(
-                       "Run a query repeatedly until it affects 0 rows, and wait for replica DBs in between.\n" .
-                               "NOTE: You need to set a LIMIT clause yourself." );
+                       "Run an update query on all rows of a table. " .
+                       "Waits for replicas at appropriate intervals." );
+               $this->addOption( 'table', 'The table name', true, true );
+               $this->addOption( 'set', 'The SET clause', true, true );
+               $this->addOption( 'where', 'The WHERE clause', false, true );
+               $this->addOption( 'key', 'A column name, the values of which are unique', true, true );
+               $this->addOption( 'batch-size', 'The batch size (default 1000)', false, true );
+               $this->addOption( 'db', 'The database name, or omit to use the current wiki.', false, true );
        }
 
        public function execute() {
-               if ( !$this->hasArg() ) {
-                       $this->error( "No query specified. Specify the query as a command line parameter.", true );
+               $table = $this->getOption( 'table' );
+               $key = $this->getOption( 'key' );
+               $set = $this->getOption( 'set' );
+               $where = $this->getOption( 'where', null );
+               $where = $where === null ? [] : [ $where ];
+               $batchSize = $this->getOption( 'batch-size', 1000 );
+
+               $dbName = $this->getOption( 'db', null );
+               if ( $dbName === null ) {
+                       $dbw = $this->getDB( DB_MASTER );
+               } else {
+                       $lbf = MediaWiki\MediaWikiServices::getInstance()->getDBLoadBalancerFactory();
+                       $lb = $lbf->getMainLB( $dbName );
+                       $dbw = $lb->getConnection( DB_MASTER, [], $dbName );
                }
 
-               $query = $this->getArg();
+               $selectConds = $where;
+               $prevEnd = false;
+
                $n = 1;
-               $dbw = $this->getDB( DB_MASTER );
                do {
                        $this->output( "Batch $n: " );
                        $n++;
+
+                       // Note that the update conditions do not rely on atomicity of the
+                       // SELECT query in order to guarantee that all rows are updated. The
+                       // results of the SELECT are merely a partitioning hint. Simultaneous
+                       // updates merely result in the wrong number of rows being updated
+                       // in a batch.
+
+                       $res = $dbw->select( $table, $key, $selectConds, __METHOD__,
+                               [ 'ORDER BY' => $key, 'LIMIT' => $batchSize ] );
+                       if ( $res->numRows() ) {
+                               $res->seek( $res->numRows() - 1 );
+                               $row = $res->fetchObject();
+                               $end = $dbw->addQuotes( $row->$key );
+                               $selectConds = array_merge( $where, [ "$key > $end" ] );
+                               $updateConds = array_merge( $where, [ "$key <= $end" ] );
+                       } else {
+                               $updateConds = $where;
+                       }
+                       if ( $prevEnd !== false ) {
+                               $updateConds = array_merge( [ "$key > $prevEnd" ], $updateConds );
+                       }
+
+                       $query = "UPDATE " . $dbw->tableName( $table ) .
+                               " SET " . $set .
+                               " WHERE " . $dbw->makeList( $updateConds, IDatabase::LIST_AND );
+
                        $dbw->query( $query, __METHOD__ );
+
+                       $prevEnd = $end;
+
                        $affected = $dbw->affectedRows();
-                       $this->output( "$affected rows\n" );
+                       $this->output( "$affected rows affected\n" );
                        wfWaitForSlaves();
-               } while ( $affected > 0 );
+               } while ( $res->numRows() );
        }
 
        public function getDbType() {
index bb9f4ea..9045870 100644 (file)
@@ -21,6 +21,8 @@
  * @ingroup Maintenance ExternalStorage
  */
 
+use MediaWiki\MediaWikiServices;
+
 if ( !defined( 'MEDIAWIKI' ) ) {
        $optionsWithoutArgs = [ 'fix' ];
        require_once __DIR__ . '/../commandLine.inc';
@@ -470,7 +472,7 @@ class CheckStorage {
                $source = new ImportStreamSource( $file );
                $importer = new WikiImporter(
                        $source,
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
                $importer->setRevisionCallback( [ $this, 'importRevision' ] );
                $importer->doImport();
diff --git a/maintenance/updateCredits.php b/maintenance/updateCredits.php
new file mode 100644 (file)
index 0000000..eb717e8
--- /dev/null
@@ -0,0 +1,79 @@
+<?php
+/**
+ * Update the CREDITS list by merging in the list of git commit authors.
+ *
+ * The contents of the existing contributors list will be preserved. If a name
+ * needs to be removed for some reason that must be done manually before or
+ * after running this script.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ */
+
+if ( PHP_SAPI != 'cli' ) {
+       die( "This script can only be run from the command line.\n" );
+}
+
+$CREDITS = 'CREDITS';
+$START_CONTRIBUTORS = '<!-- BEGIN CONTRIBUTOR LIST -->';
+$END_CONTRIBUTORS = '<!-- END CONTRIBUTOR LIST -->';
+
+$inHeader = true;
+$inFooter = false;
+$header = [];
+$contributors = [];
+$footer = [];
+
+if ( !file_exists( $CREDITS ) ) {
+       exit( 'No CREDITS file found. Are you running this script in the right directory?' );
+}
+
+$lines = explode( "\n", file_get_contents( $CREDITS ) );
+foreach ( $lines as $line ) {
+       if ( $inHeader ) {
+               $header[] = $line;
+               $inHeader = $line !== $START_CONTRIBUTORS;
+       } elseif ( $inFooter ) {
+               $footer[] = $line;
+       } elseif ( $line == $END_CONTRIBUTORS ) {
+               $inFooter = true;
+               $footer[] = $line;
+       } else {
+               $name = substr( $line, 2 );
+               $contributors[$name] = true;
+       }
+}
+unset( $lines );
+
+$lines = explode( "\n", shell_exec( 'git log --format="%aN"' ) );
+foreach ( $lines as $line ) {
+       if ( empty( $line ) )  {
+               continue;
+       }
+       if ( substr( $line, 0, 5 ) === '[BOT]' ) {
+               continue;
+       }
+       $contributors[$line] = true;
+}
+
+$contributors = array_keys( $contributors );
+$collator = Collator::create( 'uca-default-u-kn' );
+$collator->sort( $contributors );
+array_walk( $contributors, function ( &$v, $k ) {
+       $v = "* {$v}";
+} );
+
+file_put_contents( $CREDITS,
+       implode( "\n", array_merge( $header, $contributors, $footer ) ) );
index 2ce19e5..0a859c0 100644 (file)
@@ -113,6 +113,7 @@ class WrapOldPasswords extends Maintenance {
                        }
 
                        $this->commitTransaction( $dbw, __METHOD__ );
+                       LBFactory::waitForReplication();
 
                        // Clear memcached so old passwords are wiped out
                        foreach ( $updateUsers as $user ) {
index 3b75c3a..99e752c 100644 (file)
@@ -6,13 +6,13 @@
     "postdoc": "grunt copy:jsduck"
   },
   "devDependencies": {
+    "eslint-config-wikimedia": "0.3.0",
     "grunt": "1.0.1",
     "grunt-banana-checker": "0.5.0",
     "grunt-contrib-copy": "1.0.0",
-    "grunt-contrib-jshint": "1.0.0",
     "grunt-contrib-watch": "1.0.0",
-    "grunt-jscs": "2.8.0",
-    "grunt-jsonlint": "1.0.7",
+    "grunt-eslint": "19.0.0",
+    "grunt-jsonlint": "1.1.0",
     "grunt-karma": "2.0.0",
     "grunt-stylelint": "0.6.0",
     "karma": "1.1.0",
index edce2ea..4693b42 100644 (file)
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -31,4 +31,7 @@
        <exclude-pattern type="relative">^extensions/</exclude-pattern>
        <exclude-pattern type="relative">^skins/</exclude-pattern>
        <exclude-pattern>.git</exclude-pattern>
+       <exclude-pattern>AdminSettings.php</exclude-pattern>
+       <exclude-pattern>LocalSettings.php</exclude-pattern>
+       <exclude-pattern>StartProfiler.php</exclude-pattern>
 </ruleset>
index 2e4a15d..b37febd 100644 (file)
@@ -40,7 +40,6 @@ return [
                'group' => 'noscript',
        ],
        'filepage' => [
-               'position' => 'top',
                'class' => 'ResourceLoaderWikiModule',
                'styles' => [ 'MediaWiki:Filepage.css' ],
        ],
@@ -97,13 +96,11 @@ return [
         * including more than one of them into your skin as this will result in duplicate CSS.
         */
        'mediawiki.skinning.elements' => [
-               'position' => 'top',
                'styles' => [
                        'resources/src/mediawiki.skinning/elements.css' => [ 'media' => 'screen' ],
                ],
        ],
        'mediawiki.skinning.content' => [
-               'position' => 'top',
                'styles' => [
                        'resources/src/mediawiki.skinning/elements.css' => [ 'media' => 'screen' ],
                        'resources/src/mediawiki.skinning/content.css' => [ 'media' => 'screen' ],
@@ -111,7 +108,6 @@ return [
        ],
        // Used in the web installer. Test it after modifying this definition!
        'mediawiki.skinning.interface' => [
-               'position' => 'top',
                'class' => 'ResourceLoaderSkinModule',
                'styles' => [
                        'resources/src/mediawiki.skinning/elements.css' => [ 'media' => 'screen' ],
@@ -121,7 +117,6 @@ return [
        ],
 
        'mediawiki.skinning.content.parsoid' => [
-               'position' => 'top',
                // Style Parsoid HTML+RDFa output consistent with wikitext from PHP parser
                // with the interface.css styles; skinStyles should be used if your
                // skin over-rides common content styling.
@@ -132,7 +127,6 @@ return [
        ],
 
        'mediawiki.skinning.content.externallinks' => [
-               'position' => 'bottom',
                'styles' => [
                        'resources/src/mediawiki.skinning/content.externallinks.css' => [ 'media' => 'screen' ],
                ],
@@ -323,7 +317,6 @@ return [
        'jquery.qunit' => [
                'scripts' => 'resources/lib/qunitjs/qunit.js',
                'styles' => 'resources/lib/qunitjs/qunit.css',
-               'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'jquery.qunit.completenessTest' => [
@@ -341,7 +334,6 @@ return [
                        'message' => 'Please use "mediawiki.storage" instead.',
                ],
                'scripts' => 'resources/lib/jquery/jquery.jStorage.js',
-               'dependencies' => 'json',
        ],
        'jquery.suggestions' => [
                'scripts' => 'resources/src/jquery/jquery.suggestions.js',
@@ -395,7 +387,6 @@ return [
                'group' => 'jquery.ui',
        ],
        'jquery.ui.core.styles' => [
-               'position' => 'top',
                'skinStyles' => [
                        'default' => [
                                'resources/lib/jquery.ui/themes/smoothness/jquery.ui.core.css',
@@ -746,10 +737,10 @@ return [
 
        /* json2 */
 
+       // Deprecated since MediaWiki 1.29.0
        'json' => [
-               'scripts' => 'resources/lib/json2/json2.js',
+               'deprecated' => 'Use of the "json" MediaWiki module is deprecated since MediaWiki 1.29.0',
                'targets' => [ 'desktop', 'mobile' ],
-               'skipFunction' => 'resources/src/json-skip.js',
        ],
 
        /* Moment.js */
@@ -869,7 +860,6 @@ return [
        'mediawiki.apihelp' => [
                'styles' => 'resources/src/mediawiki/mediawiki.apihelp.css',
                'targets' => [ 'desktop' ],
-               'position' => 'top',
        ],
        'mediawiki.template' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.template.js',
@@ -891,7 +881,6 @@ return [
        'mediawiki.apipretty' => [
                'styles' => 'resources/src/mediawiki/mediawiki.apipretty.css',
                'targets' => [ 'desktop', 'mobile' ],
-               'position' => 'top',
        ],
        'mediawiki.api' => [
                'scripts' => 'resources/src/mediawiki/api.js',
@@ -936,7 +925,6 @@ return [
                        'dom-level2-shim',
                        'mediawiki.api',
                        'mediawiki.api.edit',
-                       'json',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -967,7 +955,6 @@ return [
                ],
        ],
        'mediawiki.content.json' => [
-               'position' => 'top',
                'styles' => 'resources/src/mediawiki/mediawiki.content.json.less',
        ],
        'mediawiki.confirmCloseWindow' => [
@@ -986,12 +973,8 @@ return [
                'dependencies' => [
                        'jquery.footHovzer',
                ],
-               // Uses a custom mw.config variable that is set in debughtml,
-               // must be loaded on the bottom
-               'position' => 'bottom',
        ],
        'mediawiki.diff.styles' => [
-               'position' => 'top',
                'styles' => [
                        'resources/src/mediawiki/mediawiki.diff.styles.css',
                        'resources/src/mediawiki/mediawiki.diff.styles.print.css' => [
@@ -1036,7 +1019,6 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.feedlink' => [
-               'position' => 'top',
                'styles' => 'resources/src/mediawiki/mediawiki.feedlink.css',
        ],
        'mediawiki.filewarning' => [
@@ -1061,7 +1043,6 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.helplink' => [
-               'position' => 'top',
                'styles' => [
                        'resources/src/mediawiki/mediawiki.helplink.less',
                ],
@@ -1111,12 +1092,10 @@ return [
        ],
        'mediawiki.htmlform.styles' => [
                'styles' => 'resources/src/mediawiki/htmlform/styles.css',
-               'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.htmlform.ooui.styles' => [
                'styles' => 'resources/src/mediawiki/htmlform/ooui.styles.css',
-               'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.icon' => [
@@ -1128,7 +1107,6 @@ return [
                'dependencies' => [
                        'jquery.byteLength',
                        'mediawiki.RegExp',
-                       'json',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -1179,7 +1157,6 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.notification.convertmessagebox.styles' => [
-               'position' => 'top',
                'styles' => [
                        'resources/src/mediawiki/mediawiki.notification.convertmessagebox.styles.less',
                ],
@@ -1191,7 +1168,6 @@ return [
        ],
        'mediawiki.pager.tablePager' => [
                'styles' => 'resources/src/mediawiki/mediawiki.pager.tablePager.less',
-               'position' => 'top',
        ],
        'mediawiki.searchSuggest' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.searchSuggest.js',
@@ -1209,7 +1185,6 @@ return [
                ],
        ],
        'mediawiki.sectionAnchor' => [
-               'position' => 'top',
                // Back-compat to hide it on cached pages (T18691; Ie9e334e973; 2015-03-17)
                'styles' => 'resources/src/mediawiki/mediawiki.sectionAnchor.css',
                'targets' => [ 'desktop', 'mobile' ],
@@ -1219,7 +1194,10 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.Title' => [
-               'scripts' => 'resources/src/mediawiki/mediawiki.Title.js',
+               'scripts' => [
+                       'resources/src/mediawiki/mediawiki.Title.js',
+                       'resources/src/mediawiki/mediawiki.Title.phpCharToUpper.js',
+               ],
                'dependencies' => [
                        'jquery.byteLength',
                        'mediawiki.util',
@@ -1406,6 +1384,11 @@ return [
                'dependencies' => 'mediawiki.util',
                'targets' => [ 'desktop', 'mobile' ],
        ],
+       'mediawiki.user.blockcookie' => [
+               'scripts' => 'resources/src/mediawiki/mediawiki.user.blockcookie.js',
+               'dependencies' => [ 'mediawiki.cookie', 'mediawiki.storage' ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
        'mediawiki.user' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.user.js',
                'dependencies' => [
@@ -1435,7 +1418,6 @@ return [
        ],
        'mediawiki.viewport' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.viewport.js',
-               'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.checkboxtoggle' => [
@@ -1454,7 +1436,6 @@ return [
                'scripts' => 'resources/src/mediawiki.toolbar/toolbar.js',
                'styles' => 'resources/src/mediawiki.toolbar/toolbar.less',
                'dependencies' => 'jquery.textSelection',
-               'position' => 'top',
        ],
        'mediawiki.experiments' => [
                'scripts' => 'resources/src/mediawiki/mediawiki.experiments.js',
@@ -1475,10 +1456,8 @@ return [
                        'jquery.byteLimit',
                        'mediawiki.api',
                ],
-               'position' => 'top',
        ],
        'mediawiki.action.edit.styles' => [
-               'position' => 'top',
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.edit.styles.css',
        ],
        'mediawiki.action.edit.collapsibleFooter' => [
@@ -1521,12 +1500,10 @@ return [
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.css',
        ],
        'mediawiki.action.history.styles' => [
-               'position' => 'top',
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.history.styles.css',
        ],
        // using this module is deprecated, for diff styles use mediawiki.diff.styles instead
        'mediawiki.action.history.diff' => [
-               'position' => 'top',
                'styles' => [
                        'resources/src/mediawiki/mediawiki.diff.styles.css',
                        'resources/src/mediawiki/mediawiki.diff.styles.print.css' => [
@@ -1552,7 +1529,6 @@ return [
                ],
        ],
        'mediawiki.action.view.categoryPage.styles' => [
-               'position' => 'top',
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.categoryPage.less',
                'targets' => [ 'desktop', 'mobile' ]
        ],
@@ -1575,11 +1551,9 @@ return [
        'mediawiki.action.view.redirect' => [
                'scripts' => 'resources/src/mediawiki.action/mediawiki.action.view.redirect.js',
                'dependencies' => 'jquery.client',
-               'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.action.view.redirectPage' => [
-               'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
                'styles' => 'resources/src/mediawiki.action/mediawiki.action.view.redirectPage.css',
        ],
@@ -1606,7 +1580,6 @@ return [
                                [ 'media' => 'print' ],
                        'resources/src/mediawiki.action/mediawiki.action.view.filepage.css',
                ],
-               'position' => 'top',
        ],
 
        /* MediaWiki Language */
@@ -1712,12 +1685,10 @@ return [
                        'resources/src/mediawiki/page/gallery.print.css' => [ 'media' => 'print' ],
                        'resources/src/mediawiki/page/gallery.css',
                ],
-               'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.page.gallery.slideshow' => [
                'scripts' => 'resources/src/mediawiki/page/gallery-slideshow.js',
-               'position' => 'top',
                'dependencies' => [
                        'mediawiki.api',
                        'mediawiki.Title',
@@ -1744,7 +1715,6 @@ return [
        'mediawiki.page.startup' => [
                'scripts' => 'resources/src/mediawiki/page/startup.js',
                'dependencies' => 'mediawiki.util',
-               'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.page.patrol.ajax' => [
@@ -1807,7 +1777,6 @@ return [
        /* MediaWiki Special pages */
 
        'mediawiki.special' => [
-               'position' => 'top',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.css',
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -1867,6 +1836,10 @@ return [
                        'apisandbox-continue',
                        'apisandbox-continue-clear',
                        'apisandbox-continue-help',
+                       'apisandbox-param-limit',
+                       'apisandbox-multivalue-all-namespaces',
+                       'apisandbox-multivalue-all-values',
+                       'api-format-prettyprint-status',
                        'blanknamespace',
                ],
        ],
@@ -1876,11 +1849,9 @@ return [
                'dependencies' => 'mediawiki.util',
        ],
        'mediawiki.special.changeslist' => [
-               'position' => 'top',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.css',
        ],
        'mediawiki.special.changeslist.legend' => [
-               'position' => 'top',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.legend.css',
        ],
        'mediawiki.special.changeslist.legend.js' => [
@@ -1891,15 +1862,12 @@ return [
                ],
        ],
        'mediawiki.special.changeslist.enhanced' => [
-               'position' => 'top',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.enhanced.css',
        ],
        'mediawiki.special.changeslist.visitedstatus' => [
-               'position' => 'top',
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.changeslist.visitedstatus.js',
        ],
        'mediawiki.special.comparepages.styles' => [
-               'position' => 'top',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.comparepages.styles.less',
        ],
        'mediawiki.special.edittags' => [
@@ -1914,7 +1882,6 @@ return [
        ],
        'mediawiki.special.edittags.styles' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.edittags.css',
-               'position' => 'top',
        ],
        'mediawiki.special.import' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.import.js',
@@ -1928,7 +1895,6 @@ return [
        ],
        'mediawiki.special.movePage.styles' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.movePage.css',
-               'position' => 'top',
        ],
        'mediawiki.special.pageLanguage' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.pageLanguage.js',
@@ -1937,12 +1903,10 @@ return [
                ],
        ],
        'mediawiki.special.pagesWithProp' => [
-               'position' => 'top',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.pagesWithProp.css',
        ],
        'mediawiki.special.preferences' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.preferences.js',
-               'position' => 'top',
                'messages' => [
                        'prefs-tabs-navigation-hint',
                        'prefswarning-warning',
@@ -1963,14 +1927,11 @@ return [
        ],
        'mediawiki.special.preferences.styles' => [
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.preferences.styles.css',
-               'position' => 'top',
        ],
        'mediawiki.special.recentchanges' => [
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.recentchanges.js',
-               'position' => 'top',
        ],
        'mediawiki.special.search' => [
-               'position' => 'top',
                'scripts' => 'resources/src/mediawiki.special/mediawiki.special.search.js',
                'styles' => 'resources/src/mediawiki.special/mediawiki.special.search.css',
                'dependencies' => 'mediawiki.widgets.SearchInputWidget',
@@ -2022,16 +1983,13 @@ return [
                'styles' => [
                        'resources/src/mediawiki.special/mediawiki.special.userlogin.common.css',
                ],
-               'position' => 'top',
        ],
        'mediawiki.special.userlogin.signup.styles' => [
-               'position' => 'top',
                'styles' => [
                        'resources/src/mediawiki.special/mediawiki.special.userlogin.signup.css',
                ],
        ],
        'mediawiki.special.userlogin.login.styles' => [
-               'position' => 'top',
                'styles' => [
                        'resources/src/mediawiki.special/mediawiki.special.userlogin.login.css',
                ],
@@ -2089,7 +2047,6 @@ return [
        /* MediaWiki Legacy */
 
        'mediawiki.legacy.commonPrint' => [
-               'position' => 'top',
                'styles' => [
                        'resources/src/mediawiki.legacy/commonPrint.css' => [ 'media' => 'print' ]
                ],
@@ -2101,13 +2058,11 @@ return [
        ],
        // Used in the web installer. Test it after modifying this definition!
        'mediawiki.legacy.shared' => [
-               'position' => 'top',
                'styles' => [
                        'resources/src/mediawiki.legacy/shared.css' => [ 'media' => 'screen' ]
                ],
        ],
        'mediawiki.legacy.oldshared' => [
-               'position' => 'top',
                'styles' => [
                        'resources/src/mediawiki.legacy/oldshared.css' => [ 'media' => 'screen' ]
                ],
@@ -2115,14 +2070,12 @@ return [
        'mediawiki.legacy.wikibits' => [
                'scripts' => 'resources/src/mediawiki.legacy/wikibits.js',
                'dependencies' => 'mediawiki.util',
-               'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
 
        /* MediaWiki UI */
 
        'mediawiki.ui' => [
-               'position' => 'top',
                'skinStyles' => [
                        'default' => [
                                'resources/src/mediawiki.ui/default.less',
@@ -2131,7 +2084,6 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.ui.checkbox' => [
-               'position' => 'top',
                'skinStyles' => [
                        'default' => [
                                'resources/src/mediawiki.ui/components/checkbox.less',
@@ -2140,7 +2092,6 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.ui.radio' => [
-               'position' => 'top',
                'skinStyles' => [
                        'default' => [
                                'resources/src/mediawiki.ui/components/radio.less',
@@ -2150,7 +2101,6 @@ return [
        ],
        // Lightweight module for anchor styles
        'mediawiki.ui.anchor' => [
-               'position' => 'top',
                'skinStyles' => [
                        'default' => [
                                'resources/src/mediawiki.ui/components/anchors.less',
@@ -2160,7 +2110,6 @@ return [
        ],
        // Lightweight module for button styles
        'mediawiki.ui.button' => [
-               'position' => 'top',
                'skinStyles' => [
                        'default' => [
                                'resources/src/mediawiki.ui/components/buttons.less',
@@ -2169,7 +2118,6 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.ui.input' => [
-               'position' => 'top',
                'skinStyles' => [
                        'default' => [
                                'resources/src/mediawiki.ui/components/inputs.less',
@@ -2178,7 +2126,6 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.ui.icon' => [
-               'position' => 'top',
                'skinStyles' => [
                        'default' => [
                                'resources/src/mediawiki.ui/components/icons.less',
@@ -2188,7 +2135,6 @@ return [
        ],
        // Lightweight module for text styles
        'mediawiki.ui.text' => [
-               'position' => 'top',
                'skinStyles' => [
                        'default' => [
                                'resources/src/mediawiki.ui/components/text.less',
@@ -2239,7 +2185,6 @@ return [
                                'resources/src/mediawiki.widgets/mw.widgets.ComplexTitleInputWidget.base.css',
                        ],
                ],
-               'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.widgets.DateInputWidget' => [
@@ -2340,6 +2285,33 @@ return [
                ],
                'messages' => [
                        'red-link-title',
+                       'mw-widgets-categoryselector-add-category-placeholder'
+               ],
+               'targets' => [ 'desktop', 'mobile' ],
+       ],
+       'mediawiki.widgets.MediaSearch' => [
+               'scripts' => [
+                       '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.MediaSearchProvider.js',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceQueue.js',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchQueue.js',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.js',
+               ],
+               'styles' => [
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.css',
+                       'resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css',
+               ],
+               'dependencies' => [
+                       'oojs-ui-widgets',
+                       'mediawiki.ForeignApi',
+                       'mediawiki.Title',
+               ],
+               'messages' => [
+                       'mw-widgets-mediasearch-noresults',
+                       'mw-widgets-mediasearch-input-placeholder',
                ],
                'targets' => [ 'desktop', 'mobile' ],
        ],
@@ -2368,7 +2340,6 @@ return [
                                'resources/src/mediawiki.widgets/mw.widgets.SearchInputWidget.css',
                        ],
                ],
-               'position' => 'top',
                'targets' => [ 'desktop', 'mobile' ],
        ],
        'mediawiki.widgets.StashedFileWidget' => [
@@ -2411,7 +2382,6 @@ return [
                'targets' => [ 'desktop', 'mobile' ],
                'dependencies' => [
                        'es5-shim',
-                       'json',
                ],
        ],
 
diff --git a/resources/lib/json2/json2.js b/resources/lib/json2/json2.js
deleted file mode 100644 (file)
index 5838457..0000000
+++ /dev/null
@@ -1,519 +0,0 @@
-/*
-    json2.js
-    2015-05-03
-
-    Public Domain.
-
-    NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
-
-    See http://www.JSON.org/js.html
-
-
-    This code should be minified before deployment.
-    See http://javascript.crockford.com/jsmin.html
-
-    USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
-    NOT CONTROL.
-
-
-    This file creates a global JSON object containing two methods: stringify
-    and parse. This file is provides the ES5 JSON capability to ES3 systems.
-    If a project might run on IE8 or earlier, then this file should be included.
-    This file does nothing on ES5 systems.
-
-        JSON.stringify(value, replacer, space)
-            value       any JavaScript value, usually an object or array.
-
-            replacer    an optional parameter that determines how object
-                        values are stringified for objects. It can be a
-                        function or an array of strings.
-
-            space       an optional parameter that specifies the indentation
-                        of nested structures. If it is omitted, the text will
-                        be packed without extra whitespace. If it is a number,
-                        it will specify the number of spaces to indent at each
-                        level. If it is a string (such as '\t' or '&nbsp;'),
-                        it contains the characters used to indent at each level.
-
-            This method produces a JSON text from a JavaScript value.
-
-            When an object value is found, if the object contains a toJSON
-            method, its toJSON method will be called and the result will be
-            stringified. A toJSON method does not serialize: it returns the
-            value represented by the name/value pair that should be serialized,
-            or undefined if nothing should be serialized. The toJSON method
-            will be passed the key associated with the value, and this will be
-            bound to the value
-
-            For example, this would serialize Dates as ISO strings.
-
-                Date.prototype.toJSON = function (key) {
-                    function f(n) {
-                        // Format integers to have at least two digits.
-                        return n < 10 
-                            ? '0' + n 
-                            : n;
-                    }
-
-                    return this.getUTCFullYear()   + '-' +
-                         f(this.getUTCMonth() + 1) + '-' +
-                         f(this.getUTCDate())      + 'T' +
-                         f(this.getUTCHours())     + ':' +
-                         f(this.getUTCMinutes())   + ':' +
-                         f(this.getUTCSeconds())   + 'Z';
-                };
-
-            You can provide an optional replacer method. It will be passed the
-            key and value of each member, with this bound to the containing
-            object. The value that is returned from your method will be
-            serialized. If your method returns undefined, then the member will
-            be excluded from the serialization.
-
-            If the replacer parameter is an array of strings, then it will be
-            used to select the members to be serialized. It filters the results
-            such that only members with keys listed in the replacer array are
-            stringified.
-
-            Values that do not have JSON representations, such as undefined or
-            functions, will not be serialized. Such values in objects will be
-            dropped; in arrays they will be replaced with null. You can use
-            a replacer function to replace those with JSON values.
-            JSON.stringify(undefined) returns undefined.
-
-            The optional space parameter produces a stringification of the
-            value that is filled with line breaks and indentation to make it
-            easier to read.
-
-            If the space parameter is a non-empty string, then that string will
-            be used for indentation. If the space parameter is a number, then
-            the indentation will be that many spaces.
-
-            Example:
-
-            text = JSON.stringify(['e', {pluribus: 'unum'}]);
-            // text is '["e",{"pluribus":"unum"}]'
-
-
-            text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t');
-            // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
-
-            text = JSON.stringify([new Date()], function (key, value) {
-                return this[key] instanceof Date 
-                    ? 'Date(' + this[key] + ')' 
-                    : value;
-            });
-            // text is '["Date(---current time---)"]'
-
-
-        JSON.parse(text, reviver)
-            This method parses a JSON text to produce an object or array.
-            It can throw a SyntaxError exception.
-
-            The optional reviver parameter is a function that can filter and
-            transform the results. It receives each of the keys and values,
-            and its return value is used instead of the original value.
-            If it returns what it received, then the structure is not modified.
-            If it returns undefined then the member is deleted.
-
-            Example:
-
-            // Parse the text. Values that look like ISO date strings will
-            // be converted to Date objects.
-
-            myData = JSON.parse(text, function (key, value) {
-                var a;
-                if (typeof value === 'string') {
-                    a =
-/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
-                    if (a) {
-                        return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
-                            +a[5], +a[6]));
-                    }
-                }
-                return value;
-            });
-
-            myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
-                var d;
-                if (typeof value === 'string' &&
-                        value.slice(0, 5) === 'Date(' &&
-                        value.slice(-1) === ')') {
-                    d = new Date(value.slice(5, -1));
-                    if (d) {
-                        return d;
-                    }
-                }
-                return value;
-            });
-
-
-    This is a reference implementation. You are free to copy, modify, or
-    redistribute.
-*/
-
-/*jslint 
-    eval, for, this 
-*/
-
-/*property
-    JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
-    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
-    lastIndex, length, parse, prototype, push, replace, slice, stringify,
-    test, toJSON, toString, valueOf
-*/
-
-
-// Create a JSON object only if one does not already exist. We create the
-// methods in a closure to avoid creating global variables.
-
-if (typeof JSON !== 'object') {
-    JSON = {};
-}
-
-(function () {
-    'use strict';
-    
-    var rx_one = /^[\],:{}\s]*$/,
-        rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
-        rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
-        rx_four = /(?:^|:|,)(?:\s*\[)+/g,
-        rx_escapable = /[\\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
-        rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
-
-    function f(n) {
-        // Format integers to have at least two digits.
-        return n < 10 
-            ? '0' + n 
-            : n;
-    }
-    
-    function this_value() {
-        return this.valueOf();
-    }
-
-    if (typeof Date.prototype.toJSON !== 'function') {
-
-        Date.prototype.toJSON = function () {
-
-            return isFinite(this.valueOf())
-                ? this.getUTCFullYear() + '-' +
-                        f(this.getUTCMonth() + 1) + '-' +
-                        f(this.getUTCDate()) + 'T' +
-                        f(this.getUTCHours()) + ':' +
-                        f(this.getUTCMinutes()) + ':' +
-                        f(this.getUTCSeconds()) + 'Z'
-                : null;
-        };
-
-        Boolean.prototype.toJSON = this_value;
-        Number.prototype.toJSON = this_value;
-        String.prototype.toJSON = this_value;
-    }
-
-    var gap,
-        indent,
-        meta,
-        rep;
-
-
-    function quote(string) {
-
-// If the string contains no control characters, no quote characters, and no
-// backslash characters, then we can safely slap some quotes around it.
-// Otherwise we must also replace the offending characters with safe escape
-// sequences.
-
-        rx_escapable.lastIndex = 0;
-        return rx_escapable.test(string) 
-            ? '"' + string.replace(rx_escapable, function (a) {
-                var c = meta[a];
-                return typeof c === 'string'
-                    ? c
-                    : '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
-            }) + '"' 
-            : '"' + string + '"';
-    }
-
-
-    function str(key, holder) {
-
-// Produce a string from holder[key].
-
-        var i,          // The loop counter.
-            k,          // The member key.
-            v,          // The member value.
-            length,
-            mind = gap,
-            partial,
-            value = holder[key];
-
-// If the value has a toJSON method, call it to obtain a replacement value.
-
-        if (value && typeof value === 'object' &&
-                typeof value.toJSON === 'function') {
-            value = value.toJSON(key);
-        }
-
-// If we were called with a replacer function, then call the replacer to
-// obtain a replacement value.
-
-        if (typeof rep === 'function') {
-            value = rep.call(holder, key, value);
-        }
-
-// What happens next depends on the value's type.
-
-        switch (typeof value) {
-        case 'string':
-            return quote(value);
-
-        case 'number':
-
-// JSON numbers must be finite. Encode non-finite numbers as null.
-
-            return isFinite(value) 
-                ? String(value) 
-                : 'null';
-
-        case 'boolean':
-        case 'null':
-
-// If the value is a boolean or null, convert it to a string. Note:
-// typeof null does not produce 'null'. The case is included here in
-// the remote chance that this gets fixed someday.
-
-            return String(value);
-
-// If the type is 'object', we might be dealing with an object or an array or
-// null.
-
-        case 'object':
-
-// Due to a specification blunder in ECMAScript, typeof null is 'object',
-// so watch out for that case.
-
-            if (!value) {
-                return 'null';
-            }
-
-// Make an array to hold the partial results of stringifying this object value.
-
-            gap += indent;
-            partial = [];
-
-// Is the value an array?
-
-            if (Object.prototype.toString.apply(value) === '[object Array]') {
-
-// The value is an array. Stringify every element. Use null as a placeholder
-// for non-JSON values.
-
-                length = value.length;
-                for (i = 0; i < length; i += 1) {
-                    partial[i] = str(i, value) || 'null';
-                }
-
-// Join all of the elements together, separated with commas, and wrap them in
-// brackets.
-
-                v = partial.length === 0
-                    ? '[]'
-                    : gap
-                        ? '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']'
-                        : '[' + partial.join(',') + ']';
-                gap = mind;
-                return v;
-            }
-
-// If the replacer is an array, use it to select the members to be stringified.
-
-            if (rep && typeof rep === 'object') {
-                length = rep.length;
-                for (i = 0; i < length; i += 1) {
-                    if (typeof rep[i] === 'string') {
-                        k = rep[i];
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (
-                                gap 
-                                    ? ': ' 
-                                    : ':'
-                            ) + v);
-                        }
-                    }
-                }
-            } else {
-
-// Otherwise, iterate through all of the keys in the object.
-
-                for (k in value) {
-                    if (Object.prototype.hasOwnProperty.call(value, k)) {
-                        v = str(k, value);
-                        if (v) {
-                            partial.push(quote(k) + (
-                                gap 
-                                    ? ': ' 
-                                    : ':'
-                            ) + v);
-                        }
-                    }
-                }
-            }
-
-// Join all of the member texts together, separated with commas,
-// and wrap them in braces.
-
-            v = partial.length === 0
-                ? '{}'
-                : gap
-                    ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}'
-                    : '{' + partial.join(',') + '}';
-            gap = mind;
-            return v;
-        }
-    }
-
-// If the JSON object does not yet have a stringify method, give it one.
-
-    if (typeof JSON.stringify !== 'function') {
-        meta = {    // table of character substitutions
-            '\b': '\\b',
-            '\t': '\\t',
-            '\n': '\\n',
-            '\f': '\\f',
-            '\r': '\\r',
-            '"': '\\"',
-            '\\': '\\\\'
-        };
-        JSON.stringify = function (value, replacer, space) {
-
-// The stringify method takes a value and an optional replacer, and an optional
-// space parameter, and returns a JSON text. The replacer can be a function
-// that can replace values, or an array of strings that will select the keys.
-// A default replacer method can be provided. Use of the space parameter can
-// produce text that is more easily readable.
-
-            var i;
-            gap = '';
-            indent = '';
-
-// If the space parameter is a number, make an indent string containing that
-// many spaces.
-
-            if (typeof space === 'number') {
-                for (i = 0; i < space; i += 1) {
-                    indent += ' ';
-                }
-
-// If the space parameter is a string, it will be used as the indent string.
-
-            } else if (typeof space === 'string') {
-                indent = space;
-            }
-
-// If there is a replacer, it must be a function or an array.
-// Otherwise, throw an error.
-
-            rep = replacer;
-            if (replacer && typeof replacer !== 'function' &&
-                    (typeof replacer !== 'object' ||
-                    typeof replacer.length !== 'number')) {
-                throw new Error('JSON.stringify');
-            }
-
-// Make a fake root object containing our value under the key of ''.
-// Return the result of stringifying the value.
-
-            return str('', {'': value});
-        };
-    }
-
-
-// If the JSON object does not yet have a parse method, give it one.
-
-    if (typeof JSON.parse !== 'function') {
-        JSON.parse = function (text, reviver) {
-
-// The parse method takes a text and an optional reviver function, and returns
-// a JavaScript value if the text is a valid JSON text.
-
-            var j;
-
-            function walk(holder, key) {
-
-// The walk method is used to recursively walk the resulting structure so
-// that modifications can be made.
-
-                var k, v, value = holder[key];
-                if (value && typeof value === 'object') {
-                    for (k in value) {
-                        if (Object.prototype.hasOwnProperty.call(value, k)) {
-                            v = walk(value, k);
-                            if (v !== undefined) {
-                                value[k] = v;
-                            } else {
-                                delete value[k];
-                            }
-                        }
-                    }
-                }
-                return reviver.call(holder, key, value);
-            }
-
-
-// Parsing happens in four stages. In the first stage, we replace certain
-// Unicode characters with escape sequences. JavaScript handles many characters
-// incorrectly, either silently deleting them, or treating them as line endings.
-
-            text = String(text);
-            rx_dangerous.lastIndex = 0;
-            if (rx_dangerous.test(text)) {
-                text = text.replace(rx_dangerous, function (a) {
-                    return '\\u' +
-                            ('0000' + a.charCodeAt(0).toString(16)).slice(-4);
-                });
-            }
-
-// In the second stage, we run the text against regular expressions that look
-// for non-JSON patterns. We are especially concerned with '()' and 'new'
-// because they can cause invocation, and '=' because it can cause mutation.
-// But just to be safe, we want to reject all unexpected forms.
-
-// We split the second stage into 4 regexp operations in order to work around
-// crippling inefficiencies in IE's and Safari's regexp engines. First we
-// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we
-// replace all simple value tokens with ']' characters. Third, we delete all
-// open brackets that follow a colon or comma or that begin the text. Finally,
-// we look to see that the remaining characters are only whitespace or ']' or
-// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval.
-
-            if (
-                rx_one.test(
-                    text
-                        .replace(rx_two, '@')
-                        .replace(rx_three, ']')
-                        .replace(rx_four, '')
-                )
-            ) {
-
-// In the third stage we use the eval function to compile the text into a
-// JavaScript structure. The '{' operator is subject to a syntactic ambiguity
-// in JavaScript: it can begin a block or an object literal. We wrap the text
-// in parens to eliminate the ambiguity.
-
-                j = eval('(' + text + ')');
-
-// In the optional fourth stage, we recursively walk the new structure, passing
-// each name/value pair to a reviver function for possible transformation.
-
-                return typeof reviver === 'function'
-                    ? walk({'': j}, '')
-                    : j;
-            }
-
-// If the text is not JSON parseable, then a SyntaxError is thrown.
-
-            throw new SyntaxError('JSON.parse');
-        };
-    }
-}());
index 8c78b67..ae68fc4 100644 (file)
@@ -1,12 +1,12 @@
 /*!
- * QUnit 1.22.0
+ * QUnit 1.23.1
  * https://qunitjs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2016-02-23T15:57Z
+ * Date: 2016-04-12T17:29Z
  */
 
 /** Font Family and Sizes */
index 84873ae..5df0822 100644 (file)
@@ -1,15 +1,15 @@
 /*!
- * QUnit 1.22.0
+ * QUnit 1.23.1
  * https://qunitjs.com/
  *
  * Copyright jQuery Foundation and other contributors
  * Released under the MIT license
  * https://jquery.org/license
  *
- * Date: 2016-02-23T15:57Z
+ * Date: 2016-04-12T17:29Z
  */
 
-(function( global ) {
+( function( global ) {
 
 var QUnit = {};
 
@@ -27,7 +27,7 @@ var window = global.window;
 var defined = {
        document: window && window.document !== undefined,
        setTimeout: setTimeout !== undefined,
-       sessionStorage: (function() {
+       sessionStorage: ( function() {
                var x = "qunit-test-string";
                try {
                        sessionStorage.setItem( x, x );
@@ -46,7 +46,7 @@ var runStarted = false;
 var toString = Object.prototype.toString,
        hasOwn = Object.prototype.hasOwnProperty;
 
-// returns a new Array with the elements that are in a but not in b
+// Returns a new Array with the elements that are in a but not in b
 function diff( a, b ) {
        var i, j,
                result = a.slice();
@@ -63,7 +63,7 @@ function diff( a, b ) {
        return result;
 }
 
-// from jquery.js
+// From jquery.js
 function inArray( elem, array ) {
        if ( array.indexOf ) {
                return array.indexOf( elem );
@@ -157,32 +157,6 @@ function is( type, obj ) {
        return QUnit.objectType( obj ) === type;
 }
 
-var getUrlParams = function() {
-       var i, param, name, value;
-       var urlParams = {};
-       var location = window.location;
-       var params = location.search.slice( 1 ).split( "&" );
-       var length = params.length;
-
-       for ( i = 0; i < length; i++ ) {
-               if ( params[ i ] ) {
-                       param = params[ i ].split( "=" );
-                       name = decodeURIComponent( param[ 0 ] );
-
-                       // allow just a key to turn on a flag, e.g., test.html?noglobals
-                       value = param.length === 1 ||
-                               decodeURIComponent( param.slice( 1 ).join( "=" ) ) ;
-                       if ( urlParams[ name ] ) {
-                               urlParams[ name ] = [].concat( urlParams[ name ], value );
-                       } else {
-                               urlParams[ name ] = value;
-                       }
-               }
-       }
-
-       return urlParams;
-};
-
 // Doesn't support IE6 to IE9, it will return undefined on these browsers
 // See also https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Error/Stack
 function extractStacktrace( e, offset ) {
@@ -212,12 +186,12 @@ function extractStacktrace( e, offset ) {
        // Support: Safari <=6 only
        } else if ( e.sourceURL ) {
 
-               // exclude useless self-reference for generated Error objects
+               // Exclude useless self-reference for generated Error objects
                if ( /qunit.js$/.test( e.sourceURL ) ) {
                        return;
                }
 
-               // for actual exceptions, this is useful
+               // For actual exceptions, this is useful
                return e.sourceURL + ":" + e.line;
        }
 }
@@ -244,53 +218,35 @@ function sourceFromStacktrace( offset ) {
  * `config` initialized at top of scope
  */
 var config = {
+
        // The queue of tests to run
        queue: [],
 
-       // block until document ready
+       // Block until document ready
        blocking: true,
 
-       // by default, run previously failed tests first
+       // By default, run previously failed tests first
        // very useful in combination with "Hide passed tests" checked
        reorder: true,
 
-       // by default, modify document.title when suite is done
+       // By default, modify document.title when suite is done
        altertitle: true,
 
        // HTML Reporter: collapse every test except the first failing test
        // If false, all failing tests will be expanded
        collapse: true,
 
-       // by default, scroll to top of the page when suite is done
+       // By default, scroll to top of the page when suite is done
        scrolltop: true,
 
-       // depth up-to which object will be dumped
+       // Depth up-to which object will be dumped
        maxDepth: 5,
 
-       // when enabled, all tests must call expect()
+       // When enabled, all tests must call expect()
        requireExpects: false,
 
-       // add checkboxes that are persisted in the query-string
-       // when enabled, the id is set to `true` as a `QUnit.config` property
-       urlConfig: [
-               {
-                       id: "hidepassed",
-                       label: "Hide passed tests",
-                       tooltip: "Only show tests and assertions that fail. Stored as query-strings."
-               },
-               {
-                       id: "noglobals",
-                       label: "Check for Globals",
-                       tooltip: "Enabling this will test if any test introduces new properties on the " +
-                               "global object (`window` in Browsers). Stored as query-strings."
-               },
-               {
-                       id: "notrycatch",
-                       label: "No try-catch",
-                       tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " +
-                               "exceptions in IE reasonable. Stored as query-strings."
-               }
-       ],
+       // Placeholder for user-configurable form-exposed URL parameters
+       urlConfig: [],
 
        // Set of all modules.
        modules: [],
@@ -307,27 +263,9 @@ var config = {
        callbacks: {}
 };
 
-var urlParams = defined.document ? getUrlParams() : {};
-
 // Push a loose unnamed module to the modules collection
 config.modules.push( config.currentModule );
 
-if ( urlParams.filter === true ) {
-       delete urlParams.filter;
-}
-
-// String search anywhere in moduleName+testName
-config.filter = urlParams.filter;
-
-config.testId = [];
-if ( urlParams.testId ) {
-       // Ensure that urlParams.testId is an array
-       urlParams.testId = decodeURIComponent( urlParams.testId ).split( "," );
-       for (var i = 0; i < urlParams.testId.length; i++ ) {
-               config.testId.push( urlParams.testId[ i ] );
-       }
-}
-
 var loggingCallbacks = {};
 
 // Register logging callbacks
@@ -431,7 +369,7 @@ function verifyLoggingCallbacks() {
                                }
                                QUnit.pushFailure( error, filePath + ":" + linerNr );
                        } else {
-                               QUnit.test( "global failure", extend(function() {
+                               QUnit.test( "global failure", extend( function() {
                                        QUnit.pushFailure( error, filePath + ":" + linerNr );
                                }, { validTest: true } ) );
                        }
@@ -440,25 +378,23 @@ function verifyLoggingCallbacks() {
 
                return ret;
        };
-} )();
-
-QUnit.urlParams = urlParams;
+}() );
 
 // Figure out if we're running the tests from a server or not
 QUnit.isLocal = !( defined.document && window.location.protocol !== "file:" );
 
 // Expose the current QUnit version
-QUnit.version = "1.22.0";
+QUnit.version = "1.23.1";
 
 extend( QUnit, {
 
-       // call on start of module test to prepend name to all tests
+       // Call on start of module test to prepend name to all tests
        module: function( name, testEnvironment, executeNow ) {
                var module, moduleFns;
                var currentModule = config.currentModule;
 
                if ( arguments.length === 2 ) {
-                       if ( testEnvironment instanceof Function ) {
+                       if ( objectType( testEnvironment ) === "function" ) {
                                executeNow = testEnvironment;
                                testEnvironment = undefined;
                        }
@@ -482,7 +418,7 @@ extend( QUnit, {
                        afterEach: setHook( module, "afterEach" )
                };
 
-               if ( executeNow instanceof Function ) {
+               if ( objectType( executeNow ) === "function" ) {
                        config.moduleStack.push( module );
                        setCurrentModule( module );
                        executeNow.call( module.testEnvironment, moduleFns );
@@ -500,7 +436,8 @@ extend( QUnit, {
                        var module = {
                                name: moduleName,
                                parentModule: parentModule,
-                               tests: []
+                               tests: [],
+                               moduleId: generateHash( moduleName )
                        };
 
                        var env = {};
@@ -573,7 +510,7 @@ extend( QUnit, {
                                return;
                        }
 
-                       // throw an Error if start is called more often than stop
+                       // Throw an Error if start is called more often than stop
                        if ( config.current.semaphore < 0 ) {
                                config.current.semaphore = 0;
 
@@ -634,7 +571,7 @@ extend( QUnit, {
                offset = ( offset || 0 ) + 2;
                return sourceFromStacktrace( offset );
        }
-});
+} );
 
 registerLoggingCallbacks( QUnit );
 
@@ -657,17 +594,17 @@ function begin() {
 
                // Avoid unnecessary information by not logging modules' test environments
                for ( i = 0, l = config.modules.length; i < l; i++ ) {
-                       modulesLog.push({
+                       modulesLog.push( {
                                name: config.modules[ i ].name,
                                tests: config.modules[ i ].tests
-                       });
+                       } );
                }
 
                // The test run is officially beginning now
                runLoggingCallbacks( "begin", {
                        totalTests: Test.count,
                        modules: modulesLog
-               });
+               } );
        }
 
        config.blocking = false;
@@ -706,7 +643,7 @@ function pauseProcessing() {
 
        if ( config.testTimeout && defined.setTimeout ) {
                clearTimeout( config.timeout );
-               config.timeout = setTimeout(function() {
+               config.timeout = setTimeout( function() {
                        if ( config.current ) {
                                config.current.semaphore = 0;
                                QUnit.pushFailure( "Test timed out", sourceFromStacktrace( 2 ) );
@@ -723,7 +660,7 @@ function resumeProcessing() {
 
        // A slight delay to allow this iteration of the event loop to finish (more assertions, etc.)
        if ( defined.setTimeout ) {
-               setTimeout(function() {
+               setTimeout( function() {
                        if ( config.current && config.current.semaphore > 0 ) {
                                return;
                        }
@@ -752,7 +689,7 @@ function done() {
                        passed: config.moduleStats.all - config.moduleStats.bad,
                        total: config.moduleStats.all,
                        runtime: now() - config.moduleStats.started
-               });
+               } );
        }
        delete config.previousModule;
 
@@ -764,7 +701,7 @@ function done() {
                passed: passed,
                total: config.stats.all,
                runtime: runtime
-       });
+       } );
 }
 
 function setHook( module, hookName ) {
@@ -779,6 +716,7 @@ function setHook( module, hookName ) {
 
 var focused = false;
 var priorityCount = 0;
+var unitSampler;
 
 function Test( settings ) {
        var i, l;
@@ -801,10 +739,10 @@ function Test( settings ) {
 
        this.testId = generateHash( this.module.name, this.testName );
 
-       this.module.tests.push({
+       this.module.tests.push( {
                name: this.testName,
                testId: this.testId
-       });
+       } );
 
        if ( settings.skip ) {
 
@@ -840,14 +778,14 @@ Test.prototype = {
                                        passed: config.moduleStats.all - config.moduleStats.bad,
                                        total: config.moduleStats.all,
                                        runtime: now() - config.moduleStats.started
-                               });
+                               } );
                        }
                        config.previousModule = this.module;
                        config.moduleStats = { all: 0, bad: 0, started: now() };
                        runLoggingCallbacks( "moduleStart", {
                                name: this.module.name,
                                tests: this.module.tests
-                       });
+                       } );
                }
 
                config.current = this;
@@ -863,7 +801,7 @@ Test.prototype = {
                        name: this.testName,
                        module: this.module.name,
                        testId: this.testId
-               });
+               } );
 
                if ( !config.pollution ) {
                        saveGlobal();
@@ -892,7 +830,7 @@ Test.prototype = {
                        this.pushFailure( "Died on test #" + ( this.assertions.length + 1 ) + " " +
                                this.stack + ": " + ( e.message || e ), extractStacktrace( e, 0 ) );
 
-                       // else next test will carry the responsibility
+                       // Else next test will carry the responsibility
                        saveGlobal();
 
                        // Restart the tests if they're blocking
@@ -1001,7 +939,7 @@ Test.prototype = {
 
                        // DEPRECATED: this property will be removed in 2.0.0, use runtime instead
                        duration: this.runtime
-               });
+               } );
 
                // QUnit.reset() is deprecated and will be replaced for a new
                // fixture reset function on QUnit 2.0/2.1.
@@ -1021,8 +959,8 @@ Test.prototype = {
 
                function run() {
 
-                       // each of these can by async
-                       synchronize([
+                       // Each of these can by async
+                       synchronize( [
                                function() {
                                        test.before();
                                },
@@ -1040,19 +978,19 @@ Test.prototype = {
                                function() {
                                        test.finish();
                                }
-                       ]);
+                       ] );
                }
 
                // Prioritize previously failed tests, detected from sessionStorage
                priority = QUnit.config.reorder && defined.sessionStorage &&
                                +sessionStorage.getItem( "qunit-test-" + this.module.name + "-" + this.testName );
 
-               return synchronize( run, priority );
+               return synchronize( run, priority, config.seed );
        },
 
        pushResult: function( resultInfo ) {
 
-               // resultInfo = { result, actual, expected, message, negative }
+               // Destructure of resultInfo = { result, actual, expected, message, negative }
                var source,
                        details = {
                                module: this.module.name,
@@ -1076,10 +1014,10 @@ Test.prototype = {
 
                runLoggingCallbacks( "log", details );
 
-               this.assertions.push({
+               this.assertions.push( {
                        result: !!resultInfo.result,
                        message: resultInfo.message
-               });
+               } );
        },
 
        pushFailure: function( message, source, actual ) {
@@ -1104,10 +1042,10 @@ Test.prototype = {
 
                runLoggingCallbacks( "log", details );
 
-               this.assertions.push({
+               this.assertions.push( {
                        result: false,
                        message: message
-               });
+               } );
        },
 
        resolvePromise: function( promise, phase ) {
@@ -1126,7 +1064,7 @@ Test.prototype = {
                                                        " " + test.testName + ": " + ( error.message || error );
                                                test.pushFailure( message, extractStacktrace( error, 0 ) );
 
-                                               // else next test will carry the responsibility
+                                               // Else next test will carry the responsibility
                                                saveGlobal();
 
                                                // Unblock
@@ -1140,30 +1078,43 @@ Test.prototype = {
        valid: function() {
                var filter = config.filter,
                        regexFilter = /^(!?)\/([\w\W]*)\/(i?$)/.exec( filter ),
-                       module = QUnit.urlParams.module && QUnit.urlParams.module.toLowerCase(),
+                       module = config.module && config.module.toLowerCase(),
                        fullName = ( this.module.name + ": " + this.testName );
 
-               function testInModuleChain( testModule ) {
+               function moduleChainNameMatch( testModule ) {
                        var testModuleName = testModule.name ? testModule.name.toLowerCase() : null;
                        if ( testModuleName === module ) {
                                return true;
                        } else if ( testModule.parentModule ) {
-                               return testInModuleChain( testModule.parentModule );
+                               return moduleChainNameMatch( testModule.parentModule );
                        } else {
                                return false;
                        }
                }
 
+               function moduleChainIdMatch( testModule ) {
+                       return inArray( testModule.moduleId, config.moduleId ) > -1 ||
+                               testModule.parentModule && moduleChainIdMatch( testModule.parentModule );
+               }
+
                // Internally-generated tests are always valid
                if ( this.callback && this.callback.validTest ) {
                        return true;
                }
 
-               if ( config.testId.length > 0 && inArray( this.testId, config.testId ) < 0 ) {
+               if ( config.moduleId && config.moduleId.length > 0 &&
+                       !moduleChainIdMatch( this.module ) ) {
+
+                       return false;
+               }
+
+               if ( config.testId && config.testId.length > 0 &&
+                       inArray( this.testId, config.testId ) < 0 ) {
+
                        return false;
                }
 
-               if ( module && !testInModuleChain( this.module ) ) {
+               if ( module && !moduleChainNameMatch( this.module ) ) {
                        return false;
                }
 
@@ -1172,7 +1123,7 @@ Test.prototype = {
                }
 
                return regexFilter ?
-                       this.regexFilter( !!regexFilter[1], regexFilter[2], regexFilter[3], fullName ) :
+                       this.regexFilter( !!regexFilter[ 1 ], regexFilter[ 2 ], regexFilter[ 3 ], fullName ) :
                        this.stringFilter( filter, fullName );
        },
 
@@ -1260,8 +1211,9 @@ function generateHash( module, testName ) {
        return hex.slice( -8 );
 }
 
-function synchronize( callback, priority ) {
-       var last = !priority;
+function synchronize( callback, priority, seed ) {
+       var last = !priority,
+               index;
 
        if ( QUnit.objectType( callback ) === "array" ) {
                while ( callback.length ) {
@@ -1272,6 +1224,14 @@ function synchronize( callback, priority ) {
 
        if ( priority ) {
                config.queue.splice( priorityCount++, 0, callback );
+       } else if ( seed ) {
+               if ( !unitSampler ) {
+                       unitSampler = unitSamplerGenerator( seed );
+               }
+
+               // Insert into a random position after all priority items
+               index = Math.floor( unitSampler() * ( config.queue.length - priorityCount + 1 ) );
+               config.queue.splice( priorityCount + index, 0, callback );
        } else {
                config.queue.push( callback );
        }
@@ -1281,6 +1241,25 @@ function synchronize( callback, priority ) {
        }
 }
 
+function unitSamplerGenerator( seed ) {
+
+       // 32-bit xorshift, requires only a nonzero seed
+       // http://excamera.com/sphinx/article-xorshift.html
+       var sample = parseInt( generateHash( seed ), 16 ) || -1;
+       return function() {
+               sample ^= sample << 13;
+               sample ^= sample >>> 17;
+               sample ^= sample << 5;
+
+               // ECMAScript has no unsigned number type
+               if ( sample < 0 ) {
+                       sample += 0x100000000;
+               }
+
+               return sample / 0x100000000;
+       };
+}
+
 function saveGlobal() {
        config.pollution = [];
 
@@ -1288,7 +1267,7 @@ function saveGlobal() {
                for ( var key in global ) {
                        if ( hasOwn.call( global, key ) ) {
 
-                               // in Opera sometimes DOM element ids show up here, ignore them
+                               // In Opera sometimes DOM element ids show up here, ignore them
                                if ( /^qunit-test-output/.test( key ) ) {
                                        continue;
                                }
@@ -1337,12 +1316,12 @@ function test( testName, expected, callback, async ) {
                expected = null;
        }
 
-       newTest = new Test({
+       newTest = new Test( {
                testName: testName,
                expected: expected,
                async: async,
                callback: callback
-       });
+       } );
 
        newTest.queue();
 }
@@ -1351,10 +1330,10 @@ function test( testName, expected, callback, async ) {
 function skip( testName ) {
        if ( focused )  { return; }
 
-       var test = new Test({
+       var test = new Test( {
                testName: testName,
                skip: true
-       });
+       } );
 
        test.queue();
 }
@@ -1373,12 +1352,12 @@ function only( testName, expected, callback, async ) {
                expected = null;
        }
 
-       newTest = new Test({
+       newTest = new Test( {
                testName: testName,
                expected: expected,
                async: async,
                callback: callback
-       });
+       } );
 
        newTest.queue();
 }
@@ -1448,7 +1427,7 @@ QUnit.assert = Assert.prototype = {
 
        pushResult: function( resultInfo ) {
 
-               // resultInfo = { result, actual, expected, message, negative }
+               // Destructure of resultInfo = { result, actual, expected, message, negative }
                var assert = this,
                        currentTest = ( assert instanceof Assert && assert.test ) || QUnit.config.current;
 
@@ -1594,7 +1573,7 @@ QUnit.assert = Assert.prototype = {
                currentTest.ignoreGlobalErrors = true;
                try {
                        block.call( currentTest.testEnvironment );
-               } catch (e) {
+               } catch ( e ) {
                        actual = e;
                }
                currentTest.ignoreGlobalErrors = false;
@@ -1602,30 +1581,30 @@ QUnit.assert = Assert.prototype = {
                if ( actual ) {
                        expectedType = QUnit.objectType( expected );
 
-                       // we don't want to validate thrown error
+                       // We don't want to validate thrown error
                        if ( !expected ) {
                                ok = true;
                                expectedOutput = null;
 
-                       // expected is a regexp
+                       // Expected is a regexp
                        } else if ( expectedType === "regexp" ) {
                                ok = expected.test( errorString( actual ) );
 
-                       // expected is a string
+                       // Expected is a string
                        } else if ( expectedType === "string" ) {
                                ok = expected === errorString( actual );
 
-                       // expected is a constructor, maybe an Error constructor
+                       // Expected is a constructor, maybe an Error constructor
                        } else if ( expectedType === "function" && actual instanceof expected ) {
                                ok = true;
 
-                       // expected is an Error object
+                       // Expected is an Error object
                        } else if ( expectedType === "object" ) {
                                ok = actual instanceof expected.constructor &&
                                        actual.name === expected.name &&
                                        actual.message === expected.message;
 
-                       // expected is a validation function which returns true if validation passed
+                       // Expected is a validation function which returns true if validation passed
                        } else if ( expectedType === "function" && expected.call( {}, actual ) === true ) {
                                expectedOutput = null;
                                ok = true;
@@ -1643,10 +1622,10 @@ QUnit.assert = Assert.prototype = {
 
 // Provide an alternative to assert.throws(), for environments that consider throws a reserved word
 // Known to us are: Closure Compiler, Narwhal
-(function() {
+( function() {
        /*jshint sub:true */
-       Assert.prototype.raises = Assert.prototype[ "throws" ];
-}());
+       Assert.prototype.raises = Assert.prototype [ "throws" ]; //jscs:ignore requireDotNotation
+}() );
 
 function errorString( error ) {
        var name, message,
@@ -1670,7 +1649,7 @@ function errorString( error ) {
 
 // Test for equality any JavaScript type.
 // Author: Philippe Rathé <prathe@gmail.com>
-QUnit.equiv = (function() {
+QUnit.equiv = ( function() {
 
        // Stack to decide between skip/abort functions
        var callers = [];
@@ -1766,7 +1745,8 @@ QUnit.equiv = (function() {
 
                        len = a.length;
                        if ( len !== b.length ) {
-                               // safe and faster
+
+                               // Safe and faster
                                return false;
                        }
 
@@ -1800,33 +1780,53 @@ QUnit.equiv = (function() {
                },
 
                "set": function( b, a ) {
-                       var aArray, bArray;
-
-                       aArray = [];
-                       a.forEach( function( v ) {
-                               aArray.push( v );
-                       });
-                       bArray = [];
-                       b.forEach( function( v ) {
-                               bArray.push( v );
-                       });
-
-                       return innerEquiv( bArray, aArray );
+                       var innerEq,
+                               outerEq = true;
+
+                       if ( a.size !== b.size ) {
+                               return false;
+                       }
+
+                       a.forEach( function( aVal ) {
+                               innerEq = false;
+
+                               b.forEach( function( bVal ) {
+                                       if ( innerEquiv( bVal, aVal ) ) {
+                                               innerEq = true;
+                                       }
+                               } );
+
+                               if ( !innerEq ) {
+                                       outerEq = false;
+                               }
+                       } );
+
+                       return outerEq;
                },
 
                "map": function( b, a ) {
-                       var aArray, bArray;
-
-                       aArray = [];
-                       a.forEach( function( v, k ) {
-                               aArray.push( [ k, v ] );
-                       });
-                       bArray = [];
-                       b.forEach( function( v, k ) {
-                               bArray.push( [ k, v ] );
-                       });
-
-                       return innerEquiv( bArray, aArray );
+                       var innerEq,
+                               outerEq = true;
+
+                       if ( a.size !== b.size ) {
+                               return false;
+                       }
+
+                       a.forEach( function( aVal, aKey ) {
+                               innerEq = false;
+
+                               b.forEach( function( bVal, bKey ) {
+                                       if ( innerEquiv( [ bVal, bKey ], [ aVal, aKey ] ) ) {
+                                               innerEq = true;
+                                       }
+                               } );
+
+                               if ( !innerEq ) {
+                                       outerEq = false;
+                               }
+                       } );
+
+                       return outerEq;
                },
 
                "object": function( b, a ) {
@@ -1908,11 +1908,11 @@ QUnit.equiv = (function() {
        }
 
        return innerEquiv;
-}());
+}() );
 
 // Based on jsDump by Ariel Flesler
 // http://flesler.blogspot.com/2008/05/jsdump-pretty-dump-of-any-javascript.html
-QUnit.dump = (function() {
+QUnit.dump = ( function() {
        function quote( str ) {
                return "\"" + str.toString().replace( /\\/g, "\\\\" ).replace( /"/g, "\\\"" ) + "\"";
        }
@@ -1950,7 +1950,7 @@ QUnit.dump = (function() {
        var reName = /^function (\w+)/,
                dump = {
 
-                       // objType is used mostly internally, you can fix a (custom) type in advance
+                       // The objType is used mostly internally, you can fix a (custom) type in advance
                        parse: function( obj, objType, stack ) {
                                stack = stack || [];
                                var res, parser, parserType,
@@ -1994,7 +1994,7 @@ QUnit.dump = (function() {
                                        type = "node";
                                } else if (
 
-                                       // native arrays
+                                       // Native arrays
                                        toString.call( obj ) === "[object Array]" ||
 
                                        // NodeList objects
@@ -2010,10 +2010,12 @@ QUnit.dump = (function() {
                                }
                                return type;
                        },
+
                        separator: function() {
                                return this.multiline ? this.HTML ? "<br />" : "\n" : this.HTML ? "&#160;" : " ";
                        },
-                       // extra can be a number, shortcut for increasing-calling-decreasing
+
+                       // Extra can be a number, shortcut for increasing-calling-decreasing
                        indent: function( extra ) {
                                if ( !this.multiline ) {
                                        return "";
@@ -2033,11 +2035,11 @@ QUnit.dump = (function() {
                        setParser: function( name, parser ) {
                                this.parsers[ name ] = parser;
                        },
+
                        // The next 3 are exposed so you can use them
                        quote: quote,
                        literal: literal,
                        join: join,
-                       //
                        depth: 1,
                        maxDepth: QUnit.config.maxDepth,
 
@@ -2054,13 +2056,13 @@ QUnit.dump = (function() {
                                "function": function( fn ) {
                                        var ret = "function",
 
-                                               // functions never have name in IE
+                                               // Functions never have name in IE
                                                name = "name" in fn ? fn.name : ( reName.exec( fn ) || [] )[ 1 ];
 
                                        if ( name ) {
                                                ret += " " + name;
                                        }
-                                       ret += "( ";
+                                       ret += "(";
 
                                        ret = [ ret, dump.parse( fn, "functionArgs" ), "){" ].join( "" );
                                        return join( ret, dump.parse( fn, "functionCode" ), "}" );
@@ -2131,7 +2133,7 @@ QUnit.dump = (function() {
                                        return ret + open + "/" + tag + close;
                                },
 
-                               // function calls it internally, it's the arguments part of the function
+                               // Function calls it internally, it's the arguments part of the function
                                functionArgs: function( fn ) {
                                        var args,
                                                l = fn.length;
@@ -2148,11 +2150,14 @@ QUnit.dump = (function() {
                                        }
                                        return " " + args.join( ", " ) + " ";
                                },
-                               // object calls it internally, the key part of an item in a map
+
+                               // Object calls it internally, the key part of an item in a map
                                key: quote,
-                               // function calls it internally, it's the content of the function
+
+                               // Function calls it internally, it's the content of the function
                                functionCode: "[code]",
-                               // node calls it internally, it's a html attribute value
+
+                               // Node calls it internally, it's a html attribute value
                                attribute: quote,
                                string: quote,
                                date: quote,
@@ -2160,23 +2165,26 @@ QUnit.dump = (function() {
                                number: literal,
                                "boolean": literal
                        },
-                       // if true, entities are escaped ( <, >, \t, space and \n )
+
+                       // If true, entities are escaped ( <, >, \t, space and \n )
                        HTML: false,
-                       // indentation unit
+
+                       // Indentation unit
                        indentChar: "  ",
-                       // if true, items in a collection, are separated by a \n, else just a space.
+
+                       // If true, items in a collection, are separated by a \n, else just a space.
                        multiline: true
                };
 
        return dump;
-}());
+}() );
 
-// back compat
+// Back compat
 QUnit.jsDump = QUnit.dump;
 
 // Deprecated
 // Extend assert methods to QUnit for Backwards compatibility
-(function() {
+( function() {
        var i,
                assertions = Assert.prototype;
 
@@ -2190,12 +2198,12 @@ QUnit.jsDump = QUnit.dump;
        for ( i in assertions ) {
                QUnit[ i ] = applyCurrent( assertions[ i ] );
        }
-})();
+}() );
 
 // For browser, export only select globals
 if ( defined.document ) {
 
-       (function() {
+       ( function() {
                var i, l,
                        keys = [
                                "test",
@@ -2221,7 +2229,7 @@ if ( defined.document ) {
                for ( i = 0, l = keys.length; i < l; i++ ) {
                        window[ keys[ i ] ] = QUnit[ keys[ i ] ];
                }
-       })();
+       }() );
 
        window.QUnit = QUnit;
 }
@@ -2246,1959 +2254,2081 @@ if ( typeof define === "function" && define.amd ) {
        QUnit.config.autostart = false;
 }
 
-/*
- * This file is a modified version of google-diff-match-patch's JavaScript implementation
- * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),
- * modifications are licensed as more fully set forth in LICENSE.txt.
- *
- * The original source of google-diff-match-patch is attributable and licensed as follows:
- *
- * Copyright 2006 Google Inc.
- * https://code.google.com/p/google-diff-match-patch/
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- * More Info:
- *  https://code.google.com/p/google-diff-match-patch/
- *
- * Usage: QUnit.diff(expected, actual)
- *
- */
-QUnit.diff = ( function() {
-       function DiffMatchPatch() {
-       }
+// Get a reference to the global object, like window in browsers
+}( ( function() {
+       return this;
+}() ) ) );
 
-       //  DIFF FUNCTIONS
+( function() {
 
-       /**
-        * The data structure representing a diff is an array of tuples:
-        * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
-        * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
-        */
-       var DIFF_DELETE = -1,
-               DIFF_INSERT = 1,
-               DIFF_EQUAL = 0;
+// Only interact with URLs via window.location
+var location = typeof window !== "undefined" && window.location;
+if ( !location ) {
+       return;
+}
 
-       /**
-        * Find the differences between two texts.  Simplifies the problem by stripping
-        * any common prefix or suffix off the texts before diffing.
-        * @param {string} text1 Old string to be diffed.
-        * @param {string} text2 New string to be diffed.
-        * @param {boolean=} optChecklines Optional speedup flag. If present and false,
-        *     then don't run a line-level diff first to identify the changed areas.
-        *     Defaults to true, which does a faster, slightly less optimal diff.
-        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-        */
-       DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines ) {
-               var deadline, checklines, commonlength,
-                       commonprefix, commonsuffix, diffs;
+var urlParams = getUrlParams();
 
-               // The diff must be complete in up to 1 second.
-               deadline = ( new Date() ).getTime() + 1000;
+QUnit.urlParams = urlParams;
 
-               // Check for null inputs.
-               if ( text1 === null || text2 === null ) {
-                       throw new Error( "Null input. (DiffMain)" );
-               }
+// Match module/test by inclusion in an array
+QUnit.config.moduleId = [].concat( urlParams.moduleId || [] );
+QUnit.config.testId = [].concat( urlParams.testId || [] );
 
-               // Check for equality (speedup).
-               if ( text1 === text2 ) {
-                       if ( text1 ) {
-                               return [
-                                       [ DIFF_EQUAL, text1 ]
-                               ];
-                       }
-                       return [];
-               }
+// Exact case-insensitive match of the module name
+QUnit.config.module = urlParams.module;
 
-               if ( typeof optChecklines === "undefined" ) {
-                       optChecklines = true;
-               }
+// Regular expression or case-insenstive substring match against "moduleName: testName"
+QUnit.config.filter = urlParams.filter;
 
-               checklines = optChecklines;
+// Test order randomization
+if ( urlParams.seed === true ) {
 
-               // Trim off common prefix (speedup).
-               commonlength = this.diffCommonPrefix( text1, text2 );
-               commonprefix = text1.substring( 0, commonlength );
-               text1 = text1.substring( commonlength );
-               text2 = text2.substring( commonlength );
+       // Generate a random seed if the option is specified without a value
+       QUnit.config.seed = Math.random().toString( 36 ).slice( 2 );
+} else if ( urlParams.seed ) {
+       QUnit.config.seed = urlParams.seed;
+}
 
-               // Trim off common suffix (speedup).
-               commonlength = this.diffCommonSuffix( text1, text2 );
-               commonsuffix = text1.substring( text1.length - commonlength );
-               text1 = text1.substring( 0, text1.length - commonlength );
-               text2 = text2.substring( 0, text2.length - commonlength );
+// Add URL-parameter-mapped config values with UI form rendering data
+QUnit.config.urlConfig.push(
+       {
+               id: "hidepassed",
+               label: "Hide passed tests",
+               tooltip: "Only show tests and assertions that fail. Stored as query-strings."
+       },
+       {
+               id: "noglobals",
+               label: "Check for Globals",
+               tooltip: "Enabling this will test if any test introduces new properties on the " +
+                       "global object (`window` in Browsers). Stored as query-strings."
+       },
+       {
+               id: "notrycatch",
+               label: "No try-catch",
+               tooltip: "Enabling this will run tests outside of a try-catch block. Makes debugging " +
+                       "exceptions in IE reasonable. Stored as query-strings."
+       }
+);
 
-               // Compute the diff on the middle block.
-               diffs = this.diffCompute( text1, text2, checklines, deadline );
+QUnit.begin( function() {
+       var i, option,
+               urlConfig = QUnit.config.urlConfig;
 
-               // Restore the prefix and suffix.
-               if ( commonprefix ) {
-                       diffs.unshift( [ DIFF_EQUAL, commonprefix ] );
-               }
-               if ( commonsuffix ) {
-                       diffs.push( [ DIFF_EQUAL, commonsuffix ] );
-               }
-               this.diffCleanupMerge( diffs );
-               return diffs;
-       };
+       for ( i = 0; i < urlConfig.length; i++ ) {
 
-       /**
-        * Reduce the number of edits by eliminating operationally trivial equalities.
-        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-        */
-       DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) {
-               var changes, equalities, equalitiesLength, lastequality,
-                       pointer, preIns, preDel, postIns, postDel;
-               changes = false;
-               equalities = []; // Stack of indices where equalities are found.
-               equalitiesLength = 0; // Keeping our own length var is faster in JS.
-               /** @type {?string} */
-               lastequality = null;
-               // Always equal to diffs[equalities[equalitiesLength - 1]][1]
-               pointer = 0; // Index of current position.
-               // Is there an insertion operation before the last equality.
-               preIns = false;
-               // Is there a deletion operation before the last equality.
-               preDel = false;
-               // Is there an insertion operation after the last equality.
-               postIns = false;
-               // Is there a deletion operation after the last equality.
-               postDel = false;
-               while ( pointer < diffs.length ) {
+               // Options can be either strings or objects with nonempty "id" properties
+               option = QUnit.config.urlConfig[ i ];
+               if ( typeof option !== "string" ) {
+                       option = option.id;
+               }
 
-                       // Equality found.
-                       if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) {
-                               if ( diffs[ pointer ][ 1 ].length < 4 && ( postIns || postDel ) ) {
+               if ( QUnit.config[ option ] === undefined ) {
+                       QUnit.config[ option ] = urlParams[ option ];
+               }
+       }
+} );
 
-                                       // Candidate found.
-                                       equalities[ equalitiesLength++ ] = pointer;
-                                       preIns = postIns;
-                                       preDel = postDel;
-                                       lastequality = diffs[ pointer ][ 1 ];
-                               } else {
+function getUrlParams() {
+       var i, param, name, value;
+       var urlParams = {};
+       var params = location.search.slice( 1 ).split( "&" );
+       var length = params.length;
 
-                                       // Not a candidate, and can never become one.
-                                       equalitiesLength = 0;
-                                       lastequality = null;
-                               }
-                               postIns = postDel = false;
+       for ( i = 0; i < length; i++ ) {
+               if ( params[ i ] ) {
+                       param = params[ i ].split( "=" );
+                       name = decodeURIComponent( param[ 0 ] );
 
-                       // An insertion or deletion.
+                       // Allow just a key to turn on a flag, e.g., test.html?noglobals
+                       value = param.length === 1 ||
+                               decodeURIComponent( param.slice( 1 ).join( "=" ) ) ;
+                       if ( urlParams[ name ] ) {
+                               urlParams[ name ] = [].concat( urlParams[ name ], value );
                        } else {
+                               urlParams[ name ] = value;
+                       }
+               }
+       }
 
-                               if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) {
-                                       postDel = true;
-                               } else {
-                                       postIns = true;
-                               }
+       return urlParams;
+}
 
-                               /*
-                                * Five types to be split:
-                                * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
-                                * <ins>A</ins>X<ins>C</ins><del>D</del>
-                                * <ins>A</ins><del>B</del>X<ins>C</ins>
-                                * <ins>A</del>X<ins>C</ins><del>D</del>
-                                * <ins>A</ins><del>B</del>X<del>C</del>
-                                */
-                               if ( lastequality && ( ( preIns && preDel && postIns && postDel ) ||
-                                               ( ( lastequality.length < 2 ) &&
-                                               ( preIns + preDel + postIns + postDel ) === 3 ) ) ) {
+// Don't load the HTML Reporter on non-browser environments
+if ( typeof window === "undefined" || !window.document ) {
+       return;
+}
 
-                                       // Duplicate record.
-                                       diffs.splice(
-                                               equalities[ equalitiesLength - 1 ],
-                                               0,
-                                               [ DIFF_DELETE, lastequality ]
-                                       );
+// Deprecated QUnit.init - Ref #530
+// Re-initialize the configuration options
+QUnit.init = function() {
+       var config = QUnit.config;
 
-                                       // Change second copy to insert.
-                                       diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
-                                       equalitiesLength--; // Throw away the equality we just deleted;
-                                       lastequality = null;
-                                       if ( preIns && preDel ) {
-                                               // No changes made which could affect previous entry, keep going.
-                                               postIns = postDel = true;
-                                               equalitiesLength = 0;
-                                       } else {
-                                               equalitiesLength--; // Throw away the previous equality.
-                                               pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
-                                               postIns = postDel = false;
-                                       }
-                                       changes = true;
-                               }
-                       }
-                       pointer++;
-               }
+       config.stats = { all: 0, bad: 0 };
+       config.moduleStats = { all: 0, bad: 0 };
+       config.started = 0;
+       config.updateRate = 1000;
+       config.blocking = false;
+       config.autostart = true;
+       config.autorun = false;
+       config.filter = "";
+       config.queue = [];
 
-               if ( changes ) {
-                       this.diffCleanupMerge( diffs );
-               }
-       };
+       appendInterface();
+};
 
-       /**
-        * Convert a diff array into a pretty HTML report.
-        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-        * @param {integer} string to be beautified.
-        * @return {string} HTML representation.
-        */
-       DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) {
-               var op, data, x,
-                       html = [];
-               for ( x = 0; x < diffs.length; x++ ) {
-                       op = diffs[ x ][ 0 ]; // Operation (insert, delete, equal)
-                       data = diffs[ x ][ 1 ]; // Text of change.
-                       switch ( op ) {
-                       case DIFF_INSERT:
-                               html[ x ] = "<ins>" + data + "</ins>";
-                               break;
-                       case DIFF_DELETE:
-                               html[ x ] = "<del>" + data + "</del>";
-                               break;
-                       case DIFF_EQUAL:
-                               html[ x ] = "<span>" + data + "</span>";
-                               break;
+var config = QUnit.config,
+       document = window.document,
+       collapseNext = false,
+       hasOwn = Object.prototype.hasOwnProperty,
+       unfilteredUrl = setUrl( { filter: undefined, module: undefined,
+               moduleId: undefined, testId: undefined } ),
+       defined = {
+               sessionStorage: ( function() {
+                       var x = "qunit-test-string";
+                       try {
+                               sessionStorage.setItem( x, x );
+                               sessionStorage.removeItem( x );
+                               return true;
+                       } catch ( e ) {
+                               return false;
                        }
-               }
-               return html.join( "" );
-       };
+               }() )
+       },
+       modulesList = [];
 
-       /**
-        * Determine the common prefix of two strings.
-        * @param {string} text1 First string.
-        * @param {string} text2 Second string.
-        * @return {number} The number of characters common to the start of each
-        *     string.
-        */
-       DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) {
-               var pointermid, pointermax, pointermin, pointerstart;
-               // Quick check for common null cases.
-               if ( !text1 || !text2 || text1.charAt( 0 ) !== text2.charAt( 0 ) ) {
-                       return 0;
-               }
-               // Binary search.
-               // Performance analysis: https://neil.fraser.name/news/2007/10/09/
-               pointermin = 0;
-               pointermax = Math.min( text1.length, text2.length );
-               pointermid = pointermax;
-               pointerstart = 0;
-               while ( pointermin < pointermid ) {
-                       if ( text1.substring( pointerstart, pointermid ) ===
-                                       text2.substring( pointerstart, pointermid ) ) {
-                               pointermin = pointermid;
-                               pointerstart = pointermin;
-                       } else {
-                               pointermax = pointermid;
-                       }
-                       pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
-               }
-               return pointermid;
-       };
+/**
+* Escape text for attribute or text content.
+*/
+function escapeText( s ) {
+       if ( !s ) {
+               return "";
+       }
+       s = s + "";
 
-       /**
-        * Determine the common suffix of two strings.
-        * @param {string} text1 First string.
-        * @param {string} text2 Second string.
-        * @return {number} The number of characters common to the end of each string.
-        */
-       DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) {
-               var pointermid, pointermax, pointermin, pointerend;
-               // Quick check for common null cases.
-               if ( !text1 ||
-                               !text2 ||
-                               text1.charAt( text1.length - 1 ) !== text2.charAt( text2.length - 1 ) ) {
-                       return 0;
-               }
-               // Binary search.
-               // Performance analysis: https://neil.fraser.name/news/2007/10/09/
-               pointermin = 0;
-               pointermax = Math.min( text1.length, text2.length );
-               pointermid = pointermax;
-               pointerend = 0;
-               while ( pointermin < pointermid ) {
-                       if ( text1.substring( text1.length - pointermid, text1.length - pointerend ) ===
-                                       text2.substring( text2.length - pointermid, text2.length - pointerend ) ) {
-                               pointermin = pointermid;
-                               pointerend = pointermin;
-                       } else {
-                               pointermax = pointermid;
-                       }
-                       pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
+       // Both single quotes and double quotes (for attributes)
+       return s.replace( /['"<>&]/g, function( s ) {
+               switch ( s ) {
+               case "'":
+                       return "&#039;";
+               case "\"":
+                       return "&quot;";
+               case "<":
+                       return "&lt;";
+               case ">":
+                       return "&gt;";
+               case "&":
+                       return "&amp;";
                }
-               return pointermid;
-       };
-
-       /**
-        * Find the differences between two texts.  Assumes that the texts do not
-        * have any common prefix or suffix.
-        * @param {string} text1 Old string to be diffed.
-        * @param {string} text2 New string to be diffed.
-        * @param {boolean} checklines Speedup flag.  If false, then don't run a
-        *     line-level diff first to identify the changed areas.
-        *     If true, then run a faster, slightly less optimal diff.
-        * @param {number} deadline Time when the diff should be complete by.
-        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) {
-               var diffs, longtext, shorttext, i, hm,
-                       text1A, text2A, text1B, text2B,
-                       midCommon, diffsA, diffsB;
+       } );
+}
 
-               if ( !text1 ) {
-                       // Just add some text (speedup).
-                       return [
-                               [ DIFF_INSERT, text2 ]
-                       ];
-               }
+/**
+ * @param {HTMLElement} elem
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvent( elem, type, fn ) {
+       if ( elem.addEventListener ) {
 
-               if ( !text2 ) {
-                       // Just delete some text (speedup).
-                       return [
-                               [ DIFF_DELETE, text1 ]
-                       ];
-               }
+               // Standards-based browsers
+               elem.addEventListener( type, fn, false );
+       } else if ( elem.attachEvent ) {
 
-               longtext = text1.length > text2.length ? text1 : text2;
-               shorttext = text1.length > text2.length ? text2 : text1;
-               i = longtext.indexOf( shorttext );
-               if ( i !== -1 ) {
-                       // Shorter text is inside the longer text (speedup).
-                       diffs = [
-                               [ DIFF_INSERT, longtext.substring( 0, i ) ],
-                               [ DIFF_EQUAL, shorttext ],
-                               [ DIFF_INSERT, longtext.substring( i + shorttext.length ) ]
-                       ];
-                       // Swap insertions for deletions if diff is reversed.
-                       if ( text1.length > text2.length ) {
-                               diffs[ 0 ][ 0 ] = diffs[ 2 ][ 0 ] = DIFF_DELETE;
+               // Support: IE <9
+               elem.attachEvent( "on" + type, function() {
+                       var event = window.event;
+                       if ( !event.target ) {
+                               event.target = event.srcElement || document;
                        }
-                       return diffs;
-               }
 
-               if ( shorttext.length === 1 ) {
-                       // Single character string.
-                       // After the previous speedup, the character can't be an equality.
-                       return [
-                               [ DIFF_DELETE, text1 ],
-                               [ DIFF_INSERT, text2 ]
-                       ];
-               }
+                       fn.call( elem, event );
+               } );
+       }
+}
 
-               // Check to see if the problem can be split in two.
-               hm = this.diffHalfMatch( text1, text2 );
-               if ( hm ) {
-                       // A half-match was found, sort out the return data.
-                       text1A = hm[ 0 ];
-                       text1B = hm[ 1 ];
-                       text2A = hm[ 2 ];
-                       text2B = hm[ 3 ];
-                       midCommon = hm[ 4 ];
-                       // Send both pairs off for separate processing.
-                       diffsA = this.DiffMain( text1A, text2A, checklines, deadline );
-                       diffsB = this.DiffMain( text1B, text2B, checklines, deadline );
-                       // Merge the results.
-                       return diffsA.concat( [
-                               [ DIFF_EQUAL, midCommon ]
-                       ], diffsB );
-               }
+/**
+ * @param {Array|NodeList} elems
+ * @param {string} type
+ * @param {Function} fn
+ */
+function addEvents( elems, type, fn ) {
+       var i = elems.length;
+       while ( i-- ) {
+               addEvent( elems[ i ], type, fn );
+       }
+}
 
-               if ( checklines && text1.length > 100 && text2.length > 100 ) {
-                       return this.diffLineMode( text1, text2, deadline );
-               }
+function hasClass( elem, name ) {
+       return ( " " + elem.className + " " ).indexOf( " " + name + " " ) >= 0;
+}
 
-               return this.diffBisect( text1, text2, deadline );
-       };
+function addClass( elem, name ) {
+       if ( !hasClass( elem, name ) ) {
+               elem.className += ( elem.className ? " " : "" ) + name;
+       }
+}
 
-       /**
-        * Do the two texts share a substring which is at least half the length of the
-        * longer text?
-        * This speedup can produce non-minimal diffs.
-        * @param {string} text1 First string.
-        * @param {string} text2 Second string.
-        * @return {Array.<string>} Five element Array, containing the prefix of
-        *     text1, the suffix of text1, the prefix of text2, the suffix of
-        *     text2 and the common middle.  Or null if there was no match.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffHalfMatch = function( text1, text2 ) {
-               var longtext, shorttext, dmp,
-                       text1A, text2B, text2A, text1B, midCommon,
-                       hm1, hm2, hm;
+function toggleClass( elem, name, force ) {
+       if ( force || typeof force === "undefined" && !hasClass( elem, name ) ) {
+               addClass( elem, name );
+       } else {
+               removeClass( elem, name );
+       }
+}
 
-               longtext = text1.length > text2.length ? text1 : text2;
-               shorttext = text1.length > text2.length ? text2 : text1;
-               if ( longtext.length < 4 || shorttext.length * 2 < longtext.length ) {
-                       return null; // Pointless.
+function removeClass( elem, name ) {
+       var set = " " + elem.className + " ";
+
+       // Class name may appear multiple times
+       while ( set.indexOf( " " + name + " " ) >= 0 ) {
+               set = set.replace( " " + name + " ", " " );
+       }
+
+       // Trim for prettiness
+       elem.className = typeof set.trim === "function" ? set.trim() : set.replace( /^\s+|\s+$/g, "" );
+}
+
+function id( name ) {
+       return document.getElementById && document.getElementById( name );
+}
+
+function getUrlConfigHtml() {
+       var i, j, val,
+               escaped, escapedTooltip,
+               selection = false,
+               urlConfig = config.urlConfig,
+               urlConfigHtml = "";
+
+       for ( i = 0; i < urlConfig.length; i++ ) {
+
+               // Options can be either strings or objects with nonempty "id" properties
+               val = config.urlConfig[ i ];
+               if ( typeof val === "string" ) {
+                       val = {
+                               id: val,
+                               label: val
+                       };
                }
-               dmp = this; // 'this' becomes 'window' in a closure.
 
-               /**
-                * Does a substring of shorttext exist within longtext such that the substring
-                * is at least half the length of longtext?
-                * Closure, but does not reference any external variables.
-                * @param {string} longtext Longer string.
-                * @param {string} shorttext Shorter string.
-                * @param {number} i Start index of quarter length substring within longtext.
-                * @return {Array.<string>} Five element Array, containing the prefix of
-                *     longtext, the suffix of longtext, the prefix of shorttext, the suffix
-                *     of shorttext and the common middle.  Or null if there was no match.
-                * @private
-                */
-               function diffHalfMatchI( longtext, shorttext, i ) {
-                       var seed, j, bestCommon, prefixLength, suffixLength,
-                               bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;
-                       // Start with a 1/4 length substring at position i as a seed.
-                       seed = longtext.substring( i, i + Math.floor( longtext.length / 4 ) );
-                       j = -1;
-                       bestCommon = "";
-                       while ( ( j = shorttext.indexOf( seed, j + 1 ) ) !== -1 ) {
-                               prefixLength = dmp.diffCommonPrefix( longtext.substring( i ),
-                                       shorttext.substring( j ) );
-                               suffixLength = dmp.diffCommonSuffix( longtext.substring( 0, i ),
-                                       shorttext.substring( 0, j ) );
-                               if ( bestCommon.length < suffixLength + prefixLength ) {
-                                       bestCommon = shorttext.substring( j - suffixLength, j ) +
-                                               shorttext.substring( j, j + prefixLength );
-                                       bestLongtextA = longtext.substring( 0, i - suffixLength );
-                                       bestLongtextB = longtext.substring( i + prefixLength );
-                                       bestShorttextA = shorttext.substring( 0, j - suffixLength );
-                                       bestShorttextB = shorttext.substring( j + prefixLength );
+               escaped = escapeText( val.id );
+               escapedTooltip = escapeText( val.tooltip );
+
+               if ( !val.value || typeof val.value === "string" ) {
+                       urlConfigHtml += "<input id='qunit-urlconfig-" + escaped +
+                               "' name='" + escaped + "' type='checkbox'" +
+                               ( val.value ? " value='" + escapeText( val.value ) + "'" : "" ) +
+                               ( config[ val.id ] ? " checked='checked'" : "" ) +
+                               " title='" + escapedTooltip + "' /><label for='qunit-urlconfig-" + escaped +
+                               "' title='" + escapedTooltip + "'>" + val.label + "</label>";
+               } else {
+                       urlConfigHtml += "<label for='qunit-urlconfig-" + escaped +
+                               "' title='" + escapedTooltip + "'>" + val.label +
+                               ": </label><select id='qunit-urlconfig-" + escaped +
+                               "' name='" + escaped + "' title='" + escapedTooltip + "'><option></option>";
+
+                       if ( QUnit.is( "array", val.value ) ) {
+                               for ( j = 0; j < val.value.length; j++ ) {
+                                       escaped = escapeText( val.value[ j ] );
+                                       urlConfigHtml += "<option value='" + escaped + "'" +
+                                               ( config[ val.id ] === val.value[ j ] ?
+                                                       ( selection = true ) && " selected='selected'" : "" ) +
+                                               ">" + escaped + "</option>";
                                }
-                       }
-                       if ( bestCommon.length * 2 >= longtext.length ) {
-                               return [ bestLongtextA, bestLongtextB,
-                                       bestShorttextA, bestShorttextB, bestCommon
-                               ];
                        } else {
-                               return null;
+                               for ( j in val.value ) {
+                                       if ( hasOwn.call( val.value, j ) ) {
+                                               urlConfigHtml += "<option value='" + escapeText( j ) + "'" +
+                                                       ( config[ val.id ] === j ?
+                                                               ( selection = true ) && " selected='selected'" : "" ) +
+                                                       ">" + escapeText( val.value[ j ] ) + "</option>";
+                                       }
+                               }
+                       }
+                       if ( config[ val.id ] && !selection ) {
+                               escaped = escapeText( config[ val.id ] );
+                               urlConfigHtml += "<option value='" + escaped +
+                                       "' selected='selected' disabled='disabled'>" + escaped + "</option>";
                        }
+                       urlConfigHtml += "</select>";
                }
+       }
 
-               // First check if the second quarter is the seed for a half-match.
-               hm1 = diffHalfMatchI( longtext, shorttext,
-                       Math.ceil( longtext.length / 4 ) );
-               // Check again based on the third quarter.
-               hm2 = diffHalfMatchI( longtext, shorttext,
-                       Math.ceil( longtext.length / 2 ) );
-               if ( !hm1 && !hm2 ) {
-                       return null;
-               } else if ( !hm2 ) {
-                       hm = hm1;
-               } else if ( !hm1 ) {
-                       hm = hm2;
-               } else {
-                       // Both matched.  Select the longest.
-                       hm = hm1[ 4 ].length > hm2[ 4 ].length ? hm1 : hm2;
-               }
+       return urlConfigHtml;
+}
 
-               // A half-match was found, sort out the return data.
-               text1A, text1B, text2A, text2B;
-               if ( text1.length > text2.length ) {
-                       text1A = hm[ 0 ];
-                       text1B = hm[ 1 ];
-                       text2A = hm[ 2 ];
-                       text2B = hm[ 3 ];
-               } else {
-                       text2A = hm[ 0 ];
-                       text2B = hm[ 1 ];
-                       text1A = hm[ 2 ];
-                       text1B = hm[ 3 ];
+// Handle "click" events on toolbar checkboxes and "change" for select menus.
+// Updates the URL with the new state of `config.urlConfig` values.
+function toolbarChanged() {
+       var updatedUrl, value, tests,
+               field = this,
+               params = {};
+
+       // Detect if field is a select menu or a checkbox
+       if ( "selectedIndex" in field ) {
+               value = field.options[ field.selectedIndex ].value || undefined;
+       } else {
+               value = field.checked ? ( field.defaultValue || true ) : undefined;
+       }
+
+       params[ field.name ] = value;
+       updatedUrl = setUrl( params );
+
+       // Check if we can apply the change without a page refresh
+       if ( "hidepassed" === field.name && "replaceState" in window.history ) {
+               QUnit.urlParams[ field.name ] = value;
+               config[ field.name ] = value || false;
+               tests = id( "qunit-tests" );
+               if ( tests ) {
+                       toggleClass( tests, "hidepass", value || false );
                }
-               midCommon = hm[ 4 ];
-               return [ text1A, text1B, text2A, text2B, midCommon ];
-       };
+               window.history.replaceState( null, "", updatedUrl );
+       } else {
+               window.location = updatedUrl;
+       }
+}
 
-       /**
-        * Do a quick line-level diff on both strings, then rediff the parts for
-        * greater accuracy.
-        * This speedup can produce non-minimal diffs.
-        * @param {string} text1 Old string to be diffed.
-        * @param {string} text2 New string to be diffed.
-        * @param {number} deadline Time when the diff should be complete by.
-        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffLineMode = function( text1, text2, deadline ) {
-               var a, diffs, linearray, pointer, countInsert,
-                       countDelete, textInsert, textDelete, j;
-               // Scan the text on a line-by-line basis first.
-               a = this.diffLinesToChars( text1, text2 );
-               text1 = a.chars1;
-               text2 = a.chars2;
-               linearray = a.lineArray;
+function setUrl( params ) {
+       var key, arrValue, i,
+               querystring = "?",
+               location = window.location;
 
-               diffs = this.DiffMain( text1, text2, false, deadline );
+       params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );
 
-               // Convert the diff back to original text.
-               this.diffCharsToLines( diffs, linearray );
-               // Eliminate freak matches (e.g. blank lines)
-               this.diffCleanupSemantic( diffs );
+       for ( key in params ) {
 
-               // Rediff any replacement blocks, this time character-by-character.
-               // Add a dummy entry at the end.
-               diffs.push( [ DIFF_EQUAL, "" ] );
-               pointer = 0;
-               countDelete = 0;
-               countInsert = 0;
-               textDelete = "";
-               textInsert = "";
-               while ( pointer < diffs.length ) {
-                       switch ( diffs[ pointer ][ 0 ] ) {
-                       case DIFF_INSERT:
-                               countInsert++;
-                               textInsert += diffs[ pointer ][ 1 ];
-                               break;
-                       case DIFF_DELETE:
-                               countDelete++;
-                               textDelete += diffs[ pointer ][ 1 ];
-                               break;
-                       case DIFF_EQUAL:
-                               // Upon reaching an equality, check for prior redundancies.
-                               if ( countDelete >= 1 && countInsert >= 1 ) {
-                                       // Delete the offending records and add the merged ones.
-                                       diffs.splice( pointer - countDelete - countInsert,
-                                               countDelete + countInsert );
-                                       pointer = pointer - countDelete - countInsert;
-                                       a = this.DiffMain( textDelete, textInsert, false, deadline );
-                                       for ( j = a.length - 1; j >= 0; j-- ) {
-                                               diffs.splice( pointer, 0, a[ j ] );
-                                       }
-                                       pointer = pointer + a.length;
+               // Skip inherited or undefined properties
+               if ( hasOwn.call( params, key ) && params[ key ] !== undefined ) {
+
+                       // Output a parameter for each value of this key (but usually just one)
+                       arrValue = [].concat( params[ key ] );
+                       for ( i = 0; i < arrValue.length; i++ ) {
+                               querystring += encodeURIComponent( key );
+                               if ( arrValue[ i ] !== true ) {
+                                       querystring += "=" + encodeURIComponent( arrValue[ i ] );
                                }
-                               countInsert = 0;
-                               countDelete = 0;
-                               textDelete = "";
-                               textInsert = "";
-                               break;
+                               querystring += "&";
                        }
-                       pointer++;
                }
-               diffs.pop(); // Remove the dummy entry at the end.
+       }
+       return location.protocol + "//" + location.host +
+               location.pathname + querystring.slice( 0, -1 );
+}
 
-               return diffs;
-       };
+function applyUrlParams() {
+       var selectedModule,
+               modulesList = id( "qunit-modulefilter" ),
+               filter = id( "qunit-filter-input" ).value;
 
-       /**
-        * Find the 'middle snake' of a diff, split the problem in two
-        * and return the recursively constructed diff.
-        * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
-        * @param {string} text1 Old string to be diffed.
-        * @param {string} text2 New string to be diffed.
-        * @param {number} deadline Time at which to bail if not yet complete.
-        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffBisect = function( text1, text2, deadline ) {
-               var text1Length, text2Length, maxD, vOffset, vLength,
-                       v1, v2, x, delta, front, k1start, k1end, k2start,
-                       k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;
-               // Cache the text lengths to prevent multiple calls.
-               text1Length = text1.length;
-               text2Length = text2.length;
-               maxD = Math.ceil( ( text1Length + text2Length ) / 2 );
-               vOffset = maxD;
-               vLength = 2 * maxD;
-               v1 = new Array( vLength );
-               v2 = new Array( vLength );
-               // Setting all elements to -1 is faster in Chrome & Firefox than mixing
-               // integers and undefined.
-               for ( x = 0; x < vLength; x++ ) {
-                       v1[ x ] = -1;
-                       v2[ x ] = -1;
+       selectedModule = modulesList ?
+               decodeURIComponent( modulesList.options[ modulesList.selectedIndex ].value ) :
+               undefined;
+
+       window.location = setUrl( {
+               module: ( selectedModule === "" ) ? undefined : selectedModule,
+               filter: ( filter === "" ) ? undefined : filter,
+
+               // Remove moduleId and testId filters
+               moduleId: undefined,
+               testId: undefined
+       } );
+}
+
+function toolbarUrlConfigContainer() {
+       var urlConfigContainer = document.createElement( "span" );
+
+       urlConfigContainer.innerHTML = getUrlConfigHtml();
+       addClass( urlConfigContainer, "qunit-url-config" );
+
+       // For oldIE support:
+       // * Add handlers to the individual elements instead of the container
+       // * Use "click" instead of "change" for checkboxes
+       addEvents( urlConfigContainer.getElementsByTagName( "input" ), "click", toolbarChanged );
+       addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", toolbarChanged );
+
+       return urlConfigContainer;
+}
+
+function toolbarLooseFilter() {
+       var filter = document.createElement( "form" ),
+               label = document.createElement( "label" ),
+               input = document.createElement( "input" ),
+               button = document.createElement( "button" );
+
+       addClass( filter, "qunit-filter" );
+
+       label.innerHTML = "Filter: ";
+
+       input.type = "text";
+       input.value = config.filter || "";
+       input.name = "filter";
+       input.id = "qunit-filter-input";
+
+       button.innerHTML = "Go";
+
+       label.appendChild( input );
+
+       filter.appendChild( label );
+       filter.appendChild( button );
+       addEvent( filter, "submit", function( ev ) {
+               applyUrlParams();
+
+               if ( ev && ev.preventDefault ) {
+                       ev.preventDefault();
                }
-               v1[ vOffset + 1 ] = 0;
-               v2[ vOffset + 1 ] = 0;
-               delta = text1Length - text2Length;
-               // If the total number of characters is odd, then the front path will collide
-               // with the reverse path.
-               front = ( delta % 2 !== 0 );
-               // Offsets for start and end of k loop.
-               // Prevents mapping of space beyond the grid.
-               k1start = 0;
-               k1end = 0;
-               k2start = 0;
-               k2end = 0;
-               for ( d = 0; d < maxD; d++ ) {
-                       // Bail out if deadline is reached.
-                       if ( ( new Date() ).getTime() > deadline ) {
-                               break;
-                       }
 
-                       // Walk the front path one step.
-                       for ( k1 = -d + k1start; k1 <= d - k1end; k1 += 2 ) {
-                               k1Offset = vOffset + k1;
-                               if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) {
-                                       x1 = v1[ k1Offset + 1 ];
-                               } else {
-                                       x1 = v1[ k1Offset - 1 ] + 1;
-                               }
-                               y1 = x1 - k1;
-                               while ( x1 < text1Length && y1 < text2Length &&
-                                       text1.charAt( x1 ) === text2.charAt( y1 ) ) {
-                                       x1++;
-                                       y1++;
-                               }
-                               v1[ k1Offset ] = x1;
-                               if ( x1 > text1Length ) {
-                                       // Ran off the right of the graph.
-                                       k1end += 2;
-                               } else if ( y1 > text2Length ) {
-                                       // Ran off the bottom of the graph.
-                                       k1start += 2;
-                               } else if ( front ) {
-                                       k2Offset = vOffset + delta - k1;
-                                       if ( k2Offset >= 0 && k2Offset < vLength && v2[ k2Offset ] !== -1 ) {
-                                               // Mirror x2 onto top-left coordinate system.
-                                               x2 = text1Length - v2[ k2Offset ];
-                                               if ( x1 >= x2 ) {
-                                                       // Overlap detected.
-                                                       return this.diffBisectSplit( text1, text2, x1, y1, deadline );
-                                               }
-                                       }
-                               }
-                       }
+               return false;
+       } );
+
+       return filter;
+}
+
+function toolbarModuleFilterHtml() {
+       var i,
+               moduleFilterHtml = "";
+
+       if ( !modulesList.length ) {
+               return false;
+       }
+
+       moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label>" +
+               "<select id='qunit-modulefilter' name='modulefilter'><option value='' " +
+               ( QUnit.urlParams.module === undefined ? "selected='selected'" : "" ) +
+               ">< All Modules ></option>";
+
+       for ( i = 0; i < modulesList.length; i++ ) {
+               moduleFilterHtml += "<option value='" +
+                       escapeText( encodeURIComponent( modulesList[ i ] ) ) + "' " +
+                       ( QUnit.urlParams.module === modulesList[ i ] ? "selected='selected'" : "" ) +
+                       ">" + escapeText( modulesList[ i ] ) + "</option>";
+       }
+       moduleFilterHtml += "</select>";
+
+       return moduleFilterHtml;
+}
+
+function toolbarModuleFilter() {
+       var toolbar = id( "qunit-testrunner-toolbar" ),
+               moduleFilter = document.createElement( "span" ),
+               moduleFilterHtml = toolbarModuleFilterHtml();
+
+       if ( !toolbar || !moduleFilterHtml ) {
+               return false;
+       }
+
+       moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
+       moduleFilter.innerHTML = moduleFilterHtml;
+
+       addEvent( moduleFilter.lastChild, "change", applyUrlParams );
+
+       toolbar.appendChild( moduleFilter );
+}
+
+function appendToolbar() {
+       var toolbar = id( "qunit-testrunner-toolbar" );
+
+       if ( toolbar ) {
+               toolbar.appendChild( toolbarUrlConfigContainer() );
+               toolbar.appendChild( toolbarLooseFilter() );
+               toolbarModuleFilter();
+       }
+}
+
+function appendHeader() {
+       var header = id( "qunit-header" );
+
+       if ( header ) {
+               header.innerHTML = "<a href='" + escapeText( unfilteredUrl ) + "'>" + header.innerHTML +
+                       "</a> ";
+       }
+}
+
+function appendBanner() {
+       var banner = id( "qunit-banner" );
+
+       if ( banner ) {
+               banner.className = "";
+       }
+}
+
+function appendTestResults() {
+       var tests = id( "qunit-tests" ),
+               result = id( "qunit-testresult" );
+
+       if ( result ) {
+               result.parentNode.removeChild( result );
+       }
+
+       if ( tests ) {
+               tests.innerHTML = "";
+               result = document.createElement( "p" );
+               result.id = "qunit-testresult";
+               result.className = "result";
+               tests.parentNode.insertBefore( result, tests );
+               result.innerHTML = "Running...<br />&#160;";
+       }
+}
+
+function storeFixture() {
+       var fixture = id( "qunit-fixture" );
+       if ( fixture ) {
+               config.fixture = fixture.innerHTML;
+       }
+}
+
+function appendFilteredTest() {
+       var testId = QUnit.config.testId;
+       if ( !testId || testId.length <= 0 ) {
+               return "";
+       }
+       return "<div id='qunit-filteredTest'>Rerunning selected tests: " +
+               escapeText( testId.join( ", " ) ) +
+               " <a id='qunit-clearFilter' href='" +
+               escapeText( unfilteredUrl ) +
+               "'>Run all tests</a></div>";
+}
+
+function appendUserAgent() {
+       var userAgent = id( "qunit-userAgent" );
+
+       if ( userAgent ) {
+               userAgent.innerHTML = "";
+               userAgent.appendChild(
+                       document.createTextNode(
+                               "QUnit " + QUnit.version + "; " + navigator.userAgent
+                       )
+               );
+       }
+}
 
-                       // Walk the reverse path one step.
-                       for ( k2 = -d + k2start; k2 <= d - k2end; k2 += 2 ) {
-                               k2Offset = vOffset + k2;
-                               if ( k2 === -d || ( k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) {
-                                       x2 = v2[ k2Offset + 1 ];
-                               } else {
-                                       x2 = v2[ k2Offset - 1 ] + 1;
-                               }
-                               y2 = x2 - k2;
-                               while ( x2 < text1Length && y2 < text2Length &&
-                                       text1.charAt( text1Length - x2 - 1 ) ===
-                                       text2.charAt( text2Length - y2 - 1 ) ) {
-                                       x2++;
-                                       y2++;
-                               }
-                               v2[ k2Offset ] = x2;
-                               if ( x2 > text1Length ) {
-                                       // Ran off the left of the graph.
-                                       k2end += 2;
-                               } else if ( y2 > text2Length ) {
-                                       // Ran off the top of the graph.
-                                       k2start += 2;
-                               } else if ( !front ) {
-                                       k1Offset = vOffset + delta - k2;
-                                       if ( k1Offset >= 0 && k1Offset < vLength && v1[ k1Offset ] !== -1 ) {
-                                               x1 = v1[ k1Offset ];
-                                               y1 = vOffset + x1 - k1Offset;
-                                               // Mirror x2 onto top-left coordinate system.
-                                               x2 = text1Length - x2;
-                                               if ( x1 >= x2 ) {
-                                                       // Overlap detected.
-                                                       return this.diffBisectSplit( text1, text2, x1, y1, deadline );
-                                               }
-                                       }
-                               }
-                       }
+function appendInterface() {
+       var qunit = id( "qunit" );
+
+       if ( qunit ) {
+               qunit.innerHTML =
+                       "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
+                       "<h2 id='qunit-banner'></h2>" +
+                       "<div id='qunit-testrunner-toolbar'></div>" +
+                       appendFilteredTest() +
+                       "<h2 id='qunit-userAgent'></h2>" +
+                       "<ol id='qunit-tests'></ol>";
+       }
+
+       appendHeader();
+       appendBanner();
+       appendTestResults();
+       appendUserAgent();
+       appendToolbar();
+}
+
+function appendTestsList( modules ) {
+       var i, l, x, z, test, moduleObj;
+
+       for ( i = 0, l = modules.length; i < l; i++ ) {
+               moduleObj = modules[ i ];
+
+               for ( x = 0, z = moduleObj.tests.length; x < z; x++ ) {
+                       test = moduleObj.tests[ x ];
+
+                       appendTest( test.name, test.testId, moduleObj.name );
                }
-               // Diff took too long and hit the deadline or
-               // number of diffs equals number of characters, no commonality at all.
-               return [
-                       [ DIFF_DELETE, text1 ],
-                       [ DIFF_INSERT, text2 ]
-               ];
-       };
+       }
+}
 
-       /**
-        * Given the location of the 'middle snake', split the diff in two parts
-        * and recurse.
-        * @param {string} text1 Old string to be diffed.
-        * @param {string} text2 New string to be diffed.
-        * @param {number} x Index of split point in text1.
-        * @param {number} y Index of split point in text2.
-        * @param {number} deadline Time at which to bail if not yet complete.
-        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) {
-               var text1a, text1b, text2a, text2b, diffs, diffsb;
-               text1a = text1.substring( 0, x );
-               text2a = text2.substring( 0, y );
-               text1b = text1.substring( x );
-               text2b = text2.substring( y );
+function appendTest( name, testId, moduleName ) {
+       var title, rerunTrigger, testBlock, assertList,
+               tests = id( "qunit-tests" );
 
-               // Compute both diffs serially.
-               diffs = this.DiffMain( text1a, text2a, false, deadline );
-               diffsb = this.DiffMain( text1b, text2b, false, deadline );
+       if ( !tests ) {
+               return;
+       }
 
-               return diffs.concat( diffsb );
-       };
+       title = document.createElement( "strong" );
+       title.innerHTML = getNameHtml( name, moduleName );
 
-       /**
-        * Reduce the number of edits by eliminating semantically trivial equalities.
-        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-        */
-       DiffMatchPatch.prototype.diffCleanupSemantic = function( diffs ) {
-               var changes, equalities, equalitiesLength, lastequality,
-                       pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1,
-                       lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;
-               changes = false;
-               equalities = []; // Stack of indices where equalities are found.
-               equalitiesLength = 0; // Keeping our own length var is faster in JS.
-               /** @type {?string} */
-               lastequality = null;
-               // Always equal to diffs[equalities[equalitiesLength - 1]][1]
-               pointer = 0; // Index of current position.
-               // Number of characters that changed prior to the equality.
-               lengthInsertions1 = 0;
-               lengthDeletions1 = 0;
-               // Number of characters that changed after the equality.
-               lengthInsertions2 = 0;
-               lengthDeletions2 = 0;
-               while ( pointer < diffs.length ) {
-                       if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found.
-                               equalities[ equalitiesLength++ ] = pointer;
-                               lengthInsertions1 = lengthInsertions2;
-                               lengthDeletions1 = lengthDeletions2;
-                               lengthInsertions2 = 0;
-                               lengthDeletions2 = 0;
-                               lastequality = diffs[ pointer ][ 1 ];
-                       } else { // An insertion or deletion.
-                               if ( diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
-                                       lengthInsertions2 += diffs[ pointer ][ 1 ].length;
-                               } else {
-                                       lengthDeletions2 += diffs[ pointer ][ 1 ].length;
-                               }
-                               // Eliminate an equality that is smaller or equal to the edits on both
-                               // sides of it.
-                               if ( lastequality && ( lastequality.length <=
-                                               Math.max( lengthInsertions1, lengthDeletions1 ) ) &&
-                                               ( lastequality.length <= Math.max( lengthInsertions2,
-                                                       lengthDeletions2 ) ) ) {
+       rerunTrigger = document.createElement( "a" );
+       rerunTrigger.innerHTML = "Rerun";
+       rerunTrigger.href = setUrl( { testId: testId } );
 
-                                       // Duplicate record.
-                                       diffs.splice(
-                                               equalities[ equalitiesLength - 1 ],
-                                               0,
-                                               [ DIFF_DELETE, lastequality ]
-                                       );
+       testBlock = document.createElement( "li" );
+       testBlock.appendChild( title );
+       testBlock.appendChild( rerunTrigger );
+       testBlock.id = "qunit-test-output-" + testId;
 
-                                       // Change second copy to insert.
-                                       diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
+       assertList = document.createElement( "ol" );
+       assertList.className = "qunit-assert-list";
 
-                                       // Throw away the equality we just deleted.
-                                       equalitiesLength--;
+       testBlock.appendChild( assertList );
 
-                                       // Throw away the previous equality (it needs to be reevaluated).
-                                       equalitiesLength--;
-                                       pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
+       tests.appendChild( testBlock );
+}
 
-                                       // Reset the counters.
-                                       lengthInsertions1 = 0;
-                                       lengthDeletions1 = 0;
-                                       lengthInsertions2 = 0;
-                                       lengthDeletions2 = 0;
-                                       lastequality = null;
-                                       changes = true;
-                               }
-                       }
-                       pointer++;
-               }
+// HTML Reporter initialization and load
+QUnit.begin( function( details ) {
+       var i, moduleObj, tests;
 
-               // Normalize the diff.
-               if ( changes ) {
-                       this.diffCleanupMerge( diffs );
+       // Sort modules by name for the picker
+       for ( i = 0; i < details.modules.length; i++ ) {
+               moduleObj = details.modules[ i ];
+               if ( moduleObj.name ) {
+                       modulesList.push( moduleObj.name );
                }
+       }
+       modulesList.sort( function( a, b ) {
+               return a.localeCompare( b );
+       } );
 
-               // Find any overlaps between deletions and insertions.
-               // e.g: <del>abcxxx</del><ins>xxxdef</ins>
-               //   -> <del>abc</del>xxx<ins>def</ins>
-               // e.g: <del>xxxabc</del><ins>defxxx</ins>
-               //   -> <ins>def</ins>xxx<del>abc</del>
-               // Only extract an overlap if it is as big as the edit ahead or behind it.
-               pointer = 1;
-               while ( pointer < diffs.length ) {
-                       if ( diffs[ pointer - 1 ][ 0 ] === DIFF_DELETE &&
-                                       diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
-                               deletion = diffs[ pointer - 1 ][ 1 ];
-                               insertion = diffs[ pointer ][ 1 ];
-                               overlapLength1 = this.diffCommonOverlap( deletion, insertion );
-                               overlapLength2 = this.diffCommonOverlap( insertion, deletion );
-                               if ( overlapLength1 >= overlapLength2 ) {
-                                       if ( overlapLength1 >= deletion.length / 2 ||
-                                                       overlapLength1 >= insertion.length / 2 ) {
-                                               // Overlap found.  Insert an equality and trim the surrounding edits.
-                                               diffs.splice(
-                                                       pointer,
-                                                       0,
-                                                       [ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ]
-                                               );
-                                               diffs[ pointer - 1 ][ 1 ] =
-                                                       deletion.substring( 0, deletion.length - overlapLength1 );
-                                               diffs[ pointer + 1 ][ 1 ] = insertion.substring( overlapLength1 );
-                                               pointer++;
-                                       }
-                               } else {
-                                       if ( overlapLength2 >= deletion.length / 2 ||
-                                                       overlapLength2 >= insertion.length / 2 ) {
+       // Capture fixture HTML from the page
+       storeFixture();
 
-                                               // Reverse overlap found.
-                                               // Insert an equality and swap and trim the surrounding edits.
-                                               diffs.splice(
-                                                       pointer,
-                                                       0,
-                                                       [ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ]
-                                               );
+       // Initialize QUnit elements
+       appendInterface();
+       appendTestsList( details.modules );
+       tests = id( "qunit-tests" );
+       if ( tests && config.hidepassed ) {
+               addClass( tests, "hidepass" );
+       }
+} );
+
+QUnit.done( function( details ) {
+       var i, key,
+               banner = id( "qunit-banner" ),
+               tests = id( "qunit-tests" ),
+               html = [
+                       "Tests completed in ",
+                       details.runtime,
+                       " milliseconds.<br />",
+                       "<span class='passed'>",
+                       details.passed,
+                       "</span> assertions of <span class='total'>",
+                       details.total,
+                       "</span> passed, <span class='failed'>",
+                       details.failed,
+                       "</span> failed."
+               ].join( "" );
+
+       if ( banner ) {
+               banner.className = details.failed ? "qunit-fail" : "qunit-pass";
+       }
+
+       if ( tests ) {
+               id( "qunit-testresult" ).innerHTML = html;
+       }
+
+       if ( config.altertitle && document.title ) {
 
-                                               diffs[ pointer - 1 ][ 0 ] = DIFF_INSERT;
-                                               diffs[ pointer - 1 ][ 1 ] =
-                                                       insertion.substring( 0, insertion.length - overlapLength2 );
-                                               diffs[ pointer + 1 ][ 0 ] = DIFF_DELETE;
-                                               diffs[ pointer + 1 ][ 1 ] =
-                                                       deletion.substring( overlapLength2 );
-                                               pointer++;
-                                       }
-                               }
-                               pointer++;
+               // Show ✖ for good, ✔ for bad suite result in title
+               // use escape sequences in case file gets loaded with non-utf-8-charset
+               document.title = [
+                       ( details.failed ? "\u2716" : "\u2714" ),
+                       document.title.replace( /^[\u2714\u2716] /i, "" )
+               ].join( " " );
+       }
+
+       // Clear own sessionStorage items if all tests passed
+       if ( config.reorder && defined.sessionStorage && details.failed === 0 ) {
+               for ( i = 0; i < sessionStorage.length; i++ ) {
+                       key = sessionStorage.key( i++ );
+                       if ( key.indexOf( "qunit-test-" ) === 0 ) {
+                               sessionStorage.removeItem( key );
                        }
-                       pointer++;
                }
-       };
+       }
 
-       /**
-        * Determine if the suffix of one string is the prefix of another.
-        * @param {string} text1 First string.
-        * @param {string} text2 Second string.
-        * @return {number} The number of characters common to the end of the first
-        *     string and the start of the second string.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffCommonOverlap = function( text1, text2 ) {
-               var text1Length, text2Length, textLength,
-                       best, length, pattern, found;
-               // Cache the text lengths to prevent multiple calls.
-               text1Length = text1.length;
-               text2Length = text2.length;
-               // Eliminate the null case.
-               if ( text1Length === 0 || text2Length === 0 ) {
-                       return 0;
-               }
-               // Truncate the longer string.
-               if ( text1Length > text2Length ) {
-                       text1 = text1.substring( text1Length - text2Length );
-               } else if ( text1Length < text2Length ) {
-                       text2 = text2.substring( 0, text1Length );
-               }
-               textLength = Math.min( text1Length, text2Length );
-               // Quick check for the worst case.
-               if ( text1 === text2 ) {
-                       return textLength;
-               }
+       // Scroll back to top to show results
+       if ( config.scrolltop && window.scrollTo ) {
+               window.scrollTo( 0, 0 );
+       }
+} );
 
-               // Start by looking for a single character match
-               // and increase length until no match is found.
-               // Performance analysis: https://neil.fraser.name/news/2010/11/04/
-               best = 0;
-               length = 1;
-               while ( true ) {
-                       pattern = text1.substring( textLength - length );
-                       found = text2.indexOf( pattern );
-                       if ( found === -1 ) {
-                               return best;
-                       }
-                       length += found;
-                       if ( found === 0 || text1.substring( textLength - length ) ===
-                                       text2.substring( 0, length ) ) {
-                               best = length;
-                               length++;
-                       }
-               }
-       };
+function getNameHtml( name, module ) {
+       var nameHtml = "";
 
-       /**
-        * Split two texts into an array of strings.  Reduce the texts to a string of
-        * hashes where each Unicode character represents one line.
-        * @param {string} text1 First string.
-        * @param {string} text2 Second string.
-        * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}
-        *     An object containing the encoded text1, the encoded text2 and
-        *     the array of unique strings.
-        *     The zeroth element of the array of unique strings is intentionally blank.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffLinesToChars = function( text1, text2 ) {
-               var lineArray, lineHash, chars1, chars2;
-               lineArray = []; // e.g. lineArray[4] === 'Hello\n'
-               lineHash = {}; // e.g. lineHash['Hello\n'] === 4
+       if ( module ) {
+               nameHtml = "<span class='module-name'>" + escapeText( module ) + "</span>: ";
+       }
 
-               // '\x00' is a valid character, but various debuggers don't like it.
-               // So we'll insert a junk entry to avoid generating a null character.
-               lineArray[ 0 ] = "";
+       nameHtml += "<span class='test-name'>" + escapeText( name ) + "</span>";
 
-               /**
-                * Split a text into an array of strings.  Reduce the texts to a string of
-                * hashes where each Unicode character represents one line.
-                * Modifies linearray and linehash through being a closure.
-                * @param {string} text String to encode.
-                * @return {string} Encoded string.
-                * @private
-                */
-               function diffLinesToCharsMunge( text ) {
-                       var chars, lineStart, lineEnd, lineArrayLength, line;
-                       chars = "";
-                       // Walk the text, pulling out a substring for each line.
-                       // text.split('\n') would would temporarily double our memory footprint.
-                       // Modifying text would create many large strings to garbage collect.
-                       lineStart = 0;
-                       lineEnd = -1;
-                       // Keeping our own length variable is faster than looking it up.
-                       lineArrayLength = lineArray.length;
-                       while ( lineEnd < text.length - 1 ) {
-                               lineEnd = text.indexOf( "\n", lineStart );
-                               if ( lineEnd === -1 ) {
-                                       lineEnd = text.length - 1;
-                               }
-                               line = text.substring( lineStart, lineEnd + 1 );
-                               lineStart = lineEnd + 1;
+       return nameHtml;
+}
 
-                               if ( lineHash.hasOwnProperty ? lineHash.hasOwnProperty( line ) :
-                                                       ( lineHash[ line ] !== undefined ) ) {
-                                       chars += String.fromCharCode( lineHash[ line ] );
-                               } else {
-                                       chars += String.fromCharCode( lineArrayLength );
-                                       lineHash[ line ] = lineArrayLength;
-                                       lineArray[ lineArrayLength++ ] = line;
-                               }
-                       }
-                       return chars;
-               }
+QUnit.testStart( function( details ) {
+       var running, testBlock, bad;
 
-               chars1 = diffLinesToCharsMunge( text1 );
-               chars2 = diffLinesToCharsMunge( text2 );
-               return {
-                       chars1: chars1,
-                       chars2: chars2,
-                       lineArray: lineArray
-               };
-       };
+       testBlock = id( "qunit-test-output-" + details.testId );
+       if ( testBlock ) {
+               testBlock.className = "running";
+       } else {
 
-       /**
-        * Rehydrate the text in a diff from a string of line hashes to real lines of
-        * text.
-        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-        * @param {!Array.<string>} lineArray Array of unique strings.
-        * @private
-        */
-       DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) {
-               var x, chars, text, y;
-               for ( x = 0; x < diffs.length; x++ ) {
-                       chars = diffs[ x ][ 1 ];
-                       text = [];
-                       for ( y = 0; y < chars.length; y++ ) {
-                               text[ y ] = lineArray[ chars.charCodeAt( y ) ];
-                       }
-                       diffs[ x ][ 1 ] = text.join( "" );
-               }
-       };
+               // Report later registered tests
+               appendTest( details.name, details.testId, details.module );
+       }
 
-       /**
-        * Reorder and merge like edit sections.  Merge equalities.
-        * Any edit section can move as long as it doesn't cross an equality.
-        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
-        */
-       DiffMatchPatch.prototype.diffCleanupMerge = function( diffs ) {
-               var pointer, countDelete, countInsert, textInsert, textDelete,
-                       commonlength, changes, diffPointer, position;
-               diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end.
-               pointer = 0;
-               countDelete = 0;
-               countInsert = 0;
-               textDelete = "";
-               textInsert = "";
-               commonlength;
-               while ( pointer < diffs.length ) {
-                       switch ( diffs[ pointer ][ 0 ] ) {
-                       case DIFF_INSERT:
-                               countInsert++;
-                               textInsert += diffs[ pointer ][ 1 ];
-                               pointer++;
-                               break;
-                       case DIFF_DELETE:
-                               countDelete++;
-                               textDelete += diffs[ pointer ][ 1 ];
-                               pointer++;
-                               break;
-                       case DIFF_EQUAL:
-                               // Upon reaching an equality, check for prior redundancies.
-                               if ( countDelete + countInsert > 1 ) {
-                                       if ( countDelete !== 0 && countInsert !== 0 ) {
-                                               // Factor out any common prefixes.
-                                               commonlength = this.diffCommonPrefix( textInsert, textDelete );
-                                               if ( commonlength !== 0 ) {
-                                                       if ( ( pointer - countDelete - countInsert ) > 0 &&
-                                                                       diffs[ pointer - countDelete - countInsert - 1 ][ 0 ] ===
-                                                                       DIFF_EQUAL ) {
-                                                               diffs[ pointer - countDelete - countInsert - 1 ][ 1 ] +=
-                                                                       textInsert.substring( 0, commonlength );
-                                                       } else {
-                                                               diffs.splice( 0, 0, [ DIFF_EQUAL,
-                                                                       textInsert.substring( 0, commonlength )
-                                                               ] );
-                                                               pointer++;
-                                                       }
-                                                       textInsert = textInsert.substring( commonlength );
-                                                       textDelete = textDelete.substring( commonlength );
-                                               }
-                                               // Factor out any common suffixies.
-                                               commonlength = this.diffCommonSuffix( textInsert, textDelete );
-                                               if ( commonlength !== 0 ) {
-                                                       diffs[ pointer ][ 1 ] = textInsert.substring( textInsert.length -
-                                                                       commonlength ) + diffs[ pointer ][ 1 ];
-                                                       textInsert = textInsert.substring( 0, textInsert.length -
-                                                               commonlength );
-                                                       textDelete = textDelete.substring( 0, textDelete.length -
-                                                               commonlength );
-                                               }
-                                       }
-                                       // Delete the offending records and add the merged ones.
-                                       if ( countDelete === 0 ) {
-                                               diffs.splice( pointer - countInsert,
-                                                       countDelete + countInsert, [ DIFF_INSERT, textInsert ] );
-                                       } else if ( countInsert === 0 ) {
-                                               diffs.splice( pointer - countDelete,
-                                                       countDelete + countInsert, [ DIFF_DELETE, textDelete ] );
-                                       } else {
-                                               diffs.splice(
-                                                       pointer - countDelete - countInsert,
-                                                       countDelete + countInsert,
-                                                       [ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ]
-                                               );
-                                       }
-                                       pointer = pointer - countDelete - countInsert +
-                                               ( countDelete ? 1 : 0 ) + ( countInsert ? 1 : 0 ) + 1;
-                               } else if ( pointer !== 0 && diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL ) {
+       running = id( "qunit-testresult" );
+       if ( running ) {
+               bad = QUnit.config.reorder && defined.sessionStorage &&
+                       +sessionStorage.getItem( "qunit-test-" + details.module + "-" + details.name );
+
+               running.innerHTML = ( bad ?
+                       "Rerunning previously failed test: <br />" :
+                       "Running: <br />" ) +
+                       getNameHtml( details.name, details.module );
+       }
 
-                                       // Merge this equality with the previous one.
-                                       diffs[ pointer - 1 ][ 1 ] += diffs[ pointer ][ 1 ];
-                                       diffs.splice( pointer, 1 );
-                               } else {
-                                       pointer++;
-                               }
-                               countInsert = 0;
-                               countDelete = 0;
-                               textDelete = "";
-                               textInsert = "";
-                               break;
-                       }
-               }
-               if ( diffs[ diffs.length - 1 ][ 1 ] === "" ) {
-                       diffs.pop(); // Remove the dummy entry at the end.
-               }
+} );
 
-               // Second pass: look for single edits surrounded on both sides by equalities
-               // which can be shifted sideways to eliminate an equality.
-               // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
-               changes = false;
-               pointer = 1;
+function stripHtml( string ) {
 
-               // Intentionally ignore the first and last element (don't need checking).
-               while ( pointer < diffs.length - 1 ) {
-                       if ( diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL &&
-                                       diffs[ pointer + 1 ][ 0 ] === DIFF_EQUAL ) {
+       // Strip tags, html entity and whitespaces
+       return string.replace( /<\/?[^>]+(>|$)/g, "" ).replace( /\&quot;/g, "" ).replace( /\s+/g, "" );
+}
 
-                               diffPointer = diffs[ pointer ][ 1 ];
-                               position = diffPointer.substring(
-                                       diffPointer.length - diffs[ pointer - 1 ][ 1 ].length
-                               );
+QUnit.log( function( details ) {
+       var assertList, assertLi,
+               message, expected, actual, diff,
+               showDiff = false,
+               testItem = id( "qunit-test-output-" + details.testId );
 
-                               // This is a single edit surrounded by equalities.
-                               if ( position === diffs[ pointer - 1 ][ 1 ] ) {
+       if ( !testItem ) {
+               return;
+       }
 
-                                       // Shift the edit over the previous equality.
-                                       diffs[ pointer ][ 1 ] = diffs[ pointer - 1 ][ 1 ] +
-                                               diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer ][ 1 ].length -
-                                                       diffs[ pointer - 1 ][ 1 ].length );
-                                       diffs[ pointer + 1 ][ 1 ] =
-                                               diffs[ pointer - 1 ][ 1 ] + diffs[ pointer + 1 ][ 1 ];
-                                       diffs.splice( pointer - 1, 1 );
-                                       changes = true;
-                               } else if ( diffPointer.substring( 0, diffs[ pointer + 1 ][ 1 ].length ) ===
-                                               diffs[ pointer + 1 ][ 1 ] ) {
+       message = escapeText( details.message ) || ( details.result ? "okay" : "failed" );
+       message = "<span class='test-message'>" + message + "</span>";
+       message += "<span class='runtime'>@ " + details.runtime + " ms</span>";
 
-                                       // Shift the edit over the next equality.
-                                       diffs[ pointer - 1 ][ 1 ] += diffs[ pointer + 1 ][ 1 ];
-                                       diffs[ pointer ][ 1 ] =
-                                               diffs[ pointer ][ 1 ].substring( diffs[ pointer + 1 ][ 1 ].length ) +
-                                               diffs[ pointer + 1 ][ 1 ];
-                                       diffs.splice( pointer + 1, 1 );
-                                       changes = true;
-                               }
-                       }
-                       pointer++;
-               }
-               // If shifts were made, the diff needs reordering and another shift sweep.
-               if ( changes ) {
-                       this.diffCleanupMerge( diffs );
+       // The pushFailure doesn't provide details.expected
+       // when it calls, it's implicit to also not show expected and diff stuff
+       // Also, we need to check details.expected existence, as it can exist and be undefined
+       if ( !details.result && hasOwn.call( details, "expected" ) ) {
+               if ( details.negative ) {
+                       expected = "NOT " + QUnit.dump.parse( details.expected );
+               } else {
+                       expected = QUnit.dump.parse( details.expected );
                }
-       };
 
-       return function( o, n ) {
-               var diff, output, text;
-               diff = new DiffMatchPatch();
-               output = diff.DiffMain( o, n );
-               diff.diffCleanupEfficiency( output );
-               text = diff.diffPrettyHtml( output );
+               actual = QUnit.dump.parse( details.actual );
+               message += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" +
+                       escapeText( expected ) +
+                       "</pre></td></tr>";
 
-               return text;
-       };
-}() );
+               if ( actual !== expected ) {
 
-// Get a reference to the global object, like window in browsers
-}( (function() {
-       return this;
-})() ));
+                       message += "<tr class='test-actual'><th>Result: </th><td><pre>" +
+                               escapeText( actual ) + "</pre></td></tr>";
 
-(function() {
+                       // Don't show diff if actual or expected are booleans
+                       if ( !( /^(true|false)$/.test( actual ) ) &&
+                                       !( /^(true|false)$/.test( expected ) ) ) {
+                               diff = QUnit.diff( expected, actual );
+                               showDiff = stripHtml( diff ).length !==
+                                       stripHtml( expected ).length +
+                                       stripHtml( actual ).length;
+                       }
 
-// Don't load the HTML Reporter on non-Browser environments
-if ( typeof window === "undefined" || !window.document ) {
-       return;
-}
+                       // Don't show diff if expected and actual are totally different
+                       if ( showDiff ) {
+                               message += "<tr class='test-diff'><th>Diff: </th><td><pre>" +
+                                       diff + "</pre></td></tr>";
+                       }
+               } else if ( expected.indexOf( "[object Array]" ) !== -1 ||
+                               expected.indexOf( "[object Object]" ) !== -1 ) {
+                       message += "<tr class='test-message'><th>Message: </th><td>" +
+                               "Diff suppressed as the depth of object is more than current max depth (" +
+                               QUnit.config.maxDepth + ").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to " +
+                               " run with a higher max depth or <a href='" +
+                               escapeText( setUrl( { maxDepth: -1 } ) ) + "'>" +
+                               "Rerun</a> without max depth.</p></td></tr>";
+               } else {
+                       message += "<tr class='test-message'><th>Message: </th><td>" +
+                               "Diff suppressed as the expected and actual results have an equivalent" +
+                               " serialization</td></tr>";
+               }
 
-// Deprecated QUnit.init - Ref #530
-// Re-initialize the configuration options
-QUnit.init = function() {
-       var tests, banner, result, qunit,
-               config = QUnit.config;
+               if ( details.source ) {
+                       message += "<tr class='test-source'><th>Source: </th><td><pre>" +
+                               escapeText( details.source ) + "</pre></td></tr>";
+               }
 
-       config.stats = { all: 0, bad: 0 };
-       config.moduleStats = { all: 0, bad: 0 };
-       config.started = 0;
-       config.updateRate = 1000;
-       config.blocking = false;
-       config.autostart = true;
-       config.autorun = false;
-       config.filter = "";
-       config.queue = [];
+               message += "</table>";
 
-       // Return on non-browser environments
-       // This is necessary to not break on node tests
-       if ( typeof window === "undefined" ) {
-               return;
+       // This occurs when pushFailure is set and we have an extracted stack trace
+       } else if ( !details.result && details.source ) {
+               message += "<table>" +
+                       "<tr class='test-source'><th>Source: </th><td><pre>" +
+                       escapeText( details.source ) + "</pre></td></tr>" +
+                       "</table>";
        }
 
-       qunit = id( "qunit" );
-       if ( qunit ) {
-               qunit.innerHTML =
-                       "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
-                       "<h2 id='qunit-banner'></h2>" +
-                       "<div id='qunit-testrunner-toolbar'></div>" +
-                       "<h2 id='qunit-userAgent'></h2>" +
-                       "<ol id='qunit-tests'></ol>";
-       }
+       assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
 
-       tests = id( "qunit-tests" );
-       banner = id( "qunit-banner" );
-       result = id( "qunit-testresult" );
+       assertLi = document.createElement( "li" );
+       assertLi.className = details.result ? "pass" : "fail";
+       assertLi.innerHTML = message;
+       assertList.appendChild( assertLi );
+} );
 
-       if ( tests ) {
-               tests.innerHTML = "";
-       }
+QUnit.testDone( function( details ) {
+       var testTitle, time, testItem, assertList,
+               good, bad, testCounts, skipped, sourceName,
+               tests = id( "qunit-tests" );
 
-       if ( banner ) {
-               banner.className = "";
+       if ( !tests ) {
+               return;
        }
 
-       if ( result ) {
-               result.parentNode.removeChild( result );
-       }
+       testItem = id( "qunit-test-output-" + details.testId );
 
-       if ( tests ) {
-               result = document.createElement( "p" );
-               result.id = "qunit-testresult";
-               result.className = "result";
-               tests.parentNode.insertBefore( result, tests );
-               result.innerHTML = "Running...<br />&#160;";
+       assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
+
+       good = details.passed;
+       bad = details.failed;
+
+       // Store result when possible
+       if ( config.reorder && defined.sessionStorage ) {
+               if ( bad ) {
+                       sessionStorage.setItem( "qunit-test-" + details.module + "-" + details.name, bad );
+               } else {
+                       sessionStorage.removeItem( "qunit-test-" + details.module + "-" + details.name );
+               }
        }
-};
 
-var config = QUnit.config,
-       collapseNext = false,
-       hasOwn = Object.prototype.hasOwnProperty,
-       defined = {
-               document: window.document !== undefined,
-               sessionStorage: (function() {
-                       var x = "qunit-test-string";
-                       try {
-                               sessionStorage.setItem( x, x );
-                               sessionStorage.removeItem( x );
-                               return true;
-                       } catch ( e ) {
-                               return false;
-                       }
-               }())
-       },
-       modulesList = [];
+       if ( bad === 0 ) {
 
-/**
-* Escape text for attribute or text content.
-*/
-function escapeText( s ) {
-       if ( !s ) {
-               return "";
+               // Collapse the passing tests
+               addClass( assertList, "qunit-collapsed" );
+       } else if ( bad && config.collapse && !collapseNext ) {
+
+               // Skip collapsing the first failing test
+               collapseNext = true;
+       } else {
+
+               // Collapse remaining tests
+               addClass( assertList, "qunit-collapsed" );
        }
-       s = s + "";
 
-       // Both single quotes and double quotes (for attributes)
-       return s.replace( /['"<>&]/g, function( s ) {
-               switch ( s ) {
-               case "'":
-                       return "&#039;";
-               case "\"":
-                       return "&quot;";
-               case "<":
-                       return "&lt;";
-               case ">":
-                       return "&gt;";
-               case "&":
-                       return "&amp;";
-               }
-       });
-}
+       // The testItem.firstChild is the test name
+       testTitle = testItem.firstChild;
 
-/**
- * @param {HTMLElement} elem
- * @param {string} type
- * @param {Function} fn
- */
-function addEvent( elem, type, fn ) {
-       if ( elem.addEventListener ) {
+       testCounts = bad ?
+               "<b class='failed'>" + bad + "</b>, " + "<b class='passed'>" + good + "</b>, " :
+               "";
 
-               // Standards-based browsers
-               elem.addEventListener( type, fn, false );
-       } else if ( elem.attachEvent ) {
+       testTitle.innerHTML += " <b class='counts'>(" + testCounts +
+               details.assertions.length + ")</b>";
+
+       if ( details.skipped ) {
+               testItem.className = "skipped";
+               skipped = document.createElement( "em" );
+               skipped.className = "qunit-skipped-label";
+               skipped.innerHTML = "skipped";
+               testItem.insertBefore( skipped, testTitle );
+       } else {
+               addEvent( testTitle, "click", function() {
+                       toggleClass( assertList, "qunit-collapsed" );
+               } );
 
-               // support: IE <9
-               elem.attachEvent( "on" + type, function() {
-                       var event = window.event;
-                       if ( !event.target ) {
-                               event.target = event.srcElement || document;
-                       }
+               testItem.className = bad ? "fail" : "pass";
 
-                       fn.call( elem, event );
-               });
+               time = document.createElement( "span" );
+               time.className = "runtime";
+               time.innerHTML = details.runtime + " ms";
+               testItem.insertBefore( time, assertList );
        }
-}
 
-/**
- * @param {Array|NodeList} elems
- * @param {string} type
- * @param {Function} fn
- */
-function addEvents( elems, type, fn ) {
-       var i = elems.length;
-       while ( i-- ) {
-               addEvent( elems[ i ], type, fn );
+       // Show the source of the test when showing assertions
+       if ( details.source ) {
+               sourceName = document.createElement( "p" );
+               sourceName.innerHTML = "<strong>Source: </strong>" + details.source;
+               addClass( sourceName, "qunit-source" );
+               if ( bad === 0 ) {
+                       addClass( sourceName, "qunit-collapsed" );
+               }
+               addEvent( testTitle, "click", function() {
+                       toggleClass( sourceName, "qunit-collapsed" );
+               } );
+               testItem.appendChild( sourceName );
        }
-}
+} );
 
-function hasClass( elem, name ) {
-       return ( " " + elem.className + " " ).indexOf( " " + name + " " ) >= 0;
-}
+// Avoid readyState issue with phantomjs
+// Ref: #818
+var notPhantom = ( function( p ) {
+       return !( p && p.version && p.version.major > 0 );
+} )( window.phantom );
 
-function addClass( elem, name ) {
-       if ( !hasClass( elem, name ) ) {
-               elem.className += ( elem.className ? " " : "" ) + name;
-       }
+if ( notPhantom && document.readyState === "complete" ) {
+       QUnit.load();
+} else {
+       addEvent( window, "load", QUnit.load );
 }
 
-function toggleClass( elem, name ) {
-       if ( hasClass( elem, name ) ) {
-               removeClass( elem, name );
-       } else {
-               addClass( elem, name );
+/*
+ * This file is a modified version of google-diff-match-patch's JavaScript implementation
+ * (https://code.google.com/p/google-diff-match-patch/source/browse/trunk/javascript/diff_match_patch_uncompressed.js),
+ * modifications are licensed as more fully set forth in LICENSE.txt.
+ *
+ * The original source of google-diff-match-patch is attributable and licensed as follows:
+ *
+ * Copyright 2006 Google Inc.
+ * https://code.google.com/p/google-diff-match-patch/
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ * More Info:
+ *  https://code.google.com/p/google-diff-match-patch/
+ *
+ * Usage: QUnit.diff(expected, actual)
+ *
+ */
+QUnit.diff = ( function() {
+       function DiffMatchPatch() {
        }
-}
 
-function removeClass( elem, name ) {
-       var set = " " + elem.className + " ";
-
-       // Class name may appear multiple times
-       while ( set.indexOf( " " + name + " " ) >= 0 ) {
-               set = set.replace( " " + name + " ", " " );
-       }
+       //  DIFF FUNCTIONS
 
-       // trim for prettiness
-       elem.className = typeof set.trim === "function" ? set.trim() : set.replace( /^\s+|\s+$/g, "" );
-}
+       /**
+        * The data structure representing a diff is an array of tuples:
+        * [[DIFF_DELETE, 'Hello'], [DIFF_INSERT, 'Goodbye'], [DIFF_EQUAL, ' world.']]
+        * which means: delete 'Hello', add 'Goodbye' and keep ' world.'
+        */
+       var DIFF_DELETE = -1,
+               DIFF_INSERT = 1,
+               DIFF_EQUAL = 0;
 
-function id( name ) {
-       return defined.document && document.getElementById && document.getElementById( name );
-}
+       /**
+        * Find the differences between two texts.  Simplifies the problem by stripping
+        * any common prefix or suffix off the texts before diffing.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {boolean=} optChecklines Optional speedup flag. If present and false,
+        *     then don't run a line-level diff first to identify the changed areas.
+        *     Defaults to true, which does a faster, slightly less optimal diff.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        */
+       DiffMatchPatch.prototype.DiffMain = function( text1, text2, optChecklines ) {
+               var deadline, checklines, commonlength,
+                       commonprefix, commonsuffix, diffs;
 
-function getUrlConfigHtml() {
-       var i, j, val,
-               escaped, escapedTooltip,
-               selection = false,
-               len = config.urlConfig.length,
-               urlConfigHtml = "";
+               // The diff must be complete in up to 1 second.
+               deadline = ( new Date() ).getTime() + 1000;
 
-       for ( i = 0; i < len; i++ ) {
-               val = config.urlConfig[ i ];
-               if ( typeof val === "string" ) {
-                       val = {
-                               id: val,
-                               label: val
-                       };
+               // Check for null inputs.
+               if ( text1 === null || text2 === null ) {
+                       throw new Error( "Null input. (DiffMain)" );
                }
 
-               escaped = escapeText( val.id );
-               escapedTooltip = escapeText( val.tooltip );
-
-               if ( config[ val.id ] === undefined ) {
-                       config[ val.id ] = QUnit.urlParams[ val.id ];
+               // Check for equality (speedup).
+               if ( text1 === text2 ) {
+                       if ( text1 ) {
+                               return [
+                                       [ DIFF_EQUAL, text1 ]
+                               ];
+                       }
+                       return [];
                }
 
-               if ( !val.value || typeof val.value === "string" ) {
-                       urlConfigHtml += "<input id='qunit-urlconfig-" + escaped +
-                               "' name='" + escaped + "' type='checkbox'" +
-                               ( val.value ? " value='" + escapeText( val.value ) + "'" : "" ) +
-                               ( config[ val.id ] ? " checked='checked'" : "" ) +
-                               " title='" + escapedTooltip + "' /><label for='qunit-urlconfig-" + escaped +
-                               "' title='" + escapedTooltip + "'>" + val.label + "</label>";
-               } else {
-                       urlConfigHtml += "<label for='qunit-urlconfig-" + escaped +
-                               "' title='" + escapedTooltip + "'>" + val.label +
-                               ": </label><select id='qunit-urlconfig-" + escaped +
-                               "' name='" + escaped + "' title='" + escapedTooltip + "'><option></option>";
-
-                       if ( QUnit.is( "array", val.value ) ) {
-                               for ( j = 0; j < val.value.length; j++ ) {
-                                       escaped = escapeText( val.value[ j ] );
-                                       urlConfigHtml += "<option value='" + escaped + "'" +
-                                               ( config[ val.id ] === val.value[ j ] ?
-                                                       ( selection = true ) && " selected='selected'" : "" ) +
-                                               ">" + escaped + "</option>";
-                               }
-                       } else {
-                               for ( j in val.value ) {
-                                       if ( hasOwn.call( val.value, j ) ) {
-                                               urlConfigHtml += "<option value='" + escapeText( j ) + "'" +
-                                                       ( config[ val.id ] === j ?
-                                                               ( selection = true ) && " selected='selected'" : "" ) +
-                                                       ">" + escapeText( val.value[ j ] ) + "</option>";
-                                       }
-                               }
-                       }
-                       if ( config[ val.id ] && !selection ) {
-                               escaped = escapeText( config[ val.id ] );
-                               urlConfigHtml += "<option value='" + escaped +
-                                       "' selected='selected' disabled='disabled'>" + escaped + "</option>";
-                       }
-                       urlConfigHtml += "</select>";
+               if ( typeof optChecklines === "undefined" ) {
+                       optChecklines = true;
                }
-       }
 
-       return urlConfigHtml;
-}
+               checklines = optChecklines;
 
-// Handle "click" events on toolbar checkboxes and "change" for select menus.
-// Updates the URL with the new state of `config.urlConfig` values.
-function toolbarChanged() {
-       var updatedUrl, value,
-               field = this,
-               params = {};
+               // Trim off common prefix (speedup).
+               commonlength = this.diffCommonPrefix( text1, text2 );
+               commonprefix = text1.substring( 0, commonlength );
+               text1 = text1.substring( commonlength );
+               text2 = text2.substring( commonlength );
 
-       // Detect if field is a select menu or a checkbox
-       if ( "selectedIndex" in field ) {
-               value = field.options[ field.selectedIndex ].value || undefined;
-       } else {
-               value = field.checked ? ( field.defaultValue || true ) : undefined;
-       }
+               // Trim off common suffix (speedup).
+               commonlength = this.diffCommonSuffix( text1, text2 );
+               commonsuffix = text1.substring( text1.length - commonlength );
+               text1 = text1.substring( 0, text1.length - commonlength );
+               text2 = text2.substring( 0, text2.length - commonlength );
 
-       params[ field.name ] = value;
-       updatedUrl = setUrl( params );
+               // Compute the diff on the middle block.
+               diffs = this.diffCompute( text1, text2, checklines, deadline );
 
-       if ( "hidepassed" === field.name && "replaceState" in window.history ) {
-               config[ field.name ] = value || false;
-               if ( value ) {
-                       addClass( id( "qunit-tests" ), "hidepass" );
-               } else {
-                       removeClass( id( "qunit-tests" ), "hidepass" );
+               // Restore the prefix and suffix.
+               if ( commonprefix ) {
+                       diffs.unshift( [ DIFF_EQUAL, commonprefix ] );
                }
+               if ( commonsuffix ) {
+                       diffs.push( [ DIFF_EQUAL, commonsuffix ] );
+               }
+               this.diffCleanupMerge( diffs );
+               return diffs;
+       };
 
-               // It is not necessary to refresh the whole page
-               window.history.replaceState( null, "", updatedUrl );
-       } else {
-               window.location = updatedUrl;
-       }
-}
-
-function setUrl( params ) {
-       var key,
-               querystring = "?";
+       /**
+        * Reduce the number of edits by eliminating operationally trivial equalities.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        */
+       DiffMatchPatch.prototype.diffCleanupEfficiency = function( diffs ) {
+               var changes, equalities, equalitiesLength, lastequality,
+                       pointer, preIns, preDel, postIns, postDel;
+               changes = false;
+               equalities = []; // Stack of indices where equalities are found.
+               equalitiesLength = 0; // Keeping our own length var is faster in JS.
+               /** @type {?string} */
+               lastequality = null;
 
-       params = QUnit.extend( QUnit.extend( {}, QUnit.urlParams ), params );
+               // Always equal to diffs[equalities[equalitiesLength - 1]][1]
+               pointer = 0; // Index of current position.
 
-       for ( key in params ) {
-               if ( hasOwn.call( params, key ) ) {
-                       if ( params[ key ] === undefined ) {
-                               continue;
-                       }
-                       querystring += encodeURIComponent( key );
-                       if ( params[ key ] !== true ) {
-                               querystring += "=" + encodeURIComponent( params[ key ] );
-                       }
-                       querystring += "&";
-               }
-       }
-       return location.protocol + "//" + location.host +
-               location.pathname + querystring.slice( 0, -1 );
-}
+               // Is there an insertion operation before the last equality.
+               preIns = false;
 
-function applyUrlParams() {
-       var selectedModule,
-               modulesList = id( "qunit-modulefilter" ),
-               filter = id( "qunit-filter-input" ).value;
+               // Is there a deletion operation before the last equality.
+               preDel = false;
 
-       selectedModule = modulesList ?
-               decodeURIComponent( modulesList.options[ modulesList.selectedIndex ].value ) :
-               undefined;
+               // Is there an insertion operation after the last equality.
+               postIns = false;
 
-       window.location = setUrl({
-               module: ( selectedModule === "" ) ? undefined : selectedModule,
-               filter: ( filter === "" ) ? undefined : filter,
+               // Is there a deletion operation after the last equality.
+               postDel = false;
+               while ( pointer < diffs.length ) {
 
-               // Remove testId filter
-               testId: undefined
-       });
-}
+                       // Equality found.
+                       if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) {
+                               if ( diffs[ pointer ][ 1 ].length < 4 && ( postIns || postDel ) ) {
 
-function toolbarUrlConfigContainer() {
-       var urlConfigContainer = document.createElement( "span" );
+                                       // Candidate found.
+                                       equalities[ equalitiesLength++ ] = pointer;
+                                       preIns = postIns;
+                                       preDel = postDel;
+                                       lastequality = diffs[ pointer ][ 1 ];
+                               } else {
 
-       urlConfigContainer.innerHTML = getUrlConfigHtml();
-       addClass( urlConfigContainer, "qunit-url-config" );
+                                       // Not a candidate, and can never become one.
+                                       equalitiesLength = 0;
+                                       lastequality = null;
+                               }
+                               postIns = postDel = false;
 
-       // For oldIE support:
-       // * Add handlers to the individual elements instead of the container
-       // * Use "click" instead of "change" for checkboxes
-       addEvents( urlConfigContainer.getElementsByTagName( "input" ), "click", toolbarChanged );
-       addEvents( urlConfigContainer.getElementsByTagName( "select" ), "change", toolbarChanged );
+                       // An insertion or deletion.
+                       } else {
 
-       return urlConfigContainer;
-}
+                               if ( diffs[ pointer ][ 0 ] === DIFF_DELETE ) {
+                                       postDel = true;
+                               } else {
+                                       postIns = true;
+                               }
 
-function toolbarLooseFilter() {
-       var filter = document.createElement( "form" ),
-               label = document.createElement( "label" ),
-               input = document.createElement( "input" ),
-               button = document.createElement( "button" );
+                               /*
+                                * Five types to be split:
+                                * <ins>A</ins><del>B</del>XY<ins>C</ins><del>D</del>
+                                * <ins>A</ins>X<ins>C</ins><del>D</del>
+                                * <ins>A</ins><del>B</del>X<ins>C</ins>
+                                * <ins>A</del>X<ins>C</ins><del>D</del>
+                                * <ins>A</ins><del>B</del>X<del>C</del>
+                                */
+                               if ( lastequality && ( ( preIns && preDel && postIns && postDel ) ||
+                                               ( ( lastequality.length < 2 ) &&
+                                               ( preIns + preDel + postIns + postDel ) === 3 ) ) ) {
 
-       addClass( filter, "qunit-filter" );
+                                       // Duplicate record.
+                                       diffs.splice(
+                                               equalities[ equalitiesLength - 1 ],
+                                               0,
+                                               [ DIFF_DELETE, lastequality ]
+                                       );
 
-       label.innerHTML = "Filter: ";
+                                       // Change second copy to insert.
+                                       diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
+                                       equalitiesLength--; // Throw away the equality we just deleted;
+                                       lastequality = null;
+                                       if ( preIns && preDel ) {
 
-       input.type = "text";
-       input.value = config.filter || "";
-       input.name = "filter";
-       input.id = "qunit-filter-input";
+                                               // No changes made which could affect previous entry, keep going.
+                                               postIns = postDel = true;
+                                               equalitiesLength = 0;
+                                       } else {
+                                               equalitiesLength--; // Throw away the previous equality.
+                                               pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
+                                               postIns = postDel = false;
+                                       }
+                                       changes = true;
+                               }
+                       }
+                       pointer++;
+               }
 
-       button.innerHTML = "Go";
+               if ( changes ) {
+                       this.diffCleanupMerge( diffs );
+               }
+       };
 
-       label.appendChild( input );
+       /**
+        * Convert a diff array into a pretty HTML report.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        * @param {integer} string to be beautified.
+        * @return {string} HTML representation.
+        */
+       DiffMatchPatch.prototype.diffPrettyHtml = function( diffs ) {
+               var op, data, x,
+                       html = [];
+               for ( x = 0; x < diffs.length; x++ ) {
+                       op = diffs[ x ][ 0 ]; // Operation (insert, delete, equal)
+                       data = diffs[ x ][ 1 ]; // Text of change.
+                       switch ( op ) {
+                       case DIFF_INSERT:
+                               html[ x ] = "<ins>" + escapeText( data ) + "</ins>";
+                               break;
+                       case DIFF_DELETE:
+                               html[ x ] = "<del>" + escapeText( data ) + "</del>";
+                               break;
+                       case DIFF_EQUAL:
+                               html[ x ] = "<span>" + escapeText( data ) + "</span>";
+                               break;
+                       }
+               }
+               return html.join( "" );
+       };
 
-       filter.appendChild( label );
-       filter.appendChild( button );
-       addEvent( filter, "submit", function( ev ) {
-               applyUrlParams();
+       /**
+        * Determine the common prefix of two strings.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {number} The number of characters common to the start of each
+        *     string.
+        */
+       DiffMatchPatch.prototype.diffCommonPrefix = function( text1, text2 ) {
+               var pointermid, pointermax, pointermin, pointerstart;
 
-               if ( ev && ev.preventDefault ) {
-                       ev.preventDefault();
+               // Quick check for common null cases.
+               if ( !text1 || !text2 || text1.charAt( 0 ) !== text2.charAt( 0 ) ) {
+                       return 0;
                }
 
-               return false;
-       });
+               // Binary search.
+               // Performance analysis: https://neil.fraser.name/news/2007/10/09/
+               pointermin = 0;
+               pointermax = Math.min( text1.length, text2.length );
+               pointermid = pointermax;
+               pointerstart = 0;
+               while ( pointermin < pointermid ) {
+                       if ( text1.substring( pointerstart, pointermid ) ===
+                                       text2.substring( pointerstart, pointermid ) ) {
+                               pointermin = pointermid;
+                               pointerstart = pointermin;
+                       } else {
+                               pointermax = pointermid;
+                       }
+                       pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
+               }
+               return pointermid;
+       };
 
-       return filter;
-}
+       /**
+        * Determine the common suffix of two strings.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {number} The number of characters common to the end of each string.
+        */
+       DiffMatchPatch.prototype.diffCommonSuffix = function( text1, text2 ) {
+               var pointermid, pointermax, pointermin, pointerend;
 
-function toolbarModuleFilterHtml() {
-       var i,
-               moduleFilterHtml = "";
+               // Quick check for common null cases.
+               if ( !text1 ||
+                               !text2 ||
+                               text1.charAt( text1.length - 1 ) !== text2.charAt( text2.length - 1 ) ) {
+                       return 0;
+               }
 
-       if ( !modulesList.length ) {
-               return false;
-       }
+               // Binary search.
+               // Performance analysis: https://neil.fraser.name/news/2007/10/09/
+               pointermin = 0;
+               pointermax = Math.min( text1.length, text2.length );
+               pointermid = pointermax;
+               pointerend = 0;
+               while ( pointermin < pointermid ) {
+                       if ( text1.substring( text1.length - pointermid, text1.length - pointerend ) ===
+                                       text2.substring( text2.length - pointermid, text2.length - pointerend ) ) {
+                               pointermin = pointermid;
+                               pointerend = pointermin;
+                       } else {
+                               pointermax = pointermid;
+                       }
+                       pointermid = Math.floor( ( pointermax - pointermin ) / 2 + pointermin );
+               }
+               return pointermid;
+       };
 
-       modulesList.sort(function( a, b ) {
-               return a.localeCompare( b );
-       });
+       /**
+        * Find the differences between two texts.  Assumes that the texts do not
+        * have any common prefix or suffix.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {boolean} checklines Speedup flag.  If false, then don't run a
+        *     line-level diff first to identify the changed areas.
+        *     If true, then run a faster, slightly less optimal diff.
+        * @param {number} deadline Time when the diff should be complete by.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffCompute = function( text1, text2, checklines, deadline ) {
+               var diffs, longtext, shorttext, i, hm,
+                       text1A, text2A, text1B, text2B,
+                       midCommon, diffsA, diffsB;
 
-       moduleFilterHtml += "<label for='qunit-modulefilter'>Module: </label>" +
-               "<select id='qunit-modulefilter' name='modulefilter'><option value='' " +
-               ( QUnit.urlParams.module === undefined ? "selected='selected'" : "" ) +
-               ">< All Modules ></option>";
+               if ( !text1 ) {
 
-       for ( i = 0; i < modulesList.length; i++ ) {
-               moduleFilterHtml += "<option value='" +
-                       escapeText( encodeURIComponent( modulesList[ i ] ) ) + "' " +
-                       ( QUnit.urlParams.module === modulesList[ i ] ? "selected='selected'" : "" ) +
-                       ">" + escapeText( modulesList[ i ] ) + "</option>";
-       }
-       moduleFilterHtml += "</select>";
+                       // Just add some text (speedup).
+                       return [
+                               [ DIFF_INSERT, text2 ]
+                       ];
+               }
 
-       return moduleFilterHtml;
-}
+               if ( !text2 ) {
 
-function toolbarModuleFilter() {
-       var toolbar = id( "qunit-testrunner-toolbar" ),
-               moduleFilter = document.createElement( "span" ),
-               moduleFilterHtml = toolbarModuleFilterHtml();
+                       // Just delete some text (speedup).
+                       return [
+                               [ DIFF_DELETE, text1 ]
+                       ];
+               }
+
+               longtext = text1.length > text2.length ? text1 : text2;
+               shorttext = text1.length > text2.length ? text2 : text1;
+               i = longtext.indexOf( shorttext );
+               if ( i !== -1 ) {
+
+                       // Shorter text is inside the longer text (speedup).
+                       diffs = [
+                               [ DIFF_INSERT, longtext.substring( 0, i ) ],
+                               [ DIFF_EQUAL, shorttext ],
+                               [ DIFF_INSERT, longtext.substring( i + shorttext.length ) ]
+                       ];
 
-       if ( !toolbar || !moduleFilterHtml ) {
-               return false;
-       }
+                       // Swap insertions for deletions if diff is reversed.
+                       if ( text1.length > text2.length ) {
+                               diffs[ 0 ][ 0 ] = diffs[ 2 ][ 0 ] = DIFF_DELETE;
+                       }
+                       return diffs;
+               }
 
-       moduleFilter.setAttribute( "id", "qunit-modulefilter-container" );
-       moduleFilter.innerHTML = moduleFilterHtml;
+               if ( shorttext.length === 1 ) {
 
-       addEvent( moduleFilter.lastChild, "change", applyUrlParams );
+                       // Single character string.
+                       // After the previous speedup, the character can't be an equality.
+                       return [
+                               [ DIFF_DELETE, text1 ],
+                               [ DIFF_INSERT, text2 ]
+                       ];
+               }
 
-       toolbar.appendChild( moduleFilter );
-}
+               // Check to see if the problem can be split in two.
+               hm = this.diffHalfMatch( text1, text2 );
+               if ( hm ) {
 
-function appendToolbar() {
-       var toolbar = id( "qunit-testrunner-toolbar" );
+                       // A half-match was found, sort out the return data.
+                       text1A = hm[ 0 ];
+                       text1B = hm[ 1 ];
+                       text2A = hm[ 2 ];
+                       text2B = hm[ 3 ];
+                       midCommon = hm[ 4 ];
 
-       if ( toolbar ) {
-               toolbar.appendChild( toolbarUrlConfigContainer() );
-               toolbar.appendChild( toolbarLooseFilter() );
-       }
-}
+                       // Send both pairs off for separate processing.
+                       diffsA = this.DiffMain( text1A, text2A, checklines, deadline );
+                       diffsB = this.DiffMain( text1B, text2B, checklines, deadline );
 
-function appendHeader() {
-       var header = id( "qunit-header" );
+                       // Merge the results.
+                       return diffsA.concat( [
+                               [ DIFF_EQUAL, midCommon ]
+                       ], diffsB );
+               }
 
-       if ( header ) {
-               header.innerHTML = "<a href='" +
-                       escapeText( setUrl( { filter: undefined, module: undefined, testId: undefined } ) ) +
-                       "'>" + header.innerHTML + "</a> ";
-       }
-}
+               if ( checklines && text1.length > 100 && text2.length > 100 ) {
+                       return this.diffLineMode( text1, text2, deadline );
+               }
 
-function appendBanner() {
-       var banner = id( "qunit-banner" );
+               return this.diffBisect( text1, text2, deadline );
+       };
 
-       if ( banner ) {
-               banner.className = "";
-       }
-}
+       /**
+        * Do the two texts share a substring which is at least half the length of the
+        * longer text?
+        * This speedup can produce non-minimal diffs.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {Array.<string>} Five element Array, containing the prefix of
+        *     text1, the suffix of text1, the prefix of text2, the suffix of
+        *     text2 and the common middle.  Or null if there was no match.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffHalfMatch = function( text1, text2 ) {
+               var longtext, shorttext, dmp,
+                       text1A, text2B, text2A, text1B, midCommon,
+                       hm1, hm2, hm;
 
-function appendTestResults() {
-       var tests = id( "qunit-tests" ),
-               result = id( "qunit-testresult" );
+               longtext = text1.length > text2.length ? text1 : text2;
+               shorttext = text1.length > text2.length ? text2 : text1;
+               if ( longtext.length < 4 || shorttext.length * 2 < longtext.length ) {
+                       return null; // Pointless.
+               }
+               dmp = this; // 'this' becomes 'window' in a closure.
 
-       if ( result ) {
-               result.parentNode.removeChild( result );
-       }
+               /**
+                * Does a substring of shorttext exist within longtext such that the substring
+                * is at least half the length of longtext?
+                * Closure, but does not reference any external variables.
+                * @param {string} longtext Longer string.
+                * @param {string} shorttext Shorter string.
+                * @param {number} i Start index of quarter length substring within longtext.
+                * @return {Array.<string>} Five element Array, containing the prefix of
+                *     longtext, the suffix of longtext, the prefix of shorttext, the suffix
+                *     of shorttext and the common middle.  Or null if there was no match.
+                * @private
+                */
+               function diffHalfMatchI( longtext, shorttext, i ) {
+                       var seed, j, bestCommon, prefixLength, suffixLength,
+                               bestLongtextA, bestLongtextB, bestShorttextA, bestShorttextB;
 
-       if ( tests ) {
-               tests.innerHTML = "";
-               result = document.createElement( "p" );
-               result.id = "qunit-testresult";
-               result.className = "result";
-               tests.parentNode.insertBefore( result, tests );
-               result.innerHTML = "Running...<br />&#160;";
-       }
-}
+                       // Start with a 1/4 length substring at position i as a seed.
+                       seed = longtext.substring( i, i + Math.floor( longtext.length / 4 ) );
+                       j = -1;
+                       bestCommon = "";
+                       while ( ( j = shorttext.indexOf( seed, j + 1 ) ) !== -1 ) {
+                               prefixLength = dmp.diffCommonPrefix( longtext.substring( i ),
+                                       shorttext.substring( j ) );
+                               suffixLength = dmp.diffCommonSuffix( longtext.substring( 0, i ),
+                                       shorttext.substring( 0, j ) );
+                               if ( bestCommon.length < suffixLength + prefixLength ) {
+                                       bestCommon = shorttext.substring( j - suffixLength, j ) +
+                                               shorttext.substring( j, j + prefixLength );
+                                       bestLongtextA = longtext.substring( 0, i - suffixLength );
+                                       bestLongtextB = longtext.substring( i + prefixLength );
+                                       bestShorttextA = shorttext.substring( 0, j - suffixLength );
+                                       bestShorttextB = shorttext.substring( j + prefixLength );
+                               }
+                       }
+                       if ( bestCommon.length * 2 >= longtext.length ) {
+                               return [ bestLongtextA, bestLongtextB,
+                                       bestShorttextA, bestShorttextB, bestCommon
+                               ];
+                       } else {
+                               return null;
+                       }
+               }
 
-function storeFixture() {
-       var fixture = id( "qunit-fixture" );
-       if ( fixture ) {
-               config.fixture = fixture.innerHTML;
-       }
-}
+               // First check if the second quarter is the seed for a half-match.
+               hm1 = diffHalfMatchI( longtext, shorttext,
+                       Math.ceil( longtext.length / 4 ) );
 
-function appendFilteredTest() {
-       var testId = QUnit.config.testId;
-       if ( !testId || testId.length <= 0 ) {
-               return "";
-       }
-       return "<div id='qunit-filteredTest'>Rerunning selected tests: " +
-               escapeText( testId.join(", ") ) +
-               " <a id='qunit-clearFilter' href='" +
-               escapeText( setUrl( { filter: undefined, module: undefined, testId: undefined } ) ) +
-               "'>" + "Run all tests" + "</a></div>";
-}
+               // Check again based on the third quarter.
+               hm2 = diffHalfMatchI( longtext, shorttext,
+                       Math.ceil( longtext.length / 2 ) );
+               if ( !hm1 && !hm2 ) {
+                       return null;
+               } else if ( !hm2 ) {
+                       hm = hm1;
+               } else if ( !hm1 ) {
+                       hm = hm2;
+               } else {
 
-function appendUserAgent() {
-       var userAgent = id( "qunit-userAgent" );
+                       // Both matched.  Select the longest.
+                       hm = hm1[ 4 ].length > hm2[ 4 ].length ? hm1 : hm2;
+               }
 
-       if ( userAgent ) {
-               userAgent.innerHTML = "";
-               userAgent.appendChild(
-                       document.createTextNode(
-                               "QUnit " + QUnit.version + "; " + navigator.userAgent
-                       )
-               );
-       }
-}
+               // A half-match was found, sort out the return data.
+               text1A, text1B, text2A, text2B;
+               if ( text1.length > text2.length ) {
+                       text1A = hm[ 0 ];
+                       text1B = hm[ 1 ];
+                       text2A = hm[ 2 ];
+                       text2B = hm[ 3 ];
+               } else {
+                       text2A = hm[ 0 ];
+                       text2B = hm[ 1 ];
+                       text1A = hm[ 2 ];
+                       text1B = hm[ 3 ];
+               }
+               midCommon = hm[ 4 ];
+               return [ text1A, text1B, text2A, text2B, midCommon ];
+       };
 
-function appendTestsList( modules ) {
-       var i, l, x, z, test, moduleObj;
+       /**
+        * Do a quick line-level diff on both strings, then rediff the parts for
+        * greater accuracy.
+        * This speedup can produce non-minimal diffs.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {number} deadline Time when the diff should be complete by.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffLineMode = function( text1, text2, deadline ) {
+               var a, diffs, linearray, pointer, countInsert,
+                       countDelete, textInsert, textDelete, j;
 
-       for ( i = 0, l = modules.length; i < l; i++ ) {
-               moduleObj = modules[ i ];
+               // Scan the text on a line-by-line basis first.
+               a = this.diffLinesToChars( text1, text2 );
+               text1 = a.chars1;
+               text2 = a.chars2;
+               linearray = a.lineArray;
 
-               if ( moduleObj.name ) {
-                       modulesList.push( moduleObj.name );
-               }
+               diffs = this.DiffMain( text1, text2, false, deadline );
 
-               for ( x = 0, z = moduleObj.tests.length; x < z; x++ ) {
-                       test = moduleObj.tests[ x ];
+               // Convert the diff back to original text.
+               this.diffCharsToLines( diffs, linearray );
 
-                       appendTest( test.name, test.testId, moduleObj.name );
-               }
-       }
-}
+               // Eliminate freak matches (e.g. blank lines)
+               this.diffCleanupSemantic( diffs );
 
-function appendTest( name, testId, moduleName ) {
-       var title, rerunTrigger, testBlock, assertList,
-               tests = id( "qunit-tests" );
+               // Rediff any replacement blocks, this time character-by-character.
+               // Add a dummy entry at the end.
+               diffs.push( [ DIFF_EQUAL, "" ] );
+               pointer = 0;
+               countDelete = 0;
+               countInsert = 0;
+               textDelete = "";
+               textInsert = "";
+               while ( pointer < diffs.length ) {
+                       switch ( diffs[ pointer ][ 0 ] ) {
+                       case DIFF_INSERT:
+                               countInsert++;
+                               textInsert += diffs[ pointer ][ 1 ];
+                               break;
+                       case DIFF_DELETE:
+                               countDelete++;
+                               textDelete += diffs[ pointer ][ 1 ];
+                               break;
+                       case DIFF_EQUAL:
+
+                               // Upon reaching an equality, check for prior redundancies.
+                               if ( countDelete >= 1 && countInsert >= 1 ) {
 
-       if ( !tests ) {
-               return;
-       }
+                                       // Delete the offending records and add the merged ones.
+                                       diffs.splice( pointer - countDelete - countInsert,
+                                               countDelete + countInsert );
+                                       pointer = pointer - countDelete - countInsert;
+                                       a = this.DiffMain( textDelete, textInsert, false, deadline );
+                                       for ( j = a.length - 1; j >= 0; j-- ) {
+                                               diffs.splice( pointer, 0, a[ j ] );
+                                       }
+                                       pointer = pointer + a.length;
+                               }
+                               countInsert = 0;
+                               countDelete = 0;
+                               textDelete = "";
+                               textInsert = "";
+                               break;
+                       }
+                       pointer++;
+               }
+               diffs.pop(); // Remove the dummy entry at the end.
 
-       title = document.createElement( "strong" );
-       title.innerHTML = getNameHtml( name, moduleName );
+               return diffs;
+       };
 
-       rerunTrigger = document.createElement( "a" );
-       rerunTrigger.innerHTML = "Rerun";
-       rerunTrigger.href = setUrl({ testId: testId });
+       /**
+        * Find the 'middle snake' of a diff, split the problem in two
+        * and return the recursively constructed diff.
+        * See Myers 1986 paper: An O(ND) Difference Algorithm and Its Variations.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {number} deadline Time at which to bail if not yet complete.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffBisect = function( text1, text2, deadline ) {
+               var text1Length, text2Length, maxD, vOffset, vLength,
+                       v1, v2, x, delta, front, k1start, k1end, k2start,
+                       k2end, k2Offset, k1Offset, x1, x2, y1, y2, d, k1, k2;
 
-       testBlock = document.createElement( "li" );
-       testBlock.appendChild( title );
-       testBlock.appendChild( rerunTrigger );
-       testBlock.id = "qunit-test-output-" + testId;
+               // Cache the text lengths to prevent multiple calls.
+               text1Length = text1.length;
+               text2Length = text2.length;
+               maxD = Math.ceil( ( text1Length + text2Length ) / 2 );
+               vOffset = maxD;
+               vLength = 2 * maxD;
+               v1 = new Array( vLength );
+               v2 = new Array( vLength );
 
-       assertList = document.createElement( "ol" );
-       assertList.className = "qunit-assert-list";
+               // Setting all elements to -1 is faster in Chrome & Firefox than mixing
+               // integers and undefined.
+               for ( x = 0; x < vLength; x++ ) {
+                       v1[ x ] = -1;
+                       v2[ x ] = -1;
+               }
+               v1[ vOffset + 1 ] = 0;
+               v2[ vOffset + 1 ] = 0;
+               delta = text1Length - text2Length;
 
-       testBlock.appendChild( assertList );
+               // If the total number of characters is odd, then the front path will collide
+               // with the reverse path.
+               front = ( delta % 2 !== 0 );
 
-       tests.appendChild( testBlock );
-}
+               // Offsets for start and end of k loop.
+               // Prevents mapping of space beyond the grid.
+               k1start = 0;
+               k1end = 0;
+               k2start = 0;
+               k2end = 0;
+               for ( d = 0; d < maxD; d++ ) {
 
-// HTML Reporter initialization and load
-QUnit.begin(function( details ) {
-       var qunit = id( "qunit" );
+                       // Bail out if deadline is reached.
+                       if ( ( new Date() ).getTime() > deadline ) {
+                               break;
+                       }
 
-       // Fixture is the only one necessary to run without the #qunit element
-       storeFixture();
+                       // Walk the front path one step.
+                       for ( k1 = -d + k1start; k1 <= d - k1end; k1 += 2 ) {
+                               k1Offset = vOffset + k1;
+                               if ( k1 === -d || ( k1 !== d && v1[ k1Offset - 1 ] < v1[ k1Offset + 1 ] ) ) {
+                                       x1 = v1[ k1Offset + 1 ];
+                               } else {
+                                       x1 = v1[ k1Offset - 1 ] + 1;
+                               }
+                               y1 = x1 - k1;
+                               while ( x1 < text1Length && y1 < text2Length &&
+                                       text1.charAt( x1 ) === text2.charAt( y1 ) ) {
+                                       x1++;
+                                       y1++;
+                               }
+                               v1[ k1Offset ] = x1;
+                               if ( x1 > text1Length ) {
 
-       if ( qunit ) {
-               qunit.innerHTML =
-                       "<h1 id='qunit-header'>" + escapeText( document.title ) + "</h1>" +
-                       "<h2 id='qunit-banner'></h2>" +
-                       "<div id='qunit-testrunner-toolbar'></div>" +
-                       appendFilteredTest() +
-                       "<h2 id='qunit-userAgent'></h2>" +
-                       "<ol id='qunit-tests'></ol>";
-       }
+                                       // Ran off the right of the graph.
+                                       k1end += 2;
+                               } else if ( y1 > text2Length ) {
 
-       appendHeader();
-       appendBanner();
-       appendTestResults();
-       appendUserAgent();
-       appendToolbar();
-       appendTestsList( details.modules );
-       toolbarModuleFilter();
+                                       // Ran off the bottom of the graph.
+                                       k1start += 2;
+                               } else if ( front ) {
+                                       k2Offset = vOffset + delta - k1;
+                                       if ( k2Offset >= 0 && k2Offset < vLength && v2[ k2Offset ] !== -1 ) {
 
-       if ( qunit && config.hidepassed ) {
-               addClass( qunit.lastChild, "hidepass" );
-       }
-});
+                                               // Mirror x2 onto top-left coordinate system.
+                                               x2 = text1Length - v2[ k2Offset ];
+                                               if ( x1 >= x2 ) {
 
-QUnit.done(function( details ) {
-       var i, key,
-               banner = id( "qunit-banner" ),
-               tests = id( "qunit-tests" ),
-               html = [
-                       "Tests completed in ",
-                       details.runtime,
-                       " milliseconds.<br />",
-                       "<span class='passed'>",
-                       details.passed,
-                       "</span> assertions of <span class='total'>",
-                       details.total,
-                       "</span> passed, <span class='failed'>",
-                       details.failed,
-                       "</span> failed."
-               ].join( "" );
+                                                       // Overlap detected.
+                                                       return this.diffBisectSplit( text1, text2, x1, y1, deadline );
+                                               }
+                                       }
+                               }
+                       }
 
-       if ( banner ) {
-               banner.className = details.failed ? "qunit-fail" : "qunit-pass";
-       }
+                       // Walk the reverse path one step.
+                       for ( k2 = -d + k2start; k2 <= d - k2end; k2 += 2 ) {
+                               k2Offset = vOffset + k2;
+                               if ( k2 === -d || ( k2 !== d && v2[ k2Offset - 1 ] < v2[ k2Offset + 1 ] ) ) {
+                                       x2 = v2[ k2Offset + 1 ];
+                               } else {
+                                       x2 = v2[ k2Offset - 1 ] + 1;
+                               }
+                               y2 = x2 - k2;
+                               while ( x2 < text1Length && y2 < text2Length &&
+                                       text1.charAt( text1Length - x2 - 1 ) ===
+                                       text2.charAt( text2Length - y2 - 1 ) ) {
+                                       x2++;
+                                       y2++;
+                               }
+                               v2[ k2Offset ] = x2;
+                               if ( x2 > text1Length ) {
 
-       if ( tests ) {
-               id( "qunit-testresult" ).innerHTML = html;
-       }
+                                       // Ran off the left of the graph.
+                                       k2end += 2;
+                               } else if ( y2 > text2Length ) {
 
-       if ( config.altertitle && defined.document && document.title ) {
+                                       // Ran off the top of the graph.
+                                       k2start += 2;
+                               } else if ( !front ) {
+                                       k1Offset = vOffset + delta - k2;
+                                       if ( k1Offset >= 0 && k1Offset < vLength && v1[ k1Offset ] !== -1 ) {
+                                               x1 = v1[ k1Offset ];
+                                               y1 = vOffset + x1 - k1Offset;
 
-               // show ✖ for good, ✔ for bad suite result in title
-               // use escape sequences in case file gets loaded with non-utf-8-charset
-               document.title = [
-                       ( details.failed ? "\u2716" : "\u2714" ),
-                       document.title.replace( /^[\u2714\u2716] /i, "" )
-               ].join( " " );
-       }
+                                               // Mirror x2 onto top-left coordinate system.
+                                               x2 = text1Length - x2;
+                                               if ( x1 >= x2 ) {
 
-       // clear own sessionStorage items if all tests passed
-       if ( config.reorder && defined.sessionStorage && details.failed === 0 ) {
-               for ( i = 0; i < sessionStorage.length; i++ ) {
-                       key = sessionStorage.key( i++ );
-                       if ( key.indexOf( "qunit-test-" ) === 0 ) {
-                               sessionStorage.removeItem( key );
+                                                       // Overlap detected.
+                                                       return this.diffBisectSplit( text1, text2, x1, y1, deadline );
+                                               }
+                                       }
+                               }
                        }
                }
-       }
-
-       // scroll back to top to show results
-       if ( config.scrolltop && window.scrollTo ) {
-               window.scrollTo( 0, 0 );
-       }
-});
 
-function getNameHtml( name, module ) {
-       var nameHtml = "";
+               // Diff took too long and hit the deadline or
+               // number of diffs equals number of characters, no commonality at all.
+               return [
+                       [ DIFF_DELETE, text1 ],
+                       [ DIFF_INSERT, text2 ]
+               ];
+       };
 
-       if ( module ) {
-               nameHtml = "<span class='module-name'>" + escapeText( module ) + "</span>: ";
-       }
+       /**
+        * Given the location of the 'middle snake', split the diff in two parts
+        * and recurse.
+        * @param {string} text1 Old string to be diffed.
+        * @param {string} text2 New string to be diffed.
+        * @param {number} x Index of split point in text1.
+        * @param {number} y Index of split point in text2.
+        * @param {number} deadline Time at which to bail if not yet complete.
+        * @return {!Array.<!DiffMatchPatch.Diff>} Array of diff tuples.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffBisectSplit = function( text1, text2, x, y, deadline ) {
+               var text1a, text1b, text2a, text2b, diffs, diffsb;
+               text1a = text1.substring( 0, x );
+               text2a = text2.substring( 0, y );
+               text1b = text1.substring( x );
+               text2b = text2.substring( y );
 
-       nameHtml += "<span class='test-name'>" + escapeText( name ) + "</span>";
+               // Compute both diffs serially.
+               diffs = this.DiffMain( text1a, text2a, false, deadline );
+               diffsb = this.DiffMain( text1b, text2b, false, deadline );
 
-       return nameHtml;
-}
+               return diffs.concat( diffsb );
+       };
 
-QUnit.testStart(function( details ) {
-       var running, testBlock, bad;
+       /**
+        * Reduce the number of edits by eliminating semantically trivial equalities.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        */
+       DiffMatchPatch.prototype.diffCleanupSemantic = function( diffs ) {
+               var changes, equalities, equalitiesLength, lastequality,
+                       pointer, lengthInsertions2, lengthDeletions2, lengthInsertions1,
+                       lengthDeletions1, deletion, insertion, overlapLength1, overlapLength2;
+               changes = false;
+               equalities = []; // Stack of indices where equalities are found.
+               equalitiesLength = 0; // Keeping our own length var is faster in JS.
+               /** @type {?string} */
+               lastequality = null;
 
-       testBlock = id( "qunit-test-output-" + details.testId );
-       if ( testBlock ) {
-               testBlock.className = "running";
-       } else {
+               // Always equal to diffs[equalities[equalitiesLength - 1]][1]
+               pointer = 0; // Index of current position.
 
-               // Report later registered tests
-               appendTest( details.name, details.testId, details.module );
-       }
+               // Number of characters that changed prior to the equality.
+               lengthInsertions1 = 0;
+               lengthDeletions1 = 0;
 
-       running = id( "qunit-testresult" );
-       if ( running ) {
-               bad = QUnit.config.reorder && defined.sessionStorage &&
-                       +sessionStorage.getItem( "qunit-test-" + details.module + "-" + details.name );
+               // Number of characters that changed after the equality.
+               lengthInsertions2 = 0;
+               lengthDeletions2 = 0;
+               while ( pointer < diffs.length ) {
+                       if ( diffs[ pointer ][ 0 ] === DIFF_EQUAL ) { // Equality found.
+                               equalities[ equalitiesLength++ ] = pointer;
+                               lengthInsertions1 = lengthInsertions2;
+                               lengthDeletions1 = lengthDeletions2;
+                               lengthInsertions2 = 0;
+                               lengthDeletions2 = 0;
+                               lastequality = diffs[ pointer ][ 1 ];
+                       } else { // An insertion or deletion.
+                               if ( diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
+                                       lengthInsertions2 += diffs[ pointer ][ 1 ].length;
+                               } else {
+                                       lengthDeletions2 += diffs[ pointer ][ 1 ].length;
+                               }
 
-               running.innerHTML = ( bad ?
-                       "Rerunning previously failed test: <br />" :
-                       "Running: <br />" ) +
-                       getNameHtml( details.name, details.module );
-       }
+                               // Eliminate an equality that is smaller or equal to the edits on both
+                               // sides of it.
+                               if ( lastequality && ( lastequality.length <=
+                                               Math.max( lengthInsertions1, lengthDeletions1 ) ) &&
+                                               ( lastequality.length <= Math.max( lengthInsertions2,
+                                                       lengthDeletions2 ) ) ) {
 
-});
+                                       // Duplicate record.
+                                       diffs.splice(
+                                               equalities[ equalitiesLength - 1 ],
+                                               0,
+                                               [ DIFF_DELETE, lastequality ]
+                                       );
 
-function stripHtml( string ) {
-       // strip tags, html entity and whitespaces
-       return string.replace(/<\/?[^>]+(>|$)/g, "").replace(/\&quot;/g, "").replace(/\s+/g, "");
-}
+                                       // Change second copy to insert.
+                                       diffs[ equalities[ equalitiesLength - 1 ] + 1 ][ 0 ] = DIFF_INSERT;
 
-QUnit.log(function( details ) {
-       var assertList, assertLi,
-               message, expected, actual, diff,
-               showDiff = false,
-               testItem = id( "qunit-test-output-" + details.testId );
+                                       // Throw away the equality we just deleted.
+                                       equalitiesLength--;
 
-       if ( !testItem ) {
-               return;
-       }
+                                       // Throw away the previous equality (it needs to be reevaluated).
+                                       equalitiesLength--;
+                                       pointer = equalitiesLength > 0 ? equalities[ equalitiesLength - 1 ] : -1;
 
-       message = escapeText( details.message ) || ( details.result ? "okay" : "failed" );
-       message = "<span class='test-message'>" + message + "</span>";
-       message += "<span class='runtime'>@ " + details.runtime + " ms</span>";
+                                       // Reset the counters.
+                                       lengthInsertions1 = 0;
+                                       lengthDeletions1 = 0;
+                                       lengthInsertions2 = 0;
+                                       lengthDeletions2 = 0;
+                                       lastequality = null;
+                                       changes = true;
+                               }
+                       }
+                       pointer++;
+               }
 
-       // pushFailure doesn't provide details.expected
-       // when it calls, it's implicit to also not show expected and diff stuff
-       // Also, we need to check details.expected existence, as it can exist and be undefined
-       if ( !details.result && hasOwn.call( details, "expected" ) ) {
-               if ( details.negative ) {
-                       expected = escapeText( "NOT " + QUnit.dump.parse( details.expected ) );
-               } else {
-                       expected = escapeText( QUnit.dump.parse( details.expected ) );
+               // Normalize the diff.
+               if ( changes ) {
+                       this.diffCleanupMerge( diffs );
                }
 
-               actual = escapeText( QUnit.dump.parse( details.actual ) );
-               message += "<table><tr class='test-expected'><th>Expected: </th><td><pre>" +
-                       expected +
-                       "</pre></td></tr>";
+               // Find any overlaps between deletions and insertions.
+               // e.g: <del>abcxxx</del><ins>xxxdef</ins>
+               //   -> <del>abc</del>xxx<ins>def</ins>
+               // e.g: <del>xxxabc</del><ins>defxxx</ins>
+               //   -> <ins>def</ins>xxx<del>abc</del>
+               // Only extract an overlap if it is as big as the edit ahead or behind it.
+               pointer = 1;
+               while ( pointer < diffs.length ) {
+                       if ( diffs[ pointer - 1 ][ 0 ] === DIFF_DELETE &&
+                                       diffs[ pointer ][ 0 ] === DIFF_INSERT ) {
+                               deletion = diffs[ pointer - 1 ][ 1 ];
+                               insertion = diffs[ pointer ][ 1 ];
+                               overlapLength1 = this.diffCommonOverlap( deletion, insertion );
+                               overlapLength2 = this.diffCommonOverlap( insertion, deletion );
+                               if ( overlapLength1 >= overlapLength2 ) {
+                                       if ( overlapLength1 >= deletion.length / 2 ||
+                                                       overlapLength1 >= insertion.length / 2 ) {
 
-               if ( actual !== expected ) {
+                                               // Overlap found.  Insert an equality and trim the surrounding edits.
+                                               diffs.splice(
+                                                       pointer,
+                                                       0,
+                                                       [ DIFF_EQUAL, insertion.substring( 0, overlapLength1 ) ]
+                                               );
+                                               diffs[ pointer - 1 ][ 1 ] =
+                                                       deletion.substring( 0, deletion.length - overlapLength1 );
+                                               diffs[ pointer + 1 ][ 1 ] = insertion.substring( overlapLength1 );
+                                               pointer++;
+                                       }
+                               } else {
+                                       if ( overlapLength2 >= deletion.length / 2 ||
+                                                       overlapLength2 >= insertion.length / 2 ) {
 
-                       message += "<tr class='test-actual'><th>Result: </th><td><pre>" +
-                               actual + "</pre></td></tr>";
+                                               // Reverse overlap found.
+                                               // Insert an equality and swap and trim the surrounding edits.
+                                               diffs.splice(
+                                                       pointer,
+                                                       0,
+                                                       [ DIFF_EQUAL, deletion.substring( 0, overlapLength2 ) ]
+                                               );
 
-                       // Don't show diff if actual or expected are booleans
-                       if ( !( /^(true|false)$/.test( actual ) ) &&
-                                       !( /^(true|false)$/.test( expected ) ) ) {
-                               diff = QUnit.diff( expected, actual );
-                               showDiff = stripHtml( diff ).length !==
-                                       stripHtml( expected ).length +
-                                       stripHtml( actual ).length;
+                                               diffs[ pointer - 1 ][ 0 ] = DIFF_INSERT;
+                                               diffs[ pointer - 1 ][ 1 ] =
+                                                       insertion.substring( 0, insertion.length - overlapLength2 );
+                                               diffs[ pointer + 1 ][ 0 ] = DIFF_DELETE;
+                                               diffs[ pointer + 1 ][ 1 ] =
+                                                       deletion.substring( overlapLength2 );
+                                               pointer++;
+                                       }
+                               }
+                               pointer++;
                        }
+                       pointer++;
+               }
+       };
 
-                       // Don't show diff if expected and actual are totally different
-                       if ( showDiff ) {
-                               message += "<tr class='test-diff'><th>Diff: </th><td><pre>" +
-                                       diff + "</pre></td></tr>";
-                       }
-               } else if ( expected.indexOf( "[object Array]" ) !== -1 ||
-                               expected.indexOf( "[object Object]" ) !== -1 ) {
-                       message += "<tr class='test-message'><th>Message: </th><td>" +
-                               "Diff suppressed as the depth of object is more than current max depth (" +
-                               QUnit.config.maxDepth + ").<p>Hint: Use <code>QUnit.dump.maxDepth</code> to " +
-                               " run with a higher max depth or <a href='" +
-                               escapeText( setUrl( { maxDepth: -1 } ) ) + "'>" +
-                               "Rerun</a> without max depth.</p></td></tr>";
+       /**
+        * Determine if the suffix of one string is the prefix of another.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {number} The number of characters common to the end of the first
+        *     string and the start of the second string.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffCommonOverlap = function( text1, text2 ) {
+               var text1Length, text2Length, textLength,
+                       best, length, pattern, found;
+
+               // Cache the text lengths to prevent multiple calls.
+               text1Length = text1.length;
+               text2Length = text2.length;
+
+               // Eliminate the null case.
+               if ( text1Length === 0 || text2Length === 0 ) {
+                       return 0;
                }
 
-               if ( details.source ) {
-                       message += "<tr class='test-source'><th>Source: </th><td><pre>" +
-                               escapeText( details.source ) + "</pre></td></tr>";
+               // Truncate the longer string.
+               if ( text1Length > text2Length ) {
+                       text1 = text1.substring( text1Length - text2Length );
+               } else if ( text1Length < text2Length ) {
+                       text2 = text2.substring( 0, text1Length );
                }
+               textLength = Math.min( text1Length, text2Length );
 
-               message += "</table>";
+               // Quick check for the worst case.
+               if ( text1 === text2 ) {
+                       return textLength;
+               }
 
-       // this occurs when pushFailure is set and we have an extracted stack trace
-       } else if ( !details.result && details.source ) {
-               message += "<table>" +
-                       "<tr class='test-source'><th>Source: </th><td><pre>" +
-                       escapeText( details.source ) + "</pre></td></tr>" +
-                       "</table>";
-       }
+               // Start by looking for a single character match
+               // and increase length until no match is found.
+               // Performance analysis: https://neil.fraser.name/news/2010/11/04/
+               best = 0;
+               length = 1;
+               while ( true ) {
+                       pattern = text1.substring( textLength - length );
+                       found = text2.indexOf( pattern );
+                       if ( found === -1 ) {
+                               return best;
+                       }
+                       length += found;
+                       if ( found === 0 || text1.substring( textLength - length ) ===
+                                       text2.substring( 0, length ) ) {
+                               best = length;
+                               length++;
+                       }
+               }
+       };
 
-       assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
+       /**
+        * Split two texts into an array of strings.  Reduce the texts to a string of
+        * hashes where each Unicode character represents one line.
+        * @param {string} text1 First string.
+        * @param {string} text2 Second string.
+        * @return {{chars1: string, chars2: string, lineArray: !Array.<string>}}
+        *     An object containing the encoded text1, the encoded text2 and
+        *     the array of unique strings.
+        *     The zeroth element of the array of unique strings is intentionally blank.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffLinesToChars = function( text1, text2 ) {
+               var lineArray, lineHash, chars1, chars2;
+               lineArray = []; // E.g. lineArray[4] === 'Hello\n'
+               lineHash = {};  // E.g. lineHash['Hello\n'] === 4
 
-       assertLi = document.createElement( "li" );
-       assertLi.className = details.result ? "pass" : "fail";
-       assertLi.innerHTML = message;
-       assertList.appendChild( assertLi );
-});
+               // '\x00' is a valid character, but various debuggers don't like it.
+               // So we'll insert a junk entry to avoid generating a null character.
+               lineArray[ 0 ] = "";
 
-QUnit.testDone(function( details ) {
-       var testTitle, time, testItem, assertList,
-               good, bad, testCounts, skipped, sourceName,
-               tests = id( "qunit-tests" );
+               /**
+                * Split a text into an array of strings.  Reduce the texts to a string of
+                * hashes where each Unicode character represents one line.
+                * Modifies linearray and linehash through being a closure.
+                * @param {string} text String to encode.
+                * @return {string} Encoded string.
+                * @private
+                */
+               function diffLinesToCharsMunge( text ) {
+                       var chars, lineStart, lineEnd, lineArrayLength, line;
+                       chars = "";
 
-       if ( !tests ) {
-               return;
-       }
+                       // Walk the text, pulling out a substring for each line.
+                       // text.split('\n') would would temporarily double our memory footprint.
+                       // Modifying text would create many large strings to garbage collect.
+                       lineStart = 0;
+                       lineEnd = -1;
 
-       testItem = id( "qunit-test-output-" + details.testId );
+                       // Keeping our own length variable is faster than looking it up.
+                       lineArrayLength = lineArray.length;
+                       while ( lineEnd < text.length - 1 ) {
+                               lineEnd = text.indexOf( "\n", lineStart );
+                               if ( lineEnd === -1 ) {
+                                       lineEnd = text.length - 1;
+                               }
+                               line = text.substring( lineStart, lineEnd + 1 );
+                               lineStart = lineEnd + 1;
 
-       assertList = testItem.getElementsByTagName( "ol" )[ 0 ];
+                               if ( lineHash.hasOwnProperty ? lineHash.hasOwnProperty( line ) :
+                                                       ( lineHash[ line ] !== undefined ) ) {
+                                       chars += String.fromCharCode( lineHash[ line ] );
+                               } else {
+                                       chars += String.fromCharCode( lineArrayLength );
+                                       lineHash[ line ] = lineArrayLength;
+                                       lineArray[ lineArrayLength++ ] = line;
+                               }
+                       }
+                       return chars;
+               }
 
-       good = details.passed;
-       bad = details.failed;
+               chars1 = diffLinesToCharsMunge( text1 );
+               chars2 = diffLinesToCharsMunge( text2 );
+               return {
+                       chars1: chars1,
+                       chars2: chars2,
+                       lineArray: lineArray
+               };
+       };
 
-       // store result when possible
-       if ( config.reorder && defined.sessionStorage ) {
-               if ( bad ) {
-                       sessionStorage.setItem( "qunit-test-" + details.module + "-" + details.name, bad );
-               } else {
-                       sessionStorage.removeItem( "qunit-test-" + details.module + "-" + details.name );
+       /**
+        * Rehydrate the text in a diff from a string of line hashes to real lines of
+        * text.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        * @param {!Array.<string>} lineArray Array of unique strings.
+        * @private
+        */
+       DiffMatchPatch.prototype.diffCharsToLines = function( diffs, lineArray ) {
+               var x, chars, text, y;
+               for ( x = 0; x < diffs.length; x++ ) {
+                       chars = diffs[ x ][ 1 ];
+                       text = [];
+                       for ( y = 0; y < chars.length; y++ ) {
+                               text[ y ] = lineArray[ chars.charCodeAt( y ) ];
+                       }
+                       diffs[ x ][ 1 ] = text.join( "" );
                }
-       }
+       };
 
-       if ( bad === 0 ) {
+       /**
+        * Reorder and merge like edit sections.  Merge equalities.
+        * Any edit section can move as long as it doesn't cross an equality.
+        * @param {!Array.<!DiffMatchPatch.Diff>} diffs Array of diff tuples.
+        */
+       DiffMatchPatch.prototype.diffCleanupMerge = function( diffs ) {
+               var pointer, countDelete, countInsert, textInsert, textDelete,
+                       commonlength, changes, diffPointer, position;
+               diffs.push( [ DIFF_EQUAL, "" ] ); // Add a dummy entry at the end.
+               pointer = 0;
+               countDelete = 0;
+               countInsert = 0;
+               textDelete = "";
+               textInsert = "";
+               commonlength;
+               while ( pointer < diffs.length ) {
+                       switch ( diffs[ pointer ][ 0 ] ) {
+                       case DIFF_INSERT:
+                               countInsert++;
+                               textInsert += diffs[ pointer ][ 1 ];
+                               pointer++;
+                               break;
+                       case DIFF_DELETE:
+                               countDelete++;
+                               textDelete += diffs[ pointer ][ 1 ];
+                               pointer++;
+                               break;
+                       case DIFF_EQUAL:
 
-               // Collapse the passing tests
-               addClass( assertList, "qunit-collapsed" );
-       } else if ( bad && config.collapse && !collapseNext ) {
+                               // Upon reaching an equality, check for prior redundancies.
+                               if ( countDelete + countInsert > 1 ) {
+                                       if ( countDelete !== 0 && countInsert !== 0 ) {
 
-               // Skip collapsing the first failing test
-               collapseNext = true;
-       } else {
+                                               // Factor out any common prefixes.
+                                               commonlength = this.diffCommonPrefix( textInsert, textDelete );
+                                               if ( commonlength !== 0 ) {
+                                                       if ( ( pointer - countDelete - countInsert ) > 0 &&
+                                                                       diffs[ pointer - countDelete - countInsert - 1 ][ 0 ] ===
+                                                                       DIFF_EQUAL ) {
+                                                               diffs[ pointer - countDelete - countInsert - 1 ][ 1 ] +=
+                                                                       textInsert.substring( 0, commonlength );
+                                                       } else {
+                                                               diffs.splice( 0, 0, [ DIFF_EQUAL,
+                                                                       textInsert.substring( 0, commonlength )
+                                                               ] );
+                                                               pointer++;
+                                                       }
+                                                       textInsert = textInsert.substring( commonlength );
+                                                       textDelete = textDelete.substring( commonlength );
+                                               }
 
-               // Collapse remaining tests
-               addClass( assertList, "qunit-collapsed" );
-       }
+                                               // Factor out any common suffixies.
+                                               commonlength = this.diffCommonSuffix( textInsert, textDelete );
+                                               if ( commonlength !== 0 ) {
+                                                       diffs[ pointer ][ 1 ] = textInsert.substring( textInsert.length -
+                                                                       commonlength ) + diffs[ pointer ][ 1 ];
+                                                       textInsert = textInsert.substring( 0, textInsert.length -
+                                                               commonlength );
+                                                       textDelete = textDelete.substring( 0, textDelete.length -
+                                                               commonlength );
+                                               }
+                                       }
 
-       // testItem.firstChild is the test name
-       testTitle = testItem.firstChild;
+                                       // Delete the offending records and add the merged ones.
+                                       if ( countDelete === 0 ) {
+                                               diffs.splice( pointer - countInsert,
+                                                       countDelete + countInsert, [ DIFF_INSERT, textInsert ] );
+                                       } else if ( countInsert === 0 ) {
+                                               diffs.splice( pointer - countDelete,
+                                                       countDelete + countInsert, [ DIFF_DELETE, textDelete ] );
+                                       } else {
+                                               diffs.splice(
+                                                       pointer - countDelete - countInsert,
+                                                       countDelete + countInsert,
+                                                       [ DIFF_DELETE, textDelete ], [ DIFF_INSERT, textInsert ]
+                                               );
+                                       }
+                                       pointer = pointer - countDelete - countInsert +
+                                               ( countDelete ? 1 : 0 ) + ( countInsert ? 1 : 0 ) + 1;
+                               } else if ( pointer !== 0 && diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL ) {
 
-       testCounts = bad ?
-               "<b class='failed'>" + bad + "</b>, " + "<b class='passed'>" + good + "</b>, " :
-               "";
+                                       // Merge this equality with the previous one.
+                                       diffs[ pointer - 1 ][ 1 ] += diffs[ pointer ][ 1 ];
+                                       diffs.splice( pointer, 1 );
+                               } else {
+                                       pointer++;
+                               }
+                               countInsert = 0;
+                               countDelete = 0;
+                               textDelete = "";
+                               textInsert = "";
+                               break;
+                       }
+               }
+               if ( diffs[ diffs.length - 1 ][ 1 ] === "" ) {
+                       diffs.pop(); // Remove the dummy entry at the end.
+               }
 
-       testTitle.innerHTML += " <b class='counts'>(" + testCounts +
-               details.assertions.length + ")</b>";
+               // Second pass: look for single edits surrounded on both sides by equalities
+               // which can be shifted sideways to eliminate an equality.
+               // e.g: A<ins>BA</ins>C -> <ins>AB</ins>AC
+               changes = false;
+               pointer = 1;
 
-       if ( details.skipped ) {
-               testItem.className = "skipped";
-               skipped = document.createElement( "em" );
-               skipped.className = "qunit-skipped-label";
-               skipped.innerHTML = "skipped";
-               testItem.insertBefore( skipped, testTitle );
-       } else {
-               addEvent( testTitle, "click", function() {
-                       toggleClass( assertList, "qunit-collapsed" );
-               });
+               // Intentionally ignore the first and last element (don't need checking).
+               while ( pointer < diffs.length - 1 ) {
+                       if ( diffs[ pointer - 1 ][ 0 ] === DIFF_EQUAL &&
+                                       diffs[ pointer + 1 ][ 0 ] === DIFF_EQUAL ) {
 
-               testItem.className = bad ? "fail" : "pass";
+                               diffPointer = diffs[ pointer ][ 1 ];
+                               position = diffPointer.substring(
+                                       diffPointer.length - diffs[ pointer - 1 ][ 1 ].length
+                               );
 
-               time = document.createElement( "span" );
-               time.className = "runtime";
-               time.innerHTML = details.runtime + " ms";
-               testItem.insertBefore( time, assertList );
-       }
+                               // This is a single edit surrounded by equalities.
+                               if ( position === diffs[ pointer - 1 ][ 1 ] ) {
 
-       // Show the source of the test when showing assertions
-       if ( details.source ) {
-               sourceName = document.createElement( "p" );
-               sourceName.innerHTML = "<strong>Source: </strong>" + details.source;
-               addClass( sourceName, "qunit-source" );
-               if ( bad === 0 ) {
-                       addClass( sourceName, "qunit-collapsed" );
+                                       // Shift the edit over the previous equality.
+                                       diffs[ pointer ][ 1 ] = diffs[ pointer - 1 ][ 1 ] +
+                                               diffs[ pointer ][ 1 ].substring( 0, diffs[ pointer ][ 1 ].length -
+                                                       diffs[ pointer - 1 ][ 1 ].length );
+                                       diffs[ pointer + 1 ][ 1 ] =
+                                               diffs[ pointer - 1 ][ 1 ] + diffs[ pointer + 1 ][ 1 ];
+                                       diffs.splice( pointer - 1, 1 );
+                                       changes = true;
+                               } else if ( diffPointer.substring( 0, diffs[ pointer + 1 ][ 1 ].length ) ===
+                                               diffs[ pointer + 1 ][ 1 ] ) {
+
+                                       // Shift the edit over the next equality.
+                                       diffs[ pointer - 1 ][ 1 ] += diffs[ pointer + 1 ][ 1 ];
+                                       diffs[ pointer ][ 1 ] =
+                                               diffs[ pointer ][ 1 ].substring( diffs[ pointer + 1 ][ 1 ].length ) +
+                                               diffs[ pointer + 1 ][ 1 ];
+                                       diffs.splice( pointer + 1, 1 );
+                                       changes = true;
+                               }
+                       }
+                       pointer++;
                }
-               addEvent( testTitle, "click", function() {
-                       toggleClass( sourceName, "qunit-collapsed" );
-               });
-               testItem.appendChild( sourceName );
-       }
-});
 
-if ( defined.document ) {
+               // If shifts were made, the diff needs reordering and another shift sweep.
+               if ( changes ) {
+                       this.diffCleanupMerge( diffs );
+               }
+       };
 
-       // Avoid readyState issue with phantomjs
-       // Ref: #818
-       var notPhantom = ( function( p ) {
-               return !( p && p.version && p.version.major > 0 );
-       } )( window.phantom );
+       return function( o, n ) {
+               var diff, output, text;
+               diff = new DiffMatchPatch();
+               output = diff.DiffMain( o, n );
+               diff.diffCleanupEfficiency( output );
+               text = diff.diffPrettyHtml( output );
 
-       if ( notPhantom && document.readyState === "complete" ) {
-               QUnit.load();
-       } else {
-               addEvent( window, "load", QUnit.load );
-       }
-} else {
-       config.pageLoaded = true;
-       config.autorun = true;
-}
+               return text;
+       };
+}() );
 
-})();
+}() );
index a6106e4..f25944c 100644 (file)
  */
 ( function ( $, mw ) {
 
-// Cached access key modifiers for used browser
-var cachedAccessKeyModifiers,
-
-       // Whether to use 'test-' instead of correct prefix (used for testing)
-       useTestPrefix = false,
-
-       // tag names which can have a label tag
-       // https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Form-associated_content
-       labelable = 'button, input, textarea, keygen, meter, output, progress, select';
-
-/**
- * Find the modifier keys that need to be pressed together with the accesskey to trigger the input.
- *
- * The result is dependant on the ua paramater or the current platform.
- * For browsers that support accessKeyLabel, #getAccessKeyLabel never calls here.
- * Valid key values that are returned can be: ctrl, alt, option, shift, esc
- *
- * @private
- * @param {Object} [ua] An object with a 'userAgent' and 'platform' property.
- * @return {Array} Array with 0 or more of the string values: ctrl, option, alt, shift, esc
- */
-function getAccessKeyModifiers( ua ) {
-       // use cached prefix if possible
-       if ( !ua && cachedAccessKeyModifiers ) {
-               return cachedAccessKeyModifiers;
-       }
+       // Cached access key modifiers for used browser
+       var cachedAccessKeyModifiers,
+
+               // Whether to use 'test-' instead of correct prefix (used for testing)
+               useTestPrefix = false,
+
+               // tag names which can have a label tag
+               // https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Content_categories#Form-associated_content
+               labelable = 'button, input, textarea, keygen, meter, output, progress, select';
+
+       /**
+        * Find the modifier keys that need to be pressed together with the accesskey to trigger the input.
+        *
+        * The result is dependant on the ua paramater or the current platform.
+        * For browsers that support accessKeyLabel, #getAccessKeyLabel never calls here.
+        * Valid key values that are returned can be: ctrl, alt, option, shift, esc
+        *
+        * @private
+        * @param {Object} [ua] An object with a 'userAgent' and 'platform' property.
+        * @return {Array} Array with 0 or more of the string values: ctrl, option, alt, shift, esc
+        */
+       function getAccessKeyModifiers( ua ) {
+               var profile, accessKeyModifiers;
+
+               // use cached prefix if possible
+               if ( !ua && cachedAccessKeyModifiers ) {
+                       return cachedAccessKeyModifiers;
+               }
 
-       var profile = $.client.profile( ua ),
+               profile = $.client.profile( ua );
                accessKeyModifiers = [ 'alt' ];
 
-       // Classic Opera on any platform
-       if ( profile.name === 'opera' && profile.versionNumber < 15 ) {
-               accessKeyModifiers = [ 'shift', 'esc' ];
-
-       // Chrome and modern Opera on any platform
-       } else if ( profile.name === 'chrome' || profile.name === 'opera' ) {
-               accessKeyModifiers = (
-                       profile.platform === 'mac'
-                               // Chrome on Mac
-                               ? [ 'ctrl', 'option' ]
-                               // Chrome on Windows or Linux
-                               // (both alt- and alt-shift work, but alt with E, D, F etc does not
-                               // work since they are browser shortcuts)
-                               : [ 'alt', 'shift' ]
-               );
-
-       // Non-Windows Safari with webkit_version > 526
-       } else if ( profile.platform !== 'win'
-               && profile.name === 'safari'
-               && profile.layoutVersion > 526
-       ) {
-               accessKeyModifiers = [ 'ctrl', 'alt' ];
-
-       // Safari/Konqueror on any platform, or any browser on Mac
-       // (but not Safari on Windows)
-       } else if ( !( profile.platform === 'win' && profile.name === 'safari' )
-               && ( profile.name === 'safari'
-               || profile.platform === 'mac'
-               || profile.name === 'konqueror' )
-       ) {
-               accessKeyModifiers = [ 'ctrl' ];
-
-       // Firefox/Iceweasel 2.x and later
-       } else if ( ( profile.name === 'firefox' || profile.name === 'iceweasel' )
-               && profile.versionBase > '1'
-       ) {
-               accessKeyModifiers = [ 'alt', 'shift' ];
-       }
+               // Classic Opera on any platform
+               if ( profile.name === 'opera' && profile.versionNumber < 15 ) {
+                       accessKeyModifiers = [ 'shift', 'esc' ];
+
+               // Chrome and modern Opera on any platform
+               } else if ( profile.name === 'chrome' || profile.name === 'opera' ) {
+                       accessKeyModifiers = (
+                               profile.platform === 'mac' ?
+                                       // Chrome on Mac
+                                       [ 'ctrl', 'option' ] :
+                                       // Chrome on Windows or Linux
+                                       // (both alt- and alt-shift work, but alt with E, D, F etc does not
+                                       // work since they are browser shortcuts)
+                                       [ 'alt', 'shift' ]
+                       );
+
+               // Non-Windows Safari with webkit_version > 526
+               } else if ( profile.platform !== 'win' &&
+                       profile.name === 'safari' &&
+                       profile.layoutVersion > 526
+               ) {
+                       accessKeyModifiers = [ 'ctrl', 'alt' ];
+
+               // Safari/Konqueror on any platform, or any browser on Mac
+               // (but not Safari on Windows)
+               } else if (
+                       !( profile.platform === 'win' && profile.name === 'safari' ) &&
+                       (
+                               profile.name === 'safari' ||
+                               profile.platform === 'mac' ||
+                               profile.name === 'konqueror'
+                       )
+               ) {
+                       accessKeyModifiers = [ 'ctrl' ];
+
+               // Firefox/Iceweasel 2.x and later
+               } else if (
+                       ( profile.name === 'firefox' || profile.name === 'iceweasel' ) &&
+                       profile.versionBase > '1'
+               ) {
+                       accessKeyModifiers = [ 'alt', 'shift' ];
+               }
 
-       // cache modifiers
-       if ( !ua ) {
-               cachedAccessKeyModifiers = accessKeyModifiers;
+               // cache modifiers
+               if ( !ua ) {
+                       cachedAccessKeyModifiers = accessKeyModifiers;
+               }
+               return accessKeyModifiers;
        }
-       return accessKeyModifiers;
-}
 
-/**
- * Get the access key label for an element.
- *
- * Will use native accessKeyLabel if available (currently only in Firefox 8+),
- * falls back to #getAccessKeyModifiers.
- *
- * @private
- * @param {HTMLElement} element Element to get the label for
- * @return {string} Access key label
- */
-function getAccessKeyLabel( element ) {
-       // abort early if no access key
-       if ( !element.accessKey ) {
-               return '';
-       }
-       // use accessKeyLabel if possible
-       // https://html.spec.whatwg.org/multipage/interaction.html#dom-accesskeylabel
-       if ( !useTestPrefix && element.accessKeyLabel ) {
-               return element.accessKeyLabel;
+       /**
+        * Get the access key label for an element.
+        *
+        * Will use native accessKeyLabel if available (currently only in Firefox 8+),
+        * falls back to #getAccessKeyModifiers.
+        *
+        * @private
+        * @param {HTMLElement} element Element to get the label for
+        * @return {string} Access key label
+        */
+       function getAccessKeyLabel( element ) {
+               // abort early if no access key
+               if ( !element.accessKey ) {
+                       return '';
+               }
+               // use accessKeyLabel if possible
+               // https://html.spec.whatwg.org/multipage/interaction.html#dom-accesskeylabel
+               if ( !useTestPrefix && element.accessKeyLabel ) {
+                       return element.accessKeyLabel;
+               }
+               return ( useTestPrefix ? 'test' : getAccessKeyModifiers().join( '-' ) ) + '-' + element.accessKey;
        }
-       return ( useTestPrefix ? 'test' : getAccessKeyModifiers().join( '-' ) ) + '-' + element.accessKey;
-}
-
-/**
- * Update the title for an element (on the element with the access key or it's label) to show
- * the correct access key label.
- *
- * @private
- * @param {HTMLElement} element Element with the accesskey
- * @param {HTMLElement} titleElement Element with the title to update (may be the same as `element`)
- */
-function updateTooltipOnElement( element, titleElement ) {
-       var oldTitle, parts, regexp, newTitle, accessKeyLabel;
 
-       oldTitle = titleElement.title;
-       if ( !oldTitle ) {
-               // don't add a title if the element didn't have one before
-               return;
-       }
+       /**
+        * Update the title for an element (on the element with the access key or it's label) to show
+        * the correct access key label.
+        *
+        * @private
+        * @param {HTMLElement} element Element with the accesskey
+        * @param {HTMLElement} titleElement Element with the title to update (may be the same as `element`)
+        */
+       function updateTooltipOnElement( element, titleElement ) {
+               var oldTitle, parts, regexp, newTitle, accessKeyLabel;
+
+               oldTitle = titleElement.title;
+               if ( !oldTitle ) {
+                       // don't add a title if the element didn't have one before
+                       return;
+               }
 
-       parts = ( mw.msg( 'word-separator' ) + mw.msg( 'brackets' ) ).split( '$1' );
-       regexp = new RegExp( $.map( parts, mw.RegExp.escape ).join( '.*?' ) + '$' );
-       newTitle = oldTitle.replace( regexp, '' );
-       accessKeyLabel = getAccessKeyLabel( element );
+               parts = ( mw.msg( 'word-separator' ) + mw.msg( 'brackets' ) ).split( '$1' );
+               regexp = new RegExp( $.map( parts, mw.RegExp.escape ).join( '.*?' ) + '$' );
+               newTitle = oldTitle.replace( regexp, '' );
+               accessKeyLabel = getAccessKeyLabel( element );
 
-       if ( accessKeyLabel ) {
-               // Should be build the same as in Linker::titleAttrib
-               newTitle += mw.msg( 'word-separator' ) + mw.msg( 'brackets', accessKeyLabel );
-       }
-       if ( oldTitle !== newTitle ) {
-               titleElement.title = newTitle;
+               if ( accessKeyLabel ) {
+                       // Should be build the same as in Linker::titleAttrib
+                       newTitle += mw.msg( 'word-separator' ) + mw.msg( 'brackets', accessKeyLabel );
+               }
+               if ( oldTitle !== newTitle ) {
+                       titleElement.title = newTitle;
+               }
        }
-}
 
-/**
- * Update the title for an element to show the correct access key label.
- *
- * @private
- * @param {HTMLElement} element Element with the accesskey
- */
-function updateTooltip( element ) {
-       var id, $element, $label, $labelParent;
-       updateTooltipOnElement( element, element );
-
-       // update associated label if there is one
-       $element = $( element );
-       if ( $element.is( labelable ) ) {
-               // Search it using 'for' attribute
-               id = element.id.replace( /"/g, '\\"' );
-               if ( id ) {
-                       $label = $( 'label[for="' + id + '"]' );
-                       if ( $label.length === 1 ) {
-                               updateTooltipOnElement( element, $label[ 0 ] );
+       /**
+        * Update the title for an element to show the correct access key label.
+        *
+        * @private
+        * @param {HTMLElement} element Element with the accesskey
+        */
+       function updateTooltip( element ) {
+               var id, $element, $label, $labelParent;
+               updateTooltipOnElement( element, element );
+
+               // update associated label if there is one
+               $element = $( element );
+               if ( $element.is( labelable ) ) {
+                       // Search it using 'for' attribute
+                       id = element.id.replace( /"/g, '\\"' );
+                       if ( id ) {
+                               $label = $( 'label[for="' + id + '"]' );
+                               if ( $label.length === 1 ) {
+                                       updateTooltipOnElement( element, $label[ 0 ] );
+                               }
                        }
-               }
 
-               // Search it as parent, because the form control can also be inside the label element itself
-               $labelParent = $element.parents( 'label' );
-               if ( $labelParent.length === 1 ) {
-                       updateTooltipOnElement( element, $labelParent[ 0 ] );
+                       // Search it as parent, because the form control can also be inside the label element itself
+                       $labelParent = $element.parents( 'label' );
+                       if ( $labelParent.length === 1 ) {
+                               updateTooltipOnElement( element, $labelParent[ 0 ] );
+                       }
                }
        }
-}
-
-/**
- * Update the titles for all elements in a jQuery selection.
- *
- * @return {jQuery}
- * @chainable
- */
-$.fn.updateTooltipAccessKeys = function () {
-       return this.each( function () {
-               updateTooltip( this );
-       } );
-};
 
-/**
- * getAccessKeyModifiers
- *
- * @method updateTooltipAccessKeys_getAccessKeyModifiers
- * @inheritdoc #getAccessKeyModifiers
- */
-$.fn.updateTooltipAccessKeys.getAccessKeyModifiers = getAccessKeyModifiers;
-
-/**
- * getAccessKeyLabel
- *
- * @method updateTooltipAccessKeys_getAccessKeyLabel
- * @inheritdoc #getAccessKeyLabel
- */
-$.fn.updateTooltipAccessKeys.getAccessKeyLabel = getAccessKeyLabel;
-
-/**
- * getAccessKeyPrefix
- *
- * @method updateTooltipAccessKeys_getAccessKeyPrefix
- * @deprecated since 1.27 Use #getAccessKeyModifiers
- */
-$.fn.updateTooltipAccessKeys.getAccessKeyPrefix = function ( ua ) {
-       return getAccessKeyModifiers( ua ).join( '-' ) + '-';
-};
-
-/**
- * Switch test mode on and off.
- *
- * @method updateTooltipAccessKeys_setTestMode
- * @param {boolean} mode New mode
- */
-$.fn.updateTooltipAccessKeys.setTestMode = function ( mode ) {
-       useTestPrefix = mode;
-};
-
-/**
- * @class jQuery
- * @mixins jQuery.plugin.accessKeyLabel
- */
+       /**
+        * Update the titles for all elements in a jQuery selection.
+        *
+        * @return {jQuery}
+        * @chainable
+        */
+       $.fn.updateTooltipAccessKeys = function () {
+               return this.each( function () {
+                       updateTooltip( this );
+               } );
+       };
+
+       /**
+        * getAccessKeyModifiers
+        *
+        * @method updateTooltipAccessKeys_getAccessKeyModifiers
+        * @inheritdoc #getAccessKeyModifiers
+        */
+       $.fn.updateTooltipAccessKeys.getAccessKeyModifiers = getAccessKeyModifiers;
+
+       /**
+        * getAccessKeyLabel
+        *
+        * @method updateTooltipAccessKeys_getAccessKeyLabel
+        * @inheritdoc #getAccessKeyLabel
+        */
+       $.fn.updateTooltipAccessKeys.getAccessKeyLabel = getAccessKeyLabel;
+
+       /**
+        * getAccessKeyPrefix
+        *
+        * @method updateTooltipAccessKeys_getAccessKeyPrefix
+        * @deprecated since 1.27 Use #getAccessKeyModifiers
+        * @param {Object} [ua] An object with a 'userAgent' and 'platform' property.
+        * @return {string}
+        */
+       $.fn.updateTooltipAccessKeys.getAccessKeyPrefix = function ( ua ) {
+               return getAccessKeyModifiers( ua ).join( '-' ) + '-';
+       };
+
+       /**
+        * Switch test mode on and off.
+        *
+        * @method updateTooltipAccessKeys_setTestMode
+        * @param {boolean} mode New mode
+        */
+       $.fn.updateTooltipAccessKeys.setTestMode = function ( mode ) {
+               useTestPrefix = mode;
+       };
+
+       /**
+        * @class jQuery
+        * @mixins jQuery.plugin.accessKeyLabel
+        */
 
 }( jQuery, mediaWiki ) );
index fd7e8d1..8716b69 100644 (file)
  */
 ( function ( $ ) {
 
-var
-       // Cache ellipsed substrings for every string-width-position combination
-       cache = {},
+       var
+               // Cache ellipsed substrings for every string-width-position combination
+               cache = {},
 
-       // Use a separate cache when match highlighting is enabled
-       matchTextCache = {};
+               // Use a separate cache when match highlighting is enabled
+               matchTextCache = {};
 
-// Due to <https://github.com/jscs-dev/jscs-jsdoc/issues/136>
-// jscs:disable jsDoc
-/**
- * Automatically truncate the plain text contents of an element and add an ellipsis
- *
- * @param {Object} options
- * @param {'left'|'center'|'right'} [options.position='center'] Where to remove text.
- * @param {boolean} [options.tooltip=false] Whether to show a tooltip with the remainder
- * of the text.
- * @param {boolean} [options.restoreText=false] Whether to save the text for restoring
- * later.
- * @param {boolean} [options.hasSpan=false] Whether the element is already a container,
- * or if the library should create a new container for it.
- * @param {string|null} [options.matchText=null] Text to highlight, e.g. search terms.
- * @return {jQuery}
- * @chainable
- */
-$.fn.autoEllipsis = function ( options ) {
-       options = $.extend( {
-               position: 'center',
-               tooltip: false,
-               restoreText: false,
-               hasSpan: false,
-               matchText: null
-       }, options );
+       // Due to <https://github.com/jscs-dev/jscs-jsdoc/issues/136>
+       // jscs:disable jsDoc
+       /**
       * Automatically truncate the plain text contents of an element and add an ellipsis
       *
       * @param {Object} options
       * @param {'left'|'center'|'right'} [options.position='center'] Where to remove text.
       * @param {boolean} [options.tooltip=false] Whether to show a tooltip with the remainder
       * of the text.
       * @param {boolean} [options.restoreText=false] Whether to save the text for restoring
       * later.
       * @param {boolean} [options.hasSpan=false] Whether the element is already a container,
       * or if the library should create a new container for it.
       * @param {string|null} [options.matchText=null] Text to highlight, e.g. search terms.
       * @return {jQuery}
       * @chainable
       */
+       $.fn.autoEllipsis = function ( options ) {
+               options = $.extend( {
+                       position: 'center',
+                       tooltip: false,
+                       restoreText: false,
+                       hasSpan: false,
+                       matchText: null
+               }, options );
 
-       return this.each( function () {
-               var $trimmableText,
-                       text, trimmableText, w, pw,
-                       l, r, i, side, m,
-                       // container element - used for measuring against
-                       $container = $( this );
+               return this.each( function () {
+                       var $trimmableText,
+                               text, trimmableText, w, pw,
+                               l, r, i, side, m,
+                               // container element - used for measuring against
+                               $container = $( this );
 
-               if ( options.restoreText ) {
-                       if ( !$container.data( 'autoEllipsis.originalText' ) ) {
-                               $container.data( 'autoEllipsis.originalText', $container.text() );
-                       } else {
-                               $container.text( $container.data( 'autoEllipsis.originalText' ) );
+                       if ( options.restoreText ) {
+                               if ( !$container.data( 'autoEllipsis.originalText' ) ) {
+                                       $container.data( 'autoEllipsis.originalText', $container.text() );
+                               } else {
+                                       $container.text( $container.data( 'autoEllipsis.originalText' ) );
+                               }
                        }
-               }
 
-               // trimmable text element - only the text within this element will be trimmed
-               if ( options.hasSpan ) {
-                       $trimmableText = $container.children( options.selector );
-               } else {
-                       $trimmableText = $( '<span>' )
-                               .css( 'whiteSpace', 'nowrap' )
-                               .text( $container.text() );
-                       $container
-                               .empty()
-                               .append( $trimmableText );
-               }
+                       // trimmable text element - only the text within this element will be trimmed
+                       if ( options.hasSpan ) {
+                               $trimmableText = $container.children( options.selector );
+                       } else {
+                               $trimmableText = $( '<span>' )
+                                       .css( 'whiteSpace', 'nowrap' )
+                                       .text( $container.text() );
+                               $container
+                                       .empty()
+                                       .append( $trimmableText );
+                       }
 
-               text = $container.text();
-               trimmableText = $trimmableText.text();
-               w = $container.width();
-               pw = 0;
+                       text = $container.text();
+                       trimmableText = $trimmableText.text();
+                       w = $container.width();
+                       pw = 0;
 
-               // Try cache
-               if ( options.matchText ) {
-                       if ( !( text in matchTextCache ) ) {
-                               matchTextCache[ text ] = {};
-                       }
-                       if ( !( options.matchText in matchTextCache[ text ] ) ) {
-                               matchTextCache[ text ][ options.matchText ] = {};
-                       }
-                       if ( !( w in matchTextCache[ text ][ options.matchText ] ) ) {
-                               matchTextCache[ text ][ options.matchText ][ w ] = {};
-                       }
-                       if ( options.position in matchTextCache[ text ][ options.matchText ][ w ] ) {
-                               $container.html( matchTextCache[ text ][ options.matchText ][ w ][ options.position ] );
-                               if ( options.tooltip ) {
-                                       $container.attr( 'title', text );
+                       // Try cache
+                       if ( options.matchText ) {
+                               if ( !( text in matchTextCache ) ) {
+                                       matchTextCache[ text ] = {};
                                }
-                               return;
-                       }
-               } else {
-                       if ( !( text in cache ) ) {
-                               cache[ text ] = {};
-                       }
-                       if ( !( w in cache[ text ] ) ) {
-                               cache[ text ][ w ] = {};
-                       }
-                       if ( options.position in cache[ text ][ w ] ) {
-                               $container.html( cache[ text ][ w ][ options.position ] );
-                               if ( options.tooltip ) {
-                                       $container.attr( 'title', text );
+                               if ( !( options.matchText in matchTextCache[ text ] ) ) {
+                                       matchTextCache[ text ][ options.matchText ] = {};
+                               }
+                               if ( !( w in matchTextCache[ text ][ options.matchText ] ) ) {
+                                       matchTextCache[ text ][ options.matchText ][ w ] = {};
+                               }
+                               if ( options.position in matchTextCache[ text ][ options.matchText ][ w ] ) {
+                                       $container.html( matchTextCache[ text ][ options.matchText ][ w ][ options.position ] );
+                                       if ( options.tooltip ) {
+                                               $container.attr( 'title', text );
+                                       }
+                                       return;
+                               }
+                       } else {
+                               if ( !( text in cache ) ) {
+                                       cache[ text ] = {};
+                               }
+                               if ( !( w in cache[ text ] ) ) {
+                                       cache[ text ][ w ] = {};
+                               }
+                               if ( options.position in cache[ text ][ w ] ) {
+                                       $container.html( cache[ text ][ w ][ options.position ] );
+                                       if ( options.tooltip ) {
+                                               $container.attr( 'title', text );
+                                       }
+                                       return;
                                }
-                               return;
                        }
-               }
 
-               if ( $trimmableText.width() + pw > w ) {
-                       switch ( options.position ) {
-                               case 'right':
-                                       // Use binary search-like technique for efficiency
-                                       l = 0;
-                                       r = trimmableText.length;
-                                       do {
-                                               m = Math.ceil( ( l + r ) / 2 );
-                                               $trimmableText.text( trimmableText.slice( 0, m ) + '...' );
-                                               if ( $trimmableText.width() + pw > w ) {
-                                                       // Text is too long
-                                                       r = m - 1;
-                                               } else {
-                                                       l = m;
+                       if ( $trimmableText.width() + pw > w ) {
+                               switch ( options.position ) {
+                                       case 'right':
+                                               // Use binary search-like technique for efficiency
+                                               l = 0;
+                                               r = trimmableText.length;
+                                               do {
+                                                       m = Math.ceil( ( l + r ) / 2 );
+                                                       $trimmableText.text( trimmableText.slice( 0, m ) + '...' );
+                                                       if ( $trimmableText.width() + pw > w ) {
+                                                               // Text is too long
+                                                               r = m - 1;
+                                                       } else {
+                                                               l = m;
+                                                       }
+                                               } while ( l < r );
+                                               $trimmableText.text( trimmableText.slice( 0, l ) + '...' );
+                                               break;
+                                       case 'center':
+                                               // TODO: Use binary search like for 'right'
+                                               i = [ Math.round( trimmableText.length / 2 ), Math.round( trimmableText.length / 2 ) ];
+                                               // Begin with making the end shorter
+                                               side = 1;
+                                               while ( $trimmableText.outerWidth() + pw > w && i[ 0 ] > 0 ) {
+                                                       $trimmableText.text( trimmableText.slice( 0, i[ 0 ] ) + '...' + trimmableText.slice( i[ 1 ] ) );
+                                                       // Alternate between trimming the end and begining
+                                                       if ( side === 0 ) {
+                                                               // Make the begining shorter
+                                                               i[ 0 ]--;
+                                                               side = 1;
+                                                       } else {
+                                                               // Make the end shorter
+                                                               i[ 1 ]++;
+                                                               side = 0;
+                                                       }
                                                }
-                                       } while ( l < r );
-                                       $trimmableText.text( trimmableText.slice( 0, l ) + '...' );
-                                       break;
-                               case 'center':
-                                       // TODO: Use binary search like for 'right'
-                                       i = [ Math.round( trimmableText.length / 2 ), Math.round( trimmableText.length / 2 ) ];
-                                       // Begin with making the end shorter
-                                       side = 1;
-                                       while ( $trimmableText.outerWidth() + pw > w && i[ 0 ] > 0 ) {
-                                               $trimmableText.text( trimmableText.slice( 0, i[ 0 ] ) + '...' + trimmableText.slice( i[ 1 ] ) );
-                                               // Alternate between trimming the end and begining
-                                               if ( side === 0 ) {
-                                                       // Make the begining shorter
-                                                       i[ 0 ]--;
-                                                       side = 1;
-                                               } else {
-                                                       // Make the end shorter
-                                                       i[ 1 ]++;
-                                                       side = 0;
+                                               break;
+                                       case 'left':
+                                               // TODO: Use binary search like for 'right'
+                                               r = 0;
+                                               while ( $trimmableText.outerWidth() + pw > w && r < trimmableText.length ) {
+                                                       $trimmableText.text( '...' + trimmableText.slice( r ) );
+                                                       r++;
                                                }
-                                       }
-                                       break;
-                               case 'left':
-                                       // TODO: Use binary search like for 'right'
-                                       r = 0;
-                                       while ( $trimmableText.outerWidth() + pw > w && r < trimmableText.length ) {
-                                               $trimmableText.text( '...' + trimmableText.slice( r ) );
-                                               r++;
-                                       }
-                                       break;
+                                               break;
+                               }
+                       }
+                       if ( options.tooltip ) {
+                               $container.attr( 'title', text );
+                       }
+                       if ( options.matchText ) {
+                               $container.highlightText( options.matchText );
+                               matchTextCache[ text ][ options.matchText ][ w ][ options.position ] = $container.html();
+                       } else {
+                               cache[ text ][ w ][ options.position ] = $container.html();
                        }
-               }
-               if ( options.tooltip ) {
-                       $container.attr( 'title', text );
-               }
-               if ( options.matchText ) {
-                       $container.highlightText( options.matchText );
-                       matchTextCache[ text ][ options.matchText ][ w ][ options.position ] = $container.html();
-               } else {
-                       cache[ text ][ w ][ options.position ] = $container.html();
-               }
 
-       } );
-};
-// jscs:enable jsDoc
+               } );
+       };
+       // jscs:enable jsDoc
 
-/**
- * @class jQuery
- * @mixins jQuery.plugin.autoEllipsis
- */
+       /**
       * @class jQuery
       * @mixins jQuery.plugin.autoEllipsis
       */
 
 }( jQuery ) );
index b1692bb..567bec8 100644 (file)
@@ -3,6 +3,17 @@
  */
 ( function ( $ ) {
 
+       var eventKeys = [
+               'keyup.byteLimit',
+               'keydown.byteLimit',
+               'change.byteLimit',
+               'mouseup.byteLimit',
+               'cut.byteLimit',
+               'paste.byteLimit',
+               'focus.byteLimit',
+               'blur.byteLimit'
+       ].join( ' ' );
+
        /**
         * Utility function to trim down a string, based on byteLimit
         * and given a safe start position. It supports insertion anywhere
                };
        };
 
-       var eventKeys = [
-               'keyup.byteLimit',
-               'keydown.byteLimit',
-               'change.byteLimit',
-               'mouseup.byteLimit',
-               'cut.byteLimit',
-               'paste.byteLimit',
-               'focus.byteLimit',
-               'blur.byteLimit'
-       ].join( ' ' );
-
        /**
         * Enforces a byte limit on an input field, so that UTF-8 entries are counted as well,
         * when, for example, a database field has a byte limit rather than a character limit.
index a3cc8fc..70dc105 100644 (file)
@@ -10,7 +10,6 @@
 ( function ( $ ) {
 
        function getColor( elem, attr ) {
-               /*jshint boss:true */
                var color;
 
                do {
@@ -22,6 +21,7 @@
                        }
 
                        attr = 'backgroundColor';
+               // eslint-disable-next-line no-cond-assign
                } while ( elem = elem.parentNode );
 
                return $.colorUtil.getRGB( color );
index c14f2c8..c53ec3b 100644 (file)
@@ -23,7 +23,6 @@
                 * @return {Array}
                 */
                getRGB: function ( color ) {
-                       /*jshint boss:true */
                        var result;
 
                        // Check if we're already dealing with an array of colors
@@ -32,6 +31,7 @@
                        }
 
                        // Look for rgb(num,num,num)
+                       // eslint-disable-next-line no-cond-assign
                        if ( result = /rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec( color ) ) {
                                return [
                                        parseInt( result[ 1 ], 10 ),
@@ -41,6 +41,7 @@
                        }
 
                        // Look for rgb(num%,num%,num%)
+                       // eslint-disable-next-line no-cond-assign
                        if ( result = /rgb\(\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*,\s*([0-9]+(?:\.[0-9]+)?)\%\s*\)/.exec( color ) ) {
                                return [
                                        parseFloat( result[ 1 ] ) * 2.55,
@@ -50,6 +51,7 @@
                        }
 
                        // Look for #a0b1c2
+                       // eslint-disable-next-line no-cond-assign
                        if ( result = /#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec( color ) ) {
                                return [
                                        parseInt( result[ 1 ], 16 ),
@@ -59,6 +61,7 @@
                        }
 
                        // Look for #fff
+                       // eslint-disable-next-line no-cond-assign
                        if ( result = /#([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/.exec( color ) ) {
                                return [
                                        parseInt( result[ 1 ] + result[ 1 ], 16 ),
@@ -68,6 +71,7 @@
                        }
 
                        // Look for rgba(0, 0, 0, 0) == transparent in Safari 3
+                       // eslint-disable-next-line no-cond-assign
                        if ( result = /rgba\(0, 0, 0, 0\)/.exec( color ) ) {
                                return $.colorUtil.colors.transparent;
                        }
                 * @return {number[]} The HSL representation
                 */
                rgbToHsl: function ( r, g, b ) {
+                       var d, h, s, l, min, max;
+
                        r = r / 255;
                        g = g / 255;
                        b = b / 255;
 
-                       var d,
-                               max = Math.max( r, g, b ),
-                               min = Math.min( r, g, b ),
-                               h,
-                               s,
-                               l = ( max + min ) / 2;
+                       max = Math.max( r, g, b );
+                       min = Math.min( r, g, b );
+                       l = ( max + min ) / 2;
 
                        if ( max === min ) {
                                // achromatic
index 1ecce6c..7931c81 100644 (file)
@@ -12,6 +12,7 @@
                return data;
        };
 
+       // eslint-disable-next-line valid-jsdoc
        /**
         * Enable inline confirmation for given clickable element (like `<a />` or `<button />`).
         *
index f9db72f..0bfa8f3 100644 (file)
@@ -19,6 +19,9 @@
        $.expandableField = {
                /**
                 * Expand the field, make the callback
+                *
+                * @param {jQuery.Event} e Event
+                * @param {Object} context
                 */
                expandField: function ( e, context ) {
                        context.config.beforeExpand.call( context.data.$field, context );
@@ -29,6 +32,9 @@
                },
                /**
                 * Condense the field, make the callback
+                *
+                * @param {jQuery.Event} e Event
+                * @param {Object} context
                 */
                condenseField: function ( e, context ) {
                        context.config.beforeCondense.call( context.data.$field, context );
index 7d308f8..7a7109c 100644 (file)
  */
 ( function ( $ ) {
 
-/**
- * Get reported or approximate device pixel ratio.
- *
- * - 1.0 means 1 CSS pixel is 1 hardware pixel
- * - 2.0 means 1 CSS pixel is 2 hardware pixels
- * - etc.
- *
- * Uses `window.devicePixelRatio` if available, or CSS media queries on IE.
- *
- * @static
- * @inheritable
- * @return {number} Device pixel ratio
- */
-$.devicePixelRatio = function () {
-       if ( window.devicePixelRatio !== undefined ) {
-               // Most web browsers:
-               // * WebKit/Blink (Safari, Chrome, Android browser, etc)
-               // * Opera
-               // * Firefox 18+
-               // * Microsoft Edge (Windows 10)
-               return window.devicePixelRatio;
-       } else if ( window.msMatchMedia !== undefined ) {
-               // Windows 8 desktops / tablets, probably Windows Phone 8
-               //
-               // IE 10/11 doesn't report pixel ratio directly, but we can get the
-               // screen DPI and divide by 96. We'll bracket to [1, 1.5, 2.0] for
-               // simplicity, but you may get different values depending on zoom
-               // factor, size of screen and orientation in Metro IE.
-               if ( window.msMatchMedia( '(min-resolution: 192dpi)' ).matches ) {
+       /**
+        * Get reported or approximate device pixel ratio.
+        *
+        * - 1.0 means 1 CSS pixel is 1 hardware pixel
+        * - 2.0 means 1 CSS pixel is 2 hardware pixels
+        * - etc.
+        *
+        * Uses `window.devicePixelRatio` if available, or CSS media queries on IE.
+        *
+        * @static
+        * @inheritable
+        * @return {number} Device pixel ratio
+        */
+       $.devicePixelRatio = function () {
+               if ( window.devicePixelRatio !== undefined ) {
+                       // Most web browsers:
+                       // * WebKit/Blink (Safari, Chrome, Android browser, etc)
+                       // * Opera
+                       // * Firefox 18+
+                       // * Microsoft Edge (Windows 10)
+                       return window.devicePixelRatio;
+               } else if ( window.msMatchMedia !== undefined ) {
+                       // Windows 8 desktops / tablets, probably Windows Phone 8
+                       //
+                       // IE 10/11 doesn't report pixel ratio directly, but we can get the
+                       // screen DPI and divide by 96. We'll bracket to [1, 1.5, 2.0] for
+                       // simplicity, but you may get different values depending on zoom
+                       // factor, size of screen and orientation in Metro IE.
+                       if ( window.msMatchMedia( '(min-resolution: 192dpi)' ).matches ) {
+                               return 2;
+                       } else if ( window.msMatchMedia( '(min-resolution: 144dpi)' ).matches ) {
+                               return 1.5;
+                       } else {
+                               return 1;
+                       }
+               } else {
+                       // Legacy browsers...
+                       // Assume 1 if unknown.
+                       return 1;
+               }
+       };
+
+       /**
+        * Bracket a given device pixel ratio to one of [1, 1.5, 2].
+        *
+        * This is useful for grabbing images on the fly with sizes based on the display
+        * density, without causing slowdown and extra thumbnail renderings on devices
+        * that are slightly different from the most common sizes.
+        *
+        * The bracketed ratios match the default 'srcset' output on MediaWiki thumbnails,
+        * so will be consistent with default renderings.
+        *
+        * @static
+        * @inheritable
+        * @param {number} baseRatio Base ratio
+        * @return {number} Device pixel ratio
+        */
+       $.bracketDevicePixelRatio = function ( baseRatio ) {
+               if ( baseRatio > 1.5 ) {
                        return 2;
-               } else if ( window.msMatchMedia( '(min-resolution: 144dpi)' ).matches ) {
+               } else if ( baseRatio > 1 ) {
                        return 1.5;
                } else {
                        return 1;
                }
-       } else {
-               // Legacy browsers...
-               // Assume 1 if unknown.
-               return 1;
-       }
-};
-
-/**
- * Bracket a given device pixel ratio to one of [1, 1.5, 2].
- *
- * This is useful for grabbing images on the fly with sizes based on the display
- * density, without causing slowdown and extra thumbnail renderings on devices
- * that are slightly different from the most common sizes.
- *
- * The bracketed ratios match the default 'srcset' output on MediaWiki thumbnails,
- * so will be consistent with default renderings.
- *
- * @static
- * @inheritable
- * @return {number} Device pixel ratio
- */
-$.bracketDevicePixelRatio = function ( baseRatio ) {
-       if ( baseRatio > 1.5 ) {
-               return 2;
-       } else if ( baseRatio > 1 ) {
-               return 1.5;
-       } else {
-               return 1;
-       }
-};
+       };
 
-/**
- * Get reported or approximate device pixel ratio, bracketed to [1, 1.5, 2].
- *
- * This is useful for grabbing images on the fly with sizes based on the display
- * density, without causing slowdown and extra thumbnail renderings on devices
- * that are slightly different from the most common sizes.
- *
- * The bracketed ratios match the default 'srcset' output on MediaWiki thumbnails,
- * so will be consistent with default renderings.
- *
- * - 1.0 means 1 CSS pixel is 1 hardware pixel
- * - 1.5 means 1 CSS pixel is 1.5 hardware pixels
- * - 2.0 means 1 CSS pixel is 2 hardware pixels
- *
- * @static
- * @inheritable
- * @return {number} Device pixel ratio
- */
-$.bracketedDevicePixelRatio = function () {
-       return $.bracketDevicePixelRatio( $.devicePixelRatio() );
-};
+       /**
       * Get reported or approximate device pixel ratio, bracketed to [1, 1.5, 2].
       *
       * This is useful for grabbing images on the fly with sizes based on the display
       * density, without causing slowdown and extra thumbnail renderings on devices
       * that are slightly different from the most common sizes.
       *
       * The bracketed ratios match the default 'srcset' output on MediaWiki thumbnails,
       * so will be consistent with default renderings.
       *
       * - 1.0 means 1 CSS pixel is 1 hardware pixel
       * - 1.5 means 1 CSS pixel is 1.5 hardware pixels
       * - 2.0 means 1 CSS pixel is 2 hardware pixels
       *
       * @static
       * @inheritable
       * @return {number} Device pixel ratio
       */
+       $.bracketedDevicePixelRatio = function () {
+               return $.bracketDevicePixelRatio( $.devicePixelRatio() );
+       };
 
-/**
- * Implement responsive images based on srcset attributes, if browser has no
- * native srcset support.
- *
- * @return {jQuery} This selection
- * @chainable
- */
-$.fn.hidpi = function () {
-       var $target = this,
-               // TODO add support for dpi media query checks on Firefox, IE
-               devicePixelRatio = $.devicePixelRatio(),
-               testImage = new Image();
+       /**
       * Implement responsive images based on srcset attributes, if browser has no
       * native srcset support.
       *
       * @return {jQuery} This selection
       * @chainable
       */
+       $.fn.hidpi = function () {
+               var $target = this,
+                       // TODO add support for dpi media query checks on Firefox, IE
+                       devicePixelRatio = $.devicePixelRatio(),
+                       testImage = new Image();
 
-       if ( devicePixelRatio > 1 && testImage.srcset === undefined ) {
-               // No native srcset support.
-               $target.find( 'img' ).each( function () {
-                       var $img = $( this ),
-                               srcset = $img.attr( 'srcset' ),
-                               match;
-                       if ( typeof srcset === 'string' && srcset !== '' ) {
-                               match = $.matchSrcSet( devicePixelRatio, srcset );
-                               if ( match !== null ) {
-                                       $img.attr( 'src', match );
+               if ( devicePixelRatio > 1 && testImage.srcset === undefined ) {
+                       // No native srcset support.
+                       $target.find( 'img' ).each( function () {
+                               var $img = $( this ),
+                                       srcset = $img.attr( 'srcset' ),
+                                       match;
+                               if ( typeof srcset === 'string' && srcset !== '' ) {
+                                       match = $.matchSrcSet( devicePixelRatio, srcset );
+                                       if ( match !== null ) {
+                                               $img.attr( 'src', match );
+                                       }
                                }
-                       }
-               } );
-       }
+                       } );
+               }
 
-       return $target;
-};
+               return $target;
+       };
 
-/**
- * Match a srcset entry for the given device pixel ratio
- *
- * Exposed for testing.
- *
- * @private
- * @static
- * @param {number} devicePixelRatio
- * @param {string} srcset
- * @return {Mixed} null or the matching src string
- */
-$.matchSrcSet = function ( devicePixelRatio, srcset ) {
-       var candidates,
-               candidate,
-               bits,
-               src,
-               i,
-               ratioStr,
-               ratio,
-               selectedRatio = 1,
-               selectedSrc = null;
-       candidates = srcset.split( / *, */ );
-       for ( i = 0; i < candidates.length; i++ ) {
-               candidate = candidates[ i ];
-               bits = candidate.split( / +/ );
-               src = bits[ 0 ];
-               if ( bits.length > 1 && bits[ 1 ].charAt( bits[ 1 ].length - 1 ) === 'x' ) {
-                       ratioStr = bits[ 1 ].slice( 0, -1 );
-                       ratio = parseFloat( ratioStr );
-                       if ( ratio <= devicePixelRatio && ratio > selectedRatio ) {
-                               selectedRatio = ratio;
-                               selectedSrc = src;
+       /**
+        * Match a srcset entry for the given device pixel ratio
+        *
+        * Exposed for testing.
+        *
+        * @private
+        * @static
+        * @param {number} devicePixelRatio
+        * @param {string} srcset
+        * @return {Mixed} null or the matching src string
+        */
+       $.matchSrcSet = function ( devicePixelRatio, srcset ) {
+               var candidates,
+                       candidate,
+                       bits,
+                       src,
+                       i,
+                       ratioStr,
+                       ratio,
+                       selectedRatio = 1,
+                       selectedSrc = null;
+               candidates = srcset.split( / *, */ );
+               for ( i = 0; i < candidates.length; i++ ) {
+                       candidate = candidates[ i ];
+                       bits = candidate.split( / +/ );
+                       src = bits[ 0 ];
+                       if ( bits.length > 1 && bits[ 1 ].charAt( bits[ 1 ].length - 1 ) === 'x' ) {
+                               ratioStr = bits[ 1 ].slice( 0, -1 );
+                               ratio = parseFloat( ratioStr );
+                               if ( ratio <= devicePixelRatio && ratio > selectedRatio ) {
+                                       selectedRatio = ratio;
+                                       selectedSrc = src;
+                               }
                        }
                }
-       }
-       return selectedSrc;
-};
+               return selectedSrc;
+       };
 
-/**
- * @class jQuery
- * @mixins jQuery.plugin.hidpi
- */
+       /**
       * @class jQuery
       * @mixins jQuery.plugin.hidpi
       */
 
 }( jQuery ) );
index e37f19b..3feca81 100644 (file)
                                        // replace the matched node, with our span-wrapped clone of the matched node
                                        middlebit.parentNode.replaceChild( spannode, middlebit );
                                }
-                       } else if ( node.nodeType === Node.ELEMENT_NODE
+                       } else if (
+                               node.nodeType === Node.ELEMENT_NODE &&
                                // element with childnodes, and not a script, style or an element we created
-                               && node.childNodes
-                               && !/(script|style)/i.test( node.tagName )
-                               && !( node.tagName.toLowerCase() === 'span'
-                                       && node.className.match( /\bhighlight/ )
+                               node.childNodes &&
+                               !/(script|style)/i.test( node.tagName ) &&
+                               !(
+                                       node.tagName.toLowerCase() === 'span' &&
+                                       node.className.match( /\bhighlight/ )
                                )
                        ) {
                                for ( i = 0; i < node.childNodes.length; ++i ) {
index f5932b2..05b3891 100644 (file)
  */
 ( function ( $, mw ) {
 
-/**
- * Gets a localized message, using parameters from options if present.
- *
- * @ignore
- * @param {Object} options
- * @param {string} key
- * @return {string} Localized message
- */
-function msg( options, key ) {
-       var args = options.params[ key ] || [];
-       // Format: mw.msg( key [, p1, p2, ...] )
-       args.unshift( options.prefix + ( options.keys[ key ] || key ) );
-       return mw.msg.apply( mw, args );
-}
+       /**
       * Gets a localized message, using parameters from options if present.
       *
       * @ignore
       * @param {Object} options
       * @param {string} key
       * @return {string} Localized message
       */
+       function msg( options, key ) {
+               var args = options.params[ key ] || [];
+               // Format: mw.msg( key [, p1, p2, ...] )
+               args.unshift( options.prefix + ( options.keys[ key ] || key ) );
+               return mw.msg.apply( mw, args );
+       }
 
-/**
- * Localizes a DOM selection by replacing <html:msg /> elements with localized text and adding
- * localized title and alt attributes to elements with title-msg and alt-msg attributes
- * respectively.
- *
- * Call on a selection of HTML which contains `<html:msg key="message-key" />` elements or elements
- * with title-msg="message-key", alt-msg="message-key" or placeholder-msg="message-key" attributes.
- * `<html:msg />` elements will be replaced with localized text, *-msg attributes will be replaced
- * with attributes that do not have the "-msg" suffix and contain a localized message.
- *
- * Example:
- *     // Messages: { 'title': 'Awesome', 'desc': 'Cat doing backflip' 'search' contains 'Search' }
- *     var html = '\
- *         <p>\
- *             <html:msg key="title" />\
- *             <img src="something.jpg" title-msg="title" alt-msg="desc" />\
- *             <input type="text" placeholder-msg="search" />\
- *         </p>';
- *     $( 'body' ).append( $( html ).localize() );
- *
- * Appends something like this to the body...
- *     <p>
- *         Awesome
- *         <img src="something.jpg" title="Awesome" alt="Cat doing backflip" />
- *         <input type="text" placeholder="Search" />
- *     </p>
- *
- * Arguments can be passed into uses of a message using the params property of the options object
- * given to .localize(). Multiple messages can be given parameters, because the params property is
- * an object keyed by the message key to apply the parameters to, each containing an array of
- * parameters to use. The limitation is that you can not use different parameters to individual uses
- * of a message in the same selection being localized - they will all recieve the same parameters.
- *
- * Example:
- *     // Messages: { 'easy-as': 'Easy as $1 $2 $3.' }
- *     var html = '<p><html:msg key="easy-as" /></p>';
- *     $( 'body' ).append( $( html ).localize( { 'params': { 'easy-as': ['a', 'b', 'c'] } } ) );
- *
- * Appends something like this to the body...
- *     <p>Easy as a, b, c</p>
- *
- * Raw HTML content can be used, instead of it being escaped as text. To do this, just use the raw
- * attribute on a msg element.
- *
- * Example:
- *     // Messages: { 'hello': '<b><i>Hello</i> $1!</b>' }
- *     var html = '\
- *         <p>\
- *             <!-- escaped: --><html:msg key="hello" />\
- *             <!-- raw: --><html:msg key="hello" raw />\
- *         </p>';
- *     $( 'body' ).append( $( html ).localize( { 'params': { 'hello': ['world'] } } ) );
- *
- * Appends something like this to the body...
- *     <p>
- *         <!-- escaped: -->&lt;b&gt;&lt;i&gt;Hello&lt;/i&gt; world!&lt;/b&gt;
- *         <!-- raw: --><b><i>Hello</i> world!</b>
- *     </p>
- *
- * Message keys can also be remapped, allowing the same generic template to be used with a variety
- * of messages. This is important for improving re-usability of templates.
- *
- * Example:
- *     // Messages: { 'good-afternoon': 'Good afternoon' }
- *     var html = '<p><html:msg key="greeting" /></p>';
- *     $( 'body' ).append( $( html ).localize( { 'keys': { 'greeting': 'good-afternoon' } } ) );
- *
- * Appends something like this to the body...
- *     <p>Good afternoon</p>
- *
- * Message keys can also be prefixed globally, which is handy when writing extensions, where by
- * convention all messages are prefixed with the extension's name.
- *
- * Example:
- *     // Messages: { 'teleportation-warning': 'You may not get there all in one piece.' }
- *     var html = '<p><html:msg key="warning" /></p>';
- *     $( 'body' ).append( $( html ).localize( { 'prefix': 'teleportation-' } ) );
- *
- * Appends something like this to the body...
- *     <p>You may not get there all in one piece.</p>
- *
- * @param {Object} options Map of options to be used while localizing
- * @param {string} options.prefix String to prepend to all message keys
- * @param {Object} options.keys Message key aliases, used for remapping keys to a template
- * @param {Object} options.params Lists of parameters to use with certain message keys
- * @return {jQuery}
- * @chainable
- */
-$.fn.localize = function ( options ) {
-       var $target = this,
-               attributes = [ 'title', 'alt', 'placeholder' ];
+       /**
       * Localizes a DOM selection by replacing <html:msg /> elements with localized text and adding
       * localized title and alt attributes to elements with title-msg and alt-msg attributes
       * respectively.
       *
       * Call on a selection of HTML which contains `<html:msg key="message-key" />` elements or elements
       * with title-msg="message-key", alt-msg="message-key" or placeholder-msg="message-key" attributes.
       * `<html:msg />` elements will be replaced with localized text, *-msg attributes will be replaced
       * with attributes that do not have the "-msg" suffix and contain a localized message.
       *
       * Example:
       *     // Messages: { 'title': 'Awesome', 'desc': 'Cat doing backflip' 'search' contains 'Search' }
       *     var html = '\
       *         <p>\
       *             <html:msg key="title" />\
       *             <img src="something.jpg" title-msg="title" alt-msg="desc" />\
       *             <input type="text" placeholder-msg="search" />\
       *         </p>';
       *     $( 'body' ).append( $( html ).localize() );
       *
       * Appends something like this to the body...
       *     <p>
       *         Awesome
       *         <img src="something.jpg" title="Awesome" alt="Cat doing backflip" />
       *         <input type="text" placeholder="Search" />
       *     </p>
       *
       * Arguments can be passed into uses of a message using the params property of the options object
       * given to .localize(). Multiple messages can be given parameters, because the params property is
       * an object keyed by the message key to apply the parameters to, each containing an array of
       * parameters to use. The limitation is that you can not use different parameters to individual uses
       * of a message in the same selection being localized - they will all recieve the same parameters.
       *
       * Example:
       *     // Messages: { 'easy-as': 'Easy as $1 $2 $3.' }
       *     var html = '<p><html:msg key="easy-as" /></p>';
       *     $( 'body' ).append( $( html ).localize( { 'params': { 'easy-as': ['a', 'b', 'c'] } } ) );
       *
       * Appends something like this to the body...
       *     <p>Easy as a, b, c</p>
       *
       * Raw HTML content can be used, instead of it being escaped as text. To do this, just use the raw
       * attribute on a msg element.
       *
       * Example:
       *     // Messages: { 'hello': '<b><i>Hello</i> $1!</b>' }
       *     var html = '\
       *         <p>\
       *             <!-- escaped: --><html:msg key="hello" />\
       *             <!-- raw: --><html:msg key="hello" raw />\
       *         </p>';
       *     $( 'body' ).append( $( html ).localize( { 'params': { 'hello': ['world'] } } ) );
       *
       * Appends something like this to the body...
       *     <p>
       *         <!-- escaped: -->&lt;b&gt;&lt;i&gt;Hello&lt;/i&gt; world!&lt;/b&gt;
       *         <!-- raw: --><b><i>Hello</i> world!</b>
       *     </p>
       *
       * Message keys can also be remapped, allowing the same generic template to be used with a variety
       * of messages. This is important for improving re-usability of templates.
       *
       * Example:
       *     // Messages: { 'good-afternoon': 'Good afternoon' }
       *     var html = '<p><html:msg key="greeting" /></p>';
       *     $( 'body' ).append( $( html ).localize( { 'keys': { 'greeting': 'good-afternoon' } } ) );
       *
       * Appends something like this to the body...
       *     <p>Good afternoon</p>
       *
       * Message keys can also be prefixed globally, which is handy when writing extensions, where by
       * convention all messages are prefixed with the extension's name.
       *
       * Example:
       *     // Messages: { 'teleportation-warning': 'You may not get there all in one piece.' }
       *     var html = '<p><html:msg key="warning" /></p>';
       *     $( 'body' ).append( $( html ).localize( { 'prefix': 'teleportation-' } ) );
       *
       * Appends something like this to the body...
       *     <p>You may not get there all in one piece.</p>
       *
       * @param {Object} options Map of options to be used while localizing
       * @param {string} options.prefix String to prepend to all message keys
       * @param {Object} options.keys Message key aliases, used for remapping keys to a template
       * @param {Object} options.params Lists of parameters to use with certain message keys
       * @return {jQuery}
       * @chainable
       */
+       $.fn.localize = function ( options ) {
+               var $target = this,
+                       attributes = [ 'title', 'alt', 'placeholder' ];
 
-       // Extend options
-       options = $.extend( {
-               prefix: '',
-               keys: {},
-               params: {}
-       }, options );
+               // Extend options
+               options = $.extend( {
+                       prefix: '',
+                       keys: {},
+                       params: {}
+               }, options );
 
-       // Elements
-       // Ok, so here's the story on this selector. In IE 6/7, searching for 'msg' turns up the
-       // 'html:msg', but searching for 'html:msg' doesn't. In later IE and other browsers, searching
-       // for 'html:msg' turns up the 'html:msg', but searching for 'msg' doesn't. So searching for
-       // both 'msg' and 'html:msg' seems to get the job done. This feels pretty icky, though.
-       $target.find( 'msg,html\\:msg' ).each( function () {
-               var $el = $( this );
-               // Escape by default
-               if ( $el.attr( 'raw' ) ) {
-                       $el.html( msg( options, $el.attr( 'key' ) ) );
-               } else {
-                       $el.text( msg( options, $el.attr( 'key' ) ) );
-               }
-               // Remove wrapper
-               $el.replaceWith( $el.html() );
-       } );
-
-       // Attributes
-       // Note: there's no way to prevent escaping of values being injected into attributes, this is
-       // on purpose, not a design flaw.
-       $.each( attributes, function ( i, attr ) {
-               var msgAttr = attr + '-msg';
-               $target.find( '[' + msgAttr + ']' ).each( function () {
+               // Elements
+               // Ok, so here's the story on this selector. In IE 6/7, searching for 'msg' turns up the
+               // 'html:msg', but searching for 'html:msg' doesn't. In later IE and other browsers, searching
+               // for 'html:msg' turns up the 'html:msg', but searching for 'msg' doesn't. So searching for
+               // both 'msg' and 'html:msg' seems to get the job done. This feels pretty icky, though.
+               $target.find( 'msg,html\\:msg' ).each( function () {
                        var $el = $( this );
-                       $el.attr( attr, msg( options, $el.attr( msgAttr ) ) ).removeAttr( msgAttr );
+                       // Escape by default
+                       if ( $el.attr( 'raw' ) ) {
+                               $el.html( msg( options, $el.attr( 'key' ) ) );
+                       } else {
+                               $el.text( msg( options, $el.attr( 'key' ) ) );
+                       }
+                       // Remove wrapper
+                       $el.replaceWith( $el.html() );
                } );
-       } );
 
-       // HTML, Text for elements which cannot have children e.g. OPTION
-       $target.find( '[data-msg-text]' ).each( function () {
-               var $el = $( this );
-               $el.text( msg( options, $el.attr( 'data-msg-text' ) ) );
-       } );
+               // Attributes
+               // Note: there's no way to prevent escaping of values being injected into attributes, this is
+               // on purpose, not a design flaw.
+               $.each( attributes, function ( i, attr ) {
+                       var msgAttr = attr + '-msg';
+                       $target.find( '[' + msgAttr + ']' ).each( function () {
+                               var $el = $( this );
+                               $el.attr( attr, msg( options, $el.attr( msgAttr ) ) ).removeAttr( msgAttr );
+                       } );
+               } );
 
-       $target.find( '[data-msg-html]' ).each( function () {
-               var $el = $( this );
-               $el.html( msg( options, $el.attr( 'data-msg-html' ) ) );
-       } );
+               // HTML, Text for elements which cannot have children e.g. OPTION
+               $target.find( '[data-msg-text]' ).each( function () {
+                       var $el = $( this );
+                       $el.text( msg( options, $el.attr( 'data-msg-text' ) ) );
+               } );
+
+               $target.find( '[data-msg-html]' ).each( function () {
+                       var $el = $( this );
+                       $el.html( msg( options, $el.attr( 'data-msg-html' ) ) );
+               } );
 
-       return $target;
-};
+               return $target;
+       };
 
-// Let IE know about the msg tag before it's used...
-document.createElement( 'msg' );
+       // Let IE know about the msg tag before it's used...
+       document.createElement( 'msg' );
 
-/**
- * @class jQuery
- * @mixins jQuery.plugin.localize
- */
+       /**
       * @class jQuery
       * @mixins jQuery.plugin.localize
       */
 
 }( jQuery, mediaWiki ) );
index 27ceb2b..f9675fa 100644 (file)
                        return false;
                },
                compareArray: function ( arrThis, arrAgainst ) {
+                       var i;
                        if ( arrThis.length !== arrAgainst.length ) {
                                return false;
                        }
-                       for ( var i = 0; i < arrThis.length; i++ ) {
+                       for ( i = 0; i < arrThis.length; i++ ) {
                                if ( $.isArray( arrThis[ i ] ) ) {
                                        if ( !$.compareArray( arrThis[ i ], arrAgainst[ i ] ) ) {
                                                return false;
                return str.replace( /([\\{}()|.?*+\-\^$\[\]])/g, '\\$1' );
        }, 'Use mediawiki.RegExp instead.' );
 
-} )( jQuery, mediaWiki );
+}( jQuery, mediaWiki ) );
index c472ac7..12b0404 100644 (file)
@@ -35,7 +35,7 @@
        function args( elem ) {
                // Return an object of element attributes
                var newAttrs = {},
-                               rinlinejQuery = /^jQuery\d+$/;
+                       rinlinejQuery = /^jQuery\d+$/;
                $.each( elem.attributes, function ( i, attr ) {
                        if ( attr.specified && !rinlinejQuery.test( attr.name ) ) {
                                newAttrs[ attr.name ] = attr.value;
@@ -46,7 +46,7 @@
 
        function clearPlaceholder( event, value ) {
                var input = this,
-                               $input = $( input );
+                       $input = $( input );
                if ( input.value === $input.attr( 'placeholder' ) && $input.hasClass( 'placeholder' ) ) {
                        if ( $input.data( 'placeholder-password' ) ) {
                                $input = $input.hide().next().show().attr( 'id', $input.removeAttr( 'id' ).data( 'placeholder-id' ) );
@@ -68,9 +68,9 @@
 
        function setPlaceholder() {
                var $replacement,
-                               input = this,
-                               $input = $( input ),
-                               id = this.id;
+                       input = this,
+                       $input = $( input ),
+                       id = this.id;
                if ( !input.value ) {
                        if ( input.type === 'password' ) {
                                if ( !$input.data( 'placeholder-textinput' ) ) {
@@ -85,7 +85,7 @@
                                                                'placeholder-password': $input,
                                                                'placeholder-id': id
                                                        } )
-                                                       .bind( 'focus.placeholder drop.placeholder', clearPlaceholder );
+                                                       .on( 'focus.placeholder drop.placeholder', clearPlaceholder );
                                        $input
                                                        .data( {
                                                                'placeholder-textinput': $replacement,
 
        function changePlaceholder( text ) {
                var hasArgs = arguments.length,
-                               $input = this;
+                       $input = this;
                if ( hasArgs ) {
                        if ( $input.attr( 'placeholder' ) !== text ) {
                                $input.prop( 'placeholder', text );
                                .filter( function () {
                                        return !$( this ).data( 'placeholder-enabled' );
                                } )
-                               .bind( {
+                               .on( {
                                        'focus.placeholder drop.placeholder': clearPlaceholder,
                                        'blur.placeholder': setPlaceholder
                                } )
                } );
 
                // Clear placeholder values upon page reload
-               $( window ).bind( 'beforeunload.placeholder', function () {
+               $( window ).on( 'beforeunload.placeholder', function () {
                        $( '.placeholder' ).each( function () {
                                this.value = '';
                        } );
index 8d263fb..4353dd7 100644 (file)
@@ -17,9 +17,9 @@
 
        var util,
                hasOwn = Object.prototype.hasOwnProperty,
-               log = ( window.console && window.console.log )
-                       ? function () { return window.console.log.apply( window.console, arguments ); }
-                       function () {};
+               log = ( window.console && window.console.log ) ?
+                       function () { return window.console.log.apply( window.console, arguments ); } :
+                       function () {};
 
        // Simplified version of a few jQuery methods, except that they don't
        // call other jQuery methods. Required to be able to run the CompletenessTest
                } );
 
                QUnit.done( function () {
+                       var toolbar, testResults, cntTotal, cntCalled, cntMissing;
+
                        that.populateMissingTests();
                        log( 'CompletenessTest/populateMissingTests', that );
 
-                       var toolbar, testResults, cntTotal, cntCalled, cntMissing;
-
                        cntTotal = util.keys( that.injectionTracker ).length;
                        cntCalled = util.keys( that.methodCallTracker ).length;
                        cntMissing = util.keys( that.missingTests ).length;
 
                        // Hard ignores
                        if ( this.ignoreFn( currVal, this, currPathArray ) ) {
-                               return null;
+                               return;
                        }
 
                        // Handle the lazy limit
                        this.lazyCounter++;
                        if ( this.lazyCounter > this.lazyLimit ) {
                                log( 'CompletenessTest.fn.walkTheObject> Limit reached: ' + this.lazyCounter, currPathArray );
-                               return null;
+                               return;
                        }
 
                        // Functions
                        // Make the spy inherit from the original so that its static methods are also
                        // visible in the spy (e.g. when we inject a check into mw.log, mw.log.warn
                        // must remain accessible).
-                       // XXX: https://github.com/jshint/jshint/issues/2656
-                       /*jshint ignore:start */
-                       /*jshint proto:true */
                        spy.__proto__ = val;
-                       /*jshint ignore:end */
 
                        // Objects are by reference, members (unless objects) are not.
                        obj[ key ] = spy;
index af5a97d..9079cc0 100644 (file)
@@ -59,6 +59,8 @@
                 * @return {jQuery}
                 */
                createSpinner: function ( opts ) {
+                       var $spinner;
+
                        if ( opts !== undefined && $.type( opts ) !== 'object' ) {
                                opts = {
                                        id: opts
@@ -67,7 +69,7 @@
 
                        opts = $.extend( {}, defaults, opts );
 
-                       var $spinner = $( '<div>' ).addClass( 'mw-spinner' ).attr( 'title', '...' );
+                       $spinner = $( '<div>' ).addClass( 'mw-spinner' ).attr( 'title', '...' );
                        if ( opts.id !== undefined ) {
                                $spinner.attr( 'id', 'mw-spinner-' + opts.id );
                        }
index 884ecb6..f3e4e09 100644 (file)
                                                        $results.empty();
                                                        expWidth = -1;
                                                        for ( i = 0; i < context.config.suggestions.length; i++ ) {
-                                                               /*jshint loopfunc:true */
                                                                text = context.config.suggestions[ i ];
                                                                $result = $( '<div>' )
                                                                        .addClass( 'suggestions-result' )
                                                        46, // delete
                                                        8   // backspace
                                                ];
-                                               if ( context.data.keypressedCount === 0
-                                                       && e.which === context.data.keypressed
-                                                       && $.inArray( e.which, allowed ) !== -1
+                                               if ( context.data.keypressedCount === 0 &&
+                                                       e.which === context.data.keypressed &&
+                                                       $.inArray( e.which, allowed ) !== -1
                                                ) {
                                                        $.suggestions.keypress( e, context, context.data.keypressed );
                                                }
index 62be0d8..4da05e6 100644 (file)
         * in default (ascending) order when their header cell is clicked the next time.
         *
         * @param {jQuery} $headers
-        * @param {number[][]} sortList
-        * @param {number[][]} headerToColumns
+        * @param {Array} sortList 2D number array
+        * @param {Array} headerToColumns 2D number array
         */
        function setHeadersOrder( $headers, sortList, headerToColumns ) {
                // Loop through all headers to retrieve the indices of the columns the header spans across:
        }
 
        function setHeadersCss( table, $headers, list, css, msg, columnToHeader ) {
+               var i, len;
                // Remove all header information and reset titles to default message
                $headers.removeClass( css[ 0 ] ).removeClass( css[ 1 ] ).attr( 'title', msg[ 1 ] );
 
-               for ( var i = 0; i < list.length; i++ ) {
+               for ( i = 0, len = list.length; i < len; i++ ) {
                        $headers
                                .eq( columnToHeader[ list[ i ][ 0 ] ] )
                                .addClass( css[ list[ i ][ 1 ] ] )
        }
 
        function buildCollationTable() {
+               var key, keys = [];
                ts.collationTable = mw.config.get( 'tableSorterCollation' );
                ts.collationRegex = null;
                if ( ts.collationTable ) {
-                       var key,
-                               keys = [];
-
                        // Build array of key names
                        for ( key in ts.collationTable ) {
                                // Check hasOwn to be safe
        /* Public scope */
 
        $.tablesorter = {
-                       defaultOptions: {
-                               cssHeader: 'headerSort',
-                               cssAsc: 'headerSortUp',
-                               cssDesc: 'headerSortDown',
-                               cssChildRow: 'expand-child',
-                               sortMultiSortKey: 'shiftKey',
-                               unsortableClass: 'unsortable',
-                               parsers: [],
-                               cancelSelection: true,
-                               sortList: [],
-                               headerList: [],
-                               headerToColumns: [],
-                               columnToHeader: [],
-                               columns: 0
-                       },
-
-                       dateRegex: [],
-                       monthNames: {},
-
-                       /**
-                        * @param {jQuery} $tables
-                        * @param {Object} [settings]
-                        */
-                       construct: function ( $tables, settings ) {
-                               return $tables.each( function ( i, table ) {
-                                       // Declare and cache.
-                                       var $headers, cache, config, sortCSS, sortMsg,
-                                               $table = $( table ),
-                                               firstTime = true;
-
-                                       // Quit if no tbody
-                                       if ( !table.tBodies ) {
+               defaultOptions: {
+                       cssHeader: 'headerSort',
+                       cssAsc: 'headerSortUp',
+                       cssDesc: 'headerSortDown',
+                       cssChildRow: 'expand-child',
+                       sortMultiSortKey: 'shiftKey',
+                       unsortableClass: 'unsortable',
+                       parsers: [],
+                       cancelSelection: true,
+                       sortList: [],
+                       headerList: [],
+                       headerToColumns: [],
+                       columnToHeader: [],
+                       columns: 0
+               },
+
+               dateRegex: [],
+               monthNames: {},
+
+               /**
+                * @param {jQuery} $tables
+                * @param {Object} [settings]
+                * @return {jQuery}
+                */
+               construct: function ( $tables, settings ) {
+                       return $tables.each( function ( i, table ) {
+                               // Declare and cache.
+                               var $headers, cache, config, sortCSS, sortMsg,
+                                       $table = $( table ),
+                                       firstTime = true;
+
+                               // Quit if no tbody
+                               if ( !table.tBodies ) {
+                                       return;
+                               }
+                               if ( !table.tHead ) {
+                                       // No thead found. Look for rows with <th>s and
+                                       // move them into a <thead> tag or a <tfoot> tag
+                                       emulateTHeadAndFoot( $table );
+
+                                       // Still no thead? Then quit
+                                       if ( !table.tHead ) {
                                                return;
                                        }
-                                       if ( !table.tHead ) {
-                                               // No thead found. Look for rows with <th>s and
-                                               // move them into a <thead> tag or a <tfoot> tag
-                                               emulateTHeadAndFoot( $table );
+                               }
+                               $table.addClass( 'jquery-tablesorter' );
 
-                                               // Still no thead? Then quit
-                                               if ( !table.tHead ) {
-                                                       return;
-                                               }
-                                       }
-                                       $table.addClass( 'jquery-tablesorter' );
-
-                                       // Merge and extend
-                                       config = $.extend( {}, $.tablesorter.defaultOptions, settings );
-
-                                       // Save the settings where they read
-                                       $.data( table, 'tablesorter', { config: config } );
-
-                                       // Get the CSS class names, could be done elsewhere
-                                       sortCSS = [ config.cssAsc, config.cssDesc ];
-                                       // Messages tell the the user what the *next* state will be
-                                       // so are in reverse order to the CSS classes.
-                                       sortMsg = [ mw.msg( 'sort-descending' ), mw.msg( 'sort-ascending' ) ];
-
-                                       // Build headers
-                                       $headers = buildHeaders( table, sortMsg );
-
-                                       // Grab and process locale settings.
-                                       buildTransformTable();
-                                       buildDateTable();
-
-                                       // Precaching regexps can bring 10 fold
-                                       // performance improvements in some browsers.
-                                       cacheRegexs();
-
-                                       function setupForFirstSort() {
-                                               firstTime = false;
-
-                                               // Defer buildCollationTable to first sort. As user and site scripts
-                                               // may customize tableSorterCollation but load after $.ready(), other
-                                               // scripts may call .tablesorter() before they have done the
-                                               // tableSorterCollation customizations.
-                                               buildCollationTable();
-
-                                               // Legacy fix of .sortbottoms
-                                               // Wrap them inside a tfoot (because that's what they actually want to be)
-                                               // and put the <tfoot> at the end of the <table>
-                                               var $tfoot,
-                                                       $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
-                                               if ( $sortbottoms.length ) {
-                                                       $tfoot = $table.children( 'tfoot' );
-                                                       if ( $tfoot.length ) {
-                                                               $tfoot.eq( 0 ).prepend( $sortbottoms );
-                                                       } else {
-                                                               $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
-                                                       }
-                                               }
+                               // Merge and extend
+                               config = $.extend( {}, $.tablesorter.defaultOptions, settings );
 
-                                               explodeRowspans( $table );
-                                               manageColspans( $table );
+                               // Save the settings where they read
+                               $.data( table, 'tablesorter', { config: config } );
 
-                                               // Try to auto detect column type, and store in tables config
-                                               config.parsers = buildParserCache( table, $headers );
-                                       }
+                               // Get the CSS class names, could be done elsewhere
+                               sortCSS = [ config.cssAsc, config.cssDesc ];
+                               // Messages tell the the user what the *next* state will be
+                               // so are in reverse order to the CSS classes.
+                               sortMsg = [ mw.msg( 'sort-descending' ), mw.msg( 'sort-ascending' ) ];
 
-                                       // Apply event handling to headers
-                                       // this is too big, perhaps break it out?
-                                       $headers.on( 'keypress click', function ( e ) {
-                                               var cell, $cell, columns, newSortList, i,
-                                                       totalRows,
-                                                       j, s, o;
-
-                                               if ( e.type === 'click' && e.target.nodeName.toLowerCase() === 'a' ) {
-                                                       // The user clicked on a link inside a table header.
-                                                       // Do nothing and let the default link click action continue.
-                                                       return true;
-                                               }
+                               // Build headers
+                               $headers = buildHeaders( table, sortMsg );
 
-                                               if ( e.type === 'keypress' && e.which !== 13 ) {
-                                                       // Only handle keypresses on the "Enter" key.
-                                                       return true;
-                                               }
+                               // Grab and process locale settings.
+                               buildTransformTable();
+                               buildDateTable();
 
-                                               if ( firstTime ) {
-                                                       setupForFirstSort();
+                               // Precaching regexps can bring 10 fold
+                               // performance improvements in some browsers.
+                               cacheRegexs();
+
+                               function setupForFirstSort() {
+                                       var $tfoot, $sortbottoms;
+
+                                       firstTime = false;
+
+                                       // Defer buildCollationTable to first sort. As user and site scripts
+                                       // may customize tableSorterCollation but load after $.ready(), other
+                                       // scripts may call .tablesorter() before they have done the
+                                       // tableSorterCollation customizations.
+                                       buildCollationTable();
+
+                                       // Legacy fix of .sortbottoms
+                                       // Wrap them inside a tfoot (because that's what they actually want to be)
+                                       // and put the <tfoot> at the end of the <table>
+                                       $sortbottoms = $table.find( '> tbody > tr.sortbottom' );
+                                       if ( $sortbottoms.length ) {
+                                               $tfoot = $table.children( 'tfoot' );
+                                               if ( $tfoot.length ) {
+                                                       $tfoot.eq( 0 ).prepend( $sortbottoms );
+                                               } else {
+                                                       $table.append( $( '<tfoot>' ).append( $sortbottoms ) );
                                                }
+                                       }
 
-                                               // Build the cache for the tbody cells
-                                               // to share between calculations for this sort action.
-                                               // Re-calculated each time a sort action is performed due to possiblity
-                                               // that sort values change. Shouldn't be too expensive, but if it becomes
-                                               // too slow an event based system should be implemented somehow where
-                                               // cells get event .change() and bubbles up to the <table> here
-                                               cache = buildCache( table );
-
-                                               totalRows = ( $table[ 0 ].tBodies[ 0 ] && $table[ 0 ].tBodies[ 0 ].rows.length ) || 0;
-                                               if ( totalRows > 0 ) {
-                                                       cell = this;
-                                                       $cell = $( cell );
-
-                                                       // Get current column sort order
-                                                       $cell.data( {
-                                                               order: $cell.data( 'count' ) % 2,
-                                                               count: $cell.data( 'count' ) + 1
-                                                       } );
+                                       explodeRowspans( $table );
+                                       manageColspans( $table );
 
-                                                       cell = this;
-                                                       // Get current column index
-                                                       columns = config.headerToColumns[ $cell.data( 'headerIndex' ) ];
-                                                       newSortList = $.map( columns, function ( c ) {
-                                                               // jQuery "helpfully" flattens the arrays...
-                                                               return [ [ c, $cell.data( 'order' ) ] ];
-                                                       } );
-                                                       // Index of first column belonging to this header
-                                                       i = columns[ 0 ];
+                                       // Try to auto detect column type, and store in tables config
+                                       config.parsers = buildParserCache( table, $headers );
+                               }
 
-                                                       if ( !e[ config.sortMultiSortKey ] ) {
-                                                               // User only wants to sort on one column set
-                                                               // Flush the sort list and add new columns
-                                                               config.sortList = newSortList;
-                                                       } else {
-                                                               // Multi column sorting
-                                                               // It is not possible for one column to belong to multiple headers,
-                                                               // so this is okay - we don't need to check for every value in the columns array
-                                                               if ( isValueInArray( i, config.sortList ) ) {
-                                                                       // The user has clicked on an already sorted column.
-                                                                       // Reverse the sorting direction for all tables.
-                                                                       for ( j = 0; j < config.sortList.length; j++ ) {
-                                                                               s = config.sortList[ j ];
-                                                                               o = config.headerList[ config.columnToHeader[ s[ 0 ] ] ];
-                                                                               if ( isValueInArray( s[ 0 ], newSortList ) ) {
-                                                                                       $( o ).data( 'count', s[ 1 ] + 1 );
-                                                                                       s[ 1 ] = $( o ).data( 'count' ) % 2;
-                                                                               }
+                               // Apply event handling to headers
+                               // this is too big, perhaps break it out?
+                               $headers.on( 'keypress click', function ( e ) {
+                                       var cell, $cell, columns, newSortList, i,
+                                               totalRows,
+                                               j, s, o;
+
+                                       if ( e.type === 'click' && e.target.nodeName.toLowerCase() === 'a' ) {
+                                               // The user clicked on a link inside a table header.
+                                               // Do nothing and let the default link click action continue.
+                                               return true;
+                                       }
+
+                                       if ( e.type === 'keypress' && e.which !== 13 ) {
+                                               // Only handle keypresses on the "Enter" key.
+                                               return true;
+                                       }
+
+                                       if ( firstTime ) {
+                                               setupForFirstSort();
+                                       }
+
+                                       // Build the cache for the tbody cells
+                                       // to share between calculations for this sort action.
+                                       // Re-calculated each time a sort action is performed due to possiblity
+                                       // that sort values change. Shouldn't be too expensive, but if it becomes
+                                       // too slow an event based system should be implemented somehow where
+                                       // cells get event .change() and bubbles up to the <table> here
+                                       cache = buildCache( table );
+
+                                       totalRows = ( $table[ 0 ].tBodies[ 0 ] && $table[ 0 ].tBodies[ 0 ].rows.length ) || 0;
+                                       if ( totalRows > 0 ) {
+                                               cell = this;
+                                               $cell = $( cell );
+
+                                               // Get current column sort order
+                                               $cell.data( {
+                                                       order: $cell.data( 'count' ) % 2,
+                                                       count: $cell.data( 'count' ) + 1
+                                               } );
+
+                                               cell = this;
+                                               // Get current column index
+                                               columns = config.headerToColumns[ $cell.data( 'headerIndex' ) ];
+                                               newSortList = $.map( columns, function ( c ) {
+                                                       // jQuery "helpfully" flattens the arrays...
+                                                       return [ [ c, $cell.data( 'order' ) ] ];
+                                               } );
+                                               // Index of first column belonging to this header
+                                               i = columns[ 0 ];
+
+                                               if ( !e[ config.sortMultiSortKey ] ) {
+                                                       // User only wants to sort on one column set
+                                                       // Flush the sort list and add new columns
+                                                       config.sortList = newSortList;
+                                               } else {
+                                                       // Multi column sorting
+                                                       // It is not possible for one column to belong to multiple headers,
+                                                       // so this is okay - we don't need to check for every value in the columns array
+                                                       if ( isValueInArray( i, config.sortList ) ) {
+                                                               // The user has clicked on an already sorted column.
+                                                               // Reverse the sorting direction for all tables.
+                                                               for ( j = 0; j < config.sortList.length; j++ ) {
+                                                                       s = config.sortList[ j ];
+                                                                       o = config.headerList[ config.columnToHeader[ s[ 0 ] ] ];
+                                                                       if ( isValueInArray( s[ 0 ], newSortList ) ) {
+                                                                               $( o ).data( 'count', s[ 1 ] + 1 );
+                                                                               s[ 1 ] = $( o ).data( 'count' ) % 2;
                                                                        }
-                                                               } else {
-                                                                       // Add columns to sort list array
-                                                                       config.sortList = config.sortList.concat( newSortList );
                                                                }
+                                                       } else {
+                                                               // Add columns to sort list array
+                                                               config.sortList = config.sortList.concat( newSortList );
                                                        }
+                                               }
 
-                                                       // Reset order/counts of cells not affected by sorting
-                                                       setHeadersOrder( $headers, config.sortList, config.headerToColumns );
+                                               // Reset order/counts of cells not affected by sorting
+                                               setHeadersOrder( $headers, config.sortList, config.headerToColumns );
 
-                                                       // Set CSS for headers
-                                                       setHeadersCss( $table[ 0 ], $headers, config.sortList, sortCSS, sortMsg, config.columnToHeader );
-                                                       appendToTable(
-                                                               $table[ 0 ], multisort( $table[ 0 ], config.sortList, cache )
-                                                       );
+                                               // Set CSS for headers
+                                               setHeadersCss( $table[ 0 ], $headers, config.sortList, sortCSS, sortMsg, config.columnToHeader );
+                                               appendToTable(
+                                                       $table[ 0 ], multisort( $table[ 0 ], config.sortList, cache )
+                                               );
 
-                                                       // Stop normal event by returning false
-                                                       return false;
-                                               }
+                                               // Stop normal event by returning false
+                                               return false;
+                                       }
 
-                                       // Cancel selection
-                                       } ).mousedown( function () {
-                                               if ( config.cancelSelection ) {
-                                                       this.onselectstart = function () {
-                                                               return false;
-                                                       };
+                               // Cancel selection
+                               } ).mousedown( function () {
+                                       if ( config.cancelSelection ) {
+                                               this.onselectstart = function () {
                                                        return false;
-                                               }
-                                       } );
+                                               };
+                                               return false;
+                                       }
+                               } );
 
-                                       /**
-                                        * Sorts the table. If no sorting is specified by passing a list of sort
-                                        * objects, the table is sorted according to the initial sorting order.
-                                        * Passing an empty array will reset sorting (basically just reset the headers
-                                        * making the table appear unsorted).
-                                        *
-                                        * @param {Array} [sortList] List of sort objects.
-                                        */
-                                       $table.data( 'tablesorter' ).sort = function ( sortList ) {
-
-                                               if ( firstTime ) {
-                                                       setupForFirstSort();
-                                               }
+                               /**
+                                * Sorts the table. If no sorting is specified by passing a list of sort
+                                * objects, the table is sorted according to the initial sorting order.
+                                * Passing an empty array will reset sorting (basically just reset the headers
+                                * making the table appear unsorted).
+                                *
+                                * @param {Array} [sortList] List of sort objects.
+                                */
+                               $table.data( 'tablesorter' ).sort = function ( sortList ) {
+
+                                       if ( firstTime ) {
+                                               setupForFirstSort();
+                                       }
 
-                                               if ( sortList === undefined ) {
-                                                       sortList = config.sortList;
-                                               } else if ( sortList.length > 0 ) {
-                                                       sortList = convertSortList( sortList );
-                                               }
+                                       if ( sortList === undefined ) {
+                                               sortList = config.sortList;
+                                       } else if ( sortList.length > 0 ) {
+                                               sortList = convertSortList( sortList );
+                                       }
 
-                                               // Set each column's sort count to be able to determine the correct sort
-                                               // order when clicking on a header cell the next time
-                                               setHeadersOrder( $headers, sortList, config.headerToColumns );
+                                       // Set each column's sort count to be able to determine the correct sort
+                                       // order when clicking on a header cell the next time
+                                       setHeadersOrder( $headers, sortList, config.headerToColumns );
 
-                                               // re-build the cache for the tbody cells
-                                               cache = buildCache( table );
+                                       // re-build the cache for the tbody cells
+                                       cache = buildCache( table );
 
-                                               // set css for headers
-                                               setHeadersCss( table, $headers, sortList, sortCSS, sortMsg, config.columnToHeader );
+                                       // set css for headers
+                                       setHeadersCss( table, $headers, sortList, sortCSS, sortMsg, config.columnToHeader );
 
-                                               // sort the table and append it to the dom
-                                               appendToTable( table, multisort( table, sortList, cache ) );
-                                       };
+                                       // sort the table and append it to the dom
+                                       appendToTable( table, multisort( table, sortList, cache ) );
+                               };
 
-                                       // sort initially
-                                       if ( config.sortList.length > 0 ) {
-                                               config.sortList = convertSortList( config.sortList );
-                                               $table.data( 'tablesorter' ).sort();
-                                       }
+                               // sort initially
+                               if ( config.sortList.length > 0 ) {
+                                       config.sortList = convertSortList( config.sortList );
+                                       $table.data( 'tablesorter' ).sort();
+                               }
 
-                               } );
-                       },
+                       } );
+               },
 
-                       addParser: function ( parser ) {
-                               if ( !getParserById( parser.id ) ) {
-                                       parsers.push( parser );
-                               }
-                       },
-
-                       formatDigit: function ( s ) {
-                               var out, c, p, i;
-                               if ( ts.transformTable !== false ) {
-                                       out = '';
-                                       for ( p = 0; p < s.length; p++ ) {
-                                               c = s.charAt( p );
-                                               if ( c in ts.transformTable ) {
-                                                       out += ts.transformTable[ c ];
-                                               } else {
-                                                       out += c;
-                                               }
+               addParser: function ( parser ) {
+                       if ( !getParserById( parser.id ) ) {
+                               parsers.push( parser );
+                       }
+               },
+
+               formatDigit: function ( s ) {
+                       var out, c, p, i;
+                       if ( ts.transformTable !== false ) {
+                               out = '';
+                               for ( p = 0; p < s.length; p++ ) {
+                                       c = s.charAt( p );
+                                       if ( c in ts.transformTable ) {
+                                               out += ts.transformTable[ c ];
+                                       } else {
+                                               out += c;
                                        }
-                                       s = out;
                                }
-                               i = parseFloat( s.replace( /[, ]/g, '' ).replace( '\u2212', '-' ) );
-                               return isNaN( i ) ? 0 : i;
-                       },
+                               s = out;
+                       }
+                       i = parseFloat( s.replace( /[, ]/g, '' ).replace( '\u2212', '-' ) );
+                       return isNaN( i ) ? 0 : i;
+               },
 
-                       formatFloat: function ( s ) {
-                               var i = parseFloat( s );
-                               return isNaN( i ) ? 0 : i;
-                       },
+               formatFloat: function ( s ) {
+                       var i = parseFloat( s );
+                       return isNaN( i ) ? 0 : i;
+               },
 
-                       formatInt: function ( s ) {
-                               var i = parseInt( s, 10 );
-                               return isNaN( i ) ? 0 : i;
-                       },
+               formatInt: function ( s ) {
+                       var i = parseInt( s, 10 );
+                       return isNaN( i ) ? 0 : i;
+               },
 
-                       clearTableBody: function ( table ) {
-                               $( table.tBodies[ 0 ] ).empty();
-                       },
+               clearTableBody: function ( table ) {
+                       $( table.tBodies[ 0 ] ).empty();
+               },
 
-                       getParser: function ( id ) {
-                               buildTransformTable();
-                               buildDateTable();
-                               cacheRegexs();
-                               buildCollationTable();
+               getParser: function ( id ) {
+                       buildTransformTable();
+                       buildDateTable();
+                       cacheRegexs();
+                       buildCollationTable();
 
-                               return getParserById( id );
-                       },
+                       return getParserById( id );
+               },
 
-                       getParsers: function () {  // for table diagnosis
-                               return parsers;
-                       }
-               };
+               getParsers: function () {  // for table diagnosis
+                       return parsers;
+               }
+       };
 
        // Shortcut
        ts = $.tablesorter;
                        return true;
                },
                format: function ( s ) {
+                       var tsc;
                        s = $.trim( s.toLowerCase() );
                        if ( ts.collationRegex ) {
-                               var tsc = ts.collationTable;
+                               tsc = ts.collationTable;
                                s = s.replace( ts.collationRegex, function ( match ) {
                                        var r = tsc[ match ] ? tsc[ match ] : tsc[ match.toUpperCase() ];
                                        return r.toLowerCase();
                                if ( !matches ) {
                                        return $.tablesorter.formatFloat( 0 );
                                }
-                               isodate = new Date( matches[ 2 ]  + '/' + matches[ 3 ] + '/' + matches[ 1 ] );
+                               isodate = new Date( matches[ 2 ] + '/' + matches[ 3 ] + '/' + matches[ 1 ] );
                        } else {
                                matches = s.match( ts.rgx.isoDate[ 0 ] );
                                if ( !matches ) {
index 5e93ba6..c897302 100644 (file)
 
                /**
                 * Helper function to get an IE TextRange object for an element
+                *
+                * @param {HTMLElement} element
+                * @return {TextRange}
                 */
-               function rangeForElementIE( e ) {
-                       if ( e.nodeName.toLowerCase() === 'input' ) {
-                               return e.createTextRange();
+               function rangeForElementIE( element ) {
+                       var sel;
+                       if ( element.nodeName.toLowerCase() === 'input' ) {
+                               return element.createTextRange();
                        } else {
-                               var sel = document.body.createTextRange();
-                               sel.moveToElementText( e );
+                               sel = document.body.createTextRange();
+                               sel.moveToElementText( element );
                                return sel;
                        }
                }
@@ -47,6 +51,8 @@
                 * Helper function for IE for activating the textarea. Called only in the
                 * IE-specific code paths below; makes use of IE-specific non-standard
                 * function setActive() if possible to avoid screen flicker.
+                *
+                * @param {HTMLElement} element
                 */
                function activateElementOnIE( element ) {
                        if ( element.setActive ) {
                fn = {
                        /**
                         * Get the contents of the textarea
+                        *
+                        * @return {string}
                         */
                        getContents: function () {
                                return this.val();
                        },
                        /**
                         * Set the contents of the textarea, replacing anything that was there before
+                        *
+                        * @param {string} content
                         */
                        setContents: function ( content ) {
                                this.val( content );
@@ -72,6 +82,8 @@
                        /**
                         * Get the currently selected text in this textarea. Will focus the textarea
                         * in some browsers (IE/Opera)
+                        *
+                        * @return {string}
                         */
                        getSelection: function () {
                                var retval, range,
                         * Inserts text at the beginning and end of a text selection, optionally
                         * inserting text at the caret when selection is empty.
                         *
+                        * @param {Object} options Options
                         * FIXME document the options parameters
+                        * @return {jQuery}
                         */
                        encapsulateSelection: function ( options ) {
                                return this.each( function () {
                                         * Do the splitlines stuff.
                                         *
                                         * Wrap each line of the selected text with pre and post
+                                        *
+                                        * @param {string} selText Selected text
+                                        * @param {string} pre Text before
+                                        * @param {string} post Text after
+                                        * @return {string} Wrapped text
                                         */
                                        function doSplitLines( selText, pre, post ) {
                                                var i,
                         *
                         * Will focus the textarea in some browsers (IE/Opera)
                         *
+                        * @param {Object} options Options
                         * FIXME document the options parameters
+                        * @return {number} Position
                         */
                        getCaretPosition: function ( options ) {
                                function getCaret( e ) {
                                        var caretPos = 0,
                                                endPos = 0,
                                                preText, rawPreText, periText,
-                                               rawPeriText, postText, rawPostText,
+                                               rawPeriText, postText,
                                                // IE Support
                                                preFinished,
                                                periFinished,
                                                // Load the text values we need to compare
                                                preText = rawPreText = preRange.text;
                                                periText = rawPeriText = periRange.text;
-                                               postText = rawPostText = postRange.text;
+                                               postText = postRange.text;
 
                                                /*
                                                 * Check each range for trimmed newlines by shrinking the range by 1
                                                                        postFinished = true;
                                                                } else {
                                                                        postRange.moveEnd( 'character', -1 );
-                                                                       if ( postRange.text === postText ) {
-                                                                               rawPostText += '\r\n';
-                                                                       } else {
+                                                                       if ( postRange.text !== postText ) {
                                                                                postFinished = true;
                                                                        }
                                                                }
                                return getCaret( this.get( 0 ) );
                        },
                        /**
+                        * @param {Object} options options
                         * FIXME document the options parameters
+                        * @return {jQuery}
                         */
                        setSelection: function ( options ) {
                                return this.each( function () {
                         * Scroll a textarea to the current cursor position. You can set the cursor
                         * position with setSelection()
                         *
-                        * @param {boolean} options Whether to force a scroll even if the caret position
-                        *  is already visible. Defaults to false
-                        *
-                        * FIXME document the options parameters (function body suggests options.force is a boolean, not options itself)
+                        * @param {Object} options options
+                        * @cfg {boolean} [force=false] Whether to force a scroll even if the caret position
+                        *  is already visible.
+                        * FIXME document the options parameters
+                        * @return {jQuery}
                         */
                        scrollToCaretPosition: function ( options ) {
                                function getLineLength( e ) {
diff --git a/resources/src/json-skip.js b/resources/src/json-skip.js
deleted file mode 100644 (file)
index 0a1e1c2..0000000
+++ /dev/null
@@ -1,4 +0,0 @@
-/*!
- * Skip function for json2.js.
- */
-return !!( window.JSON && JSON.stringify && JSON.parse );
index 6c63957..c8d3fad 100644 (file)
@@ -1,6 +1,7 @@
 /*!
  * Scripts for pre-emptive edit preparing on action=edit
  */
+/* eslint-disable no-use-before-define */
 ( function ( mw, $ ) {
        if ( !mw.config.get( 'wgAjaxEditStash' ) ) {
                return;
                        if (
                                // Reverts may involve use (undo) links; stash as they review the diff.
                                // Since the form has a pre-filled summary, stash the edit immediately.
-                               mw.util.getParamValue( 'undo' ) !== null
+                               mw.util.getParamValue( 'undo' ) !== null ||
                                // Pressing "show changes" and "preview" also signify that the user will
                                // probably save the page soon
-                               || $.inArray( $form.find( '#mw-edit-mode' ).val(), [ 'preview', 'diff' ] ) > -1
+                               $.inArray( $form.find( '#mw-edit-mode' ).val(), [ 'preview', 'diff' ] ) > -1
                        ) {
                                checkStash();
                        }
index 077d5e3..b3b0af2 100644 (file)
@@ -10,6 +10,7 @@ jQuery( function ( $ ) {
         * @ignore
         * @context {Element} input
         * @param {jQuery.Event} e
+        * @return {boolean} False to cancel the default event
         */
        function updateDiffRadios() {
                var nextState = 'before',
index 2be29f0..7439754 100644 (file)
@@ -4,11 +4,12 @@
 ( function ( mw, $ ) {
        $( function () {
                mw.util.$content.dblclick( function ( e ) {
+                       var $a;
                        // Recheck preference so extensions can do a hack to disable this code.
                        if ( parseInt( mw.user.options.get( 'editondblclick' ), 10 ) ) {
                                e.preventDefault();
                                // Trigger native HTMLElement click instead of opening URL (bug 43052)
-                               var $a = $( '#ca-edit a' );
+                               $a = $( '#ca-edit a' );
                                // Not every page has an edit link (bug 57713)
                                if ( $a.length ) {
                                        $a.get( 0 ).click();
index 29a5a79..39a122d 100644 (file)
@@ -28,7 +28,7 @@
                }
 
                // Note that this will update the hash in a modern browser, retaining back behaviour
-               history.replaceState( /*data=*/ history.state, /*title=*/ document.title, /*url=*/ canonical );
+               history.replaceState( /* data= */ history.state, /* title= */ document.title, /* url= */ canonical );
                if ( shouldChangeFragment ) {
                        // Specification for history.replaceState() doesn't require browser to scroll,
                        // so scroll to be sure (see also T110501). Support for IE9 and IE10.
index a4c911a..e136211 100644 (file)
@@ -3,7 +3,6 @@
  */
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
-       /*jshint onecase:true */
        var grammarForms = mediaWiki.language.getData( 'ga', 'grammarForms' );
        if ( grammarForms && grammarForms[ form ] ) {
                return grammarForms[ form ][ word ];
index 945f02f..5bf8c4d 100644 (file)
@@ -21,7 +21,7 @@ mediaWiki.language.convertGrammar = function ( word, form ) {
                        }
 
                        // Add a hyphen (maqaf) before numbers and non-Hebrew letters
-                       if ( word.slice( 0, 1 ) < 'א' ||  word.slice( 0, 1 ) > 'ת' ) {
+                       if ( word.slice( 0, 1 ) < 'א' || word.slice( 0, 1 ) > 'ת' ) {
                                word = '־' + word;
                        }
        }
index 935d466..bb6f61d 100644 (file)
@@ -3,7 +3,6 @@
  */
 
 mediaWiki.language.convertGrammar = function ( word, form ) {
-       /*jshint onecase:true */
        var grammarForms = mediaWiki.language.getData( 'hy', 'grammarForms' );
        if ( grammarForms && grammarForms[ form ] ) {
                return grammarForms[ form ][ word ];
index cf3ef79..fc2af3d 100644 (file)
  */
 ( function ( mw, $ ) {
 
-/**
- * @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}
+        * @class mw.language
         */
-       procPLURAL: function ( template ) {
-               if ( template.title && template.parameters && mw.language.convertPlural ) {
-                       // Check if we have forms to replace
-                       if ( template.parameters.length === 0 ) {
-                               return '';
+       $.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 );
                        }
-                       // Restore the count into a Number ( if it got converted earlier )
-                       var 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 '';
-       },
+                       // 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.
-        *
-        * @param {number} count Non-localized quantifier
-        * @param {Array} forms List of plural forms
-        * @param {Object} [explicitPluralForms] List of explicit plural forms
-        * @return {string} Correct form for quantifier in this language
-        */
-       convertPlural: function ( count, forms, explicitPluralForms ) {
-               var pluralRules,
-                       pluralFormIndex = 0;
+               /**
+                * Plural form transformations, needed for some languages.
+                *
+                * @param {number} count Non-localized quantifier
+                * @param {Array} forms List of plural forms
+                * @param {Object} [explicitPluralForms] List of explicit plural forms
+                * @return {string} Correct form for quantifier in this language
+                */
+               convertPlural: function ( count, forms, explicitPluralForms ) {
+                       var pluralRules,
+                               pluralFormIndex = 0;
 
-               if ( explicitPluralForms && ( explicitPluralForms[ count ] !== undefined ) ) {
-                       return explicitPluralForms[ count ];
-               }
+                       if ( explicitPluralForms && ( explicitPluralForms[ count ] !== undefined ) ) {
+                               return explicitPluralForms[ count ];
+                       }
 
-               if ( !forms || forms.length === 0 ) {
-                       return '';
-               }
+                       if ( !forms || forms.length === 0 ) {
+                               return '';
+                       }
 
-               pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
-               if ( !pluralRules ) {
-                       // default fallback.
-                       return ( count === 1 ) ? forms[ 0 ] : forms[ 1 ];
-               }
-               pluralFormIndex = mw.cldr.getPluralForm( count, pluralRules );
-               pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );
-               return forms[ pluralFormIndex ];
-       },
+                       pluralRules = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'pluralRules' );
+                       if ( !pluralRules ) {
+                               // default fallback.
+                               return ( count === 1 ) ? forms[ 0 ] : forms[ 1 ];
+                       }
+                       pluralFormIndex = mw.cldr.getPluralForm( count, pluralRules );
+                       pluralFormIndex = Math.min( pluralFormIndex, forms.length - 1 );
+                       return forms[ pluralFormIndex ];
+               },
 
-       /**
-        * Pads an array to a specific length by copying the last one element.
-        *
-        * @private
-        * @param {Array} forms Number of forms given to convertPlural
-        * @param {number} count Number of forms required
-        * @return {Array} Padded array of forms
-        */
-       preConvertPlural: function ( forms, count ) {
-               while ( forms.length < count ) {
-                       forms.push( forms[ forms.length - 1 ] );
-               }
-               return forms;
-       },
+               /**
+                * Pads an array to a specific length by copying the last one element.
+                *
+                * @private
+                * @param {Array} forms Number of forms given to convertPlural
+                * @param {number} count Number of forms required
+                * @return {Array} Padded array of forms
+                */
+               preConvertPlural: function ( forms, count ) {
+                       while ( forms.length < count ) {
+                               forms.push( forms[ forms.length - 1 ] );
+                       }
+                       return forms;
+               },
 
-       /**
-        * Provides an alternative text depending on specified gender.
-        *
-        * Usage in message text: `{{gender:[gender|user object]|masculine|feminine|neutral}}`.
-        * If second or third parameter are not specified, masculine is used.
-        *
-        * These details may be overridden per language.
-        *
-        * @param {string} gender 'male', 'female', or anything else for neutral.
-        * @param {Array} forms List of gender forms
-        * @return {string}
-        */
-       gender: function ( gender, forms ) {
-               if ( !forms || forms.length === 0 ) {
-                       return '';
-               }
-               forms = mw.language.preConvertPlural( forms, 2 );
-               if ( gender === 'male' ) {
-                       return forms[ 0 ];
-               }
-               if ( gender === 'female' ) {
-                       return forms[ 1 ];
-               }
-               return ( forms.length === 3 ) ? forms[ 2 ] : forms[ 0 ];
-       },
+               /**
+                * Provides an alternative text depending on specified gender.
+                *
+                * Usage in message text: `{{gender:[gender|user object]|masculine|feminine|neutral}}`.
+                * If second or third parameter are not specified, masculine is used.
+                *
+                * These details may be overridden per language.
+                *
+                * @param {string} gender 'male', 'female', or anything else for neutral.
+                * @param {Array} forms List of gender forms
+                * @return {string}
+                */
+               gender: function ( gender, forms ) {
+                       if ( !forms || forms.length === 0 ) {
+                               return '';
+                       }
+                       forms = mw.language.preConvertPlural( forms, 2 );
+                       if ( gender === 'male' ) {
+                               return forms[ 0 ];
+                       }
+                       if ( gender === 'female' ) {
+                               return forms[ 1 ];
+                       }
+                       return ( forms.length === 3 ) ? forms[ 2 ] : forms[ 0 ];
+               },
 
-       /**
-        * Grammatical transformations, needed for inflected languages.
-        * Invoked by putting `{{grammar:form|word}}` in a message.
-        *
-        * The rules can be defined in $wgGrammarForms global or computed
-        * dynamically by overriding this method per language.
-        *
-        * @param {string} word
-        * @param {string} form
-        * @return {string}
-        */
-       convertGrammar: function ( word, form ) {
-               var grammarForms = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'grammarForms' );
-               if ( grammarForms && grammarForms[ form ] ) {
-                       return grammarForms[ form ][ word ] || word;
-               }
-               return word;
-       },
+               /**
+                * Grammatical transformations, needed for inflected languages.
+                * Invoked by putting `{{grammar:form|word}}` in a message.
+                *
+                * The rules can be defined in $wgGrammarForms global or computed
+                * dynamically by overriding this method per language.
+                *
+                * @param {string} word
+                * @param {string} form
+                * @return {string}
+                */
+               convertGrammar: function ( word, form ) {
+                       var grammarForms = mw.language.getData( mw.config.get( 'wgUserLanguage' ), 'grammarForms' );
+                       if ( grammarForms && grammarForms[ form ] ) {
+                               return grammarForms[ form ][ word ] || word;
+                       }
+                       return word;
+               },
 
-       /**
-        * Turn a list of string into a simple list using commas and 'and'.
-        *
-        * See Language::listToText in languages/Language.php
-        *
-        * @param {string[]} list
-        * @return {string}
-        */
-       listToText: function ( list ) {
-               var text = '',
-                       i = 0;
+               /**
+                * Turn a list of string into a simple list using commas and 'and'.
+                *
+                * See Language::listToText in languages/Language.php
+                *
+                * @param {string[]} list
+                * @return {string}
+                */
+               listToText: function ( list ) {
+                       var text = '',
+                               i = 0;
 
-               for ( ; i < list.length; i++ ) {
-                       text += list[ i ];
-                       if ( list.length - 2 === i ) {
-                               text += mw.msg( 'and' ) + mw.msg( 'word-separator' );
-                       } else if ( list.length - 1 !== i ) {
-                               text += mw.msg( 'comma-separator' );
+                       for ( ; i < list.length; i++ ) {
+                               text += list[ i ];
+                               if ( list.length - 2 === i ) {
+                                       text += mw.msg( 'and' ) + mw.msg( 'word-separator' );
+                               } else if ( list.length - 1 !== i ) {
+                                       text += mw.msg( 'comma-separator' );
+                               }
                        }
-               }
-               return text;
-       },
+                       return text;
+               },
 
-       setSpecialCharacters: function ( data ) {
-               this.specialCharacters = data;
-       }
-} );
+               setSpecialCharacters: function ( data ) {
+                       this.specialCharacters = data;
+               }
+       } );
 
 }( mediaWiki, jQuery ) );
index 268985f..1192650 100644 (file)
         * @return {string}
         */
        function replicate( str, num ) {
+               var buf = [];
+
                if ( num <= 0 || !str ) {
                        return '';
                }
 
-               var buf = [];
                while ( num-- ) {
                        buf.push( str );
                }
         * @return {string}
         */
        function pad( text, size, ch, end ) {
+               var out, padStr;
+
                if ( !ch ) {
                        ch = '0';
                }
 
-               var out = String( text ),
-                       padStr = replicate( ch, Math.ceil( ( size - out.length ) / ch.length ) );
+               out = String( text );
+               padStr = replicate( ch, Math.ceil( ( size - out.length ) / ch.length ) );
 
                return end ? out + padStr : padStr + out;
        }
         * @return {string}
         */
        function commafyNumber( value, pattern, options ) {
-               options = options || {
-                       group: ',',
-                       decimal: '.'
-               };
-
-               if ( isNaN( value ) ) {
-                       return value;
-               }
-
                var padLength,
                        patternDigits,
                        index,
                        groupSize2 = 0,
                        pieces = [];
 
+               options = options || {
+                       group: ',',
+                       decimal: '.'
+               };
+
+               if ( isNaN( value ) ) {
+                       return value;
+               }
+
                if ( patternParts[ 1 ] ) {
                        // Pad fractional with trailing zeros
                        padLength = ( patternParts[ 1 ] && patternParts[ 1 ].lastIndexOf( '0' ) + 1 );
index 6226c90..aa49ae1 100644 (file)
 ( function ( mw, $ ) {
 
-var ProtectionForm = window.ProtectionForm = {
-       /**
-        * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
-        * on the protection form
-        */
-       init: function () {
-               var $cell = $( '<td>' ),
-                       $row = $( '<tr>' ).append( $cell );
-
-               if ( !$( '#mwProtectSet' ).length ) {
-                       return false;
-               }
-
-               if ( mw.config.get( 'wgCascadeableLevels' ) !== undefined ) {
-                       $( 'form#mw-Protect-Form' ).submit( this.toggleUnchainedInputs.bind( ProtectionForm, true ) );
-               }
-               this.getExpirySelectors().each( function () {
-                       $( this ).change( ProtectionForm.updateExpiryList.bind( ProtectionForm, this ) );
-               } );
-               this.getExpiryInputs().each( function () {
-                       $( this ).on( 'keyup change', ProtectionForm.updateExpiry.bind( ProtectionForm, this ) );
-               } );
-               this.getLevelSelectors().each( function () {
-                       $( this ).change( ProtectionForm.updateLevels.bind( ProtectionForm, this ) );
-               } );
-
-               $( '#mwProtectSet > tbody > tr:first' ).after( $row );
-
-               // If there is only one protection type, there is nothing to chain
-               if ( $( '[id ^= mw-protect-table-]' ).length > 1 ) {
-                       $cell.append(
-                               $( '<input>' )
-                                       .attr( { id: 'mwProtectUnchained', type: 'checkbox' } )
-                                       .click( this.onChainClick.bind( this ) )
-                                       .prop( 'checked', !this.areAllTypesMatching() ),
-                               document.createTextNode( ' ' ),
-                               $( '<label>' )
-                                       .attr( 'for', 'mwProtectUnchained' )
-                                       .text( mw.msg( 'protect-unchain-permissions' ) )
-                       );
-
-                       this.toggleUnchainedInputs( !this.areAllTypesMatching() );
-               }
-
-               $( '#mwProtect-reason' ).byteLimit( 180 );
-
-               this.updateCascadeCheckbox();
-       },
-
-       /**
-        * Sets the disabled attribute on the cascade checkbox depending on the current selected levels
-        */
-       updateCascadeCheckbox: function () {
-               this.getLevelSelectors().each( function () {
-                       if ( !ProtectionForm.isCascadeableLevel( $( this ).val() ) ) {
-                               $( '#mwProtect-cascade' ).prop( { checked: false, disabled: true } );
+       var ProtectionForm = window.ProtectionForm = {
+               /**
+                * Set up the protection chaining interface (i.e. "unlock move permissions" checkbox)
+                * on the protection form
+                *
+                * @return {boolean}
+                */
+               init: function () {
+                       var $cell = $( '<td>' ),
+                               $row = $( '<tr>' ).append( $cell );
+
+                       if ( !$( '#mwProtectSet' ).length ) {
                                return false;
-                       } else {
-                               $( '#mwProtect-cascade' ).prop( 'disabled', false );
                        }
-               } );
-       },
-
-       /**
-        * Checks if a certain protection level is cascadeable.
-        *
-        * @param {string} level
-        * @return {boolean}
-        */
-       isCascadeableLevel: function ( level ) {
-               return $.inArray( level, mw.config.get( 'wgCascadeableLevels' ) ) !== -1;
-       },
-
-       /**
-        * When protection levels are locked together, update the rest
-        * when one action's level changes
-        *
-        * @param {Element} source Level selector that changed
-        */
-       updateLevels: function ( source ) {
-               if ( !this.isUnchained() ) {
-                       this.setAllSelectors( source.selectedIndex );
-               }
-               this.updateCascadeCheckbox();
-       },
-
-       /**
-        * When protection levels are locked together, update the
-        * expiries when one changes
-        *
-        * @param {Element} source expiry input that changed
-        */
-
-       updateExpiry: function ( source ) {
-               if ( !this.isUnchained() ) {
+
+                       if ( mw.config.get( 'wgCascadeableLevels' ) !== undefined ) {
+                               $( 'form#mw-Protect-Form' ).submit( this.toggleUnchainedInputs.bind( ProtectionForm, true ) );
+                       }
+                       this.getExpirySelectors().each( function () {
+                               $( this ).change( ProtectionForm.updateExpiryList.bind( ProtectionForm, this ) );
+                       } );
                        this.getExpiryInputs().each( function () {
-                               this.value = source.value;
+                               $( this ).on( 'keyup change', ProtectionForm.updateExpiry.bind( ProtectionForm, this ) );
                        } );
-               }
-               if ( this.isUnchained() ) {
-                       $( '#' + source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' ) ).val( 'othertime' );
-               } else {
-                       this.getExpirySelectors().each( function () {
-                               this.value = 'othertime';
+                       this.getLevelSelectors().each( function () {
+                               $( this ).change( ProtectionForm.updateLevels.bind( ProtectionForm, this ) );
                        } );
-               }
-       },
-
-       /**
-        * When protection levels are locked together, update the
-        * expiry lists when one changes and clear the custom inputs
-        *
-        * @param {Element} source Expiry selector that changed
-        */
-       updateExpiryList: function ( source ) {
-               if ( !this.isUnchained() ) {
-                       this.getExpirySelectors().each( function () {
-                               this.value = source.value;
+
+                       $( '#mwProtectSet > tbody > tr:first' ).after( $row );
+
+                       // If there is only one protection type, there is nothing to chain
+                       if ( $( '[id ^= mw-protect-table-]' ).length > 1 ) {
+                               $cell.append(
+                                       $( '<input>' )
+                                               .attr( { id: 'mwProtectUnchained', type: 'checkbox' } )
+                                               .click( this.onChainClick.bind( this ) )
+                                               .prop( 'checked', !this.areAllTypesMatching() ),
+                                       document.createTextNode( ' ' ),
+                                       $( '<label>' )
+                                               .attr( 'for', 'mwProtectUnchained' )
+                                               .text( mw.msg( 'protect-unchain-permissions' ) )
+                               );
+
+                               this.toggleUnchainedInputs( !this.areAllTypesMatching() );
+                       }
+
+                       $( '#mwProtect-reason' ).byteLimit( 180 );
+
+                       this.updateCascadeCheckbox();
+                       return true;
+               },
+
+               /**
+                * Sets the disabled attribute on the cascade checkbox depending on the current selected levels
+                */
+               updateCascadeCheckbox: function () {
+                       this.getLevelSelectors().each( function () {
+                               if ( !ProtectionForm.isCascadeableLevel( $( this ).val() ) ) {
+                                       $( '#mwProtect-cascade' ).prop( { checked: false, disabled: true } );
+                                       return false;
+                               } else {
+                                       $( '#mwProtect-cascade' ).prop( 'disabled', false );
+                               }
                        } );
-                       this.getExpiryInputs().each( function () {
-                               this.value = '';
+               },
+
+               /**
+                * Checks if a certain protection level is cascadeable.
+                *
+                * @param {string} level
+                * @return {boolean}
+                */
+               isCascadeableLevel: function ( level ) {
+                       return $.inArray( level, mw.config.get( 'wgCascadeableLevels' ) ) !== -1;
+               },
+
+               /**
+                * When protection levels are locked together, update the rest
+                * when one action's level changes
+                *
+                * @param {Element} source Level selector that changed
+                */
+               updateLevels: function ( source ) {
+                       if ( !this.isUnchained() ) {
+                               this.setAllSelectors( source.selectedIndex );
+                       }
+                       this.updateCascadeCheckbox();
+               },
+
+               /**
+                * When protection levels are locked together, update the
+                * expiries when one changes
+                *
+                * @param {Element} source expiry input that changed
+                */
+
+               updateExpiry: function ( source ) {
+                       if ( !this.isUnchained() ) {
+                               this.getExpiryInputs().each( function () {
+                                       this.value = source.value;
+                               } );
+                       }
+                       if ( this.isUnchained() ) {
+                               $( '#' + source.id.replace( /^mwProtect-(\w+)-expires$/, 'mwProtectExpirySelection-$1' ) ).val( 'othertime' );
+                       } else {
+                               this.getExpirySelectors().each( function () {
+                                       this.value = 'othertime';
+                               } );
+                       }
+               },
+
+               /**
+                * When protection levels are locked together, update the
+                * expiry lists when one changes and clear the custom inputs
+                *
+                * @param {Element} source Expiry selector that changed
+                */
+               updateExpiryList: function ( source ) {
+                       if ( !this.isUnchained() ) {
+                               this.getExpirySelectors().each( function () {
+                                       this.value = source.value;
+                               } );
+                               this.getExpiryInputs().each( function () {
+                                       this.value = '';
+                               } );
+                       }
+               },
+
+               /**
+                * Update chain status and enable/disable various bits of the UI
+                * when the user changes the "unlock move permissions" checkbox
+                */
+               onChainClick: function () {
+                       this.toggleUnchainedInputs( this.isUnchained() );
+                       if ( !this.isUnchained() ) {
+                               this.setAllSelectors( this.getMaxLevel() );
+                       }
+                       this.updateCascadeCheckbox();
+               },
+
+               /**
+                * Returns true if the named attribute in all objects in the given array are matching
+                *
+                * @param {Object[]} objects
+                * @param {string} attrName
+                * @return {boolean}
+                */
+               matchAttribute: function ( objects, attrName ) {
+                       return $.map( objects, function ( object ) {
+                               return object[ attrName ];
+                       } ).filter( function ( item, index, a ) {
+                               return index === a.indexOf( item );
+                       } ).length === 1;
+               },
+
+               /**
+                * Are all actions protected at the same level, with the same expiry time?
+                *
+                * @return {boolean}
+                */
+               areAllTypesMatching: function () {
+                       return this.matchAttribute( this.getLevelSelectors(), 'selectedIndex' ) &&
+                               this.matchAttribute( this.getExpirySelectors(), 'selectedIndex' ) &&
+                               this.matchAttribute( this.getExpiryInputs(), 'value' );
+               },
+
+               /**
+                * Is protection chaining off?
+                *
+                * @return {boolean}
+                */
+               isUnchained: function () {
+                       var element = document.getElementById( 'mwProtectUnchained' );
+                       return element ?
+                               element.checked :
+                               true; // No control, so we need to let the user set both levels
+               },
+
+               /**
+                * Find the highest protection level in any selector
+                *
+                * @return {number}
+                */
+               getMaxLevel: function () {
+                       return Math.max.apply( Math, this.getLevelSelectors().map( function () {
+                               return this.selectedIndex;
+                       } ) );
+               },
+
+               /**
+                * Protect all actions at the specified level
+                *
+                * @param {number} index Protection level
+                */
+               setAllSelectors: function ( index ) {
+                       this.getLevelSelectors().each( function () {
+                               this.selectedIndex = index;
                        } );
+               },
+
+               /**
+                * Get a list of all protection selectors on the page
+                *
+                * @return {jQuery}
+                */
+               getLevelSelectors: function () {
+                       return $( 'select[id ^= mwProtect-level-]' );
+               },
+
+               /**
+                * Get a list of all expiry inputs on the page
+                *
+                * @return {jQuery}
+                */
+               getExpiryInputs: function () {
+                       return $( 'input[id ^= mwProtect-][id $= -expires]' );
+               },
+
+               /**
+                * Get a list of all expiry selector lists on the page
+                *
+                * @return {jQuery}
+                */
+               getExpirySelectors: function () {
+                       return $( 'select[id ^= mwProtectExpirySelection-]' );
+               },
+
+               /**
+                * Enable/disable protection selectors and expiry inputs
+                *
+                * @param {boolean} val Enable?
+                */
+               toggleUnchainedInputs: function ( val ) {
+                       var setDisabled = function () { this.disabled = !val; };
+                       this.getLevelSelectors().slice( 1 ).each( setDisabled );
+                       this.getExpiryInputs().slice( 1 ).each( setDisabled );
+                       this.getExpirySelectors().slice( 1 ).each( setDisabled );
                }
-       },
-
-       /**
-        * Update chain status and enable/disable various bits of the UI
-        * when the user changes the "unlock move permissions" checkbox
-        */
-       onChainClick: function () {
-               this.toggleUnchainedInputs( this.isUnchained() );
-               if ( !this.isUnchained() ) {
-                       this.setAllSelectors( this.getMaxLevel() );
-               }
-               this.updateCascadeCheckbox();
-       },
-
-       /**
-        * Returns true if the named attribute in all objects in the given array are matching
-        *
-        * @param {Object[]} objects
-        * @param {string} attrName
-        * @return {boolean}
-        */
-       matchAttribute: function ( objects, attrName ) {
-               return $.map( objects, function ( object ) {
-                       return object[ attrName ];
-               } ).filter( function ( item, index, a ) {
-                       return index === a.indexOf( item );
-               } ).length === 1;
-       },
-
-       /**
-        * Are all actions protected at the same level, with the same expiry time?
-        *
-        * @return {boolean}
-        */
-       areAllTypesMatching: function () {
-               return this.matchAttribute( this.getLevelSelectors(), 'selectedIndex' )
-                       && this.matchAttribute( this.getExpirySelectors(), 'selectedIndex' )
-                       && this.matchAttribute( this.getExpiryInputs(), 'value' );
-       },
-
-       /**
-        * Is protection chaining off?
-        *
-        * @return {boolean}
-        */
-       isUnchained: function () {
-               var element = document.getElementById( 'mwProtectUnchained' );
-               return element
-                       ? element.checked
-                       : true; // No control, so we need to let the user set both levels
-       },
-
-       /**
-        * Find the highest protection level in any selector
-        *
-        * @return {number}
-        */
-       getMaxLevel: function () {
-               return Math.max.apply( Math, this.getLevelSelectors().map( function () {
-                       return this.selectedIndex;
-               } ) );
-       },
-
-       /**
-        * Protect all actions at the specified level
-        *
-        * @param {number} index Protection level
-        */
-       setAllSelectors: function ( index ) {
-               this.getLevelSelectors().each( function () {
-                       this.selectedIndex = index;
-               } );
-       },
-
-       /**
-        * Get a list of all protection selectors on the page
-        *
-        * @return {jQuery}
-        */
-       getLevelSelectors: function () {
-               return $( 'select[id ^= mwProtect-level-]' );
-       },
-
-       /**
-        * Get a list of all expiry inputs on the page
-        *
-        * @return {jQuery}
-        */
-       getExpiryInputs: function () {
-               return $( 'input[id ^= mwProtect-][id $= -expires]' );
-       },
-
-       /**
-        * Get a list of all expiry selector lists on the page
-        *
-        * @return {jQuery}
-        */
-       getExpirySelectors: function () {
-               return $( 'select[id ^= mwProtectExpirySelection-]' );
-       },
-
-       /**
-        * Enable/disable protection selectors and expiry inputs
-        *
-        * @param {boolean} val Enable?
-        */
-       toggleUnchainedInputs: function ( val ) {
-               var setDisabled = function () { this.disabled = !val; };
-               this.getLevelSelectors().slice( 1 ).each( setDisabled );
-               this.getExpiryInputs().slice( 1 ).each( setDisabled );
-               this.getExpirySelectors().slice( 1 ).each( setDisabled );
-       }
-};
-
-$( ProtectionForm.init.bind( ProtectionForm ) );
+       };
+
+       $( ProtectionForm.init.bind( ProtectionForm ) );
 
 }( mediaWiki, jQuery ) );
index 38271a0..8062849 100644 (file)
 
        /**
         * @deprecated since 1.17 Use mw.loader instead. Warnings added in 1.25.
+        * @param {string} url
+        * @return {HTMLElement} Script tag
         */
        function importScriptURI( url ) {
+               var s;
                if ( loadedScripts[ url ] ) {
                        return null;
                }
                loadedScripts[ url ] = true;
-               var s = document.createElement( 'script' );
+               s = document.createElement( 'script' );
                s.setAttribute( 'src', url );
                document.getElementsByTagName( 'head' )[ 0 ].appendChild( s );
                return s;
 
        /**
         * @deprecated since 1.17 Use mw.loader instead. Warnings added in 1.25.
+        * @param {string} url
+        * @param {string} media
+        * @return {HTMLElement} Link tag
         */
        function importStylesheetURI( url, media ) {
                var l = document.createElement( 'link' );
index 676ecca..9688f1f 100644 (file)
@@ -26,9 +26,9 @@
 // Orange; for contextual use of returning to a past action
 @colorRegressive: #ff5d00;
 // Red; for contextual use of a negative action of high severity
-@colorDestructive: #c33;
-@colorDestructiveHighlight: #e53939;
-@colorDestructiveActive: #873636;
+@colorDestructive: #d33;
+@colorDestructiveHighlight: #ff4242;
+@colorDestructiveActive: #b32424;
 // Orange; for contextual use of a potentially negative action of medium severity
 @colorMediumSevere: #ff5d00;
 // Yellow; for contextual use of a potentially negative action of low severity
index 68fb2aa..558fd4c 100644 (file)
@@ -1,4 +1,3 @@
-/*global OO */
 ( function ( mw, $ ) {
        /**
         * Factory for MessagePoster objects. This provides a pluggable to way to script the action
index 98ed3ee..d2015d8 100644 (file)
@@ -1,4 +1,4 @@
-/*global OO */
+/* eslint-disable no-use-before-define */
 ( function ( $, mw, OO ) {
        'use strict';
        var ApiSandbox, Util, WidgetMethods, Validators,
                        },
                        apiCheckValid: function () {
                                var that = this;
-                               return this.isValid().done( function ( ok ) {
+                               return this.getValidity().then( function () {
+                                       return $.Deferred().resolve( true ).promise();
+                               }, function () {
+                                       return $.Deferred().resolve( false ).promise();
+                               } ).done( function ( ok ) {
                                        ok = ok || suppressErrors;
                                        that.setIcon( ok ? null : 'alert' );
                                        that.setIconTitle( ok ? '' : mw.message( 'apisandbox-alert-field' ).plain() );
                },
 
                dateTimeInputWidget: {
-                       isValid: function () {
-                               var ok = !Util.apiBool( this.paramInfo.required ) || this.getApiValue() !== '';
-                               return $.Deferred().resolve( ok ).promise();
+                       getValidity: function () {
+                               if ( !Util.apiBool( this.paramInfo.required ) || this.getApiValue() !== '' ) {
+                                       return $.Deferred().resolve().promise();
+                               } else {
+                                       return $.Deferred().reject().promise();
+                               }
                        }
                },
 
                                }
                        },
                        apiCheckValid: function () {
-                               var ok = this.getApiValue() !== undefined || suppressErrors;
+                               var ok = true,
+                                       pi = this.paramInfo;
+
+                               if ( !suppressErrors ) {
+                                       ok = this.getApiValue() !== undefined && !(
+                                               pi.allspecifier !== undefined &&
+                                               this.getItemsData().length > 1 &&
+                                               this.getItemsData().indexOf( pi.allspecifier ) !== -1
+                                       );
+                               }
+
                                this.setIcon( ok ? null : 'alert' );
                                this.setIconTitle( ok ? '' : mw.message( 'apisandbox-alert-field' ).plain() );
                                return $.Deferred().resolve( ok ).promise();
                                        } );
                                        widget.setIcon = widget.input.setIcon.bind( widget.input );
                                        widget.setIconTitle = widget.input.setIconTitle.bind( widget.input );
-                                       widget.isValid = widget.input.isValid.bind( widget.input );
+                                       widget.getValidity = widget.input.getValidity.bind( widget.input );
                                        widget.paramInfo = pi;
                                        $.extend( widget, WidgetMethods.textInputWidget );
                                        if ( Util.apiBool( pi.enforcerange ) ) {
                                        break;
 
                                case 'limit':
-                                       widget = new OO.ui.NumberInputWidget( {
-                                               required: Util.apiBool( pi.required ),
-                                               isInteger: true
+                                       widget = new OO.ui.TextInputWidget( {
+                                               required: Util.apiBool( pi.required )
                                        } );
-                                       widget.setIcon = widget.input.setIcon.bind( widget.input );
-                                       widget.setIconTitle = widget.input.setIconTitle.bind( widget.input );
-                                       widget.isValid = widget.input.isValid.bind( widget.input );
-                                       widget.input.setValidation( function ( value ) {
-                                               return value === 'max' || widget.validateNumber( value );
+                                       widget.setValidation( function ( value ) {
+                                               var n, pi = this.paramInfo;
+
+                                               if ( value === 'max' ) {
+                                                       return true;
+                                               } else {
+                                                       n = +value;
+                                                       return !isNaN( n ) && isFinite( n ) &&
+                                                               // eslint-disable-next-line no-bitwise
+                                                               ( n | 0 ) === n &&
+                                                               n >= pi.min && n <= pi.apiSandboxMax;
+                                               }
                                        } );
+                                       pi.min = pi.min || 0;
+                                       pi.apiSandboxMax = mw.config.get( 'apihighlimits' ) ? pi.highmax : pi.max;
                                        widget.paramInfo = pi;
                                        $.extend( widget, WidgetMethods.textInputWidget );
-                                       widget.setRange( pi.min || 0, mw.config.get( 'apihighlimits' ) ? pi.highmax : pi.max );
                                        multiMode = 'enter';
                                        break;
 
                                                return a.data - b.data;
                                        } );
                                        if ( Util.apiBool( pi.multi ) ) {
+                                               if ( pi.allspecifier !== undefined ) {
+                                                       items.unshift( new OO.ui.MenuOptionWidget( {
+                                                               data: pi.allspecifier,
+                                                               label: mw.message( 'apisandbox-multivalue-all-namespaces', pi.allspecifier ).text()
+                                                       } ) );
+                                               }
+
                                                widget = new OO.ui.CapsuleMultiselectWidget( {
                                                        menu: { items: items }
                                                } );
                                                return new OO.ui.MenuOptionWidget( { data: String( v ), label: String( v ) } );
                                        } );
                                        if ( Util.apiBool( pi.multi ) ) {
+                                               if ( pi.allspecifier !== undefined ) {
+                                                       items.unshift( new OO.ui.MenuOptionWidget( {
+                                                               data: pi.allspecifier,
+                                                               label: mw.message( 'apisandbox-multivalue-all-values', pi.allspecifier ).text()
+                                                       } ) );
+                                               }
+
                                                widget = new OO.ui.CapsuleMultiselectWidget( {
                                                        menu: { items: items }
                                                } );
 
                /**
                 * Update the current query when the page hash changes
+                *
+                * @return {boolean} Successful
                 */
                loadFromHash: function () {
                        var params, m, re,
 
                                                $result.empty();
                                                if ( /^text\/mediawiki-api-prettyprint-wrapped(?:;|$)/.test( ct ) ) {
-                                                       data = $.parseJSON( data );
+                                                       data = JSON.parse( data );
                                                        if ( data.modules.length ) {
                                                                mw.loader.load( data.modules );
                                                        }
+                                                       if ( data.status && data.status !== 200 ) {
+                                                               $( '<div>' )
+                                                                       .addClass( 'api-pretty-header api-pretty-status' )
+                                                                       .append(
+                                                                               mw.message( 'api-format-prettyprint-status', data.status, data.statustext ).parse()
+                                                                       )
+                                                                       .appendTo( $result );
+                                                       }
                                                        $result.append( Util.parseHTML( data.html ) );
                                                        loadTime = data.time;
                                                } else if ( ( m = data.match( /<pre[ >][\s\S]*<\/pre>/ ) ) ) {
                                                                if ( pi.parameters[ i ].highmax !== undefined ) {
                                                                        dl.append( $( '<dd>', {
                                                                                addClass: 'info',
-                                                                               append: Util.parseHTML( mw.message(
-                                                                                       'api-help-param-limit2', pi.parameters[ i ].max, pi.parameters[ i ].highmax
-                                                                               ).parse() )
+                                                                               append: [
+                                                                                       Util.parseHTML( mw.message(
+                                                                                               'api-help-param-limit2', pi.parameters[ i ].max, pi.parameters[ i ].highmax
+                                                                                       ).parse() ),
+                                                                                       ' ',
+                                                                                       Util.parseHTML( mw.message( 'apisandbox-param-limit' ).parse() )
+                                                                               ]
                                                                        } ) );
                                                                } else {
                                                                        dl.append( $( '<dd>', {
                                                                                addClass: 'info',
-                                                                               append: Util.parseHTML( mw.message(
-                                                                                       'api-help-param-limit', pi.parameters[ i ].max
-                                                                               ).parse() )
+                                                                               append: [
+                                                                                       Util.parseHTML( mw.message(
+                                                                                               'api-help-param-limit', pi.parameters[ i ].max
+                                                                                       ).parse() ),
+                                                                                       ' ',
+                                                                                       Util.parseHTML( mw.message( 'apisandbox-param-limit' ).parse() )
+                                                                               ]
                                                                        } ) );
                                                                }
                                                                break;
index 69a2a67..3e6e684 100644 (file)
@@ -6,9 +6,10 @@
                var $tagList = $( '#mw-edittags-tag-list' );
                if ( $tagList.length ) {
                        $tagList.chosen( {
-                               /*jscs:disable requireCamelCaseOrUpperCaseIdentifiers */
+                               /* eslint-disable camelcase */
                                placeholder_text_multiple: mw.msg( 'tags-edit-chosen-placeholder' ),
                                no_results_text: mw.msg( 'tags-edit-chosen-no-results' )
+                               /* eslint-enable camelcase */
                        } );
                }
 
index dd48367..f818096 100644 (file)
@@ -5,8 +5,11 @@
  * @class mw.special.upload
  * @singleton
  */
+
+/* eslint-disable no-use-before-define */
+/* global Uint8Array */
+
 ( function ( mw, $ ) {
-       /*jshint latedef:false */
        var uploadWarning, uploadLicense,
                ajaxUploadDestCheck = mw.config.get( 'wgAjaxUploadDestCheck' ),
                $license = $( '#wpLicense' );
        $( function () {
                /**
                 * Is the FileAPI available with sufficient functionality?
+                *
+                * @return {boolean}
                 */
                function hasFileAPI() {
                        return window.FileReader !== undefined;
                        }, mw.config.get( 'wgFileCanRotate' ) ? function ( data ) {
                                try {
                                        meta = mw.libs.jpegmeta( data, file.fileName );
-                                       // jscs:disable requireCamelCaseOrUpperCaseIdentifiers, disallowDanglingUnderscores
+                                       // eslint-disable-next-line no-underscore-dangle, camelcase
                                        meta._binary_data = null;
-                                       // jscs:enable
                                } catch ( e ) {
                                        meta = null;
                                }
 
                /**
                 * Check if the file does not exceed the maximum size
+                *
+                * @param {File} file
+                * @return {boolean}
                 */
                function checkMaxUploadSize( file ) {
                        var maxSize, $error;
                if ( hasFileAPI() ) {
                        // Update thumbnail when the file selection control is updated.
                        $( '#wpUploadFile' ).change( function () {
+                               var file;
                                clearPreview();
                                if ( this.files && this.files.length ) {
                                        // Note: would need to be updated to handle multiple files.
-                                       var file = this.files[ 0 ];
+                                       file = this.files[ 0 ];
 
                                        if ( !checkMaxUploadSize( file ) ) {
                                                return;
index bb26c0f..e9fc024 100644 (file)
         *  current cursor position.
         * @param {string} [button.imageId] `id` attribute of the button HTML element. Can be
         *  used to define the image with CSS if it's not provided as `imageFile`.
+        * @param {string} [speedTip]
+        * @param {string} [tagOpen]
+        * @param {string} [tagClose]
+        * @param {string} [sampleText]
+        * @param {string} [imageId]
         */
        function insertButton( button, speedTip, tagOpen, tagClose, sampleText, imageId ) {
                var $button;
index 31b1cd5..54a5a85 100644 (file)
                return this.selected;
        };
 
+       // eslint-disable-next-line valid-jsdoc
        /**
         * Set the selected dates
         *
                return this.focusedDate;
        };
 
+       // eslint-disable-next-line valid-jsdoc
        /**
         * Set the currently-focused date
         *
         *
         * @protected
         * @param {jQuery.Event} e Key down event
+        * @return {boolean} False to cancel the default event
         */
        mw.widgets.datetime.CalendarWidget.prototype.onKeyDown = function ( e ) {
                var focusedDate = this.getFocusedDate();
index 1c54234..1793849 100644 (file)
         *  Defaults to the current date and time (with 0 milliseconds).
         */
        mw.widgets.datetime.DateTimeFormatter = function MwWidgetsDatetimeDateTimeFormatter( config ) {
-               var statick = this.constructor[ 'static' ];
-
-               statick.setupDefaults();
+               this.constructor.static.setupDefaults();
 
                config = $.extend( {
                        format: '@default',
                        local: false,
-                       fullZones: statick.fullZones,
-                       shortZones: statick.shortZones
+                       fullZones: this.constructor.static.fullZones,
+                       shortZones: this.constructor.static.shortZones
                }, config );
 
                // Mixin constructors
                OO.EventEmitter.call( this );
 
                // Properties
-               if ( statick.formats[ config.format ] ) {
-                       this.format = statick.formats[ config.format ];
+               if ( this.constructor.static.formats[ config.format ] ) {
+                       this.format = this.constructor.static.formats[ config.format ];
                } else {
                        this.format = config.format;
                }
@@ -70,7 +68,7 @@
         * @inheritable
         * @property {Object}
         */
-       mw.widgets.datetime.DateTimeFormatter[ 'static' ].formats = {};
+       mw.widgets.datetime.DateTimeFormatter.static.formats = {};
 
        /**
         * Default time zone indicators
@@ -79,7 +77,7 @@
         * @inheritable
         * @property {string[]}
         */
-       mw.widgets.datetime.DateTimeFormatter[ 'static' ].fullZones = null;
+       mw.widgets.datetime.DateTimeFormatter.static.fullZones = null;
 
        /**
         * Default abbreviated time zone indicators
@@ -88,9 +86,9 @@
         * @inheritable
         * @property {string[]}
         */
-       mw.widgets.datetime.DateTimeFormatter[ 'static' ].shortZones = null;
+       mw.widgets.datetime.DateTimeFormatter.static.shortZones = null;
 
-       mw.widgets.datetime.DateTimeFormatter[ 'static' ].setupDefaults = function () {
+       mw.widgets.datetime.DateTimeFormatter.static.setupDefaults = function () {
                if ( !this.fullZones ) {
                        this.fullZones = [
                                mw.msg( 'timezone-utc' ),
                return this.local;
        };
 
+       // eslint-disable-next-line valid-jsdoc
        /**
         * Toggle whether dates are in local time or UTC
         *
         *  - 'clip': "Jan 32" => "Jan 31", "Feb 32" => "Feb 28" (or 29), "Feb 0" => "Feb 1", etc.
         * @return {Date} Adjusted date
         */
-       mw.widgets.datetime.DateTimeFormatter.prototype.adjustComponent = function ( date /*, component, delta, mode */ ) {
+       mw.widgets.datetime.DateTimeFormatter.prototype.adjustComponent = function ( date /* , component, delta, mode */ ) {
                // Should be overridden by subclass
                return date;
        };
index a3088ec..e9bedf5 100644 (file)
 
        /* Static properties */
 
-       mw.widgets.datetime.DateTimeInputWidget[ 'static' ].supportsSimpleLabel = false;
+       mw.widgets.datetime.DateTimeInputWidget.static.supportsSimpleLabel = false;
 
        /* Events */
 
         * @private
         * @param {jQuery} $field
         * @param {jQuery.Event} e Key down event
+        * @return {boolean} False to cancel the default event
         */
        mw.widgets.datetime.DateTimeInputWidget.prototype.onFieldKeyDown = function ( $field, e ) {
                var spec = $field.data( 'mw-widgets-datetime-dateTimeInputWidget-fieldSpec' );
         * @private
         * @param {jQuery} $field
         * @param {jQuery.Event} e Change event
+        * @return {boolean} False to cancel the default event
         */
        mw.widgets.datetime.DateTimeInputWidget.prototype.onFieldWheel = function ( $field, e ) {
                var delta = 0,
index fbf3238..b280ead 100644 (file)
@@ -32,7 +32,7 @@
        /**
         * @inheritdoc
         */
-       mw.widgets.datetime.DiscordianDateTimeFormatter[ 'static' ].formats = {
+       mw.widgets.datetime.DiscordianDateTimeFormatter.static.formats = {
                '@time': '${hour|0}:${minute|0}:${second|0}',
                '@date': '$!{dow|full}${not-intercalary|1|, }${season|full}${not-intercalary|1| }${day|#}, ${year|#}',
                '@datetime': '$!{dow|full}${not-intercalary|1|, }${season|full}${not-intercalary|1| }${day|#}, ${year|#} ${hour|0}:${minute|0}:${second|0} $!{zone|short}',
index f60b34b..9e9b15f 100644 (file)
         * @cfg {number} [weekStartsOn=0] What day the week starts on: 0 is Sunday, 1 is Monday, 6 is Saturday.
         */
        mw.widgets.datetime.ProlepticGregorianDateTimeFormatter = function MwWidgetsDatetimeProlepticGregorianDateTimeFormatter( config ) {
-               var statick = this.constructor[ 'static' ];
-
-               statick.setupDefaults();
+               this.constructor.static.setupDefaults();
 
                config = $.extend( {
                        weekStartsOn: 0,
-                       hour12Periods: statick.hour12Periods
+                       hour12Periods: this.constructor.static.hour12Periods
                }, config );
 
                if ( config.fullMonthNames && !config.shortMonthNames ) {
                        }.bind( this ) );
                }
                config = $.extend( {
-                       fullMonthNames: statick.fullMonthNames,
-                       shortMonthNames: statick.shortMonthNames,
-                       fullDayNames: statick.fullDayNames,
-                       shortDayNames: statick.shortDayNames,
-                       dayLetters: statick.dayLetters
+                       fullMonthNames: this.constructor.static.fullMonthNames,
+                       shortMonthNames: this.constructor.static.shortMonthNames,
+                       fullDayNames: this.constructor.static.fullDayNames,
+                       shortDayNames: this.constructor.static.shortDayNames,
+                       dayLetters: this.constructor.static.dayLetters
                }, config );
 
                // Parent constructor
@@ -89,7 +87,7 @@
        /**
         * @inheritdoc
         */
-       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter[ 'static' ].formats = {
+       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter.static.formats = {
                '@time': '${hour|0}:${minute|0}:${second|0}',
                '@date': '$!{dow|short} ${day|#} ${month|short} ${year|#}',
                '@datetime': '$!{dow|short} ${day|#} ${month|short} ${year|#} ${hour|0}:${minute|0}:${second|0} $!{zone|short}',
         * @inheritable
         * @property {Object}
         */
-       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter[ 'static' ].fullMonthNames = null;
+       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter.static.fullMonthNames = null;
 
        /**
         * Default abbreviated month names.
         * @inheritable
         * @property {Object}
         */
-       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter[ 'static' ].shortMonthNames = null;
+       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter.static.shortMonthNames = null;
 
        /**
         * Default full day of week names.
         * @inheritable
         * @property {Object}
         */
-       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter[ 'static' ].fullDayNames = null;
+       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter.static.fullDayNames = null;
 
        /**
         * Default abbreviated day of week names.
         * @inheritable
         * @property {Object}
         */
-       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter[ 'static' ].shortDayNames = null;
+       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter.static.shortDayNames = null;
 
        /**
         * Default day letters.
         * @inheritable
         * @property {string[]}
         */
-       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter[ 'static' ].dayLetters = null;
+       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter.static.dayLetters = null;
 
        /**
         * Default AM/PM indicators
         * @inheritable
         * @property {string[]}
         */
-       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter[ 'static' ].hour12Periods = null;
+       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter.static.hour12Periods = null;
 
-       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter[ 'static' ].setupDefaults = function () {
-               mw.widgets.datetime.DateTimeFormatter[ 'static' ].setupDefaults.call( this );
+       mw.widgets.datetime.ProlepticGregorianDateTimeFormatter.static.setupDefaults = function () {
+               mw.widgets.datetime.DateTimeFormatter.static.setupDefaults.call( this );
 
                if ( this.fullMonthNames && !this.shortMonthNames ) {
                        this.shortMonthNames = {};
diff --git a/resources/src/mediawiki.widgets/MediaSearch/broken-image.png b/resources/src/mediawiki.widgets/MediaSearch/broken-image.png
new file mode 100644 (file)
index 0000000..f5be958
Binary files /dev/null and b/resources/src/mediawiki.widgets/MediaSearch/broken-image.png differ
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsProvider.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsProvider.js
new file mode 100644 (file)
index 0000000..dd07b92
--- /dev/null
@@ -0,0 +1,229 @@
+/*!
+ * MediaWiki Widgets - APIResultsProvider class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
+ */
+( function ( $, mw ) {
+
+       /**
+        * API Results Provider object.
+        *
+        * @class
+        * @mixins OO.EventEmitter
+        *
+        * @constructor
+        * @param {string} apiurl The URL to the api
+        * @param {Object} [config] Configuration options
+        * @cfg {number} fetchLimit The default number of results to fetch
+        * @cfg {string} lang The language of the API
+        * @cfg {number} offset Initial offset, if relevant, to call results from
+        * @cfg {Object} ajaxSettings The settings for the ajax call
+        * @cfg {Object} staticParams The data parameters that are static and should
+        *  always be sent to the API request, as opposed to user parameters.
+        * @cfg {Object} userParams Initial user parameters to be sent as data to
+        *  the API request. These can change per request, like the search query term
+        *  or sizing parameters for images, etc.
+        */
+       mw.widgets.APIResultsProvider = function MwWidgetsAPIResultsProvider( apiurl, config ) {
+               config = config || {};
+
+               this.setAPIurl( apiurl );
+               this.setDefaultFetchLimit( config.fetchLimit || 30 );
+               this.setLang( config.lang );
+               this.setOffset( config.offset || 0 );
+               this.setAjaxSettings( config.ajaxSettings || {} );
+
+               this.staticParams = config.staticParams || {};
+               this.userParams = config.userParams || {};
+
+               this.toggleDepleted( false );
+
+               // Mixin constructors
+               OO.EventEmitter.call( this );
+       };
+
+       /* Setup */
+       OO.mixinClass( mw.widgets.APIResultsProvider, OO.EventEmitter );
+
+       /* Methods */
+
+       /**
+        * Get results from the source
+        *
+        * @param {number} howMany Number of results to ask for
+        * @return {jQuery.Promise} Promise that is resolved into an array
+        * of available results, or is rejected if no results are available.
+        */
+       mw.widgets.APIResultsProvider.prototype.getResults = function () {
+               var xhr,
+                       deferred = $.Deferred(),
+                       allParams = $.extend( {}, this.getStaticParams(), this.getUserParams() );
+
+               xhr = $.getJSON( this.getAPIurl(), allParams )
+                       .done( function ( data ) {
+                               if (
+                                       $.type( data ) !== 'array' ||
+                                       (
+                                               $.type( data ) === 'array' &&
+                                               data.length === 0
+                                       )
+                               ) {
+                                       deferred.resolve();
+                               } else {
+                                       deferred.resolve( data );
+                               }
+                       } );
+               return deferred.promise( { abort: xhr.abort } );
+       };
+
+       /**
+        * Set API url
+        *
+        * @param {string} apiurl API url
+        */
+       mw.widgets.APIResultsProvider.prototype.setAPIurl = function ( apiurl ) {
+               this.apiurl = apiurl;
+       };
+
+       /**
+        * Set api url
+        *
+        * @return {string} API url
+        */
+       mw.widgets.APIResultsProvider.prototype.getAPIurl = function () {
+               return this.apiurl;
+       };
+
+       /**
+        * Get the static, non-changing data parameters sent to the API
+        *
+        * @return {Object} Data parameters
+        */
+       mw.widgets.APIResultsProvider.prototype.getStaticParams = function () {
+               return this.staticParams;
+       };
+
+       /**
+        * Get the user-inputted dynamic data parameters sent to the API
+        *
+        * @return {Object} Data parameters
+        */
+       mw.widgets.APIResultsProvider.prototype.getUserParams = function () {
+               return this.userParams;
+       };
+
+       /**
+        * Set the data parameters sent to the API
+        *
+        * @param {Object} params User defined data parameters
+        */
+       mw.widgets.APIResultsProvider.prototype.setUserParams = function ( params ) {
+               // Asymmetrically compare (params is subset of this.userParams)
+               if ( !OO.compare( params, this.userParams, true ) ) {
+                       this.userParams = $.extend( {}, this.userParams, params );
+                       this.reset();
+               }
+       };
+
+       /**
+        * Reset the provider
+        */
+       mw.widgets.APIResultsProvider.prototype.reset = function () {
+               // Reset offset
+               this.setOffset( 0 );
+               // Reset depleted status
+               this.toggleDepleted( false );
+       };
+
+       /**
+        * Get fetch limit or 'page' size. This is the number
+        * of results per request.
+        *
+        * @return {number} limit
+        */
+       mw.widgets.APIResultsProvider.prototype.getDefaultFetchLimit = function () {
+               return this.limit;
+       };
+
+       /**
+        * Set limit
+        *
+        * @param {number} limit Default number of results to fetch from the API
+        */
+       mw.widgets.APIResultsProvider.prototype.setDefaultFetchLimit = function ( limit ) {
+               this.limit = limit;
+       };
+
+       /**
+        * Get provider API language
+        *
+        * @return {string} Provider API language
+        */
+       mw.widgets.APIResultsProvider.prototype.getLang = function () {
+               return this.lang;
+       };
+
+       /**
+        * Set provider API language
+        *
+        * @param {string} lang Provider API language
+        */
+       mw.widgets.APIResultsProvider.prototype.setLang = function ( lang ) {
+               this.lang = lang;
+       };
+
+       /**
+        * Get result offset
+        *
+        * @return {number} Offset Results offset for the upcoming request
+        */
+       mw.widgets.APIResultsProvider.prototype.getOffset = function () {
+               return this.offset;
+       };
+
+       /**
+        * Set result offset
+        *
+        * @param {number} offset Results offset for the upcoming request
+        */
+       mw.widgets.APIResultsProvider.prototype.setOffset = function ( offset ) {
+               this.offset = offset;
+       };
+
+       /**
+        * Check whether the provider is depleted and has no more results
+        * to hand off.
+        *
+        * @return {boolean} The provider is depleted
+        */
+       mw.widgets.APIResultsProvider.prototype.isDepleted = function () {
+               return this.depleted;
+       };
+
+       /**
+        * Toggle depleted state
+        *
+        * @param {boolean} isDepleted The provider is depleted
+        */
+       mw.widgets.APIResultsProvider.prototype.toggleDepleted = function ( isDepleted ) {
+               this.depleted = isDepleted !== undefined ? isDepleted : !this.depleted;
+       };
+
+       /**
+        * Get the default ajax settings
+        *
+        * @return {Object} Ajax settings
+        */
+       mw.widgets.APIResultsProvider.prototype.getAjaxSettings = function () {
+               return this.ajaxSettings;
+       };
+
+       /**
+        * Get the default ajax settings
+        *
+        * @param {Object} settings Ajax settings
+        */
+       mw.widgets.APIResultsProvider.prototype.setAjaxSettings = function ( settings ) {
+               this.ajaxSettings = settings;
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsQueue.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.APIResultsQueue.js
new file mode 100644 (file)
index 0000000..3bc1d51
--- /dev/null
@@ -0,0 +1,224 @@
+/*!
+ * MediaWiki Widgets - APIResultsQueue class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see http://ve.mit-license.org
+ */
+( function ( $, mw ) {
+
+       /**
+        * API Results Queue object.
+        *
+        * @class
+        * @mixins OO.EventEmitter
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {number} limit The default number of results to fetch
+        * @cfg {number} threshold The default number of extra results
+        *  that the queue should always strive to have on top of the
+        *  individual requests for items.
+        */
+       mw.widgets.APIResultsQueue = function MwWidgetsAPIResultsQueue( config ) {
+               config = config || {};
+
+               this.fileRepoPromise = null;
+               this.providers = [];
+               this.providerPromises = [];
+               this.queue = [];
+
+               this.params = {};
+
+               this.limit = config.limit || 20;
+               this.setThreshold( config.threshold || 10 );
+
+               // Mixin constructors
+               OO.EventEmitter.call( this );
+       };
+
+       /* Setup */
+       OO.mixinClass( mw.widgets.APIResultsQueue, OO.EventEmitter );
+
+       /* Methods */
+
+       /**
+        * Set up the queue and its resources.
+        * This should be overridden if there are any setup steps to perform.
+        *
+        * @return {jQuery.Promise} Promise that resolves when the resources
+        *  are set up. Note: The promise must have an .abort() functionality.
+        */
+       mw.widgets.APIResultsQueue.prototype.setup = function () {
+               return $.Deferred().resolve().promise( { abort: $.noop } );
+       };
+
+       /**
+        * Get items from the queue
+        *
+        * @param {number} [howMany] How many items to retrieve. Defaults to the
+        *  default limit supplied on initialization.
+        * @return {jQuery.Promise} Promise that resolves into an array of items.
+        */
+       mw.widgets.APIResultsQueue.prototype.get = function ( howMany ) {
+               var fetchingPromise = null,
+                       me = this;
+
+               howMany = howMany || this.limit;
+
+               // Check if the queue has enough items
+               if ( this.queue.length < howMany + this.threshold ) {
+                       // Call for more results
+                       fetchingPromise = this.queryProviders( howMany + this.threshold )
+                               .then( function ( items ) {
+                                       // Add to the queue
+                                       me.queue = me.queue.concat.apply( me.queue, items );
+                               } );
+               }
+
+               return $.when( fetchingPromise )
+                       .then( function () {
+                               return me.queue.splice( 0, howMany );
+                       } );
+
+       };
+
+       /**
+        * Get results from all providers
+        *
+        * @param {number} [howMany] How many items to retrieve. Defaults to the
+        *  default limit supplied on initialization.
+        * @return {jQuery.Promise} Promise that is resolved into an array
+        *  of fetched items. Note: The promise must have an .abort() functionality.
+        */
+       mw.widgets.APIResultsQueue.prototype.queryProviders = function ( howMany ) {
+               var i, len,
+                       queue = this;
+
+               // Make sure there are resources set up
+               return this.setup()
+                       .then( function () {
+                               // Abort previous requests
+                               for ( i = 0, len = queue.providerPromises.length; i < len; i++ ) {
+                                       queue.providerPromises[ i ].abort();
+                               }
+                               queue.providerPromises = [];
+                               // Set up the query to all providers
+                               for ( i = 0, len = queue.providers.length; i < len; i++ ) {
+                                       if ( !queue.providers[ i ].isDepleted() ) {
+                                               queue.providerPromises.push(
+                                                       queue.providers[ i ].getResults( howMany )
+                                               );
+                                       }
+                               }
+
+                               return $.when.apply( $, queue.providerPromises )
+                                       .then( Array.prototype.concat.bind( [] ) );
+                       } );
+       };
+
+       /**
+        * Set the search query for all the providers.
+        *
+        * This also makes sure to abort any previous promises.
+        *
+        * @param {Object} params API search parameters
+        */
+       mw.widgets.APIResultsQueue.prototype.setParams = function ( params ) {
+               var i, len;
+               if ( !OO.compare( params, this.params, true ) ) {
+                       this.reset();
+                       this.params = $.extend( this.params, params );
+                       // Reset queue
+                       this.queue = [];
+                       // Reset promises
+                       for ( i = 0, len = this.providerPromises.length; i < len; i++ ) {
+                               this.providerPromises[ i ].abort();
+                       }
+                       // Change queries
+                       for ( i = 0, len = this.providers.length; i < len; i++ ) {
+                               this.providers[ i ].setUserParams( this.params );
+                       }
+               }
+       };
+
+       /**
+        * Reset the queue and all its providers
+        */
+       mw.widgets.APIResultsQueue.prototype.reset = function () {
+               var i, len;
+               // Reset queue
+               this.queue = [];
+               // Reset promises
+               for ( i = 0, len = this.providerPromises.length; i < len; i++ ) {
+                       this.providerPromises[ i ].abort();
+               }
+               // Change queries
+               for ( i = 0, len = this.providers.length; i < len; i++ ) {
+                       this.providers[ i ].reset();
+               }
+       };
+
+       /**
+        * Get the data parameters sent to the API
+        *
+        * @return {Object} params API search parameters
+        */
+       mw.widgets.APIResultsQueue.prototype.getParams = function () {
+               return this.params;
+       };
+
+       /**
+        * Set the providers
+        *
+        * @param {mw.widgets.APIResultsProvider[]} providers An array of providers
+        */
+       mw.widgets.APIResultsQueue.prototype.setProviders = function ( providers ) {
+               this.providers = providers;
+       };
+
+       /**
+        * Add a provider to the group
+        *
+        * @param {mw.widgets.APIResultsProvider} provider A provider object
+        */
+       mw.widgets.APIResultsQueue.prototype.addProvider = function ( provider ) {
+               this.providers.push( provider );
+       };
+
+       /**
+        * Set the providers
+        *
+        * @return {mw.widgets.APIResultsProvider[]} providers An array of providers
+        */
+       mw.widgets.APIResultsQueue.prototype.getProviders = function () {
+               return this.providers;
+       };
+
+       /**
+        * Get the queue size
+        *
+        * @return {number} Queue size
+        */
+       mw.widgets.APIResultsQueue.prototype.getQueueSize = function () {
+               return this.queue.length;
+       };
+
+       /**
+        * Set queue threshold
+        *
+        * @param {number} threshold Queue threshold, below which we will
+        *  request more items
+        */
+       mw.widgets.APIResultsQueue.prototype.setThreshold = function ( threshold ) {
+               this.threshold = threshold;
+       };
+
+       /**
+        * Get queue threshold
+        *
+        * @return {number} threshold Queue threshold, below which we will
+        *  request more items
+        */
+       mw.widgets.APIResultsQueue.prototype.getThreshold = function () {
+               return this.threshold;
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceProvider.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceProvider.js
new file mode 100644 (file)
index 0000000..d767109
--- /dev/null
@@ -0,0 +1,322 @@
+/*!
+ * MediaWiki Widgets - MediaResourceProvider class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * MediaWiki media resource provider.
+        *
+        * @class
+        * @extends mw.widgets.APIResultsProvider
+        *
+        * @constructor
+        * @param {string} apiurl The API url
+        * @param {Object} [config] Configuration options
+        * @cfg {string} [scriptDirUrl] The url of the API script
+        */
+       mw.widgets.MediaResourceProvider = function MwWidgetsMediaResourceProvider( apiurl, config ) {
+               config = config || {};
+
+               // Parent constructor
+               mw.widgets.MediaResourceProvider.super.call( this, apiurl, config );
+
+               // Fetching configuration
+               this.scriptDirUrl = config.scriptDirUrl;
+               this.isLocal = config.local !== undefined;
+
+               if ( this.isLocal ) {
+                       this.setAPIurl( mw.util.wikiScript( 'api' ) );
+               } else {
+                       // If 'apiurl' is set, use that. Otherwise, build the url
+                       // from scriptDirUrl and /api.php suffix
+                       this.setAPIurl( this.getAPIurl() || ( this.scriptDirUrl + '/api.php' ) );
+               }
+
+               this.siteInfoPromise = null;
+               this.thumbSizes = [];
+               this.imageSizes = [];
+       };
+
+       /* Inheritance */
+       OO.inheritClass( mw.widgets.MediaResourceProvider, mw.widgets.APIResultsProvider );
+
+       /* Methods */
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.MediaResourceProvider.prototype.getStaticParams = function () {
+               return $.extend(
+                       {},
+                       // Parent method
+                       mw.widgets.MediaResourceProvider.super.prototype.getStaticParams.call( this ),
+                       {
+                               action: 'query',
+                               iiprop: 'dimensions|url|mediatype|extmetadata|timestamp|user',
+                               iiextmetadatalanguage: this.getLang(),
+                               prop: 'imageinfo'
+                       }
+               );
+       };
+
+       /**
+        * Initialize the source and get the site info.
+        *
+        * Connect to the api url and retrieve the siteinfo parameters
+        * that are required for fetching results.
+        *
+        * @return {jQuery.Promise} Promise that resolves when the class
+        * properties are set.
+        */
+       mw.widgets.MediaResourceProvider.prototype.loadSiteInfo = function () {
+               var provider = this;
+
+               if ( !this.siteInfoPromise ) {
+                       this.siteInfoPromise = new mw.Api().get( {
+                               action: 'query',
+                               meta: 'siteinfo'
+                       } )
+                               .then( function ( data ) {
+                                       provider.setImageSizes( data.query.general.imagelimits || [] );
+                                       provider.setThumbSizes( data.query.general.thumblimits || [] );
+                                       provider.setUserParams( {
+                                               // Standard width per resource
+                                               iiurlwidth: provider.getStandardWidth()
+                                       } );
+                               } );
+               }
+               return this.siteInfoPromise;
+       };
+
+       /**
+        * Override parent method and get results from the source
+        *
+        * @param {number} [howMany] The number of items to pull from the API
+        * @return {jQuery.Promise} Promise that is resolved into an array
+        * of available results, or is rejected if no results are available.
+        */
+       mw.widgets.MediaResourceProvider.prototype.getResults = function ( howMany ) {
+               var xhr,
+                       aborted = false,
+                       provider = this;
+
+               return this.loadSiteInfo()
+                       .then( function () {
+                               if ( aborted ) {
+                                       return $.Deferred().reject();
+                               }
+                               xhr = provider.fetchAPIresults( howMany );
+                               return xhr;
+                       } )
+                       .then(
+                               function ( results ) {
+                                       if ( !results || results.length === 0 ) {
+                                               provider.toggleDepleted( true );
+                                               return [];
+                                       }
+                                       return results;
+                               },
+                               // Process failed, return an empty promise
+                               function () {
+                                       provider.toggleDepleted( true );
+                                       return $.Deferred().resolve( [] );
+                               }
+                       )
+                       .promise( { abort: function () {
+                               aborted = true;
+                               if ( xhr ) {
+                                       xhr.abort();
+                               }
+                       } } );
+       };
+
+       /**
+        * Get continuation API data
+        *
+        * @param {number} howMany The number of results to retrieve
+        * @return {Object} API request data
+        */
+       mw.widgets.MediaResourceProvider.prototype.getContinueData = function () {
+               return {};
+       };
+
+       /**
+        * Set continuation data for the next page
+        *
+        * @param {Object} continueData Continuation data
+        */
+       mw.widgets.MediaResourceProvider.prototype.setContinue = function () {
+       };
+
+       /**
+        * Sort the results
+        *
+        * @param {Object[]} results API results
+        * @return {Object[]} Sorted results
+        */
+       mw.widgets.MediaResourceProvider.prototype.sort = function ( results ) {
+               return results;
+       };
+
+       /**
+        * Call the API for search results.
+        *
+        * @param {number} howMany The number of results to retrieve
+        * @return {jQuery.Promise} Promise that resolves with an array of objects that contain
+        *  the fetched data.
+        */
+       mw.widgets.MediaResourceProvider.prototype.fetchAPIresults = function ( howMany ) {
+               var xhr, api,
+                       provider = this;
+
+               if ( !this.isValid() ) {
+                       return $.Deferred().reject().promise( { abort: $.noop } );
+               }
+
+               api = this.isLocal ? new mw.Api() : new mw.ForeignApi( this.getAPIurl(), { anonymous: true } );
+               xhr = api.get( $.extend( {}, this.getStaticParams(), this.getUserParams(), this.getContinueData( howMany ) ) );
+               return xhr
+                       .then( function ( data ) {
+                               var page, newObj, raw,
+                                       results = [];
+
+                               if ( data.error ) {
+                                       provider.toggleDepleted( true );
+                                       return [];
+                               }
+
+                               if ( data.continue ) {
+                                       // Update the offset for next time
+                                       provider.setContinue( data.continue );
+                               } else {
+                                       // This is the last available set of results. Mark as depleted!
+                                       provider.toggleDepleted( true );
+                               }
+
+                               // If the source returned no results, it will not have a
+                               // query property
+                               if ( data.query ) {
+                                       raw = data.query.pages;
+                                       if ( raw ) {
+                                               // Strip away the page ids
+                                               for ( page in raw ) {
+                                                       if ( !raw[ page ].imageinfo ) {
+                                                               // The search may give us pages that belong to the File:
+                                                               // namespace but have no files in them, either because
+                                                               // they were deleted or imported wrongly, or just started
+                                                               // as pages. In that case, the response will not include
+                                                               // imageinfo. Skip those files.
+                                                               continue;
+                                                       }
+                                                       newObj = raw[ page ].imageinfo[ 0 ];
+                                                       newObj.title = raw[ page ].title;
+                                                       newObj.index = raw[ page ].index;
+                                                       results.push( newObj );
+                                               }
+                                       }
+                               }
+                               return provider.sort( results );
+                       } )
+                       .promise( { abort: xhr.abort } );
+       };
+
+       /**
+        * Set name
+        *
+        * @param {string} name
+        */
+       mw.widgets.MediaResourceProvider.prototype.setName = function ( name ) {
+               this.name = name;
+       };
+
+       /**
+        * Get name
+        *
+        * @return {string} name
+        */
+       mw.widgets.MediaResourceProvider.prototype.getName = function () {
+               return this.name;
+       };
+
+       /**
+        * Get standard width, based on the provider source's thumb sizes.
+        *
+        * @return {number|undefined} fetchWidth
+        */
+       mw.widgets.MediaResourceProvider.prototype.getStandardWidth = function () {
+               return ( this.thumbSizes && this.thumbSizes[ this.thumbSizes.length - 1 ] ) ||
+                       ( this.imageSizes && this.imageSizes[ 0 ] ) ||
+                       // Fall back on a number
+                       300;
+       };
+
+       /**
+        * Get prop
+        *
+        * @return {string} prop
+        */
+       mw.widgets.MediaResourceProvider.prototype.getFetchProp = function () {
+               return this.fetchProp;
+       };
+
+       /**
+        * Set prop
+        *
+        * @param {string} prop
+        */
+       mw.widgets.MediaResourceProvider.prototype.setFetchProp = function ( prop ) {
+               this.fetchProp = prop;
+       };
+
+       /**
+        * Set thumb sizes
+        *
+        * @param {number[]} sizes Available thumbnail sizes
+        */
+       mw.widgets.MediaResourceProvider.prototype.setThumbSizes = function ( sizes ) {
+               this.thumbSizes = sizes;
+       };
+
+       /**
+        * Set image sizes
+        *
+        * @param {number[]} sizes Available image sizes
+        */
+       mw.widgets.MediaResourceProvider.prototype.setImageSizes = function ( sizes ) {
+               this.imageSizes = sizes;
+       };
+
+       /**
+        * Get thumb sizes
+        *
+        * @return {number[]} sizes Available thumbnail sizes
+        */
+       mw.widgets.MediaResourceProvider.prototype.getThumbSizes = function () {
+               return this.thumbSizes;
+       };
+
+       /**
+        * Get image sizes
+        *
+        * @return {number[]} sizes Available image sizes
+        */
+       mw.widgets.MediaResourceProvider.prototype.getImageSizes = function () {
+               return this.imageSizes;
+       };
+
+       /**
+        * Check if this source is valid.
+        *
+        * @return {boolean} Source is valid
+        */
+       mw.widgets.MediaResourceProvider.prototype.isValid = function () {
+               return this.isLocal ||
+                       // If we don't have either 'apiurl' or 'scriptDirUrl'
+                       // the source is invalid, and we will skip it
+                       this.apiurl !== undefined ||
+                       this.scriptDirUrl !== undefined;
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceQueue.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResourceQueue.js
new file mode 100644 (file)
index 0000000..34fa44b
--- /dev/null
@@ -0,0 +1,68 @@
+/*!
+ * MediaWiki Widgets - MediaResourceQueue class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * MediaWiki media resource queue.
+        *
+        * @class
+        * @extends mw.widgets.APIResultsQueue
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {number} maxHeight The maximum height of the media, used in the
+        *  search call to the API.
+        */
+       mw.widgets.MediaResourceQueue = function MwWidgetsMediaResourceQueue( config ) {
+               config = config || {};
+
+               // Parent constructor
+               mw.widgets.MediaResourceQueue.super.call( this, config );
+
+               this.maxHeight = config.maxHeight || 200;
+       };
+
+       /* Inheritance */
+       OO.inheritClass( mw.widgets.MediaResourceQueue, mw.widgets.APIResultsQueue );
+
+       /**
+        * Fetch the file repos.
+        *
+        * @return {jQuery.Promise} Promise that resolves when the resources are set up
+        */
+       mw.widgets.MediaResourceQueue.prototype.getFileRepos = function () {
+               var defaultSource = [ {
+                       url: mw.util.wikiScript( 'api' ),
+                       local: ''
+               } ];
+
+               if ( !this.fileRepoPromise ) {
+                       this.fileRepoPromise = new mw.Api().get( {
+                               action: 'query',
+                               meta: 'filerepoinfo'
+                       } ).then(
+                               function ( resp ) {
+                                       return resp.query && resp.query.repos || defaultSource;
+                               },
+                               function () {
+                                       return $.Deferred().resolve( defaultSource );
+                               }
+                       );
+               }
+
+               return this.fileRepoPromise;
+       };
+
+       /**
+        * Get image maximum height
+        *
+        * @return {string} Image max height
+        */
+       mw.widgets.MediaResourceQueue.prototype.getMaxHeight = function () {
+               return this.maxHeight;
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.css
new file mode 100644 (file)
index 0000000..bc752b5
--- /dev/null
@@ -0,0 +1,89 @@
+/*!
+ * MediaWiki Widgets - MediaResultWidget styles.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+.mw-widget-mediaResultWidget {
+       display: inline-block;
+       position: relative;
+       padding: 0;
+       margin: 2px;
+       overflow: hidden;
+       box-sizing: border-box;
+       text-align: center;
+}
+
+.mw-widget-mediaResultWidget-error {
+       background-color: #f3f3f3;
+}
+
+.mw-widget-mediaResultWidget-thumbnail {
+       opacity: 0;
+       display: inline-block;
+       /* stylelint-disable no-unsupported-browser-features */
+       -webkit-transition: opacity 400ms;
+       -moz-transition: opacity 400ms;
+       transition: opacity 400ms;
+       /* stylelint-enable no-unsupported-browser-features */
+}
+
+.mw-widget-mediaResultWidget-done .mw-widget-mediaResultWidget-thumbnail,
+.mw-widget-mediaResultWidget-error .mw-widget-mediaResultWidget-thumbnail {
+       opacity: 1;
+}
+
+.mw-widget-mediaResultWidget-crop {
+       background-size: cover; /* stylelint-disable-line no-unsupported-browser-features */
+       background-position: center center;
+}
+
+.mw-widget-mediaResultWidget-overlay {
+       position: absolute;
+       top: 0;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       box-shadow: inset 0 0 0 1px #ccc;
+}
+
+.mw-widget-mediaResultWidget.oo-ui-optionWidget-highlighted,
+.mw-widget-mediaResultWidget.oo-ui-optionWidget-selected {
+       box-shadow: 0 0 0.3em #a7dcff, 0 0 0 #fff;
+}
+
+.mw-widget-mediaResultWidget-error .mw-widget-mediaResultWidget-thumbnail {
+       /* @embed */
+       background-image: url( broken-image.png );
+       background-size: auto; /* stylelint-disable-line no-unsupported-browser-features */
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+
+.mw-widget-mediaResultWidget .mw-widget-mediaResultWidget-nameLabel {
+       position: absolute;
+       bottom: 0;
+       left: 0;
+       right: 0;
+       overflow: hidden;
+       padding: 0.5em;
+       color: #fff;
+       text-shadow: 1px 1px #000; /* stylelint-disable-line no-unsupported-browser-features */
+       line-height: 1.125em;
+       background-color: rgba( 0, 0, 0, 0.5 );
+       text-overflow: ellipsis;
+       text-align: left;
+}
+
+.mw-widget-mediaResultWidget.oo-ui-optionWidget-highlighted .mw-widget-mediaResultWidget-nameLabel {
+       background-color: rgba( 0, 0, 0, 0.75 );
+}
+
+.mw-widget-mediaResultWidget.oo-ui-optionWidget-selected .mw-widget-mediaResultWidget-nameLabel {
+       background-color: #000;
+}
+
+.mw-widget-mediaSearchWidget-noresults {
+       padding-top: 1em;
+}
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaResultWidget.js
new file mode 100644 (file)
index 0000000..7607e84
--- /dev/null
@@ -0,0 +1,274 @@
+/*!
+ * MediaWiki Widgets - MediaResultWidget class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Creates an mw.widgets.MediaResultWidget object.
+        *
+        * @class
+        * @extends OO.ui.OptionWidget
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {number} [rowHeight] Height of the row this result is part of
+        * @cfg {number} [maxRowWidth] A limit for the width of the row this
+        *  result is a part of.
+        * @cfg {number} [minWidth] Minimum width for the result
+        * @cfg {number} [maxWidth] Maximum width for the result
+        */
+       mw.widgets.MediaResultWidget = function MwWidgetsMediaResultWidget( config ) {
+               // Configuration initialization
+               config = config || {};
+
+               // Parent constructor
+               mw.widgets.MediaResultWidget.super.call( this, config );
+
+               // Properties
+               this.setRowHeight( config.rowHeight || 150 );
+               this.maxRowWidth = config.maxRowWidth || 500;
+               this.minWidth = config.minWidth || this.maxRowWidth / 5;
+               this.maxWidth = config.maxWidth || this.maxRowWidth * 2 / 3;
+
+               this.imageDimensions = {};
+
+               this.isAudio = this.data.mediatype === 'AUDIO';
+
+               // Store the thumbnail url
+               this.thumbUrl = this.data.thumburl;
+               this.src = null;
+               this.row = null;
+
+               this.$thumb = $( '<img>' )
+                       .addClass( 'mw-widget-mediaResultWidget-thumbnail' )
+                       .on( {
+                               load: this.onThumbnailLoad.bind( this ),
+                               error: this.onThumbnailError.bind( this )
+                       } );
+               this.$overlay = $( '<div>' )
+                       .addClass( 'mw-widget-mediaResultWidget-overlay' );
+
+               this.calculateSizing( this.data );
+
+               // Get wiki default thumbnail size
+               this.defaultThumbSize = mw.config.get( 'wgVisualEditorConfig' )
+                       .defaultUserOptions.defaultthumbsize;
+
+               // Initialization
+               this.setLabel( new mw.Title( this.data.title ).getNameText() );
+               this.$label.addClass( 'mw-widget-mediaResultWidget-nameLabel' );
+
+               this.$element
+                       .addClass( 'mw-widget-mediaResultWidget ve-ui-texture-pending' )
+                       .prepend( this.$thumb, this.$overlay );
+       };
+
+       /* Inheritance */
+
+       OO.inheritClass( mw.widgets.MediaResultWidget, OO.ui.OptionWidget );
+
+       /* Static methods */
+
+       // Copied from ve.dm.MWImageNode
+       mw.widgets.MediaResultWidget.static.resizeToBoundingBox = function ( imageDimensions, boundingBox ) {
+               var newDimensions = OO.copy( imageDimensions ),
+                       scale = Math.min(
+                               boundingBox.height / imageDimensions.height,
+                               boundingBox.width / imageDimensions.width
+                       );
+
+               if ( scale < 1 ) {
+                       // Scale down
+                       newDimensions = {
+                               width: Math.floor( newDimensions.width * scale ),
+                               height: Math.floor( newDimensions.height * scale )
+                       };
+               }
+               return newDimensions;
+       };
+
+       /* Methods */
+       /** */
+       mw.widgets.MediaResultWidget.prototype.onThumbnailLoad = function () {
+               this.$thumb.first().addClass( 've-ui-texture-transparency' );
+               this.$element
+                       .addClass( 'mw-widget-mediaResultWidget-done' )
+                       .removeClass( 've-ui-texture-pending' );
+       };
+
+       /** */
+       mw.widgets.MediaResultWidget.prototype.onThumbnailError = function () {
+               this.$thumb.last()
+                       .css( 'background-image', '' )
+                       .addClass( 've-ui-texture-alert' );
+               this.$element
+                       .addClass( 'mw-widget-mediaResultWidget-error' )
+                       .removeClass( 've-ui-texture-pending' );
+       };
+
+       /**
+        * Resize the thumbnail and wrapper according to row height and bounding boxes, if given.
+        *
+        * @param {Object} originalDimensions Original image dimensions with width and height values
+        * @param {Object} [boundingBox] Specific bounding box, if supplied
+        */
+       mw.widgets.MediaResultWidget.prototype.calculateSizing = function ( originalDimensions, boundingBox ) {
+               var wrapperPadding,
+                       imageDimensions = {};
+
+               boundingBox = boundingBox || {};
+
+               if ( this.isAudio ) {
+                       // HACK: We are getting the wrong information from the
+                       // API about audio files. Set their thumbnail to square 120px
+                       imageDimensions = {
+                               width: 120,
+                               height: 120
+                       };
+               } else {
+                       // Get the image within the bounding box
+                       imageDimensions = this.constructor.static.resizeToBoundingBox(
+                               // Image original dimensions
+                               {
+                                       width: originalDimensions.width || originalDimensions.thumbwidth,
+                                       height: originalDimensions.height || originalDimensions.thumbwidth
+                               },
+                               // Bounding box
+                               {
+                                       width: boundingBox.width || this.getImageMaxWidth(),
+                                       height: boundingBox.height || this.getRowHeight()
+                               }
+                       );
+               }
+               this.imageDimensions = imageDimensions;
+               // Set the thumbnail size
+               this.$thumb.css( this.imageDimensions );
+
+               // Set the box size
+               wrapperPadding = this.calculateWrapperPadding( this.imageDimensions );
+               this.$element.css( wrapperPadding );
+       };
+
+       /**
+        * Replace the empty .src attribute of the image with the
+        * actual src.
+        */
+       mw.widgets.MediaResultWidget.prototype.lazyLoad = function () {
+               if ( !this.hasSrc() ) {
+                       this.src = this.thumbUrl;
+                       this.$thumb.attr( 'src', this.thumbUrl );
+               }
+       };
+
+       /**
+        * Retrieve the store dimensions object
+        *
+        * @return {Object} Thumb dimensions
+        */
+       mw.widgets.MediaResultWidget.prototype.getDimensions = function () {
+               return this.dimensions;
+       };
+
+       /**
+        * Resize thumbnail and element according to the resize factor
+        *
+        * @param {number} resizeFactor The resizing factor for the image
+        */
+       mw.widgets.MediaResultWidget.prototype.resizeThumb = function ( resizeFactor ) {
+               var boundingBox,
+                       imageOriginalWidth = this.imageDimensions.width,
+                       wrapperWidth = this.$element.width();
+               // Set the new row height
+               this.setRowHeight( Math.ceil( this.getRowHeight() * resizeFactor ) );
+
+               boundingBox = {
+                       width: Math.ceil( this.imageDimensions.width * resizeFactor ),
+                       height: this.getRowHeight()
+               };
+
+               this.calculateSizing( this.data, boundingBox );
+
+               // We need to adjust the wrapper this time to fit the "perfect"
+               // dimensions, regardless of how small the image is
+               if ( imageOriginalWidth < wrapperWidth ) {
+                       boundingBox.width = wrapperWidth * resizeFactor;
+               }
+               this.$element.css( this.calculateWrapperPadding( boundingBox ) );
+       };
+
+       /**
+        * Adjust the wrapper padding for small images
+        *
+        * @param {Object} thumbDimensions Thumbnail dimensions
+        * @return {Object} Css styling for the wrapper
+        */
+       mw.widgets.MediaResultWidget.prototype.calculateWrapperPadding = function ( thumbDimensions ) {
+               var css = {
+                       height: this.rowHeight,
+                       width: thumbDimensions.width,
+                       lineHeight: this.getRowHeight() + 'px'
+               };
+
+               // Check if the image is too thin so we can make a bit of space around it
+               if ( thumbDimensions.width < this.minWidth ) {
+                       css.width = this.minWidth;
+               }
+
+               return css;
+       };
+
+       /**
+        * Set the row height for all size calculations
+        *
+        * @return {number} rowHeight Row height
+        */
+       mw.widgets.MediaResultWidget.prototype.getRowHeight = function () {
+               return this.rowHeight;
+       };
+
+       /**
+        * Set the row height for all size calculations
+        *
+        * @param {number} rowHeight Row height
+        */
+       mw.widgets.MediaResultWidget.prototype.setRowHeight = function ( rowHeight ) {
+               this.rowHeight = rowHeight;
+       };
+
+       mw.widgets.MediaResultWidget.prototype.setImageMaxWidth = function ( width ) {
+               this.maxWidth = width;
+       };
+       mw.widgets.MediaResultWidget.prototype.getImageMaxWidth = function () {
+               return this.maxWidth;
+       };
+
+       /**
+        * Set the row this result is in.
+        *
+        * @param {number} row Row number
+        */
+       mw.widgets.MediaResultWidget.prototype.setRow = function ( row ) {
+               this.row = row;
+       };
+
+       /**
+        * Get the row this result is in.
+        *
+        * @return {number} row Row number
+        */
+       mw.widgets.MediaResultWidget.prototype.getRow = function () {
+               return this.row;
+       };
+
+       /**
+        * Check if the image has a src attribute already
+        *
+        * @return {boolean} Thumbnail has its source attribute set
+        */
+       mw.widgets.MediaResultWidget.prototype.hasSrc = function () {
+               return !!this.src;
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchProvider.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchProvider.js
new file mode 100644 (file)
index 0000000..a46d911
--- /dev/null
@@ -0,0 +1,69 @@
+/*!
+ * MediaWiki Widgets - MediaSearchProvider class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * MediaWiki media search provider.
+        *
+        * @class
+        * @extends mw.widgets.MediaResourceProvider
+        *
+        * @constructor
+        * @param {string} apiurl The API url
+        * @param {Object} [config] Configuration options
+        */
+       mw.widgets.MediaSearchProvider = function MwWidgetsMediaSearchProvider( apiurl, config ) {
+               config = config || {};
+
+               config.staticParams = $.extend( {
+                       generator: 'search',
+                       gsrnamespace: mw.config.get( 'wgNamespaceIds' ).file
+               }, config.staticParams );
+
+               // Parent constructor
+               mw.widgets.MediaSearchProvider.super.call( this, apiurl, config );
+       };
+
+       /* Inheritance */
+       OO.inheritClass( mw.widgets.MediaSearchProvider, mw.widgets.MediaResourceProvider );
+
+       /* Methods */
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.MediaSearchProvider.prototype.getContinueData = function ( howMany ) {
+               return {
+                       gsroffset: this.getOffset(),
+                       gsrlimit: howMany || this.getDefaultFetchLimit()
+               };
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.MediaSearchProvider.prototype.setContinue = function ( continueData ) {
+               // Update the offset for next time
+               this.setOffset( continueData.gsroffset );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.MediaSearchProvider.prototype.sort = function ( results ) {
+               return results.sort( function ( a, b ) {
+                       return a.index - b.index;
+               } );
+       };
+
+       /**
+        * @inheritdoc
+        */
+       mw.widgets.MediaSearchProvider.prototype.isValid = function () {
+               return this.getUserParams().gsrsearch && mw.widgets.MediaSearchProvider.super.prototype.isValid.call( this );
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchQueue.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchQueue.js
new file mode 100644 (file)
index 0000000..7ee98bb
--- /dev/null
@@ -0,0 +1,82 @@
+/*!
+ * MediaWiki Widgets - MediaSearchQueue class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * MediaWiki media resource queue.
+        *
+        * @class
+        * @extends mw.widgets.MediaResourceQueue
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @cfg {number} maxHeight The maximum height of the media, used in the
+        *  search call to the API.
+        */
+       mw.widgets.MediaSearchQueue = function MwWidgetsMediaSearchQueue( config ) {
+               config = config || {};
+
+               // Parent constructor
+               mw.widgets.MediaSearchQueue.super.call( this, config );
+
+               this.searchQuery = '';
+       };
+
+       /* Inheritance */
+       OO.inheritClass( mw.widgets.MediaSearchQueue, mw.widgets.MediaResourceQueue );
+
+       /**
+        * Override parent method to set up the providers according to
+        * the file repos
+        *
+        * @return {jQuery.Promise} Promise that resolves when the resources are set up
+        */
+       mw.widgets.MediaSearchQueue.prototype.setup = function () {
+               var i, len,
+                       queue = this;
+
+               return this.getFileRepos().then( function ( sources ) {
+                       if ( queue.providers.length === 0 ) {
+                               // Set up the providers
+                               for ( i = 0, len = sources.length; i < len; i++ ) {
+                                       queue.providers.push( new mw.widgets.MediaSearchProvider(
+                                               sources[ i ].apiurl,
+                                               {
+                                                       name: sources[ i ].name,
+                                                       local: sources[ i ].local,
+                                                       scriptDirUrl: sources[ i ].scriptDirUrl,
+                                                       userParams: {
+                                                               gsrsearch: queue.getSearchQuery()
+                                                       },
+                                                       staticParams: {
+                                                               iiurlheight: queue.getMaxHeight()
+                                                       }
+                                               } )
+                                       );
+                               }
+                       }
+               } );
+       };
+
+       /**
+        * Set the search query
+        *
+        * @param {string} searchQuery API search query
+        */
+       mw.widgets.MediaSearchQueue.prototype.setSearchQuery = function ( searchQuery ) {
+               this.setParams( { gsrsearch: searchQuery } );
+       };
+
+       /**
+        * Get the search query
+        *
+        * @return {string} API search query
+        */
+       mw.widgets.MediaSearchQueue.prototype.getSearchQuery = function () {
+               return this.getParams().gsrsearch;
+       };
+}( jQuery, mediaWiki ) );
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.css b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.css
new file mode 100644 (file)
index 0000000..3d28ef8
--- /dev/null
@@ -0,0 +1,10 @@
+/*!
+ * MediaWiki Widgets - MediaSearchWidget styles.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+.mw-widget-mediaSearchWidget .oo-ui-searchWidget-query .oo-ui-inputWidget {
+       max-width: none;
+}
diff --git a/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js b/resources/src/mediawiki.widgets/MediaSearch/mw.widgets.MediaSearchWidget.js
new file mode 100644 (file)
index 0000000..c6938e8
--- /dev/null
@@ -0,0 +1,462 @@
+/*!
+ * MediaWiki Widgets - MediaSearchWidget class.
+ *
+ * @copyright 2011-2016 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+( function ( $, mw ) {
+
+       /**
+        * Creates an mw.widgets.MediaSearchWidget object.
+        *
+        * @class
+        * @extends OO.ui.SearchWidget
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
+        * @param {number} [size] Vertical size of thumbnails
+        */
+       mw.widgets.MediaSearchWidget = function MwWidgetsMediaSearchWidget( config ) {
+               // Configuration initialization
+               config = $.extend( {
+                       placeholder: mw.msg( 'mw-widgets-mediasearch-input-placeholder' )
+               }, config );
+
+               // Parent constructor
+               mw.widgets.MediaSearchWidget.super.call( this, config );
+
+               // Properties
+               this.providers = {};
+               this.lastQueryValue = '';
+               this.searchQueue = new mw.widgets.MediaSearchQueue( {
+                       limit: this.constructor.static.limit,
+                       threshold: this.constructor.static.threshold
+               } );
+
+               this.queryTimeout = null;
+               this.itemCache = {};
+               this.promises = [];
+               this.lang = config.lang || 'en';
+               this.$panels = config.$panels;
+
+               this.externalLinkUrlProtocolsRegExp = new RegExp(
+                       '^(' + mw.config.get( 'wgUrlProtocols' ) + ')',
+                       'i'
+               );
+
+               // Masonry fit properties
+               this.rows = [];
+               this.rowHeight = config.rowHeight || 200;
+               this.layoutQueue = [];
+               this.numItems = 0;
+               this.currentItemCache = [];
+
+               this.resultsSize = {};
+
+               this.selected = null;
+
+               this.noItemsMessage = new OO.ui.LabelWidget( {
+                       label: mw.msg( 'mw-widgets-mediasearch-noresults' ),
+                       classes: [ 'mw-widget-mediaSearchWidget-noresults' ]
+               } );
+               this.noItemsMessage.toggle( false );
+
+               // Events
+               this.$results.on( 'scroll', this.onResultsScroll.bind( this ) );
+               this.$query.append( this.noItemsMessage.$element );
+               this.results.connect( this, {
+                       add: 'onResultsAdd',
+                       remove: 'onResultsRemove'
+               } );
+
+               this.resizeHandler = OO.ui.debounce( this.afterResultsResize.bind( this ), 500 );
+
+               // Initialization
+               this.$element.addClass( 'mw-widget-mediaSearchWidget' );
+       };
+
+       /* Inheritance */
+
+       OO.inheritClass( mw.widgets.MediaSearchWidget, OO.ui.SearchWidget );
+
+       /* Static properties */
+
+       mw.widgets.MediaSearchWidget.static.limit = 10;
+
+       mw.widgets.MediaSearchWidget.static.threshold = 5;
+
+       /* Methods */
+
+       /**
+        * Respond to window resize and check if the result display should
+        * be updated.
+        */
+       mw.widgets.MediaSearchWidget.prototype.afterResultsResize = function () {
+               var items = this.currentItemCache;
+
+               if (
+                       items.length > 0 &&
+                       (
+                               this.resultsSize.width !== this.$results.width() ||
+                               this.resultsSize.height !== this.$results.height()
+                       )
+               ) {
+                       this.resetRows();
+                       this.itemCache = {};
+                       this.processQueueResults( items );
+                       if ( this.results.getItems().length > 0 ) {
+                               this.lazyLoadResults();
+                       }
+
+                       // Cache the size
+                       this.resultsSize = {
+                               width: this.$results.width(),
+                               height: this.$results.height()
+                       };
+               }
+       };
+
+       /**
+        * Teardown the widget; disconnect the window resize event.
+        */
+       mw.widgets.MediaSearchWidget.prototype.teardown = function () {
+               $( window ).off( 'resize', this.resizeHandler );
+       };
+
+       /**
+        * Setup the widget; activate the resize event.
+        */
+       mw.widgets.MediaSearchWidget.prototype.setup = function () {
+               $( window ).on( 'resize', this.resizeHandler );
+       };
+
+       /**
+        * Query all sources for media.
+        *
+        * @method
+        */
+       mw.widgets.MediaSearchWidget.prototype.queryMediaQueue = function () {
+               var search = this,
+                       value = this.getQueryValue();
+
+               if ( value === '' ) {
+                       return;
+               }
+
+               this.query.pushPending();
+               search.noItemsMessage.toggle( false );
+
+               this.searchQueue.setSearchQuery( value );
+               this.searchQueue.get( this.constructor.static.limit )
+                       .then( function ( items ) {
+                               if ( items.length > 0 ) {
+                                       search.processQueueResults( items );
+                                       search.currentItemCache = search.currentItemCache.concat( items );
+                               }
+
+                               search.query.popPending();
+                               search.noItemsMessage.toggle( search.results.getItems().length === 0 );
+                               if ( search.results.getItems().length > 0 ) {
+                                       search.lazyLoadResults();
+                               }
+
+                       } );
+       };
+
+       /**
+        * Process the media queue giving more items
+        *
+        * @method
+        * @param {Object[]} items Given items by the media queue
+        */
+       mw.widgets.MediaSearchWidget.prototype.processQueueResults = function ( items ) {
+               var i, len, title,
+                       resultWidgets = [],
+                       inputSearchQuery = this.getQueryValue(),
+                       queueSearchQuery = this.searchQueue.getSearchQuery();
+
+               if ( inputSearchQuery === '' || queueSearchQuery !== inputSearchQuery ) {
+                       return;
+               }
+
+               for ( i = 0, len = items.length; i < len; i++ ) {
+                       title = new mw.Title( items[ i ].title ).getMainText();
+                       // Do not insert duplicates
+                       if ( !Object.prototype.hasOwnProperty.call( this.itemCache, title ) ) {
+                               this.itemCache[ title ] = true;
+                               resultWidgets.push(
+                                       new mw.widgets.MediaResultWidget( {
+                                               data: items[ i ],
+                                               rowHeight: this.rowHeight,
+                                               maxWidth: this.results.$element.width() / 3,
+                                               minWidth: 30,
+                                               rowWidth: this.results.$element.width()
+                                       } )
+                               );
+                       }
+               }
+               this.results.addItems( resultWidgets );
+
+       };
+
+       /**
+        * Get the sanitized query value from the input
+        *
+        * @return {string} Query value
+        */
+       mw.widgets.MediaSearchWidget.prototype.getQueryValue = function () {
+               var queryValue = this.query.getValue().trim();
+
+               if ( queryValue.match( this.externalLinkUrlProtocolsRegExp ) ) {
+                       queryValue = queryValue.match( /.+\/([^\/]+)/ )[ 1 ];
+               }
+               return queryValue;
+       };
+
+       /**
+        * Handle search value change
+        *
+        * @param {string} value New value
+        */
+       mw.widgets.MediaSearchWidget.prototype.onQueryChange = function () {
+               // Get the sanitized query value
+               var queryValue = this.getQueryValue();
+
+               if ( queryValue === this.lastQueryValue ) {
+                       return;
+               }
+
+               // Parent method
+               mw.widgets.MediaSearchWidget.super.prototype.onQueryChange.apply( this, arguments );
+
+               // Reset
+               this.itemCache = {};
+               this.currentItemCache = [];
+               this.resetRows();
+
+               // Empty the results queue
+               this.layoutQueue = [];
+
+               // Change resource queue query
+               this.searchQueue.setSearchQuery( queryValue );
+               this.lastQueryValue = queryValue;
+
+               // Queue
+               clearTimeout( this.queryTimeout );
+               this.queryTimeout = setTimeout( this.queryMediaQueue.bind( this ), 350 );
+       };
+
+       /**
+        * Handle results scroll events.
+        *
+        * @param {jQuery.Event} e Scroll event
+        */
+       mw.widgets.MediaSearchWidget.prototype.onResultsScroll = function () {
+               var position = this.$results.scrollTop() + this.$results.outerHeight(),
+                       threshold = this.results.$element.outerHeight() - this.rowHeight * 3;
+
+               // Check if we need to ask for more results
+               if ( !this.query.isPending() && position > threshold ) {
+                       this.queryMediaQueue();
+               }
+
+               this.lazyLoadResults();
+       };
+
+       /**
+        * Lazy-load the images that are visible.
+        */
+       mw.widgets.MediaSearchWidget.prototype.lazyLoadResults = function () {
+               var i, elementTop,
+                       items = this.results.getItems(),
+                       resultsScrollTop = this.$results.scrollTop(),
+                       position = resultsScrollTop + this.$results.outerHeight();
+
+               // Lazy-load results
+               for ( i = 0; i < items.length; i++ ) {
+                       elementTop = items[ i ].$element.position().top;
+                       if ( elementTop <= position && !items[ i ].hasSrc() ) {
+                               // Load the image
+                               items[ i ].lazyLoad();
+                       }
+               }
+       };
+
+       /**
+        * Reset all the rows; destroy the jQuery elements and reset
+        * the rows array.
+        */
+       mw.widgets.MediaSearchWidget.prototype.resetRows = function () {
+               var i, len;
+
+               for ( i = 0, len = this.rows.length; i < len; i++ ) {
+                       this.rows[ i ].$element.remove();
+               }
+
+               this.rows = [];
+               this.itemCache = {};
+       };
+
+       /**
+        * Find an available row at the end. Either we will need to create a new
+        * row or use the last available row if it isn't full.
+        *
+        * @return {number} Row index
+        */
+       mw.widgets.MediaSearchWidget.prototype.getAvailableRow = function () {
+               var row;
+
+               if ( this.rows.length === 0 ) {
+                       row = 0;
+               } else {
+                       row = this.rows.length - 1;
+               }
+
+               if ( !this.rows[ row ] ) {
+                       // Create new row
+                       this.rows[ row ] = {
+                               isFull: false,
+                               width: 0,
+                               items: [],
+                               $element: $( '<div>' )
+                                       .addClass( 'mw-widget-mediaResultWidget-row' )
+                                       .css( {
+                                               overflow: 'hidden'
+                                       } )
+                                       .data( 'row', row )
+                                       .attr( 'data-full', false )
+                       };
+                       // Append to results
+                       this.results.$element.append( this.rows[ row ].$element );
+               } else if ( this.rows[ row ].isFull ) {
+                       row++;
+                       // Create new row
+                       this.rows[ row ] = {
+                               isFull: false,
+                               width: 0,
+                               items: [],
+                               $element: $( '<div>' )
+                                       .addClass( 'mw-widget-mediaResultWidget-row' )
+                                       .css( {
+                                               overflow: 'hidden'
+                                       } )
+                                       .data( 'row', row )
+                                       .attr( 'data-full', false )
+                       };
+                       // Append to results
+                       this.results.$element.append( this.rows[ row ].$element );
+               }
+
+               return row;
+       };
+
+       /**
+        * Respond to add results event in the results widget.
+        * Override the way SelectWidget and GroupElement append the items
+        * into the group so we can append them in groups of rows.
+        *
+        * @param {mw.widgets.MediaResultWidget[]} items An array of item elements
+        */
+       mw.widgets.MediaSearchWidget.prototype.onResultsAdd = function ( items ) {
+               var search = this;
+
+               // Add method to a queue; this queue will only run when the widget
+               // is visible
+               this.layoutQueue.push( function () {
+                       var i, j, ilen, jlen, itemWidth, row, effectiveWidth,
+                               resizeFactor,
+                               maxRowWidth = search.results.$element.width() - 15;
+
+                       // Go over the added items
+                       row = search.getAvailableRow();
+                       for ( i = 0, ilen = items.length; i < ilen; i++ ) {
+                               itemWidth = items[ i ].$element.outerWidth( true );
+
+                               // Add items to row until it is full
+                               if ( search.rows[ row ].width + itemWidth >= maxRowWidth ) {
+                                       // Mark this row as full
+                                       search.rows[ row ].isFull = true;
+                                       search.rows[ row ].$element.attr( 'data-full', true );
+
+                                       // Find the resize factor
+                                       effectiveWidth = search.rows[ row ].width;
+                                       resizeFactor = maxRowWidth / effectiveWidth;
+
+                                       search.rows[ row ].$element.attr( 'data-effectiveWidth', effectiveWidth );
+                                       search.rows[ row ].$element.attr( 'data-resizeFactor', resizeFactor );
+                                       search.rows[ row ].$element.attr( 'data-row', row );
+
+                                       // Resize all images in the row to fit the width
+                                       for ( j = 0, jlen = search.rows[ row ].items.length; j < jlen; j++ ) {
+                                               search.rows[ row ].items[ j ].resizeThumb( resizeFactor );
+                                       }
+
+                                       // find another row
+                                       row = search.getAvailableRow();
+                               }
+
+                               // Add the cumulative
+                               search.rows[ row ].width += itemWidth;
+
+                               // Store reference to the item and to the row
+                               search.rows[ row ].items.push( items[ i ] );
+                               items[ i ].setRow( row );
+
+                               // Append the item
+                               search.rows[ row ].$element.append( items[ i ].$element );
+                       }
+
+                       // If we have less than 4 rows, call for more images
+                       if ( search.rows.length < 4 ) {
+                               search.queryMediaQueue();
+                       }
+               } );
+               this.runLayoutQueue();
+       };
+
+       /**
+        * Run layout methods from the queue only if the element is visible.
+        */
+       mw.widgets.MediaSearchWidget.prototype.runLayoutQueue = function () {
+               var i, len;
+
+               if ( this.$element.is( ':visible' ) ) {
+                       for ( i = 0, len = this.layoutQueue.length; i < len; i++ ) {
+                               this.layoutQueue.pop()();
+                       }
+               }
+       };
+
+       /**
+        * Respond to removing results event in the results widget.
+        * Clear the relevant rows.
+        *
+        * @param {OO.ui.OptionWidget[]} items Removed items
+        */
+       mw.widgets.MediaSearchWidget.prototype.onResultsRemove = function ( items ) {
+               if ( items.length > 0 ) {
+                       // In the case of the media search widget, if any items are removed
+                       // all are removed (new search)
+                       this.resetRows();
+                       this.currentItemCache = [];
+               }
+       };
+
+       /**
+        * Set language for the search results.
+        *
+        * @param {string} lang Language
+        */
+       mw.widgets.MediaSearchWidget.prototype.setLang = function ( lang ) {
+               this.lang = lang;
+       };
+
+       /**
+        * Get language for the search results.
+        *
+        * @return {string} lang Language
+        */
+       mw.widgets.MediaSearchWidget.prototype.getLang = function () {
+               return this.lang;
+       };
+}( jQuery, mediaWiki ) );
index 3daa70a..57a3d9c 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
  */
-/*global moment */
+/* global moment */
 ( function ( $, mw ) {
 
        /**
                selected = moment( this.getDate(), this.getDateFormat() );
 
                switch ( this.displayLayer ) {
-               case 'month':
-                       this.labelButton.setLabel( this.moment.format( 'MMMM YYYY' ) );
-                       this.upButton.toggle( true );
-
-                       // First week displayed is the first week spanned by the month, unless it begins on Monday, in
-                       // which case first week displayed is the previous week. This makes the calendar "balanced"
-                       // and also neatly handles 28-day February sometimes spanning only 4 weeks.
-                       currentDay = moment( this.moment ).startOf( 'month' ).subtract( 1, 'day' ).startOf( 'week' );
-
-                       // Day-of-week labels. Localisation-independent: works with weeks starting on Saturday, Sunday
-                       // or Monday.
-                       for ( i = 0; i < 7; i++ ) {
-                               items.push(
-                                       $( '<div>' )
-                                               .addClass( 'mw-widget-calendarWidget-day-heading' )
-                                               .text( currentDay.format( 'dd' ) )
-                               );
-                               currentDay.add( 1, 'day' );
-                       }
-                       currentDay.subtract( 7, 'days' );
-
-                       // Actual calendar month. Always displays 6 weeks, for consistency (months can span 4 to 6
-                       // weeks).
-                       for ( i = 0; i < 42; i++ ) {
-                               items.push(
-                                       $( '<div>' )
-                                               .addClass( 'mw-widget-calendarWidget-item mw-widget-calendarWidget-day' )
-                                               .toggleClass( 'mw-widget-calendarWidget-day-additional', !currentDay.isSame( this.moment, 'month' ) )
-                                               .toggleClass( 'mw-widget-calendarWidget-day-today', currentDay.isSame( today, 'day' ) )
-                                               .toggleClass( 'mw-widget-calendarWidget-item-selected', currentDay.isSame( selected, 'day' ) )
-                                               .text( currentDay.format( 'D' ) )
-                                               .data( 'date', currentDay.date() )
-                                               .data( 'month', currentDay.month() )
-                                               .data( 'year', currentDay.year() )
-                               );
-                               currentDay.add( 1, 'day' );
-                       }
-                       break;
-
-               case 'year':
-                       this.labelButton.setLabel( this.moment.format( 'YYYY' ) );
-                       this.upButton.toggle( true );
-
-                       currentMonth = moment( this.moment ).startOf( 'year' );
-                       for ( i = 0; i < 12; i++ ) {
-                               items.push(
-                                       $( '<div>' )
-                                               .addClass( 'mw-widget-calendarWidget-item mw-widget-calendarWidget-month' )
-                                               .toggleClass( 'mw-widget-calendarWidget-item-selected', currentMonth.isSame( selected, 'month' ) )
-                                               .text( currentMonth.format( 'MMMM' ) )
-                                               .data( 'month', currentMonth.month() )
-                               );
-                               currentMonth.add( 1, 'month' );
-                       }
-                       // Shuffle the array to display months in columns rather than rows.
-                       items = [
-                               items[ 0 ], items[ 6 ],      //  | January  | July      |
-                               items[ 1 ], items[ 7 ],      //  | February | August    |
-                               items[ 2 ], items[ 8 ],      //  | March    | September |
-                               items[ 3 ], items[ 9 ],      //  | April    | October   |
-                               items[ 4 ], items[ 10 ],     //  | May      | November  |
-                               items[ 5 ], items[ 11 ]      //  | June     | December  |
-                       ];
-                       break;
-
-               case 'duodecade':
-                       this.labelButton.setLabel( null );
-                       this.upButton.toggle( false );
-
-                       currentYear = moment( { year: Math.floor( this.moment.year() / 20 ) * 20 } );
-                       for ( i = 0; i < 20; i++ ) {
-                               items.push(
-                                       $( '<div>' )
-                                               .addClass( 'mw-widget-calendarWidget-item mw-widget-calendarWidget-year' )
-                                               .toggleClass( 'mw-widget-calendarWidget-item-selected', currentYear.isSame( selected, 'year' ) )
-                                               .text( currentYear.format( 'YYYY' ) )
-                                               .data( 'year', currentYear.year() )
-                               );
-                               currentYear.add( 1, 'year' );
-                       }
-                       break;
+                       case 'month':
+                               this.labelButton.setLabel( this.moment.format( 'MMMM YYYY' ) );
+                               this.upButton.toggle( true );
+
+                               // First week displayed is the first week spanned by the month, unless it begins on Monday, in
+                               // which case first week displayed is the previous week. This makes the calendar "balanced"
+                               // and also neatly handles 28-day February sometimes spanning only 4 weeks.
+                               currentDay = moment( this.moment ).startOf( 'month' ).subtract( 1, 'day' ).startOf( 'week' );
+
+                               // Day-of-week labels. Localisation-independent: works with weeks starting on Saturday, Sunday
+                               // or Monday.
+                               for ( i = 0; i < 7; i++ ) {
+                                       items.push(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-widget-calendarWidget-day-heading' )
+                                                       .text( currentDay.format( 'dd' ) )
+                                       );
+                                       currentDay.add( 1, 'day' );
+                               }
+                               currentDay.subtract( 7, 'days' );
+
+                               // Actual calendar month. Always displays 6 weeks, for consistency (months can span 4 to 6
+                               // weeks).
+                               for ( i = 0; i < 42; i++ ) {
+                                       items.push(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-widget-calendarWidget-item mw-widget-calendarWidget-day' )
+                                                       .toggleClass( 'mw-widget-calendarWidget-day-additional', !currentDay.isSame( this.moment, 'month' ) )
+                                                       .toggleClass( 'mw-widget-calendarWidget-day-today', currentDay.isSame( today, 'day' ) )
+                                                       .toggleClass( 'mw-widget-calendarWidget-item-selected', currentDay.isSame( selected, 'day' ) )
+                                                       .text( currentDay.format( 'D' ) )
+                                                       .data( 'date', currentDay.date() )
+                                                       .data( 'month', currentDay.month() )
+                                                       .data( 'year', currentDay.year() )
+                                       );
+                                       currentDay.add( 1, 'day' );
+                               }
+                               break;
+
+                       case 'year':
+                               this.labelButton.setLabel( this.moment.format( 'YYYY' ) );
+                               this.upButton.toggle( true );
+
+                               currentMonth = moment( this.moment ).startOf( 'year' );
+                               for ( i = 0; i < 12; i++ ) {
+                                       items.push(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-widget-calendarWidget-item mw-widget-calendarWidget-month' )
+                                                       .toggleClass( 'mw-widget-calendarWidget-item-selected', currentMonth.isSame( selected, 'month' ) )
+                                                       .text( currentMonth.format( 'MMMM' ) )
+                                                       .data( 'month', currentMonth.month() )
+                                       );
+                                       currentMonth.add( 1, 'month' );
+                               }
+                               // Shuffle the array to display months in columns rather than rows.
+                               items = [
+                                       items[ 0 ], items[ 6 ],      //  | January  | July      |
+                                       items[ 1 ], items[ 7 ],      //  | February | August    |
+                                       items[ 2 ], items[ 8 ],      //  | March    | September |
+                                       items[ 3 ], items[ 9 ],      //  | April    | October   |
+                                       items[ 4 ], items[ 10 ],     //  | May      | November  |
+                                       items[ 5 ], items[ 11 ]      //  | June     | December  |
+                               ];
+                               break;
+
+                       case 'duodecade':
+                               this.labelButton.setLabel( null );
+                               this.upButton.toggle( false );
+
+                               currentYear = moment( { year: Math.floor( this.moment.year() / 20 ) * 20 } );
+                               for ( i = 0; i < 20; i++ ) {
+                                       items.push(
+                                               $( '<div>' )
+                                                       .addClass( 'mw-widget-calendarWidget-item mw-widget-calendarWidget-year' )
+                                                       .toggleClass( 'mw-widget-calendarWidget-item-selected', currentYear.isSame( selected, 'year' ) )
+                                                       .text( currentYear.format( 'YYYY' ) )
+                                                       .data( 'year', currentYear.year() )
+                                       );
+                                       currentYear.add( 1, 'year' );
+                               }
+                               break;
                }
 
                this.$body.append.apply( this.$body, items );
         */
        mw.widgets.CalendarWidget.prototype.onPrevButtonClick = function () {
                switch ( this.displayLayer ) {
-               case 'month':
-                       this.moment.subtract( 1, 'month' );
-                       break;
-               case 'year':
-                       this.moment.subtract( 1, 'year' );
-                       break;
-               case 'duodecade':
-                       this.moment.subtract( 20, 'years' );
-                       break;
+                       case 'month':
+                               this.moment.subtract( 1, 'month' );
+                               break;
+                       case 'year':
+                               this.moment.subtract( 1, 'year' );
+                               break;
+                       case 'duodecade':
+                               this.moment.subtract( 20, 'years' );
+                               break;
                }
                this.updateUI( 'previous' );
        };
         */
        mw.widgets.CalendarWidget.prototype.onNextButtonClick = function () {
                switch ( this.displayLayer ) {
-               case 'month':
-                       this.moment.add( 1, 'month' );
-                       break;
-               case 'year':
-                       this.moment.add( 1, 'year' );
-                       break;
-               case 'duodecade':
-                       this.moment.add( 20, 'years' );
-                       break;
+                       case 'month':
+                               this.moment.add( 1, 'month' );
+                               break;
+                       case 'year':
+                               this.moment.add( 1, 'year' );
+                               break;
+                       case 'duodecade':
+                               this.moment.add( 20, 'years' );
+                               break;
                }
                this.updateUI( 'next' );
        };
         * what gets clicked.
         *
         * @private
+        * @param {jQuery.Event} e Click event
         */
        mw.widgets.CalendarWidget.prototype.onBodyClick = function ( e ) {
                var
         *
         * @private
         * @param {jQuery.Event} e Mouse click event
+        * @return {boolean} False to cancel the default event
         */
        mw.widgets.CalendarWidget.prototype.onClick = function ( e ) {
                if ( !this.isDisabled() && e.which === 1 ) {
         *
         * @private
         * @param {jQuery.Event} e Key down event
+        * @return {boolean} False to cancel the default event
         */
        mw.widgets.CalendarWidget.prototype.onKeyDown = function ( e ) {
                var
-                       /*jshint -W024*/
                        dir = OO.ui.Element.static.getDir( this.$element ),
-                       /*jshint +W024*/
                        nextDirectionKey = dir === 'ltr' ? OO.ui.Keys.RIGHT : OO.ui.Keys.LEFT,
                        prevDirectionKey = dir === 'ltr' ? OO.ui.Keys.LEFT : OO.ui.Keys.RIGHT,
                        changed = true;
 
                if ( !this.isDisabled() ) {
                        switch ( e.which ) {
-                       case prevDirectionKey:
-                               this.moment.subtract( 1, this.precision === 'month' ? 'month' : 'day' );
-                               break;
-                       case nextDirectionKey:
-                               this.moment.add( 1, this.precision === 'month' ? 'month' : 'day' );
-                               break;
-                       case OO.ui.Keys.UP:
-                               this.moment.subtract( 1, this.precision === 'month' ? 'month' : 'week' );
-                               break;
-                       case OO.ui.Keys.DOWN:
-                               this.moment.add( 1, this.precision === 'month' ? 'month' : 'week' );
-                               break;
-                       case OO.ui.Keys.PAGEUP:
-                               this.moment.subtract( 1, this.precision === 'month' ? 'year' : 'month' );
-                               break;
-                       case OO.ui.Keys.PAGEDOWN:
-                               this.moment.add( 1, this.precision === 'month' ? 'year' : 'month' );
-                               break;
-                       default:
-                               changed = false;
-                               break;
+                               case prevDirectionKey:
+                                       this.moment.subtract( 1, this.precision === 'month' ? 'month' : 'day' );
+                                       break;
+                               case nextDirectionKey:
+                                       this.moment.add( 1, this.precision === 'month' ? 'month' : 'day' );
+                                       break;
+                               case OO.ui.Keys.UP:
+                                       this.moment.subtract( 1, this.precision === 'month' ? 'month' : 'week' );
+                                       break;
+                               case OO.ui.Keys.DOWN:
+                                       this.moment.add( 1, this.precision === 'month' ? 'month' : 'week' );
+                                       break;
+                               case OO.ui.Keys.PAGEUP:
+                                       this.moment.subtract( 1, this.precision === 'month' ? 'year' : 'month' );
+                                       break;
+                               case OO.ui.Keys.PAGEDOWN:
+                                       this.moment.add( 1, this.precision === 'month' ? 'year' : 'month' );
+                                       break;
+                               default:
+                                       changed = false;
+                                       break;
                        }
 
                        if ( changed ) {
index 4d86cfd..488d9e0 100644 (file)
@@ -94,7 +94,8 @@
         * @extends mw.Title
         *
         * @constructor
-        * @inheritdoc
+        * @param {string} title
+        * @param {number} [namespace]
         */
        function ForeignTitle( title, namespace ) {
                // We only need to handle categories here... but we don't know the target language.
        };
 
        /**
-        * @class mw.widgets.CategoryCapsuleItemWidget
-        *
         * Category selector capsule item widget. Extends OO.ui.CapsuleItemWidget with the ability to link
         * to the given page, and to show its existence status (i.e., whether it is a redlink).
         *
+        * @class mw.widgets.CategoryCapsuleItemWidget
         * @uses mw.Api
         * @extends OO.ui.CapsuleItemWidget
         *
                this.$label.replaceWith( this.$link );
                this.setLabelElement( this.$link );
 
-               /*jshint -W024*/
                if ( !this.constructor.static.pageExistenceCaches[ this.apiUrl ] ) {
                        this.constructor.static.pageExistenceCaches[ this.apiUrl ] =
                                new PageExistenceCache( new mw.ForeignApi( this.apiUrl ) );
                        .done( function ( exists ) {
                                widget.setMissing( !exists );
                        } );
-               /*jshint +W024*/
        };
 
        /* Setup */
 
        /* Static Properties */
 
-       /*jshint -W024*/
        /**
         * Map of API URLs to PageExistenceCache objects.
         *
        mw.widgets.CategoryCapsuleItemWidget.static.pageExistenceCaches = {
                '': new PageExistenceCache()
        };
-       /*jshint +W024*/
 
        /* Methods */
 
index 267eebb..422c048 100644 (file)
@@ -52,6 +52,7 @@
                        menu: {
                                filterFromInput: false
                        },
+                       placeholder: mw.msg( 'mw-widgets-categoryselector-add-category-placeholder' ),
                        // This allows the user to both select non-existent categories, and prevents the selector from
                        // being wiped from #onMenuItemsChange when we change the available options in the dropdown
                        allowArbitrary: true
                                        prop: 'categories',
                                        cllimit: this.limit,
                                        titles: 'Category:' + input
-                               } ).done( function ( res )  {
+                               } ).done( function ( res ) {
                                        var categories = [];
 
                                        $.each( res.query.pages, function ( index, page ) {
index ddae9b1..8f48ec3 100644 (file)
@@ -51,7 +51,6 @@
        OO.inheritClass( mw.widgets.ComplexTitleInputWidget, OO.ui.Widget );
 
        /* Static Methods */
-       /*jshint -W024*/
 
        /**
         * @inheritdoc
@@ -85,8 +84,6 @@
                return state;
        };
 
-       /*jshint +W024*/
-
        /* Methods */
 
        /**
index ed251f2..7f5e608 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
  */
-/*global moment */
+/* global moment */
 ( function ( $, mw ) {
 
        /**
@@ -87,6 +87,8 @@
         *     calendar uses relative positioning.
         */
        mw.widgets.DateInputWidget = function MWWDateInputWidget( config ) {
+               var placeholderDateFormat, mustBeAfter, mustBeBefore;
+
                // Config initialization
                config = $.extend( {
                        precision: 'day',
                        }
                }
 
-               var placeholderDateFormat, mustBeAfter, mustBeBefore;
                if ( config.placeholderDateFormat ) {
                        placeholderDateFormat = config.placeholderDateFormat;
                } else if ( config.inputFormat ) {
         * @return {string} Format string
         */
        mw.widgets.DateInputWidget.prototype.getDisplayFormat = function () {
+               var localeData, llll, lll, ll, format;
+
                if ( this.displayFormat !== undefined ) {
                        return this.displayFormat;
                }
                        // We try to construct it as 'llll - (lll - ll)' and hope for the best.
                        // This seems to work well for many languages (maybe even all?).
 
-                       var localeData = moment.localeData( moment.locale() ),
-                               llll = localeData.longDateFormat( 'llll' ),
-                               lll = localeData.longDateFormat( 'lll' ),
-                               ll = localeData.longDateFormat( 'll' ),
-                               format = llll.replace( lll.replace( ll, '' ), '' );
+                       localeData = moment.localeData( moment.locale() );
+                       llll = localeData.longDateFormat( 'llll' );
+                       lll = localeData.longDateFormat( 'lll' );
+                       ll = localeData.longDateFormat( 'll' );
+                       format = llll.replace( lll.replace( ll, '' ), '' );
 
                        return format;
                }
         *
         * @private
         * @param {jQuery.Event} e Mouse click event
+        * @return {boolean} False to cancel the default event
         */
        mw.widgets.DateInputWidget.prototype.onClick = function ( e ) {
                if ( !this.isDisabled() && e.which === 1 ) {
         *
         * @private
         * @param {jQuery.Event} e Key press event
+        * @return {boolean} False to cancel the default event
         */
        mw.widgets.DateInputWidget.prototype.onKeyPress = function ( e ) {
                if ( !this.isDisabled() &&
         *
         * @private
         * @param {jQuery.Event} e Key press event
+        * @return {boolean} False to cancel the default event
         */
        mw.widgets.DateInputWidget.prototype.onCalendarKeyPress = function ( e ) {
                if ( !this.isDisabled() && e.which === OO.ui.Keys.ENTER ) {
         *
         * @private
         * @param {jQuery.Event} e Mouse click event
+        * @return {boolean} False to cancel the default event
         */
        mw.widgets.DateInputWidget.prototype.onCalendarClick = function ( e ) {
                if (
index c88395e..aa0c739 100644 (file)
@@ -36,6 +36,8 @@
 
        /**
         * @private
+        * @param {Object} [config] Configuration options
+        * @return {Object[]} Dropdown options
         */
        mw.widgets.NamespaceInputWidget.prototype.getNamespaceDropdownOptions = function ( config ) {
                var options,
index d816335..2ac75c5 100755 (executable)
@@ -13,6 +13,7 @@
         * @extends mw.widgets.TitleInputWidget
         *
         * @constructor
+        * @param {Object} [config] Configuration options
         * @cfg {boolean} [pushPending=true] Visually mark the input field as "pending", while
         *  requesting suggestions.
         * @cfg {boolean} [performSearchOnClick=true] If true, the script will start a search when-
@@ -77,7 +78,7 @@
         * @inheritdoc mw.widgets.TitleWidget
         */
        mw.widgets.SearchInputWidget.prototype.getSuggestionsPromise = function () {
-               var api = new mw.Api(),
+               var api = this.getApi(),
                        promise,
                        self = this;
 
index 101a606..a78ad82 100644 (file)
@@ -15,6 +15,7 @@
         * @mixins OO.ui.mixin.LookupElement
         *
         * @constructor
+        * @param {Object} [config] Configuration options
         * @cfg {boolean} [suggestions=true] Display search suggestions
         * @cfg {RegExp|Function|string} [validate] Perform title validation
         */
index 96f9549..5ba9481 100644 (file)
@@ -15,6 +15,7 @@
         * @mixins mw.widgets.TitleWidget
         *
         * @constructor
+        * @param {Object} [config] Configuration options
         */
        mw.widgets.TitleSearchWidget = function MwWidgetsTitleSearchWidget( config ) {
                config = config || {};
index 7ca19df..0e5e0c5 100644 (file)
@@ -6,16 +6,6 @@
  */
 ( function ( $, mw ) {
 
-       var interwikiPrefixesPromise = new mw.Api().get( {
-                       action: 'query',
-                       meta: 'siteinfo',
-                       siprop: 'interwikimap'
-               } ).then( function ( data ) {
-                       return $.map( data.query.interwikimap, function ( interwiki ) {
-                               return interwiki.prefix;
-                       } );
-               } );
-
        /**
         * Mixin for title widgets
         *
@@ -36,6 +26,7 @@
         * @cfg {boolean} [validateTitle=true] Whether the input must be a valid title (if set to true,
         *  the widget will marks itself red for invalid inputs, including an empty query).
         * @cfg {Object} [cache] Result cache which implements a 'set' method, taking keyed values as an argument
+        * @cfg {mw.Api} [api] API object to use, creates a default mw.Api instance if not specified
         */
        mw.widgets.TitleWidget = function MwWidgetsTitleWidget( config ) {
                // Config initialization
@@ -56,6 +47,7 @@
                this.excludeCurrentPage = !!config.excludeCurrentPage;
                this.validateTitle = config.validateTitle !== undefined ? config.validateTitle : true;
                this.cache = config.cache;
+               this.api = config.api || new mw.Api();
 
                // Initialization
                this.$element.addClass( 'mw-widget-titleWidget' );
 
        OO.initClass( mw.widgets.TitleWidget );
 
+       /* Static properties */
+
+       mw.widgets.TitleWidget.static.interwikiPrefixesPromiseCache = {};
+
        /* Methods */
 
        /**
                this.namespace = namespace;
        };
 
+       mw.widgets.TitleWidget.prototype.getInterwikiPrefixesPromise = function () {
+               var api = this.getApi(),
+                       cache = this.constructor.static.interwikiPrefixesPromiseCache,
+                       key = api.defaults.ajax.url;
+               if ( !cache.hasOwnProperty( key ) ) {
+                       cache[ key ] = api.get( {
+                               action: 'query',
+                               meta: 'siteinfo',
+                               siprop: 'interwikimap'
+                       } ).then( function ( data ) {
+                               return $.map( data.query.interwikimap, function ( interwiki ) {
+                                       return interwiki.prefix;
+                               } );
+                       } );
+               }
+               return cache[ key ];
+       };
+
        /**
         * Get a promise which resolves with an API repsonse for suggested
         * links for the current query.
         */
        mw.widgets.TitleWidget.prototype.getSuggestionsPromise = function () {
                var req,
+                       api = this.getApi(),
                        query = this.getQueryValue(),
                        widget = this,
                        promiseAbortObject = { abort: function () {
                        } };
 
                if ( mw.Title.newFromText( query ) ) {
-                       return interwikiPrefixesPromise.then( function ( interwikiPrefixes ) {
+                       return this.getInterwikiPrefixesPromise().then( function ( interwikiPrefixes ) {
                                var params,
                                        interwiki = query.substring( 0, query.indexOf( ':' ) );
                                if (
                                                params.prop.push( 'pageterms' );
                                                params.wbptterms = 'description';
                                        }
-                                       req = new mw.Api().get( params );
+                                       req = api.get( params );
                                        promiseAbortObject.abort = req.abort.bind( req ); // TODO ew
                                        return req.then( function ( ret ) {
                                                if ( ret.query === undefined ) {
-                                                       ret = new mw.Api().get( { action: 'query', titles: query } );
+                                                       ret = api.get( { action: 'query', titles: query } );
                                                        promiseAbortObject.abort = ret.abort.bind( ret );
                                                }
                                                return ret;
                }
        };
 
+       /**
+        * Get the API object for title requests
+        *
+        * @return {mw.Api} MediaWiki API
+        */
+       mw.widgets.TitleWidget.prototype.getApi = function () {
+               return this.api;
+       };
+
        /**
         * Get option widgets from the server response
         *
                        description = mw.msg( 'mw-widgets-titleinput-description-new-page' );
                }
                return {
-                       data: this.namespace !== null && this.relative
-                               ? mwTitle.getRelativeText( this.namespace )
-                               title,
+                       data: this.namespace !== null && this.relative ?
+                               mwTitle.getRelativeText( this.namespace ) :
+                               title,
                        url: mwTitle.getUrl(),
                        imageUrl: this.showImages ? data.imageUrl : null,
                        description: this.showDescriptions ? description : null,
index 164fd20..2b3a59f 100644 (file)
@@ -90,6 +90,7 @@
         *
         * @method
         * @param {Mixed} response Response from server
+        * @return {Object}
         */
        mw.widgets.UserInputWidget.prototype.getLookupCacheDataFromResponse = function ( response ) {
                return response.query.allusers || {};
index f51403f..1a3cdd5 100644 (file)
                this.apiUrl = String( url );
                this.anonymous = options && options.anonymous;
 
-               options = $.extend( /*deep=*/ true,
+               options = $.extend( /* deep=*/ true,
                        {
                                ajax: {
                                        url: this.apiUrl,
                                        xhrFields: {
-                                               withCredentials: this.anonymous ? false : true
+                                               withCredentials: !this.anonymous
                                        }
                                },
                                parameters: {
index b7579ff..0c08ca4 100644 (file)
                                } )
                                // AJAX success just means "200 OK" response, also check API error codes
                                .done( function ( result, textStatus, jqXHR ) {
+                                       var code;
                                        if ( result === undefined || result === null || result === '' ) {
                                                apiDeferred.reject( 'ok-but-empty',
                                                        'OK response but empty result (check HTTP headers?)',
                                                        jqXHR
                                                );
                                        } else if ( result.error ) {
-                                               var code = result.error.code === undefined ? 'unknown' : result.error.code;
+                                               code = result.error.code === undefined ? 'unknown' : result.error.code;
                                                apiDeferred.reject( code, result, result, jqXHR );
                                        } else {
                                                apiDeferred.resolve( result, jqXHR );
                                                        } );
                                                }
 
-                                               // Different error, pass on to let caller handle the error code
-                                               return this;
+                                               // Let caller handle the error code
+                                               return $.Deferred().rejectWith( this, arguments );
                                        }
                                );
                        } ).promise( { abort: function () {
                 *
                 * @since 1.22
                 * @param {string} type Token type
+                * @param {string} [assert]
                 * @return {jQuery.Promise} Received token.
                 */
                getToken: function ( type, assert ) {
                        promiseGroup = promises[ this.defaults.ajax.url ];
                        d = promiseGroup && promiseGroup[ type + 'Token' ];
 
+                       if ( !promiseGroup ) {
+                               promiseGroup = promises[ this.defaults.ajax.url ] = {};
+                       }
+
                        if ( !d ) {
                                apiPromise = this.get( {
                                        action: 'query',
                                                // Clear promise. Do not cache errors.
                                                delete promiseGroup[ type + 'Token' ];
 
-                                               // Pass on to allow the caller to handle the error
-                                               return this;
+                                               // Let caller handle the error code
+                                               return $.Deferred().rejectWith( this, arguments );
                                        } )
                                        // Attach abort handler
                                        .promise( { abort: apiPromise.abort } );
 
                                // Store deferred now so that we can use it again even if it isn't ready yet
-                               if ( !promiseGroup ) {
-                                       promiseGroup = promises[ this.defaults.ajax.url ] = {};
-                               }
                                promiseGroup[ type + 'Token' ] = d;
                        }
 
index bb3a913..21fad5e 100644 (file)
                        var basetimestamp, curtimestamp,
                                api = this;
                        return api.get( {
-                                       action: 'query',
-                                       prop: 'revisions',
-                                       rvprop: [ 'content', 'timestamp' ],
-                                       titles: String( title ),
-                                       formatversion: '2',
-                                       curtimestamp: true
-                               } )
+                               action: 'query',
+                               prop: 'revisions',
+                               rvprop: [ 'content', 'timestamp' ],
+                               titles: String( title ),
+                               formatversion: '2',
+                               curtimestamp: true
+                       } )
                                .then( function ( data ) {
                                        var page, revision;
                                        if ( !data.query || !data.query.pages ) {
index 418fd23..f38e88b 100644 (file)
                 * @return {string} return.done.data Parsed HTML of `wikitext`.
                 */
                parse: function ( content, additionalParams ) {
-                       var apiPromise, config = $.extend( {
-                               formatversion: 2,
-                               action: 'parse',
-                               contentmodel: 'wikitext'
-                       }, additionalParams );
+                       var apiPromise,
+                               config = $.extend( {
+                                       formatversion: 2,
+                                       action: 'parse',
+                                       contentmodel: 'wikitext'
+                               }, additionalParams );
 
                        if ( mw.Title && content instanceof mw.Title ) {
                                // Parse existing page
index 8169449..351ceb2 100644 (file)
@@ -34,7 +34,8 @@
         * @return {string}
         */
        function getFirstKey( obj ) {
-               for ( var key in obj ) {
+               var key;
+               for ( key in obj ) {
                        if ( obj.hasOwnProperty( key ) ) {
                                return key;
                        }
@@ -45,6 +46,7 @@
         * Get new iframe object for an upload.
         *
         * @private
+        * @param {string} id
         * @return {HTMLIframeElement}
         */
        function getNewIframe( id ) {
@@ -58,6 +60,8 @@
         * Shortcut for getting hidden inputs
         *
         * @private
+        * @param {string} name
+        * @param {string} val
         * @return {jQuery}
         */
        function getHiddenInput( name, val ) {
                 *
                 * @param {string} filekey
                 * @param {Object} data
+                * @return {jQuery.Promise}
                 */
                uploadFromStash: function ( filekey, data ) {
                        data.filekey = filekey;
index a2ff129..687b475 100644 (file)
@@ -12,6 +12,7 @@
         * @param {string|mw.Title|string[]|mw.Title[]} pages Full page name or instance of mw.Title, or an
         *  array thereof. If an array is passed, the return value passed to the promise will also be an
         *  array of appropriate objects.
+        * @param {Object} [addParams]
         * @return {jQuery.Promise}
         * @return {Function} return.done
         * @return {Object|Object[]} return.done.watch Object or list of objects (depends on the `pages`
index 0fbbcbe..5f60097 100644 (file)
@@ -4,8 +4,6 @@
  */
 ( function ( mw, $ ) {
 
-       /*jshint -W024*/
-
        /**
         * Helper function for hide-if to find the nearby form field.
         *
 
        mw.hook( 'htmlform.enhance' ).add( function ( $root ) {
                $root.find( '.mw-htmlform-hide-if' ).each( function () {
-                       var v, i, fields, test, func, spec, self, modules, data,extraModules,
+                       var v, i, fields, test, func, spec, self, modules, data, extraModules,
                                $el = $( this );
 
                        modules = [];
index 37474f6..4f672fc 100644 (file)
@@ -10,6 +10,7 @@
         * Currently only supports passing 'hide-if' data.
         *
         * @ignore
+        * @param {Object} [config] Configuration options
         */
        mw.htmlform.Element = function ( config ) {
                // Configuration initialization
index 9ab2532..37c0554 100644 (file)
@@ -18,8 +18,8 @@
                } );
                $oldContainer.find( 'input' ).each( function () {
                        var $oldInput = $( this ),
-                       checked = $oldInput.prop( 'checked' ),
-                       $option = $( '<option>' );
+                               checked = $oldInput.prop( 'checked' ),
+                               $option = $( '<option>' );
                        $option.prop( 'value', $oldInput.prop( 'value' ) );
                        if ( checked ) {
                                $option.prop( 'selected', true );
@@ -98,7 +98,6 @@
                                                modules.push.apply( modules, extraModules );
                                        }
                                        mw.loader.using( modules, function () {
-                                               /*jshint -W024*/
                                                convertCheckboxesWidgetToCapsules( OO.ui.FieldLayout.static.infuse( $el ) );
                                        } );
                                } else {
index 844d74c..a5cf1d8 100644 (file)
@@ -1,4 +1,4 @@
-/*global moment */
+/* global moment, Uint8Array */
 ( function ( $, mw ) {
 
        /**
@@ -18,6 +18,9 @@
         * @class mw.ForeignStructuredUpload.BookletLayout
         * @uses mw.ForeignStructuredUpload
         * @extends mw.Upload.BookletLayout
+        *
+        * @constructor
+        * @param {Object} config Configuration options
         * @cfg {string} [target] Used to choose the target repository.
         *     If nothing is passed, the {@link mw.ForeignUpload#property-target default} is used.
         */
                                }
 
                                try {
-                                       metadata = mw.libs.jpegmeta( this.result, file.name );
+                                       metadata = mw.libs.jpegmeta( fileStr, file.name );
                                } catch ( e ) {
                                        metadata = null;
                                }
index 3a0a94b..0c572d4 100644 (file)
@@ -1,8 +1,5 @@
 ( function ( mw, $, OO ) {
        /**
-        * @class mw.ForeignStructuredUpload
-        * @extends mw.ForeignUpload
-        *
         * Used to represent an upload in progress on the frontend.
         *
         * This subclass will upload to a wiki using a structured metadata
         * **TODO: This currently only supports uploads under CC-BY-SA 4.0,
         * and should really have support for more licenses.**
         *
-        * @inheritdoc
+        * @class mw.ForeignStructuredUpload
+        * @extends mw.ForeignUpload
+        *
+        * @constructor
+        * @param {string} [target]
+        * @param {Object} [apiconfig]
         */
        function ForeignStructuredUpload( target, apiconfig ) {
                this.date = undefined;
index 781c1df..08fc01d 100644 (file)
@@ -1,8 +1,5 @@
 ( function ( mw, OO, $ ) {
        /**
-        * @class mw.ForeignUpload
-        * @extends mw.Upload
-        *
         * Used to represent an upload in progress on the frontend.
         *
         * Subclassed to upload to a foreign API, with no other goodies. Use
@@ -12,6 +9,9 @@
         * an object, we assume you want the default, and treat it as apiconfig
         * instead.
         *
+        * @class mw.ForeignUpload
+        * @extends mw.Upload
+        *
         * @constructor
         * @param {string} [target] Used to set up the target
         *     wiki. If not remote, this class behaves identically to mw.Upload (unless further subclassed)
 
        /**
         * Override from mw.Upload to make sure the API info is found and allowed
+        *
+        * @inheritdoc
         */
        ForeignUpload.prototype.upload = function () {
                var upload = this;
 
        /**
         * Override from mw.Upload to make sure the API info is found and allowed
+        *
+        * @inheritdoc
         */
        ForeignUpload.prototype.uploadToStash = function () {
                var upload = this;
index e468768..0e2af50 100644 (file)
@@ -3,17 +3,15 @@
  * @author Timo Tijhof, 2011-2013
  * @since 1.18
  */
-( function ( mw, $ ) {
-       /*jshint latedef:false */
 
+/* eslint-disable no-use-before-define */
+
+( function ( mw, $ ) {
        /**
         * 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
         * logic directly and get null for invalid titles which is easier to work with.
         *
-        * @class mw.Title
-        */
-       /**
         * Note that in the constructor and #newFromText method, `namespace` is the **default** namespace
         * only, and can be overridden by a namespace prefix in `title`. If you do not want this behavior,
         * use #makeTitle. Compare:
@@ -30,7 +28,8 @@
         *     mw.Title.newFromText( 'Template:Foo', NS_TEMPLATE ).getPrefixedText(); // => 'Template:Foo'
         *     mw.Title.makeTitle( NS_TEMPLATE, 'Template:Foo' ).getPrefixedText();   // => 'Template:Template:Foo'
         *
-        * @method constructor
+        * @class mw.Title
+        * @constructor
         * @param {string} title Title of the page. If no second argument given,
         *  this will be searched for a namespace
         * @param {number} [namespace=NS_MAIN] If given, will used as default namespace for the given title
                this.title = parsed.title;
                this.ext = parsed.ext;
                this.fragment = parsed.fragment;
-
-               return this;
        }
 
        /* Private members */
 
+       // eslint-disable-next-line vars-on-top
        var
+               namespaceIds = mw.config.get( 'wgNamespaceIds' ),
 
-       namespaceIds = mw.config.get( 'wgNamespaceIds' ),
+               /**
+                * @private
+                * @static
+                * @property NS_MAIN
+                */
+               NS_MAIN = namespaceIds[ '' ],
 
-       /**
-        * @private
-        * @static
-        * @property NS_MAIN
-        */
-       NS_MAIN = namespaceIds[ '' ],
+               /**
+                * @private
+                * @static
+                * @property NS_TALK
+                */
+               NS_TALK = namespaceIds.talk,
 
-       /**
-        * @private
-        * @static
-        * @property NS_TALK
-        */
-       NS_TALK = namespaceIds.talk,
+               /**
+                * @private
+                * @static
+                * @property NS_SPECIAL
+                */
+               NS_SPECIAL = namespaceIds.special,
 
-       /**
-        * @private
-        * @static
-        * @property NS_SPECIAL
-        */
-       NS_SPECIAL = namespaceIds.special,
+               /**
+                * @private
+                * @static
+                * @property NS_MEDIA
+                */
+               NS_MEDIA = namespaceIds.media,
 
-       /**
-        * @private
-        * @static
-        * @property NS_MEDIA
-        */
-       NS_MEDIA = namespaceIds.media,
+               /**
+                * @private
+                * @static
+                * @property NS_FILE
+                */
+               NS_FILE = namespaceIds.file,
 
-       /**
-        * @private
-        * @static
-        * @property NS_FILE
-        */
-       NS_FILE = namespaceIds.file,
+               /**
+                * @private
+                * @static
+                * @property FILENAME_MAX_BYTES
+                */
+               FILENAME_MAX_BYTES = 240,
 
-       /**
-        * @private
-        * @static
-        * @property FILENAME_MAX_BYTES
-        */
-       FILENAME_MAX_BYTES = 240,
+               /**
+                * @private
+                * @static
+                * @property TITLE_MAX_BYTES
+                */
+               TITLE_MAX_BYTES = 255,
 
-       /**
-        * @private
-        * @static
-        * @property TITLE_MAX_BYTES
-        */
-       TITLE_MAX_BYTES = 255,
+               /**
+                * Get the namespace id from a namespace name (either from the localized, canonical or alias
+                * name).
+                *
+                * Example: On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or
+                * even 'Bild'.
+                *
+                * @private
+                * @static
+                * @method getNsIdByName
+                * @param {string} ns Namespace name (case insensitive, leading/trailing space ignored)
+                * @return {number|boolean} Namespace id or boolean false
+                */
+               getNsIdByName = function ( ns ) {
+                       var id;
+
+                       // Don't cast non-strings to strings, because null or undefined should not result in
+                       // returning the id of a potential namespace called "Null:" (e.g. on null.example.org/wiki)
+                       // Also, toLowerCase throws exception on null/undefined, because it is a String method.
+                       if ( typeof ns !== 'string' ) {
+                               return false;
+                       }
+                       // TODO: Should just use local var namespaceIds here but it
+                       // breaks test which modify the config
+                       id = mw.config.get( 'wgNamespaceIds' )[ ns.toLowerCase() ];
+                       if ( id === undefined ) {
+                               return false;
+                       }
+                       return id;
+               },
 
-       /**
-        * Get the namespace id from a namespace name (either from the localized, canonical or alias
-        * name).
-        *
-        * Example: On a German wiki this would return 6 for any of 'File', 'Datei', 'Image' or
-        * even 'Bild'.
-        *
-        * @private
-        * @static
-        * @method getNsIdByName
-        * @param {string} ns Namespace name (case insensitive, leading/trailing space ignored)
-        * @return {number|boolean} Namespace id or boolean false
-        */
-       getNsIdByName = function ( ns ) {
-               var id;
-
-               // Don't cast non-strings to strings, because null or undefined should not result in
-               // returning the id of a potential namespace called "Null:" (e.g. on null.example.org/wiki)
-               // Also, toLowerCase throws exception on null/undefined, because it is a String method.
-               if ( typeof ns !== 'string' ) {
-                       return false;
-               }
-               // TODO: Should just use local var namespaceIds here but it
-               // breaks test which modify the config
-               id = mw.config.get( 'wgNamespaceIds' )[ ns.toLowerCase() ];
-               if ( id === undefined ) {
-                       return false;
-               }
-               return id;
-       },
+               /**
+                * @private
+                * @method getNamespacePrefix_
+                * @param {number} namespace
+                * @return {string}
+                */
+               getNamespacePrefix = function ( namespace ) {
+                       return namespace === NS_MAIN ?
+                               '' :
+                               ( mw.config.get( 'wgFormattedNamespaces' )[ namespace ].replace( / /g, '_' ) + ':' );
+               },
 
-       /**
-        * @private
-        * @method getNamespacePrefix_
-        * @param {number} namespace
-        * @return {string}
-        */
-       getNamespacePrefix = function ( namespace ) {
-               return namespace === NS_MAIN ?
-                       '' :
-                       ( mw.config.get( 'wgFormattedNamespaces' )[ namespace ].replace( / /g, '_' ) + ':' );
-       },
-
-       rUnderscoreTrim = /^_+|_+$/g,
-
-       rSplit = /^(.+?)_*:_*(.*)$/,
-
-       // See MediaWikiTitleCodec.php#getTitleInvalidRegex
-       rInvalid = new RegExp(
-               '[^' + mw.config.get( 'wgLegalTitleChars' ) + ']' +
-               // URL percent encoding sequences interfere with the ability
-               // to round-trip titles -- you can't link to them consistently.
-               '|%[0-9A-Fa-f]{2}' +
-               // XML/HTML character references produce similar issues.
-               '|&[A-Za-z0-9\u0080-\uFFFF]+;' +
-               '|&#[0-9]+;' +
-               '|&#x[0-9A-Fa-f]+;'
-       ),
-
-       // From MediaWikiTitleCodec::splitTitleString() in PHP
-       // Note that this is not equivalent to /\s/, e.g. underscore is included, tab is not included.
-       rWhitespace = /[ _\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]+/g,
-
-       // From MediaWikiTitleCodec::splitTitleString() in PHP
-       rUnicodeBidi = /[\u200E\u200F\u202A-\u202E]/g,
+               rUnderscoreTrim = /^_+|_+$/g,
 
-       /**
-        * Slightly modified from Flinfo. Credit goes to Lupo and Flominator.
-        * @private
-        * @static
-        * @property sanitationRules
-        */
-       sanitationRules = [
-               // "signature"
-               {
-                       pattern: /~{3}/g,
-                       replace: '',
-                       generalRule: true
-               },
-               // control characters
-               {
-                       pattern: /[\x00-\x1f\x7f]/g,
-                       replace: '',
-                       generalRule: true
-               },
-               // URL encoding (possibly)
-               {
-                       pattern: /%([0-9A-Fa-f]{2})/g,
-                       replace: '% $1',
-                       generalRule: true
-               },
-               // HTML-character-entities
-               {
-                       pattern: /&(([A-Za-z0-9\x80-\xff]+|#[0-9]+|#x[0-9A-Fa-f]+);)/g,
-                       replace: '& $1',
-                       generalRule: true
-               },
-               // slash, colon (not supported by file systems like NTFS/Windows, Mac OS 9 [:], ext4 [/])
-               {
-                       pattern: new RegExp( '[' + mw.config.get( 'wgIllegalFileChars', '' ) + ']', 'g' ),
-                       replace: '-',
-                       fileRule: true
-               },
-               // brackets, greater than
-               {
-                       pattern: /[\]\}>]/g,
-                       replace: ')',
-                       generalRule: true
-               },
-               // brackets, lower than
-               {
-                       pattern: /[\[\{<]/g,
-                       replace: '(',
-                       generalRule: true
-               },
-               // everything that wasn't covered yet
-               {
-                       pattern: new RegExp( rInvalid.source, 'g' ),
-                       replace: '-',
-                       generalRule: true
-               },
-               // directory structures
-               {
-                       pattern: /^(\.|\.\.|\.\/.*|\.\.\/.*|.*\/\.\/.*|.*\/\.\.\/.*|.*\/\.|.*\/\.\.)$/g,
-                       replace: '',
-                       generalRule: true
-               }
-       ],
+               rSplit = /^(.+?)_*:_*(.*)$/,
 
-       /**
-        * Internal helper for #constructor and #newFromText.
-        *
-        * Based on Title.php#secureAndSplit
-        *
-        * @private
-        * @static
-        * @method parse
-        * @param {string} title
-        * @param {number} [defaultNamespace=NS_MAIN]
-        * @return {Object|boolean}
-        */
-       parse = function ( title, defaultNamespace ) {
-               var namespace, m, id, i, fragment, ext;
+               // See MediaWikiTitleCodec.php#getTitleInvalidRegex
+               rInvalid = new RegExp(
+                       '[^' + mw.config.get( 'wgLegalTitleChars' ) + ']' +
+                       // URL percent encoding sequences interfere with the ability
+                       // to round-trip titles -- you can't link to them consistently.
+                       '|%[0-9A-Fa-f]{2}' +
+                       // XML/HTML character references produce similar issues.
+                       '|&[A-Za-z0-9\u0080-\uFFFF]+;' +
+                       '|&#[0-9]+;' +
+                       '|&#x[0-9A-Fa-f]+;'
+               ),
 
-               namespace = defaultNamespace === undefined ? NS_MAIN : defaultNamespace;
+               // From MediaWikiTitleCodec::splitTitleString() in PHP
+               // Note that this is not equivalent to /\s/, e.g. underscore is included, tab is not included.
+               rWhitespace = /[ _\u00A0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000]+/g,
 
-               title = title
-                       // Strip Unicode bidi override characters
-                       .replace( rUnicodeBidi, '' )
-                       // Normalise whitespace to underscores and remove duplicates
-                       .replace( rWhitespace, '_' )
-                       // Trim underscores
-                       .replace( rUnderscoreTrim, '' );
+               // From MediaWikiTitleCodec::splitTitleString() in PHP
+               rUnicodeBidi = /[\u200E\u200F\u202A-\u202E]/g,
+
+               /**
+                * Slightly modified from Flinfo. Credit goes to Lupo and Flominator.
+                * @private
+                * @static
+                * @property sanitationRules
+                */
+               sanitationRules = [
+                       // "signature"
+                       {
+                               pattern: /~{3}/g,
+                               replace: '',
+                               generalRule: true
+                       },
+                       // control characters
+                       {
+                               // eslint-disable-next-line no-control-regex
+                               pattern: /[\x00-\x1f\x7f]/g,
+                               replace: '',
+                               generalRule: true
+                       },
+                       // URL encoding (possibly)
+                       {
+                               pattern: /%([0-9A-Fa-f]{2})/g,
+                               replace: '% $1',
+                               generalRule: true
+                       },
+                       // HTML-character-entities
+                       {
+                               pattern: /&(([A-Za-z0-9\x80-\xff]+|#[0-9]+|#x[0-9A-Fa-f]+);)/g,
+                               replace: '& $1',
+                               generalRule: true
+                       },
+                       // slash, colon (not supported by file systems like NTFS/Windows, Mac OS 9 [:], ext4 [/])
+                       {
+                               pattern: new RegExp( '[' + mw.config.get( 'wgIllegalFileChars', '' ) + ']', 'g' ),
+                               replace: '-',
+                               fileRule: true
+                       },
+                       // brackets, greater than
+                       {
+                               pattern: /[\]\}>]/g,
+                               replace: ')',
+                               generalRule: true
+                       },
+                       // brackets, lower than
+                       {
+                               pattern: /[\[\{<]/g,
+                               replace: '(',
+                               generalRule: true
+                       },
+                       // everything that wasn't covered yet
+                       {
+                               pattern: new RegExp( rInvalid.source, 'g' ),
+                               replace: '-',
+                               generalRule: true
+                       },
+                       // directory structures
+                       {
+                               pattern: /^(\.|\.\.|\.\/.*|\.\.\/.*|.*\/\.\/.*|.*\/\.\.\/.*|.*\/\.|.*\/\.\.)$/g,
+                               replace: '',
+                               generalRule: true
+                       }
+               ],
+
+               /**
+                * Internal helper for #constructor and #newFromText.
+                *
+                * Based on Title.php#secureAndSplit
+                *
+                * @private
+                * @static
+                * @method parse
+                * @param {string} title
+                * @param {number} [defaultNamespace=NS_MAIN]
+                * @return {Object|boolean}
+                */
+               parse = function ( title, defaultNamespace ) {
+                       var namespace, m, id, i, fragment, ext;
+
+                       namespace = defaultNamespace === undefined ? NS_MAIN : defaultNamespace;
 
-               // Process initial colon
-               if ( title !== '' && title[ 0 ] === ':' ) {
-                       // Initial colon means main namespace instead of specified default
-                       namespace = NS_MAIN;
                        title = title
-                               // Strip colon
-                               .slice( 1 )
+                               // Strip Unicode bidi override characters
+                               .replace( rUnicodeBidi, '' )
+                               // Normalise whitespace to underscores and remove duplicates
+                               .replace( rWhitespace, '_' )
                                // Trim underscores
                                .replace( rUnderscoreTrim, '' );
-               }
 
-               if ( title === '' ) {
-                       return false;
-               }
+                       // Process initial colon
+                       if ( title !== '' && title[ 0 ] === ':' ) {
+                               // Initial colon means main namespace instead of specified default
+                               namespace = NS_MAIN;
+                               title = title
+                                       // Strip colon
+                                       .slice( 1 )
+                                       // Trim underscores
+                                       .replace( rUnderscoreTrim, '' );
+                       }
 
-               // Process namespace prefix (if any)
-               m = title.match( rSplit );
-               if ( m ) {
-                       id = getNsIdByName( m[ 1 ] );
-                       if ( id !== false ) {
-                               // Ordinary namespace
-                               namespace = id;
-                               title = m[ 2 ];
+                       if ( title === '' ) {
+                               return false;
+                       }
 
-                               // For Talk:X pages, make sure X has no "namespace" prefix
-                               if ( namespace === NS_TALK && ( m = title.match( rSplit ) ) ) {
-                                       // Disallow titles like Talk:File:x (subject should roundtrip: talk:file:x -> file:x -> file_talk:x)
-                                       if ( getNsIdByName( m[ 1 ] ) !== false ) {
-                                               return false;
+                       // Process namespace prefix (if any)
+                       m = title.match( rSplit );
+                       if ( m ) {
+                               id = getNsIdByName( m[ 1 ] );
+                               if ( id !== false ) {
+                                       // Ordinary namespace
+                                       namespace = id;
+                                       title = m[ 2 ];
+
+                                       // For Talk:X pages, make sure X has no "namespace" prefix
+                                       if ( namespace === NS_TALK && ( m = title.match( rSplit ) ) ) {
+                                               // Disallow titles like Talk:File:x (subject should roundtrip: talk:file:x -> file:x -> file_talk:x)
+                                               if ( getNsIdByName( m[ 1 ] ) !== false ) {
+                                                       return false;
+                                               }
                                        }
                                }
                        }
-               }
 
-               // Process fragment
-               i = title.indexOf( '#' );
-               if ( i === -1 ) {
-                       fragment = null;
-               } else {
-                       fragment = title
-                               // Get segment starting after the hash
-                               .slice( i + 1 )
-                               // Convert to text
-                               // NB: Must not be trimmed ("Example#_foo" is not the same as "Example#foo")
-                               .replace( /_/g, ' ' );
-
-                       title = title
-                               // Strip hash
-                               .slice( 0, i )
-                               // Trim underscores, again (strips "_" from "bar" in "Foo_bar_#quux")
-                               .replace( rUnderscoreTrim, '' );
-               }
+                       // Process fragment
+                       i = title.indexOf( '#' );
+                       if ( i === -1 ) {
+                               fragment = null;
+                       } else {
+                               fragment = title
+                                       // Get segment starting after the hash
+                                       .slice( i + 1 )
+                                       // Convert to text
+                                       // NB: Must not be trimmed ("Example#_foo" is not the same as "Example#foo")
+                                       .replace( /_/g, ' ' );
+
+                               title = title
+                                       // Strip hash
+                                       .slice( 0, i )
+                                       // Trim underscores, again (strips "_" from "bar" in "Foo_bar_#quux")
+                                       .replace( rUnderscoreTrim, '' );
+                       }
 
-               // Reject illegal characters
-               if ( title.match( rInvalid ) ) {
-                       return false;
-               }
+                       // Reject illegal characters
+                       if ( title.match( rInvalid ) ) {
+                               return false;
+                       }
 
-               // Disallow titles that browsers or servers might resolve as directory navigation
-               if (
-                       title.indexOf( '.' ) !== -1 && (
-                               title === '.' || title === '..' ||
-                               title.indexOf( './' ) === 0 ||
-                               title.indexOf( '../' ) === 0 ||
-                               title.indexOf( '/./' ) !== -1 ||
-                               title.indexOf( '/../' ) !== -1 ||
-                               title.slice( -2 ) === '/.' ||
-                               title.slice( -3 ) === '/..'
-                       )
-               ) {
-                       return false;
-               }
+                       // Disallow titles that browsers or servers might resolve as directory navigation
+                       if (
+                               title.indexOf( '.' ) !== -1 && (
+                                       title === '.' || title === '..' ||
+                                       title.indexOf( './' ) === 0 ||
+                                       title.indexOf( '../' ) === 0 ||
+                                       title.indexOf( '/./' ) !== -1 ||
+                                       title.indexOf( '/../' ) !== -1 ||
+                                       title.slice( -2 ) === '/.' ||
+                                       title.slice( -3 ) === '/..'
+                               )
+                       ) {
+                               return false;
+                       }
 
-               // Disallow magic tilde sequence
-               if ( title.indexOf( '~~~' ) !== -1 ) {
-                       return false;
-               }
+                       // Disallow magic tilde sequence
+                       if ( title.indexOf( '~~~' ) !== -1 ) {
+                               return false;
+                       }
 
-               // Disallow titles exceeding the TITLE_MAX_BYTES byte size limit (size of underlying database field)
-               // Except for special pages, e.g. [[Special:Block/Long name]]
-               // Note: The PHP implementation also asserts that even in NS_SPECIAL, the title should
-               // be less than 512 bytes.
-               if ( namespace !== NS_SPECIAL && $.byteLength( title ) > TITLE_MAX_BYTES ) {
-                       return false;
-               }
+                       // Disallow titles exceeding the TITLE_MAX_BYTES byte size limit (size of underlying database field)
+                       // Except for special pages, e.g. [[Special:Block/Long name]]
+                       // Note: The PHP implementation also asserts that even in NS_SPECIAL, the title should
+                       // be less than 512 bytes.
+                       if ( namespace !== NS_SPECIAL && $.byteLength( title ) > TITLE_MAX_BYTES ) {
+                               return false;
+                       }
 
-               // Can't make a link to a namespace alone.
-               if ( title === '' && namespace !== NS_MAIN ) {
-                       return false;
-               }
+                       // Can't make a link to a namespace alone.
+                       if ( title === '' && namespace !== NS_MAIN ) {
+                               return false;
+                       }
 
-               // Any remaining initial :s are illegal.
-               if ( title[ 0 ] === ':' ) {
-                       return false;
-               }
+                       // Any remaining initial :s are illegal.
+                       if ( title[ 0 ] === ':' ) {
+                               return false;
+                       }
 
-               // For backwards-compatibility with old mw.Title, we separate the extension from the
-               // rest of the title.
-               i = title.lastIndexOf( '.' );
-               if ( i === -1 || title.length <= i + 1 ) {
-                       // Extensions are the non-empty segment after the last dot
-                       ext = null;
-               } else {
-                       ext = title.slice( i + 1 );
-                       title = title.slice( 0, i );
-               }
+                       // For backwards-compatibility with old mw.Title, we separate the extension from the
+                       // rest of the title.
+                       i = title.lastIndexOf( '.' );
+                       if ( i === -1 || title.length <= i + 1 ) {
+                               // Extensions are the non-empty segment after the last dot
+                               ext = null;
+                       } else {
+                               ext = title.slice( i + 1 );
+                               title = title.slice( 0, i );
+                       }
 
-               return {
-                       namespace: namespace,
-                       title: title,
-                       ext: ext,
-                       fragment: fragment
-               };
-       },
+                       return {
+                               namespace: namespace,
+                               title: title,
+                               ext: ext,
+                               fragment: fragment
+                       };
+               },
 
-       /**
-        * Convert db-key to readable text.
-        *
-        * @private
-        * @static
-        * @method text
-        * @param {string} s
-        * @return {string}
-        */
-       text = function ( s ) {
-               if ( s !== null && s !== undefined ) {
-                       return s.replace( /_/g, ' ' );
-               } else {
-                       return '';
-               }
-       },
+               /**
+                * Convert db-key to readable text.
+                *
+                * @private
+                * @static
+                * @method text
+                * @param {string} s
+                * @return {string}
+                */
+               text = function ( s ) {
+                       if ( s !== null && s !== undefined ) {
+                               return s.replace( /_/g, ' ' );
+                       } else {
+                               return '';
+                       }
+               },
 
-       /**
-        * Sanitizes a string based on a rule set and a filter
-        *
-        * @private
-        * @static
-        * @method sanitize
-        * @param {string} s
-        * @param {Array} filter
-        * @return {string}
-        */
-       sanitize = function ( s, filter ) {
-               var i, ruleLength, rule, m, filterLength,
-                       rules = sanitationRules;
-
-               for ( i = 0, ruleLength = rules.length; i < ruleLength; ++i ) {
-                       rule = rules[ i ];
-                       for ( m = 0, filterLength = filter.length; m < filterLength; ++m ) {
-                               if ( rule[ filter[ m ] ] ) {
-                                       s = s.replace( rule.pattern, rule.replace );
+               /**
+                * Sanitizes a string based on a rule set and a filter
+                *
+                * @private
+                * @static
+                * @method sanitize
+                * @param {string} s
+                * @param {Array} filter
+                * @return {string}
+                */
+               sanitize = function ( s, filter ) {
+                       var i, ruleLength, rule, m, filterLength,
+                               rules = sanitationRules;
+
+                       for ( i = 0, ruleLength = rules.length; i < ruleLength; ++i ) {
+                               rule = rules[ i ];
+                               for ( m = 0, filterLength = filter.length; m < filterLength; ++m ) {
+                                       if ( rule[ filter[ m ] ] ) {
+                                               s = s.replace( rule.pattern, rule.replace );
+                                       }
                                }
                        }
-               }
-               return s;
-       },
-
-       /**
-        * Cuts a string to a specific byte length, assuming UTF-8
-        * or less, if the last character is a multi-byte one
-        *
-        * @private
-        * @static
-        * @method trimToByteLength
-        * @param {string} s
-        * @param {number} length
-        * @return {string}
-        */
-       trimToByteLength = function ( s, length ) {
-               var byteLength, chopOffChars, chopOffBytes;
-
-               // bytelength is always greater or equal to the length in characters
-               s = s.substr( 0, length );
-               while ( ( byteLength = $.byteLength( s ) ) > length ) {
-                       // Calculate how many characters can be safely removed
-                       // First, we need to know how many bytes the string exceeds the threshold
-                       chopOffBytes = byteLength - length;
-                       // A character in UTF-8 is at most 4 bytes
-                       // One character must be removed in any case because the
-                       // string is too long
-                       chopOffChars = Math.max( 1, Math.floor( chopOffBytes / 4 ) );
-                       s = s.substr( 0, s.length - chopOffChars );
-               }
-               return s;
-       },
+                       return s;
+               },
 
-       /**
-        * Cuts a file name to a specific byte length
-        *
-        * @private
-        * @static
-        * @method trimFileNameToByteLength
-        * @param {string} name without extension
-        * @param {string} extension file extension
-        * @return {string} The full name, including extension
-        */
-       trimFileNameToByteLength = function ( name, extension ) {
-               // There is a special byte limit for file names and ... remember the dot
-               return trimToByteLength( name, FILENAME_MAX_BYTES - extension.length - 1 ) + '.' + extension;
-       },
-
-       // Polyfill for ES5 Object.create
-       createObject = Object.create || ( function () {
-               return function ( o ) {
-                       function Title() {}
-                       if ( o !== Object( o ) ) {
-                               throw new Error( 'Cannot inherit from a non-object' );
+               /**
+                * Cuts a string to a specific byte length, assuming UTF-8
+                * or less, if the last character is a multi-byte one
+                *
+                * @private
+                * @static
+                * @method trimToByteLength
+                * @param {string} s
+                * @param {number} length
+                * @return {string}
+                */
+               trimToByteLength = function ( s, length ) {
+                       var byteLength, chopOffChars, chopOffBytes;
+
+                       // bytelength is always greater or equal to the length in characters
+                       s = s.substr( 0, length );
+                       while ( ( byteLength = $.byteLength( s ) ) > length ) {
+                               // Calculate how many characters can be safely removed
+                               // First, we need to know how many bytes the string exceeds the threshold
+                               chopOffBytes = byteLength - length;
+                               // A character in UTF-8 is at most 4 bytes
+                               // One character must be removed in any case because the
+                               // string is too long
+                               chopOffChars = Math.max( 1, Math.floor( chopOffBytes / 4 ) );
+                               s = s.substr( 0, s.length - chopOffChars );
                        }
-                       Title.prototype = o;
-                       return new Title();
-               };
-       }() );
+                       return s;
+               },
+
+               /**
+                * Cuts a file name to a specific byte length
+                *
+                * @private
+                * @static
+                * @method trimFileNameToByteLength
+                * @param {string} name without extension
+                * @param {string} extension file extension
+                * @return {string} The full name, including extension
+                */
+               trimFileNameToByteLength = function ( name, extension ) {
+                       // There is a special byte limit for file names and ... remember the dot
+                       return trimToByteLength( name, FILENAME_MAX_BYTES - extension.length - 1 ) + '.' + extension;
+               },
+
+               // Polyfill for ES5 Object.create
+               createObject = Object.create || ( function () {
+                       return function ( o ) {
+                               function Title() {}
+                               if ( o !== Object( o ) ) {
+                                       throw new Error( 'Cannot inherit from a non-object' );
+                               }
+                               Title.prototype = o;
+                               return new Title();
+                       };
+               }() );
 
        /* Static members */
 
                        }
                }
 
-               if ( namespace === NS_MEDIA
-                       || ( options.forUploading && ( namespace === NS_FILE ) )
+               if (
+                       namespace === NS_MEDIA ||
+                       ( options.forUploading && ( namespace === NS_FILE ) )
                ) {
 
                        title = sanitize( title, [ 'generalRule', 'fileRule' ] );
                pages: {},
 
                set: function ( titles, state ) {
+                       var i, len,
+                               pages = this.pages;
+
                        titles = $.isArray( titles ) ? titles : [ titles ];
                        state = state === undefined ? true : !!state;
-                       var i,
-                               pages = this.pages,
-                               len = titles.length;
 
-                       for ( i = 0; i < len; i++ ) {
+                       for ( i = 0, len = titles.length; i < len; i++ ) {
                                pages[ titles[ i ] ] = state;
                        }
                        return true;
                        ) {
                                return this.title;
                        }
-                       return this.title[ 0 ].toUpperCase() + this.title.slice( 1 );
+                       // PHP's strtoupper differs from String.toUpperCase in a number of cases
+                       // Bug: T147646
+                       return mw.Title.phpCharToUpper( this.title[ 0 ] ) + this.title.slice( 1 );
                },
 
                /**
diff --git a/resources/src/mediawiki/mediawiki.Title.phpCharToUpper.js b/resources/src/mediawiki/mediawiki.Title.phpCharToUpper.js
new file mode 100644 (file)
index 0000000..2b39c9a
--- /dev/null
@@ -0,0 +1,255 @@
+// This file can't be parsed by JSDuck due to <https://github.com/tenderlove/rkelly/issues/35>.
+// (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 ) {
+       var toUpperMapping = {
+               'ß': 'ß',
+               'ʼn': 'ʼn',
+               'Dž': 'Dž',
+               'dž': 'Dž',
+               'Lj': 'Lj',
+               'lj': 'Lj',
+               'Nj': 'Nj',
+               'nj': 'Nj',
+               'ǰ': 'ǰ',
+               'Dz': 'Dz',
+               'dz': 'Dz',
+               'ʝ': 'Ʝ',
+               'ͅ': 'ͅ',
+               'ΐ': 'ΐ',
+               'ΰ': 'ΰ',
+               'և': 'և',
+               'ᏸ': 'Ᏸ',
+               'ᏹ': 'Ᏹ',
+               'ᏺ': 'Ᏺ',
+               'ᏻ': 'Ᏻ',
+               'ᏼ': 'Ᏼ',
+               'ᏽ': 'Ᏽ',
+               'ẖ': 'ẖ',
+               'ẗ': 'ẗ',
+               'ẘ': 'ẘ',
+               'ẙ': 'ẙ',
+               'ẚ': 'ẚ',
+               'ὐ': 'ὐ',
+               'ὒ': 'ὒ',
+               'ὔ': 'ὔ',
+               'ὖ': 'ὖ',
+               'ᾀ': 'ᾈ',
+               'ᾁ': 'ᾉ',
+               'ᾂ': 'ᾊ',
+               'ᾃ': 'ᾋ',
+               'ᾄ': 'ᾌ',
+               'ᾅ': 'ᾍ',
+               'ᾆ': 'ᾎ',
+               'ᾇ': 'ᾏ',
+               'ᾈ': 'ᾈ',
+               'ᾉ': 'ᾉ',
+               'ᾊ': 'ᾊ',
+               'ᾋ': 'ᾋ',
+               'ᾌ': 'ᾌ',
+               'ᾍ': 'ᾍ',
+               'ᾎ': 'ᾎ',
+               'ᾏ': 'ᾏ',
+               'ᾐ': 'ᾘ',
+               'ᾑ': 'ᾙ',
+               'ᾒ': 'ᾚ',
+               'ᾓ': 'ᾛ',
+               'ᾔ': 'ᾜ',
+               'ᾕ': 'ᾝ',
+               'ᾖ': 'ᾞ',
+               'ᾗ': 'ᾟ',
+               'ᾘ': 'ᾘ',
+               'ᾙ': 'ᾙ',
+               'ᾚ': 'ᾚ',
+               'ᾛ': 'ᾛ',
+               'ᾜ': 'ᾜ',
+               'ᾝ': 'ᾝ',
+               'ᾞ': 'ᾞ',
+               'ᾟ': 'ᾟ',
+               'ᾠ': 'ᾨ',
+               'ᾡ': 'ᾩ',
+               'ᾢ': 'ᾪ',
+               'ᾣ': 'ᾫ',
+               'ᾤ': 'ᾬ',
+               'ᾥ': 'ᾭ',
+               'ᾦ': 'ᾮ',
+               'ᾧ': 'ᾯ',
+               'ᾨ': 'ᾨ',
+               'ᾩ': 'ᾩ',
+               'ᾪ': 'ᾪ',
+               'ᾫ': 'ᾫ',
+               'ᾬ': 'ᾬ',
+               'ᾭ': 'ᾭ',
+               'ᾮ': 'ᾮ',
+               'ᾯ': 'ᾯ',
+               'ᾲ': 'ᾲ',
+               'ᾳ': 'ᾼ',
+               'ᾴ': 'ᾴ',
+               'ᾶ': 'ᾶ',
+               'ᾷ': 'ᾷ',
+               'ᾼ': 'ᾼ',
+               'ῂ': 'ῂ',
+               'ῃ': 'ῌ',
+               'ῄ': 'ῄ',
+               'ῆ': 'ῆ',
+               'ῇ': 'ῇ',
+               'ῌ': 'ῌ',
+               'ῒ': 'ῒ',
+               'ΐ': 'ΐ',
+               'ῖ': 'ῖ',
+               'ῗ': 'ῗ',
+               'ῢ': 'ῢ',
+               'ΰ': 'ΰ',
+               'ῤ': 'ῤ',
+               'ῦ': 'ῦ',
+               'ῧ': 'ῧ',
+               'ῲ': 'ῲ',
+               'ῳ': 'ῼ',
+               'ῴ': 'ῴ',
+               'ῶ': 'ῶ',
+               'ῷ': 'ῷ',
+               'ῼ': 'ῼ',
+               'ⅰ': 'ⅰ',
+               'ⅱ': 'ⅱ',
+               'ⅲ': 'ⅲ',
+               'ⅳ': 'ⅳ',
+               'ⅴ': 'ⅴ',
+               'ⅵ': 'ⅵ',
+               'ⅶ': 'ⅶ',
+               'ⅷ': 'ⅷ',
+               'ⅸ': 'ⅸ',
+               'ⅹ': 'ⅹ',
+               'ⅺ': 'ⅺ',
+               'ⅻ': 'ⅻ',
+               'ⅼ': 'ⅼ',
+               'ⅽ': 'ⅽ',
+               'ⅾ': 'ⅾ',
+               'ⅿ': 'ⅿ',
+               'ⓐ': 'ⓐ',
+               'ⓑ': 'ⓑ',
+               'ⓒ': 'ⓒ',
+               'ⓓ': 'ⓓ',
+               'ⓔ': 'ⓔ',
+               'ⓕ': 'ⓕ',
+               'ⓖ': 'ⓖ',
+               'ⓗ': 'ⓗ',
+               'ⓘ': 'ⓘ',
+               'ⓙ': 'ⓙ',
+               'ⓚ': 'ⓚ',
+               'ⓛ': 'ⓛ',
+               'ⓜ': 'ⓜ',
+               'ⓝ': 'ⓝ',
+               'ⓞ': 'ⓞ',
+               'ⓟ': 'ⓟ',
+               'ⓠ': 'ⓠ',
+               'ⓡ': 'ⓡ',
+               'ⓢ': 'ⓢ',
+               'ⓣ': 'ⓣ',
+               'ⓤ': 'ⓤ',
+               'ⓥ': 'ⓥ',
+               'ⓦ': 'ⓦ',
+               'ⓧ': 'ⓧ',
+               'ⓨ': 'ⓨ',
+               'ⓩ': 'ⓩ',
+               'ꞵ': 'Ꞵ',
+               'ꞷ': 'Ꞷ',
+               'ꭓ': 'Ꭓ',
+               'ꭰ': 'Ꭰ',
+               'ꭱ': 'Ꭱ',
+               'ꭲ': 'Ꭲ',
+               'ꭳ': 'Ꭳ',
+               'ꭴ': 'Ꭴ',
+               'ꭵ': 'Ꭵ',
+               'ꭶ': 'Ꭶ',
+               'ꭷ': 'Ꭷ',
+               'ꭸ': 'Ꭸ',
+               'ꭹ': 'Ꭹ',
+               'ꭺ': 'Ꭺ',
+               'ꭻ': 'Ꭻ',
+               'ꭼ': 'Ꭼ',
+               'ꭽ': 'Ꭽ',
+               'ꭾ': 'Ꭾ',
+               'ꭿ': 'Ꭿ',
+               'ꮀ': 'Ꮀ',
+               'ꮁ': 'Ꮁ',
+               'ꮂ': 'Ꮂ',
+               'ꮃ': 'Ꮃ',
+               'ꮄ': 'Ꮄ',
+               'ꮅ': 'Ꮅ',
+               'ꮆ': 'Ꮆ',
+               'ꮇ': 'Ꮇ',
+               'ꮈ': 'Ꮈ',
+               'ꮉ': 'Ꮉ',
+               'ꮊ': 'Ꮊ',
+               'ꮋ': 'Ꮋ',
+               'ꮌ': 'Ꮌ',
+               'ꮍ': 'Ꮍ',
+               'ꮎ': 'Ꮎ',
+               'ꮏ': 'Ꮏ',
+               'ꮐ': 'Ꮐ',
+               'ꮑ': 'Ꮑ',
+               'ꮒ': 'Ꮒ',
+               'ꮓ': 'Ꮓ',
+               'ꮔ': 'Ꮔ',
+               'ꮕ': 'Ꮕ',
+               'ꮖ': 'Ꮖ',
+               'ꮗ': 'Ꮗ',
+               'ꮘ': 'Ꮘ',
+               'ꮙ': 'Ꮙ',
+               'ꮚ': 'Ꮚ',
+               'ꮛ': 'Ꮛ',
+               'ꮜ': 'Ꮜ',
+               'ꮝ': 'Ꮝ',
+               'ꮞ': 'Ꮞ',
+               'ꮟ': 'Ꮟ',
+               'ꮠ': 'Ꮠ',
+               'ꮡ': 'Ꮡ',
+               'ꮢ': 'Ꮢ',
+               'ꮣ': 'Ꮣ',
+               'ꮤ': 'Ꮤ',
+               'ꮥ': 'Ꮥ',
+               'ꮦ': 'Ꮦ',
+               'ꮧ': 'Ꮧ',
+               'ꮨ': 'Ꮨ',
+               'ꮩ': 'Ꮩ',
+               'ꮪ': 'Ꮪ',
+               'ꮫ': 'Ꮫ',
+               'ꮬ': 'Ꮬ',
+               'ꮭ': 'Ꮭ',
+               'ꮮ': 'Ꮮ',
+               'ꮯ': 'Ꮯ',
+               'ꮰ': 'Ꮰ',
+               'ꮱ': 'Ꮱ',
+               'ꮲ': 'Ꮲ',
+               'ꮳ': 'Ꮳ',
+               'ꮴ': 'Ꮴ',
+               'ꮵ': 'Ꮵ',
+               'ꮶ': 'Ꮶ',
+               'ꮷ': 'Ꮷ',
+               'ꮸ': 'Ꮸ',
+               'ꮹ': 'Ꮹ',
+               'ꮺ': 'Ꮺ',
+               'ꮻ': 'Ꮻ',
+               'ꮼ': 'Ꮼ',
+               'ꮽ': 'Ꮽ',
+               'ꮾ': 'Ꮾ',
+               'ꮿ': 'Ꮿ',
+               'ff': 'ff',
+               'fi': 'fi',
+               'fl': 'fl',
+               'ffi': 'ffi',
+               'ffl': 'ffl',
+               'ſt': 'ſt',
+               'st': 'st',
+               'ﬓ': 'ﬓ',
+               'ﬔ': 'ﬔ',
+               'ﬕ': 'ﬕ',
+               'ﬖ': 'ﬖ',
+               'ﬗ': 'ﬗ'
+       };
+       mw.Title.phpCharToUpper = function ( chr ) {
+               var mapped = toUpperMapping[ chr ];
+               return mapped || chr.toUpperCase();
+       };
+}( mediaWiki ) );
index 7c4855f..c7ebfd8 100644 (file)
@@ -1,4 +1,4 @@
-/*global moment*/
+/* global moment*/
 ( function ( $, mw, moment ) {
 
        /**
                                        // If the user can't upload anything, don't give them the option to.
                                        api.getUserInfo().then( function ( userInfo ) {
                                                if ( userInfo.rights.indexOf( 'upload' ) === -1 ) {
-                                                       // TODO Use a better error message when not all logged-in users can upload
-                                                       booklet.getPage( 'upload' ).$element.msg( 'api-error-mustbeloggedin' );
+                                                       if ( mw.user.isAnon() ) {
+                                                               booklet.getPage( 'upload' ).$element.msg( 'api-error-mustbeloggedin' );
+                                                       } else {
+                                                               booklet.getPage( 'upload' ).$element.msg( 'api-error-badaccess-groups' );
+                                                       }
                                                }
                                                return $.Deferred().resolve();
                                        } )
index a719ffe..9d9c0a6 100644 (file)
@@ -29,6 +29,9 @@
         * @uses mw.Upload
         * @uses mw.Upload.BookletLayout
         * @extends OO.ui.ProcessDialog
+        *
+        * @constructor
+        * @param {Object} [config] Configuration options
         * @cfg {Function} [bookletClass=mw.Upload.BookletLayout] Booklet class to be
         *     used for the steps
         * @cfg {Object} [booklet] Booklet constructor configuration
@@ -57,7 +60,6 @@
         * @inheritdoc
         * @property title
         */
-       /*jshint -W024*/
        mw.Upload.Dialog.static.title = mw.msg( 'upload-dialog-title' );
 
        /**
@@ -97,8 +99,6 @@
                }
        ];
 
-       /*jshint +W024*/
-
        /* Methods */
 
        /**
         * @return {mw.Upload.BookletLayout} An upload booklet
         */
        mw.Upload.Dialog.prototype.createUploadBooklet = function () {
+               // eslint-disable-next-line new-cap
                return new this.bookletClass( $.extend( {
                        $overlay: this.$overlay
                }, this.bookletConfig ) );
index 23b0900..02df2a8 100644 (file)
@@ -2,8 +2,6 @@
        var UP;
 
        /**
-        * @class mw.Upload
-        *
         * Used to represent an upload in progress on the frontend.
         * Most of the functionality is implemented in mw.Api.plugin.upload,
         * but this model class will tie it together as well as let you perform
@@ -43,6 +41,8 @@
         *       } );
         *     } );
         *
+        * @class mw.Upload
+        *
         * @constructor
         * @param {Object|mw.Api} [apiconfig] A mw.Api object (or subclass), or configuration
         *     to pass to the constructor of mw.Api.
index 835b423..0c47dbe 100644 (file)
  * @class mw.Uri
  */
 
+/* eslint-disable no-use-before-define */
+
 ( function ( mw, $ ) {
+       var parser, properties;
+
        /**
         * Function that's useful when constructing the URI string -- we frequently encounter the pattern
         * of having to add something to the URI as we go, but only if it's present, and to include a
         * @static
         * @property {Object} parser
         */
-       var parser = {
+       parser = {
                strict: mw.template.get( 'mediawiki.Uri', 'strict.regexp' ).render(),
                loose: mw.template.get( 'mediawiki.Uri', 'loose.regexp' ).render()
-       },
+       };
 
        /**
         * The order here matches the order of captured matches in the `parser` property regexes.
         * @param {string|Function} documentLocation A full url, or function returning one.
         *  If passed a function, the return value may change over time and this will be honoured. (T74334)
         * @member mw
+        * @return {Function} Uri class
         */
        mw.UriRelative = function ( documentLocation ) {
                var getDefaultUri = ( function () {
index 4d0c135..e3a8f7b 100644 (file)
@@ -1,9 +1,5 @@
-/* jshint devel: true */
 ( function ( mw, $ ) {
        /**
-        * @method confirmCloseWindow
-        * @member mw
-        *
         * Prevent the closing of a window with a confirm message (the onbeforeunload event seems to
         * work in most browsers.)
         *
@@ -25,6 +21,8 @@
         *         // do whatever you wanted to do
         *     }
         *
+        * @method confirmCloseWindow
+        * @member mw
         * @param {Object} [options]
         * @param {string} [options.namespace] Namespace for the event registration
         * @param {string} [options.message]
                        }
                };
        };
-} )( mediaWiki, jQuery );
+}( mediaWiki, jQuery ) );
index 26c74a1..3c1a668 100644 (file)
                        }
 
                        bitDiv( 'phpversion' )
-                               .append( $( this.data.phpEngine === 'HHVM'
-                                       ? '<a href="http://hhvm.com/">HHVM</a>'
-                                       '<a href="https://php.net/">PHP</a>'
+                               .append( $( this.data.phpEngine === 'HHVM' ?
+                                       '<a href="http://hhvm.com/">HHVM</a>' :
+                                       '<a href="https://php.net/">PHP</a>'
                                ) )
                                .append( ': ' + this.data.phpVersion );
 
 
                /**
                 * Build the console panel
+                *
+                * @return {jQuery} Console panel
                 */
                buildConsoleTable: function () {
                        var $table, entryTypeText, i, length, entry;
                        $table = $( '<table id="mw-debug-querylist"></table>' );
 
                        $( '<tr>' )
-                               .append( $( '<th>#</th>' ).css( 'width', '4em' )    )
+                               .append( $( '<th>#</th>' ).css( 'width', '4em' ) )
                                .append( $( '<th>SQL</th>' ) )
-                               .append( $( '<th>Time</th>' ).css( 'width', '8em'  ) )
+                               .append( $( '<th>Time</th>' ).css( 'width', '8em' ) )
                                .append( $( '<th>Call</th>' ).css( 'width', '18em' ) )
                        .appendTo( $table );
 
index 46b8479..e86aff6 100644 (file)
                        /**
                         * Dumb window.onerror handler which forwards the errors via mw.track.
                         *
+                        * @param {string} errorMessage
+                        * @param {string} url
+                        * @param {number} lineNumber
+                        * @param {number} [columnNumber]
+                        * @param {Error|Mixed} [errorObject]
+                        * @return {boolean} True to prevent the default action
                         * @fires global_error
                         */
                        window.onerror = function ( errorMessage, url, lineNumber, columnNumber, errorObject ) {
index 49ff411..0c9ea97 100644 (file)
@@ -1,4 +1,3 @@
-/* jshint bitwise:false */
 ( function ( mw, $ ) {
 
        var CONTROL_BUCKET = 'control',
@@ -17,6 +16,7 @@
         * @see https://jsbin.com/kejewi/4/watch?js,console
         */
        function hashString( string ) {
+               /* eslint-disable no-bitwise */
                var hash = 0,
                        i = string.length;
 
@@ -30,6 +30,7 @@
                hash += ( hash << 15 );
 
                return hash >>> 0;
+               /* eslint-enable no-bitwise */
        }
 
        /**
index 0b3ea04..6abdf83 100644 (file)
@@ -6,8 +6,6 @@
  * @author Moriel Schottlender, 2015
  * @since 1.19
  */
-/*jshint esversion:5 */
-/*global OO*/
 ( function ( mw, $ ) {
        /**
         * This is a way of getting simple feedback from users. It's useful
                                this.feedbackSubjectInput.getValue()
                        );
 
-               this.actions.setAbilities( { submit:  isValid } );
+               this.actions.setAbilities( { submit: isValid } );
        };
 
        /**
                                if ( secondaryCode === 'http' ) {
                                        fb.status = 'error3';
                                        // ajax request failed
-                                       mw.log.warn( 'Feedback report failed with HTTP error: ' +  details.textStatus );
+                                       mw.log.warn( 'Feedback report failed with HTTP error: ' + details.textStatus );
                                } else {
                                        fb.status = 'error2';
-                                       mw.log.warn( 'Feedback report failed with API error: ' +  secondaryCode );
+                                       mw.log.warn( 'Feedback report failed with API error: ' + secondaryCode );
                                }
                        } else {
                                fb.status = 'error1';
index 882affe..72bf3d7 100644 (file)
@@ -4,7 +4,6 @@
  * @author Mark Holmquist, 2015
  * @since 1.25
  */
-/*global OO*/
 ( function ( mw, $, oo ) {
        var warningConfig = mw.config.get( 'wgFileWarning' ),
                warningMessages = warningConfig.messages,
index a74aef3..fdaa989 100644 (file)
@@ -4,7 +4,9 @@
  * @author Ori Livneh
  * @since 1.22
  */
-/*jshint devel:true */
+
+/* eslint-disable no-console */
+
 ( function ( mw, $ ) {
 
        var inspect,
        }
 
        function humanSize( bytes ) {
-               if ( !$.isNumeric( bytes ) || bytes === 0 ) { return bytes; }
-               var i = 0,
+               var i,
                        units = [ '', ' KiB', ' MiB', ' GiB', ' TiB', ' PiB' ];
 
-               for ( ; bytes >= 1024; bytes /= 1024 ) { i++; }
+               if ( !$.isNumeric( bytes ) || bytes === 0 ) { return bytes; }
+
+               for ( i = 0; bytes >= 1024; bytes /= 1024 ) { i++; }
                // Maintain one decimal for kB and above, but don't
                // add ".0" for bytes.
                return bytes.toFixed( i > 0 ? 1 : 0 ) + units[ i ];
                        /**
                         * Generate a breakdown of all loaded modules and their size in
                         * kilobytes. Modules are ordered from largest to smallest.
+                        *
+                        * @return {Object[]} Size reports
                         */
                        size: function () {
                                // Map each module to a descriptor object.
                        /**
                         * For each module with styles, count the number of selectors, and
                         * count how many match against some element currently in the DOM.
+                        *
+                        * @return {Object[]} CSS reports
                         */
                        css: function () {
                                var modules = [];
                                                allSelectors: stats.total,
                                                matchedSelectors: stats.matched,
                                                percentMatched: stats.total !== 0 ?
-                                                       ( stats.matched / stats.total * 100 ).toFixed( 2 )  + '%' : null
+                                                       ( stats.matched / stats.total * 100 ).toFixed( 2 ) + '%' : null
                                        } );
                                } );
                                sortByProperty( modules, 'allSelectors', true );
                         * Report stats on mw.loader.store: the number of localStorage
                         * cache hits and misses, the number of items purged from the
                         * cache, and the total size of the module blob in localStorage.
+                        *
+                        * @return {Object[]} Store stats
                         */
                        store: function () {
                                var raw, stats = { enabled: mw.loader.store.enabled };
                                        $.extend( stats, mw.loader.store.stats );
                                        try {
                                                raw = localStorage.getItem( mw.loader.store.getStoreKey() );
-                                               stats.totalSizeInBytes =  $.byteLength( raw );
+                                               stats.totalSizeInBytes = $.byteLength( raw );
                                                stats.totalSize = humanSize( $.byteLength( raw ) );
                                        } catch ( e ) {}
                                }
 
                                // Grep module's CSS
                                if (
-                                       $.isPlainObject( module.style ) && $.isArray( module.style.css )
-                                       && pattern.test( module.style.css.join( '' ) )
+                                       $.isPlainObject( module.style ) && $.isArray( module.style.css ) &&
+                                       pattern.test( module.style.css.join( '' ) )
                                ) {
                                        // Module's CSS source matches
                                        return true;
index 2646cff..c82b9cb 100644 (file)
        function getFailableParserFn( options ) {
                return function ( args ) {
                        var fallback,
+                               // eslint-disable-next-line new-cap
                                parser = new mw.jqueryMsg.parser( options ),
                                key = args[ 0 ],
                                argsArray = $.isArray( args[ 1 ] ) ? args[ 1 ] : slice.call( args, 1 );
                }
 
                return function () {
+                       var failableResult;
                        if ( !failableParserFn ) {
                                failableParserFn = getFailableParserFn( options );
                        }
-                       var failableResult = failableParserFn( arguments );
+                       failableResult = failableParserFn( arguments );
                        if ( format === 'text' || format === 'escaped' ) {
                                return failableResult.text();
                        } else {
                var failableParserFn;
 
                return function () {
+                       var $target;
                        if ( !failableParserFn ) {
                                failableParserFn = getFailableParserFn( options );
                        }
-                       var $target = this.empty();
+                       $target = this.empty();
                        appendWithoutParsing( $target, failableParserFn( arguments ) );
                        return $target;
                };
                this.settings.onlyCurlyBraceTransform = ( this.settings.format === 'text' || this.settings.format === 'escaped' );
                this.astCache = {};
 
+               // eslint-disable-next-line new-cap
                this.emitter = new mw.jqueryMsg.htmlEmitter( this.settings.language, this.settings.magic );
        };
 
 
                /**
                 * Fetch the message string associated with a key, return parsed structure. Memoized.
-                * Note that we pass '[' + key + ']' back for a missing message here.
+                * Note that we pass '⧼' + key + '⧽' back for a missing message here.
                 *
                 * @param {string} key
-                * @return {string|Array} string of '[key]' if message missing, simple string if possible, array of arrays if needs parsing
+                * @return {string|Array} string of '⧼key⧽' if message missing, simple string if possible, array of arrays if needs parsing
                 */
                getAst: function ( key ) {
                        var wikiText;
                        if ( !this.astCache.hasOwnProperty( key ) ) {
                                wikiText = this.settings.messages.get( key );
                                if ( typeof wikiText !== 'string' ) {
-                                       wikiText = '\\[' + key + '\\]';
+                                       wikiText = '⧼' + key + '⧽';
                                }
                                this.astCache[ key ] = this.wikiTextToAst( wikiText );
                        }
                        /**
                         * Starts the parse
                         *
-                        * @param {Function} rootExpression root parse function
+                        * @param {Function} rootExpression Root parse function
+                        * @return {Array|null}
                         */
                        function start( rootExpression ) {
                                var result = nOrMore( 0, rootExpression )();
 
        /**
         * htmlEmitter - object which primarily exists to emit HTML from parser ASTs
+        *
+        * @param {Object} language
+        * @param {Object} magic
         */
        mw.jqueryMsg.htmlEmitter = function ( language, magic ) {
-               this.language = language;
                var jmsg = this;
+               this.language = language;
                $.each( magic, function ( key, val ) {
                        jmsg[ key.toLowerCase() ] = function () {
                                return val;
                 * It may, though, if the wikitext appears in extension-controlled content.
                 *
                 * @param {string[]} nodes
+                * @return {jQuery}
                 */
                wikilink: function ( nodes ) {
                        var page, anchor, url, $el;
                 * @return {number|string} Formatted number
                 */
                formatnum: function ( nodes ) {
-                       var isInteger = ( nodes[ 1 ] && nodes[ 1 ] === 'R' ) ? true : false,
+                       var isInteger = !!nodes[ 1 ] && nodes[ 1 ] === 'R',
                                number = nodes[ 0 ];
 
                        return this.language.convertNumber( number, isInteger );
                return function () {
                        return reusableParent.msg( this.key, this.parameters ).contents().detach();
                };
-       } )();
+       }() );
 
 }( mediaWiki, jQuery ) );
index 9c8fe70..fceeb64 100644 (file)
@@ -7,7 +7,9 @@
  * @alternateClassName mediaWiki
  * @singleton
  */
-/*jshint latedef:false */
+
+/* eslint-disable no-use-before-define */
+
 ( function ( $ ) {
        'use strict';
 
@@ -31,7 +33,7 @@
         * @return {string} hash as an seven-character base 36 string
         */
        function fnv132( str ) {
-               /*jshint bitwise:false */
+               /* eslint-disable no-bitwise */
                var hash = 0x811C9DC5,
                        i;
 
@@ -46,6 +48,7 @@
                }
 
                return hash;
+               /* eslint-enable no-bitwise */
        }
 
        StringSet = window.Set || ( function () {
                        return mw.format.apply( null, [ this.map.get( this.key ) ].concat( this.parameters ) );
                },
 
+               // eslint-disable-next-line valid-jsdoc
                /**
                 * Add (does not replace) parameters for `$N` placeholder values.
                 *
                        var text;
 
                        if ( !this.exists() ) {
-                               // Use <key> as text if key does not exist
-                               if ( this.format === 'escaped' || this.format === 'parse' ) {
-                                       // format 'escaped' and 'parse' need to have the brackets and key html escaped
-                                       return mw.html.escape( '<' + this.key + '>' );
-                               }
-                               return '<' + this.key + '>';
+                               // Use ⧼key⧽ as text if key does not exist
+                               // Err on the side of safety, ensure that the output
+                               // is always html safe in the event the message key is
+                               // missing, since in that case its highly likely the
+                               // message key is user-controlled.
+                               // '⧼' is used instead of '<' to side-step any
+                               // double-escaping issues.
+                               // (Keep synchronised with Message::toString() in PHP.)
+                               return '⧼' + mw.html.escape( this.key ) + '⧽';
                        }
 
                        if ( this.format === 'plain' || this.format === 'text' || this.format === 'parse' ) {
                }
        };
 
+       /* eslint-disable no-console */
        log = ( function () {
                // Also update the restoration of methods in mediawiki.log.js
                // when adding or removing methods here.
                log.deprecate = !Object.defineProperty ? function ( obj, key, val ) {
                        obj[ key ] = val;
                } : function ( obj, key, val, msg, logName ) {
+                       var logged = new StringSet();
                        logName = logName || key;
                        msg = 'Use of "' + logName + '" is deprecated.' + ( msg ? ( ' ' + msg ) : '' );
-                       var logged = new StringSet();
                        function uniqueTrace() {
                                var trace = new Error().stack;
                                if ( logged.has( trace ) ) {
 
                return log;
        }() );
+       /* eslint-enable no-console */
 
        /**
         * @class mw
                                }
 
                                if ( registry[ module ].skip !== null ) {
-                                       /*jshint evil:true */
+                                       // eslint-disable-next-line no-new-func
                                        skip = new Function( registry[ module ].skip );
                                        registry[ module ].skip = null;
                                        if ( skip() ) {
                                                        ) );
                                                }
 
-                                               unresolved.add(  module );
+                                               unresolved.add( module );
                                                sortDependencies( deps[ i ], resolved, unresolved );
                                        }
                                }
                         * @private
                         * @param {string[]} modules Array of string module names
                         * @return {Array} List of dependencies, including 'module'.
+                        * @throws {Error} If an unregistered module or a dependency loop is encountered
                         */
                        function resolve( modules ) {
-                               var resolved = [];
-                               $.each( modules, function ( idx, module ) {
-                                       sortDependencies( module, resolved );
-                               } );
+                               var i, resolved = [];
+                               for ( i = 0; i < modules.length; i++ ) {
+                                       sortDependencies( modules[ i ], resolved );
+                               }
                                return resolved;
                        }
 
                         * Utility function for execute()
                         *
                         * @ignore
+                        * @param {string} [media] Media attribute
+                        * @param {string} url URL
                         */
                        function addLink( media, url ) {
                                var el = document.createElement( 'link' );
                                                } );
                                        };
 
-                                       implicitDependencies = ( $.inArray( module, legacyModules ) !== -1 )
-                                               ? []
-                                               legacyModules;
+                                       implicitDependencies = ( $.inArray( module, legacyModules ) !== -1 ) ?
+                                               [] :
+                                               legacyModules;
 
                                        if ( module === 'user' ) {
                                                // Implicit dependency on the site module. Not real dependency because
                                                implicitDependencies.push( 'site' );
                                        }
 
-                                       legacyWait = implicitDependencies.length
-                                               ? mw.loader.using( implicitDependencies )
-                                               $.Deferred().resolve();
+                                       legacyWait = implicitDependencies.length ?
+                                               mw.loader.using( implicitDependencies ) :
+                                               $.Deferred().resolve();
 
                                        legacyWait.always( function () {
                                                try {
                         * to a query string of the form foo.bar,baz|bar.baz,quux
                         *
                         * @private
+                        * @param {Object} moduleMap Module map
+                        * @return {string} Module query string
                         */
                        function buildModulesString( moduleMap ) {
                                var p, prefix,
                                                        prefix = modules[ i ].substr( 0, lastDotIndex );
                                                        suffix = modules[ i ].slice( lastDotIndex + 1 );
 
-                                                       bytesAdded = hasOwn.call( moduleMap, prefix )
-                                                               ? suffix.length + 3 // '%2C'.length == 3
-                                                               modules[ i ].length + 3; // '%7C'.length == 3
+                                                       bytesAdded = hasOwn.call( moduleMap, prefix ) ?
+                                                               suffix.length + 3 : // '%2C'.length == 3
+                                                               modules[ i ].length + 3; // '%7C'.length == 3
 
                                                        // If the url would become too long, create a new one,
                                                        // but don't create empty requests
                                                        return true;
                                                } );
                                                asyncEval( implementations, function ( err ) {
+                                                       var failed;
                                                        // Not good, the cached mw.loader.implement calls failed! This should
                                                        // never happen, barring ResourceLoader bugs, browser bugs and PEBKACs.
                                                        // Depending on how corrupt the string is, it is likely that some
 
                                                        mw.track( 'resourceloader.exception', { exception: err, source: 'store-eval' } );
                                                        // Re-add the failed ones that are still pending back to the batch
-                                                       var failed = $.grep( sourceModules, function ( module ) {
+                                                       failed = $.grep( sourceModules, function ( module ) {
                                                                return registry[ module ].state === 'loading';
                                                        } );
                                                        batchRequest( failed );
                                                deferred.fail( error );
                                        }
 
-                                       // Resolve entire dependency map
-                                       dependencies = resolve( dependencies );
+                                       try {
+                                               // Resolve entire dependency map
+                                               dependencies = resolve( dependencies );
+                                       } catch ( e ) {
+                                               return deferred.reject( e ).promise();
+                                       }
                                        if ( allReady( dependencies ) ) {
                                                // Run ready immediately
                                                deferred.resolve( mw.loader.require );
                                 *
                                 * @protected
                                 * @since 1.27
+                                * @param {string} moduleName Module name
+                                * @return {Mixed} Exported value
                                 */
                                require: function ( moduleName ) {
                                        var state = mw.loader.getState( moduleName );
                                         *
                                         * @param {string} module Module name
                                         * @param {Object} descriptor The module's descriptor as set in the registry
+                                        * @return {boolean} Module was set
                                         */
                                        set: function ( module, descriptor ) {
                                                var args, key, src;
                                                        // Partial descriptor
                                                        // (e.g. skipped module, or style module with state=ready)
                                                        $.inArray( undefined, [ descriptor.script, descriptor.style,
-                                                                       descriptor.messages, descriptor.templates ] ) !== -1
+                                                               descriptor.messages, descriptor.templates ] ) !== -1
                                                ) {
                                                        // Decline to store
                                                        return false;
                                                        }
                                                } catch ( e ) {
                                                        mw.track( 'resourceloader.exception', { exception: e, source: 'store-localstorage-json' } );
-                                                       return;
+                                                       return false;
                                                }
 
                                                src = 'mw.loader.implement(' + args.join( ',' ) + ');';
                                                }
                                                mw.loader.store.items[ key ] = src;
                                                mw.loader.store.update();
+                                               return true;
                                        },
 
                                        /**
                                         * Iterate through the module store, removing any item that does not correspond
                                         * (in name and version) to an item in the module registry.
+                                        *
+                                        * @return {boolean} Store was pruned
                                         */
                                        prune: function () {
                                                var key, module;
                                                                delete mw.loader.store.items[ key ];
                                                        }
                                                }
+                                               return true;
                                        },
 
                                        /**
                                 * Wrapper object for raw HTML passed to mw.html.element().
                                 *
                                 * @class mw.html.Raw
+                                * @constructor
+                                * @param {string} value
                                 */
                                Raw: function ( value ) {
                                        this.value = value;
                                 * Wrapper object for CDATA element contents passed to mw.html.element()
                                 *
                                 * @class mw.html.Cdata
+                                * @constructor
+                                * @param {string} value
                                 */
                                Cdata: function ( value ) {
                                        this.value = value;
                                         */
                                        remove: list.remove,
 
+                                       // eslint-disable-next-line valid-jsdoc
                                        /**
                                         * Run a hook.
                                         *
         * @param {string} [data.module] Name of module which caused the error
         */
        function logError( topic, data ) {
+               /* eslint-disable no-console */
                var msg,
                        e = data.exception,
                        source = data.source,
                                console.error( String( e ), e );
                        }
                }
+               /* eslint-enable no-console */
        }
 
        // Subscribe to error streams
index c886817..4d23604 100644 (file)
 
                        if ( !$log.length ) {
                                $log = $( '<div id="mw-log-console"></div>' ).css( {
-                                               overflow: 'auto',
-                                               height: '150px',
-                                               backgroundColor: 'white',
-                                               borderTop: 'solid 2px #ADADAD'
-                                       } );
+                                       overflow: 'auto',
+                                       height: '150px',
+                                       backgroundColor: 'white',
+                                       borderTop: 'solid 2px #ADADAD'
+                               } );
                                hovzer = $.getFootHovzer();
                                hovzer.$.append( $log );
                                hovzer.update();
index 36b45f1..926f8c5 100644 (file)
         * @alternateClassName mw.Notification
         * @constructor
         * @private
+        * @param {mw.Message|jQuery|HTMLElement|string} message
+        * @param {Object} options
         */
        function Notification( message, options ) {
-               var $notification, $notificationTitle, $notificationContent;
+               var $notification, $notificationContent;
 
                $notification = $( '<div class="mw-notification"></div>' )
                        .data( 'mw.notification', this )
@@ -48,7 +50,7 @@
                }
 
                if ( options.title ) {
-                       $notificationTitle = $( '<div class="mw-notification-title"></div>' )
+                       $( '<div class="mw-notification-title"></div>' )
                                .text( options.title )
                                .appendTo( $notification );
                }
                                        $area.hide();
                                        notif.$notification.remove();
                                } else {
-                                       notif.$notification.slideUp( 'fast',  function () {
+                                       notif.$notification.slideUp( 'fast', function () {
                                                $( this ).remove();
                                        } );
                                }
index 7c7aca3..fa1a78c 100644 (file)
                }
 
                /**
-                * defines the location of autocomplete. Typically either
+                * Defines the location of autocomplete. Typically either
                 * header, which is in the top right of vector (for example)
                 * and content which identifies the main search bar on
-                * Special:Search.  Defaults to header for skins that don't set
+                * Special:Search. Defaults to header for skins that don't set
                 * explicitly.
                 *
                 * @ignore
+                * @param {Object} context
+                * @return {string}
                 */
                function getInputLocation( context ) {
                        return context.config.$region
                 * 'this' is the search input box (jQuery object)
                 *
                 * @ignore
+                * @param {Object} metadata
                 */
                function onAfterUpdate( metadata ) {
                        var context = this.data( 'suggestionsContext' );
                                cache: true,
                                highlightInput: true
                        } )
-                       .bind( 'paste cut drop', function () {
+                       .on( 'paste cut drop', function () {
                                // make sure paste and cut events from the mouse and drag&drop events
                                // trigger the keypress handler and cause the suggestions to update
                                $( this ).trigger( 'keypress' );
index 7f62256..9f5e5c4 100644 (file)
@@ -1,4 +1,4 @@
-/*global Mustache */
+/* global Mustache */
 ( function ( mw, $ ) {
        // Register mustache compiler
        mw.template.registerCompiler( 'mustache', {
@@ -16,6 +16,7 @@
                                 * @param {Object} data Data to render
                                 * @param {Object} partialTemplates Map partial names to Mustache template objects
                                 *  returned by mw.template.get()
+                                * @return {jQuery} Rendered HTML
                                 */
                                render: function ( data, partialTemplates ) {
                                        var partials = {};
diff --git a/resources/src/mediawiki/mediawiki.user.blockcookie.js b/resources/src/mediawiki/mediawiki.user.blockcookie.js
new file mode 100644 (file)
index 0000000..ffff039
--- /dev/null
@@ -0,0 +1,23 @@
+( function ( mw ) {
+
+       // If a user has been autoblocked, a cookie is set.
+       // Its value is replicated here in localStorage to guard against cookie-removal.
+       // This module will only be loaded when $wgCookieSetOnAutoblock is true.
+       // Ref: https://phabricator.wikimedia.org/T5233
+
+       if ( !mw.cookie.get( 'BlockID' ) && mw.storage.get( 'blockID' ) ) {
+               // The block ID exists in storage, but not in the cookie.
+               mw.cookie.set( 'BlockID', mw.storage.get( 'blockID' ) );
+
+       } else if ( parseInt( mw.cookie.get( 'BlockID' ), 10 ) > 0 && !mw.storage.get( 'blockID' ) ) {
+               // The block ID exists in the cookie, but not in storage.
+               // (When a block expires the cookie remains but its value is '', hence the integer check above.)
+               mw.storage.set( 'blockID', mw.cookie.get( 'BlockID' ) );
+
+       } else if ( mw.cookie.get( 'BlockID' ) === '' && mw.storage.get( 'blockID' ) ) {
+               // If only the empty string is in the cookie, remove the storage value. The block is no longer valid.
+               mw.storage.remove( 'blockID' );
+
+       }
+
+}( mediaWiki ) );
index 63e7de8..c4c91f9 100644 (file)
@@ -2,10 +2,9 @@
  * @class mw.user
  * @singleton
  */
+/* global Uint32Array */
 ( function ( mw, $ ) {
-       var i,
-               userInfoPromise,
-               byteToHex = [];
+       var userInfoPromise;
 
        /**
         * Get the current user's groups or rights
                return userInfoPromise;
        }
 
-       // Map from numbers 0-255 to a hex string (with padding)
-       for ( i = 0; i < 256; i++ ) {
-               // Padding: Add a full byte (0x100, 256) and strip the extra character
-               byteToHex[ i ] = ( i + 256 ).toString( 16 ).slice( 1 );
-       }
-
        // mw.user with the properties options and tokens gets defined in mediawiki.js.
        $.extend( mw.user, {
 
                 * @return {string} 64 bit integer in hex format, padded
                 */
                generateRandomSessionId: function () {
-                       /*jshint bitwise:false */
-                       var rnds, i, r,
-                               hexRnds = new Array( 8 ),
+                       var rnds, i,
+                               hexRnds = new Array( 2 ),
                                // Support: IE 11
                                crypto = window.crypto || window.msCrypto;
 
-                       // Based on https://github.com/broofa/node-uuid/blob/bfd9f96127/uuid.js
                        if ( crypto && crypto.getRandomValues ) {
-                               // Fill an array with 8 random values, each of which is 8 bits.
-                               // Note that Uint8Array is array-like but does not implement Array.
-                               rnds = new Uint8Array( 8 );
+                               // Fill an array with 2 random values, each of which is 32 bits.
+                               // Note that Uint32Array is array-like but does not implement Array.
+                               rnds = new Uint32Array( 2 );
                                crypto.getRandomValues( rnds );
                        } else {
-                               rnds = new Array( 8 );
-                               for ( i = 0; i < 8; i++ ) {
-                                       if ( ( i & 3 ) === 0 ) {
-                                               r = Math.random() * 0x100000000;
-                                       }
-                                       rnds[ i ] = r >>> ( ( i & 3 ) << 3 ) & 255;
-                               }
+                               rnds = [
+                                       Math.floor( Math.random() * 0x100000000 ),
+                                       Math.floor( Math.random() * 0x100000000 )
+                               ];
                        }
-                       // Convert from number to hex
-                       for ( i = 0; i < 8; i++ ) {
-                               hexRnds[ i ] = byteToHex[ rnds[ i ] ];
+                       // Convert number to a string with 16 hex characters
+                       for ( i = 0; i < 2; i++ ) {
+                               // Add 0x100000000 before converting to hex and strip the extra character
+                               // after converting to keep the leading zeros.
+                               hexRnds[ i ] = ( rnds[ i ] + 0x100000000 ).toString( 16 ).slice( 1 );
                        }
 
                        // Concatenation of two random integers with entropy n and m
                 *  unavailable, or Date for when the user registered.
                 */
                getRegistration: function () {
+                       var registration;
                        if ( mw.user.isAnon() ) {
                                return false;
                        }
-                       var registration = mw.config.get( 'wgUserRegistration' );
+                       registration = mw.config.get( 'wgUserRegistration' );
                        // Registration may be unavailable if the user signed up before MediaWiki
                        // began tracking this.
                        return !registration ? null : new Date( registration );
index 654f232..a8188db 100644 (file)
@@ -50,6 +50,7 @@
                 * Encode the string like PHP's rawurlencode
                 *
                 * @param {string} str String to be encoded.
+                * @return {string} Encoded string
                 */
                rawurlencode: function ( str ) {
                        str = String( str );
@@ -62,6 +63,7 @@
                 * Encode the string like Sanitizer::escapeId in PHP
                 *
                 * @param {string} str String to be encoded.
+                * @return {string} Encoded string
                 */
                escapeId: function ( str ) {
                        str = String( str );
@@ -80,6 +82,7 @@
                 * of `wfUrlencode` in PHP.
                 *
                 * @param {string} str String to be encoded.
+                * @return {string} Encoded string
                 */
                wikiUrlencode: function ( str ) {
                        return util.rawurlencode( str )
                                query = $.param( params );
                        }
                        if ( query ) {
-                               url = title
-                                       ? util.wikiScript() + '?title=' + util.wikiUrlencode( title ) + '&' + query
-                                       util.wikiScript() + '?' + query;
+                               url = title ?
+                                       util.wikiScript() + '?title=' + util.wikiUrlencode( title ) + '&' + query :
+                                       util.wikiScript() + '?' + query;
                        } else {
                                url = mw.config.get( 'wgArticlePath' )
                                        .replace( '$1', util.wikiUrlencode( title ).replace( /\$/g, '$$$$' ) );
                 * @return {Mixed} Parameter value or null.
                 */
                getParamValue: function ( param, url ) {
-                       if ( url === undefined ) {
-                               url = location.href;
-                       }
                        // Get last match, stop at hash
                        var     re = new RegExp( '^[^#]*[&?]' + mw.RegExp.escape( param ) + '=([^&#]*)' ),
-                               m = re.exec( url );
+                               m = re.exec( url !== undefined ? url : location.href );
+
                        if ( m ) {
                                // Beware that decodeURIComponent is not required to understand '+'
                                // by spec, as encodeURIComponent does not produce it.
 
                        html5EmailRegexp = new RegExp(
                                // start of string
-                               '^'
-                               +
+                               '^' +
                                // User part which is liberal :p
-                               '[' + rfc5322Atext + '\\.]+'
-                               +
+                               '[' + rfc5322Atext + '\\.]+' +
                                // 'at'
-                               '@'
-                               +
+                               '@' +
                                // Domain first part
-                               '[' + rfc1034LdhStr + ']+'
-                               +
+                               '[' + rfc1034LdhStr + ']+' +
                                // Optional second part and following are separated by a dot
-                               '(?:\\.[' + rfc1034LdhStr + ']+)*'
-                               +
+                               '(?:\\.[' + rfc1034LdhStr + ']+)*' +
                                // End of string
                                '$',
                                // RegExp is case insensitive
                 * @return {boolean}
                 */
                isIPv4Address: function ( address, allowBlock ) {
+                       var block, RE_IP_BYTE, RE_IP_ADD;
+
                        if ( typeof address !== 'string' ) {
                                return false;
                        }
 
-                       var     block = allowBlock ? '(?:\\/(?:3[0-2]|[12]?\\d))?' : '',
-                               RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])',
-                               RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
+                       block = allowBlock ? '(?:\\/(?:3[0-2]|[12]?\\d))?' : '';
+                       RE_IP_BYTE = '(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|0?[0-9]?[0-9])';
+                       RE_IP_ADD = '(?:' + RE_IP_BYTE + '\\.){3}' + RE_IP_BYTE;
 
                        return ( new RegExp( '^' + RE_IP_ADD + block + '$' ).test( address ) );
                },
                 * @return {boolean}
                 */
                isIPv6Address: function ( address, allowBlock ) {
+                       var block, RE_IPV6_ADD;
+
                        if ( typeof address !== 'string' ) {
                                return false;
                        }
 
-                       var     block = allowBlock ? '(?:\\/(?:12[0-8]|1[01][0-9]|[1-9]?\\d))?' : '',
-                               RE_IPV6_ADD =
-                       '(?:' + // starts with "::" (including "::")
-                       ':(?::|(?::' + '[0-9A-Fa-f]{1,4}' + '){1,7})' +
-                       '|' + // ends with "::" (except "::")
-                       '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){0,6}::' +
-                       '|' + // contains no "::"
-                       '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){7}' +
-                       ')';
+                       block = allowBlock ? '(?:\\/(?:12[0-8]|1[01][0-9]|[1-9]?\\d))?' : '';
+                       RE_IPV6_ADD =
+                               '(?:' + // starts with "::" (including "::")
+                               ':(?::|(?::' + '[0-9A-Fa-f]{1,4}' + '){1,7})' +
+                               '|' + // ends with "::" (except "::")
+                               '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){0,6}::' +
+                               '|' + // contains no "::"
+                               '[0-9A-Fa-f]{1,4}' + '(?::' + '[0-9A-Fa-f]{1,4}' + '){7}' +
+                               ')';
 
                        if ( new RegExp( '^' + RE_IPV6_ADD + block + '$' ).test( address ) ) {
                                return true;
                        RE_IPV6_ADD = '[0-9A-Fa-f]{1,4}' + '(?:::?' + '[0-9A-Fa-f]{1,4}' + '){1,6}';
 
                        return (
-                               new RegExp( '^' + RE_IPV6_ADD + block + '$' ).test( address )
-                               && /::/.test( address )
-                               && !/::.*::/.test( address )
+                               new RegExp( '^' + RE_IPV6_ADD + block + '$' ).test( address ) &&
+                               /::/.test( address ) &&
+                               !/::.*::/.test( address )
                        );
                },
 
index 6396331..b453ac8 100644 (file)
@@ -18,6 +18,7 @@
                 *
                 * @ignore
                 * @private
+                * @return {Object} Viewport positions
                 */
                makeViewportFromWindow: function () {
                        var $window = $( window ),
@@ -85,7 +86,7 @@
                 */
                isElementCloseToViewport: function ( el, threshold, rectangle ) {
                        var viewport = rectangle ? $.extend( {}, rectangle ) : this.makeViewportFromWindow();
-                       threshold = threshold || 50 ;
+                       threshold = threshold || 50;
 
                        viewport.top -= threshold;
                        viewport.left -= threshold;
index cf448b0..094c4df 100644 (file)
        /**
         * Gets the height of the interface elements and the
         * gallery's caption.
+        *
+        * @return {number} Height
         */
        mw.GallerySlideshow.prototype.getChromeHeight = function () {
                return this.$interface.outerHeight() + this.$galleryCaption.outerHeight();
                if ( this.imageInfoCache[ imageSrc ] === undefined ) {
                        api = new mw.Api();
                        // TODO: This supports only gallery of images
-                       title = new mw.Title.newFromImg( $img );
+                       title = mw.Title.newFromImg( $img );
                        params = {
                                action: 'query',
                                formatversion: 2,
        };
 
        // Bootstrap all slideshow galleries
-       $( function () {
-               $( '.mw-gallery-slideshow' ).each( function () {
-                       /*jshint -W031 */
+       mw.hook( 'wikipage.content' ).add( function ( $content ) {
+               $content.find( '.mw-gallery-slideshow' ).each( function () {
+                       // eslint-disable-next-line no-new
                        new mw.GallerySlideshow( this );
-                       /*jshint +W031 */
                } );
        } );
 }( mediaWiki, jQuery, OO ) );
index 02bc1de..6038a57 100644 (file)
@@ -1,8 +1,10 @@
 /*!
  * Implement AJAX navigation for multi-page images so the user may browse without a full page reload.
  */
+
+/* eslint-disable no-use-before-define */
+
 ( function ( mw, $ ) {
-       /*jshint latedef:false */
        var jqXhr, $multipageimage, $spinner,
                cache = {},
                cacheOrder = [];
index 89bbbe7..6d6d46d 100644 (file)
                                rcid: rcid
                        } )
                        .done( function ( data ) {
+                               var title;
                                // Remove all patrollinks from the page (including any spinners inside).
                                $patrolLinks.closest( '.patrollink' ).remove();
                                if ( data.patrol !== undefined ) {
                                        // Success
-                                       var title = new mw.Title( data.patrol.title );
+                                       title = new mw.Title( data.patrol.title );
                                        mw.notify( mw.msg( 'markedaspatrollednotify', title.toText() ) );
                                } else {
                                        // This should never happen as errors should trigger fail
index 83d14b3..cb46b11 100644 (file)
@@ -43,9 +43,9 @@
                                        }
                                        $( e.delegateTarget ).remove();
                                }, function ( errorCode, data ) {
-                                       var message = data && data.error && data.error.messageHtml
-                                               ? $.parseHTML( data.error.messageHtml )
-                                               mw.msg( 'rollbackfailed' ),
+                                       var message = data && data.error && data.error.messageHtml ?
+                                               $.parseHTML( data.error.messageHtml ) :
+                                               mw.msg( 'rollbackfailed' ),
                                                type = errorCode === 'alreadyrolled' ? 'warn' : 'error';
 
                                        mw.notify( message, {
index 282799a..076357a 100644 (file)
@@ -3,6 +3,7 @@
        mw.page = {};
 
        $( function () {
+               var $diff;
                mw.util.init();
 
                /**
@@ -23,7 +24,7 @@
                 */
                mw.hook( 'wikipage.content' ).fire( $( '#mw-content-text' ) );
 
-               var $diff = $( 'table.diff[data-mw="interface"]' );
+               $diff = $( 'table.diff[data-mw="interface"]' );
                if ( $diff.length ) {
                        /**
                         * Fired when the diff is added to a page containing a diff
index c67b93e..0abb957 100644 (file)
@@ -1,7 +1,7 @@
 // Use DMY date format for Moment.js, in accordance with MediaWiki's date formatting routines.
 // This affects English only (and languages without localisations, that fall back to English).
 // http://momentjs.com/docs/#/customization/long-date-formats/
-/*global moment */
+/* global moment */
 moment.locale( 'en', {
        longDateFormat: {
                // Unchanged, but have to be repeated here:
index dd33b00..13f26f0 100644 (file)
@@ -1,4 +1,4 @@
-/*global moment, mw */
+/* global moment, mw */
 
 // HACK: Overwrite moment's i18n with MediaWiki's for the current language so that
 // wgTranslateNumerals is respected.
index 5f52d1e..c8acc86 100644 (file)
@@ -4,16 +4,16 @@
  */
 
 window.Node = window.Node || {
-       ELEMENT_NODE:                1,
-       ATTRIBUTE_NODE:              2,
-       TEXT_NODE:                   3,
-       CDATA_SECTION_NODE:          4,
-       ENTITY_REFERENCE_NODE:       5,
-       ENTITY_NODE:                 6,
+       ELEMENT_NODE: 1,
+       ATTRIBUTE_NODE: 2,
+       TEXT_NODE: 3,
+       CDATA_SECTION_NODE: 4,
+       ENTITY_REFERENCE_NODE: 5,
+       ENTITY_NODE: 6,
        PROCESSING_INSTRUCTION_NODE: 7,
-       COMMENT_NODE:                8,
-       DOCUMENT_NODE:               9,
-       DOCUMENT_TYPE_NODE:          10,
-       DOCUMENT_FRAGMENT_NODE:      11,
-       NOTATION_NODE:               12
+       COMMENT_NODE: 8,
+       DOCUMENT_NODE: 9,
+       DOCUMENT_TYPE_NODE: 10,
+       DOCUMENT_FRAGMENT_NODE: 11,
+       NOTATION_NODE: 12
 };
index 5e05590..82a00bc 100644 (file)
@@ -3,11 +3,11 @@
  *
  * This file is where we decide whether to initialise the modern run-time.
  */
-/*jshint unused: false */
-/*globals mw, RLQ: true, NORLQ: true, $VARS, $CODE, performance */
 
-var mediaWikiLoadStart = ( new Date() ).getTime(),
+/* global mw, $VARS, $CODE */
 
+// eslint-disable-next-line no-unused-vars
+var mediaWikiLoadStart = ( new Date() ).getTime(),
        mwPerformance = ( window.performance && performance.mark ) ? performance : {
                mark: function () {}
        };
@@ -21,17 +21,19 @@ mwPerformance.mark( 'mwLoadStart' );
  * - DOM Level 4 & Selectors API Level 1
  * - HTML5 & Web Storage
  * - DOM Level 2 Events
+ * - JSON
  *
  * Browsers we support in our modern run-time (Grade A):
- * - Chrome
+ * - Chrome 4+
  * - IE 9+
  * - Firefox 3.5+
- * - Safari 4+
+ * - Safari 5+
  * - Opera 10.5+
- * - Mobile Safari (iOS 1+)
+ * - Mobile Safari (iOS 4+)
  * - Android 2.0+
  *
  * Browsers we support in our no-javascript run-time (Grade C):
+ * - Chrome 1+
  * - IE 6+
  * - Firefox 3+
  * - Safari 3+
@@ -44,30 +46,37 @@ mwPerformance.mark( 'mwLoadStart' );
  * - Nokia's Ovi Browser
  * - MeeGo's browser
  * - Google Glass
+ * - UC Mini (speed mode on)
  *
  * Other browsers that pass the check are considered Grade X.
+ *
+ * @param {string} [str] User agent, defaults to navigator.userAgent
+ * @return {boolean} User agent is compatible with MediaWiki JS
  */
 function isCompatible( str ) {
        var ua = str || navigator.userAgent;
        return !!(
                // http://caniuse.com/#feat=queryselector
-               'querySelector' in document
+               'querySelector' in document &&
 
                // http://caniuse.com/#feat=namevalue-storage
                // https://developer.blackberry.com/html5/apis/v1_0/localstorage.html
                // https://blog.whatwg.org/this-week-in-html-5-episode-30
-               && 'localStorage' in window
+               'localStorage' in window &&
 
                // http://caniuse.com/#feat=addeventlistener
-               && 'addEventListener' in window
+               'addEventListener' in window &&
+
+               // http://caniuse.com/#feat=json
+               // https://phabricator.wikimedia.org/T141344#2784065
+               ( window.JSON && JSON.stringify && JSON.parse ) &&
 
                // Hardcoded exceptions for browsers that pass the requirement but we don't want to
                // support in the modern run-time.
-               && !(
-                       ua.match( /webOS\/1\.[0-4]|SymbianOS|Series60|NetFront|Opera Mini|S40OviBrowser|MeeGo|Android.+Glass/ ) ||
-                       ua.match( /PlayStation/i ) ||
-                       // UC Mini (speed mode on)
-                       ua.match( /^Mozilla\/5\.0 .+ Gecko\/$/ )
+               // Note: Please extend the regex instead of adding new ones
+               !(
+                       ua.match( /webOS\/1\.[0-4]|SymbianOS|Series60|NetFront|Opera Mini|S40OviBrowser|MeeGo|Android.+Glass|^Mozilla\/5\.0 .+ Gecko\/$/ ) ||
+                       ua.match( /PlayStation/i )
                )
        );
 }
@@ -112,6 +121,7 @@ function isCompatible( str ) {
 
                // Must be after mw.config.set because these callbacks may use mw.loader which
                // needs to have values 'skin', 'debug' etc. from mw.config.
+               // eslint-disable-next-line vars-on-top
                var RLQ = window.RLQ || [];
                while ( RLQ.length ) {
                        RLQ.shift()();
index 6c3ad07..53e724b 100644 (file)
@@ -15,6 +15,7 @@ class TestSetup {
                global $wgMainStash;
                global $wgLanguageConverterCacheType, $wgUseDatabaseMessages;
                global $wgLocaltimezone, $wgLocalisationCacheConf;
+               global $wgSearchType;
                global $wgDevelopmentWarnings;
                global $wgSessionProviders, $wgSessionPbkdf2Iterations;
                global $wgJobTypeConf;
@@ -50,6 +51,9 @@ class TestSetup {
 
                $wgLocalisationCacheConf['storeClass'] = 'LCStoreNull';
 
+               // Do not bother updating search tables
+               $wgSearchType = 'SearchEngineDummy';
+
                // Generic MediaWiki\Session\SessionManager configuration for tests
                // We use CookieSessionProvider because things might be expecting
                // cookies to show up in a FauxRequest somewhere.
index 0bfa318..66df315 100644 (file)
@@ -35,6 +35,7 @@ $wgAutoloadClasses += [
        'DjVuSupport' => "$testDir/parser/DjVuSupport.php",
        'TestRecorder' => "$testDir/parser/TestRecorder.php",
        'MultiTestRecorder' => "$testDir/parser/MultiTestRecorder.php",
+       'ParserTestMockParser' => "$testDir/parser/ParserTestMockParser.php",
        'ParserTestRunner' => "$testDir/parser/ParserTestRunner.php",
        'ParserTestParserHook' => "$testDir/parser/ParserTestParserHook.php",
        'ParserTestPrinter' => "$testDir/parser/ParserTestPrinter.php",
diff --git a/tests/parser/ParserTestMockParser.php b/tests/parser/ParserTestMockParser.php
new file mode 100644 (file)
index 0000000..0757b34
--- /dev/null
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * A parser used during article insertion which does nothing, to avoid
+ * unnecessary log noise and other interference with debugging.
+ */
+class ParserTestMockParser {
+       public function preSaveTransform( $text, Title $title, User $user,
+               ParserOptions $options, $clearState = true
+       ) {
+               return $text;
+       }
+
+       public function parse(
+               $text, Title $title, ParserOptions $options,
+               $linestart = true, $clearState = true, $revid = null
+       ) {
+               return new ParserOutput;
+       }
+}
index e433c2e..281e1df 100644 (file)
@@ -426,7 +426,7 @@ class ParserTestRunner {
         * @param ScopedCallback|null A ScopedCallback to consume
         * @return ScopedCallback
         */
-       protected function createTeardownObject( $teardown, $nextTeardown ) {
+       protected function createTeardownObject( $teardown, $nextTeardown = null ) {
                return new ScopedCallback( function() use ( $teardown, $nextTeardown ) {
                        // Schedule teardown snippets in reverse order
                        $teardown = array_reverse( $teardown );
@@ -1503,7 +1503,18 @@ class ParserTestRunner {
                        throw new MWException( "duplicate article '$name' at $file:$line\n" );
                }
 
-               $status = $page->doEditContent( ContentHandler::makeContent( $text, $title ), '', EDIT_NEW );
+               // Use mock parser, to make debugging of actual parser tests simpler.
+               // But initialise the MessageCache clone first, don't let MessageCache
+               // get a reference to the mock object.
+               MessageCache::singleton()->getParser();
+               $restore = $this->executeSetupSnippets( [ 'wgParser' => new ParserTestMockParser ] );
+               $status = $page->doEditContent(
+                       ContentHandler::makeContent( $text, $title ),
+                       '',
+                       EDIT_NEW | EDIT_INTERNAL
+               );
+               $restore();
+
                if ( !$status->isOK() ) {
                        throw new MWException( $status->getWikiText( false, false, 'en' ) );
                }
index a18e219..5b17eac 100644 (file)
@@ -2712,10 +2712,12 @@ Templates: Handle empty comment-and-ws-only lines correctly
 <!--should be ignored-->
  <!--should be ignored as well-->
 bar}}
-!! html
+!! html/php
 <p>foo
 bar
 </p>
+!! html/parsoid
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo\n&lt;!--should be ignored-->\n &lt;!--should be ignored as well-->\nbar"}},"i":0}}]}'>foo <!--should be ignored--> <!--should be ignored as well--> bar</p>
 !! end
 
 !! test
@@ -2731,7 +2733,13 @@ Templates: Handle comments in the target
 {{echo<!-- should be ignored -->|foo}}
 
 {{<!-- should be ignored -->echo|foo}}
-!!html/parsoid
+!! html/php
+<p>foo
+</p><p>foo
+</p><p>foo
+</p><p>foo
+</p>
+!! html/parsoid
 <p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo\n&lt;!-- should be ignored -->\n","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
 
 <p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo&lt;!-- should be ignored -->\n","href":"./Template:Echo"},"params":{"1":{"wt":"foo"}},"i":0}}]}'>foo</p>
@@ -2755,7 +2763,13 @@ Templates: Handle comments in parameter names (bug 67657)
 {{echo|1<!-- should be ignored -->=foo}}
 
 {{echo|<!-- should be ignored -->1=foo}}
-!!html/parsoid
+!! html/php
+<p>foo
+</p><p>foo
+</p><p>foo
+</p><p>foo
+</p>
+!! html/parsoid
 <p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo","key":{"wt":"1\n&lt;!-- should be ignored -->"}}},"i":0}}]}'>foo</p>
 
 <p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"1":{"wt":"foo","key":{"wt":"&lt;!-- should be ignored -->\n1"}}},"i":0}}]}'>foo</p>
@@ -2769,11 +2783,11 @@ Templates: Handle comments in parameter names (bug 67657)
 Templates: Other wikitext in parameter names (bug 67657)
 !! wikitext
 {{echo|''1''=foo}}
-!!html/parsoid
-<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"&#39;&#39;1&#39;&#39;":{"wt":"foo"}},"i":0}}]}'>{{{1}}}</p>
-!!html/php
+!! html/php
 <p>{{{1}}}
 </p>
+!! html/parsoid
+<p typeof="mw:Transclusion" data-mw='{"parts":[{"template":{"target":{"wt":"echo","href":"./Template:Echo"},"params":{"&#39;&#39;1&#39;&#39;":{"wt":"foo"}},"i":0}}]}'>{{{1}}}</p>
 !!end
 
 #--------------------------------------------------------------------
@@ -7426,6 +7440,23 @@ Piped link with no link text
 <p>[[Thomas Bek (bishop of St David's)|]]</p>
 !! end
 
+!! test
+Piped link with empty link text
+!! wikitext
+[[Main Page|<nowiki />]] - empty nowiki
+[[Main Page| ]] - empty space
+[[Main Page|&nbsp;]] - empty non breaking space
+!! html/php
+<p><a href="/wiki/Main_Page" title="Main Page"></a> - empty nowiki
+<a href="/wiki/Main_Page" title="Main Page"> </a> - empty space
+<a href="/wiki/Main_Page" title="Main Page">&#160;</a> - empty non breaking space
+</p>
+!! html/parsoid
+<p><a rel="mw:WikiLink" href="./Main_Page" title="Main Page"><meta typeof="mw:Placeholder" data-parsoid='{"src":"&lt;nowiki />"}'/></a> - empty nowiki
+<a rel="mw:WikiLink" href="./Main_Page" title="Main Page"> </a> - empty space
+<a rel="mw:WikiLink" href="./Main_Page" title="Main Page"><span typeof="mw:Entity" data-parsoid='{"src":"&amp;nbsp;","srcContent":" "}'> </span></a> - empty non breaking space</p>
+!! end
+
 !! test
 Broken link
 !! wikitext
index e0f4416..db1df5c 100644 (file)
@@ -81,6 +81,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         */
        private $mwGlobals = [];
 
+       /**
+        * Holds list of MediaWiki configuration settings to be unset in tearDown().
+        * See also setMwGlobals().
+        * @var array
+        */
+       private $mwGlobalsToUnset = [];
+
        /**
         * Holds original loggers which have been replaced by setLogger()
         * @var LoggerInterface[]
@@ -535,7 +542,11 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                foreach ( $this->mwGlobals as $key => $value ) {
                        $GLOBALS[$key] = $value;
                }
+               foreach ( $this->mwGlobalsToUnset as $value ) {
+                       unset( $GLOBALS[$value] );
+               }
                $this->mwGlobals = [];
+               $this->mwGlobalsToUnset = [];
                $this->restoreLoggers();
 
                if ( self::$serviceLocator && MediaWikiServices::getInstance() !== self::$serviceLocator ) {
@@ -684,8 +695,6 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
         *
         * @param array|string $globalKeys Key to the global variable, or an array of keys.
         *
-        * @throws Exception When trying to stash an unset global
-        *
         * @note To allow changes to global variables to take effect on global service instances,
         *       call overrideMwServices().
         *
@@ -700,9 +709,13 @@ abstract class MediaWikiTestCase extends PHPUnit_Framework_TestCase {
                        // NOTE: make sure we only save the global once or a second call to
                        // setMwGlobals() on the same global would override the original
                        // value.
-                       if ( !array_key_exists( $globalKey, $this->mwGlobals ) ) {
+                       if (
+                               !array_key_exists( $globalKey, $this->mwGlobals ) &&
+                               !array_key_exists( $globalKey, $this->mwGlobalsToUnset )
+                       ) {
                                if ( !array_key_exists( $globalKey, $GLOBALS ) ) {
-                                       throw new Exception( "Global with key {$globalKey} doesn't exist and cant be stashed" );
+                                       $this->mwGlobalsToUnset[$globalKey] = $globalKey;
+                                       continue;
                                }
                                // NOTE: we serialize then unserialize the value in case it is an object
                                // this stops any objects being passed by reference. We could use clone
index 8eb1fd5..baa481e 100644 (file)
@@ -1,5 +1,6 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
 use Psr\Log\LoggerInterface;
 use Psr\Log\NullLogger;
 
@@ -140,7 +141,7 @@ class EmptyResourceLoader extends ResourceLoader {
        // and default registrations are done from ServiceWiring instead.
        public function __construct( Config $config = null, LoggerInterface $logger = null ) {
                $this->setLogger( $logger ?: new NullLogger() );
-               $this->config = $config ?: ConfigFactory::getDefaultInstance()->makeConfig( 'main' );
+               $this->config = $config ?: MediaWikiServices::getInstance()->getMainConfig();
                $this->setMessageBlobStore( new MessageBlobStore( $this, $this->getLogger() ) );
        }
 }
diff --git a/tests/phpunit/data/localisationcache/ba.json b/tests/phpunit/data/localisationcache/ba.json
new file mode 100644 (file)
index 0000000..59b8912
--- /dev/null
@@ -0,0 +1,3 @@
+{
+       "present-ba": "ba"
+}
index 27600cd..39cce86 100644 (file)
@@ -1,5 +1,5 @@
 {
-       "present-uk": "en",
+       "present-ba": "en",
        "present-ru": "en",
        "present-en": "en"
 }
index 79e1444..c9f89d3 100644 (file)
@@ -1,4 +1,4 @@
 {
-       "present-uk": "ru",
+       "present-ba": "ru",
        "present-ru": "ru"
 }
diff --git a/tests/phpunit/data/localisationcache/uk.json b/tests/phpunit/data/localisationcache/uk.json
deleted file mode 100644 (file)
index f63ce5d..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-{
-       "present-uk": "uk"
-}
index 4c689ab..e8afb4c 100644 (file)
@@ -18,8 +18,8 @@ class MessageTest extends MediaWikiLangTestCase {
        public function testConstructor( $expectedLang, $key, $params, $language ) {
                $message = new Message( $key, $params, $language );
 
-               $this->assertEquals( $key, $message->getKey() );
-               $this->assertEquals( $params, $message->getParams() );
+               $this->assertSame( $key, $message->getKey() );
+               $this->assertSame( $params, $message->getParams() );
                $this->assertEquals( $expectedLang, $message->getLanguage() );
 
                $messageSpecifier = $this->getMockForAbstractClass( 'MessageSpecifier' );
@@ -29,8 +29,8 @@ class MessageTest extends MediaWikiLangTestCase {
                        ->method( 'getParams' )->will( $this->returnValue( $params ) );
                $message = new Message( $messageSpecifier, [], $language );
 
-               $this->assertEquals( $key, $message->getKey() );
-               $this->assertEquals( $params, $message->getParams() );
+               $this->assertSame( $key, $message->getKey() );
+               $this->assertSame( $params, $message->getParams() );
                $this->assertEquals( $expectedLang, $message->getLanguage() );
        }
 
@@ -97,7 +97,7 @@ class MessageTest extends MediaWikiLangTestCase {
                $returned = call_user_func_array( [ $msg, 'params' ], $args );
 
                $this->assertSame( $msg, $returned );
-               $this->assertEquals( $expected, $msg->getParams() );
+               $this->assertSame( $expected, $msg->getParams() );
        }
 
        public static function provideConstructorLanguage() {
@@ -165,8 +165,8 @@ class MessageTest extends MediaWikiLangTestCase {
 
                $msg = new Message( $key );
                $this->assertContains( $msg->getKey(), $expected );
-               $this->assertEquals( $expected, $msg->getKeysToTry() );
-               $this->assertEquals( count( $expected ) > 1, $msg->isMultiKey() );
+               $this->assertSame( $expected, $msg->getKeysToTry() );
+               $this->assertSame( count( $expected ) > 1, $msg->isMultiKey() );
        }
 
        /**
@@ -190,13 +190,13 @@ class MessageTest extends MediaWikiLangTestCase {
         * @covers Message::__construct
         */
        public function testWfMessageParams() {
-               $this->assertEquals( 'Return to $1.', wfMessage( 'returnto' )->text() );
-               $this->assertEquals( 'Return to $1.', wfMessage( 'returnto', [] )->text() );
-               $this->assertEquals(
+               $this->assertSame( 'Return to $1.', wfMessage( 'returnto' )->text() );
+               $this->assertSame( 'Return to $1.', wfMessage( 'returnto', [] )->text() );
+               $this->assertSame(
                        'You have foo (bar).',
                        wfMessage( 'youhavenewmessages', 'foo', 'bar' )->text()
                );
-               $this->assertEquals(
+               $this->assertSame(
                        'You have foo (bar).',
                        wfMessage( 'youhavenewmessages', [ 'foo', 'bar' ] )->text()
                );
@@ -222,13 +222,13 @@ class MessageTest extends MediaWikiLangTestCase {
         * @covers Message::toString
         */
        public function testToStringKey() {
-               $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->text() );
-               $this->assertEquals( '⧼i-dont-exist-evar⧽', wfMessage( 'i-dont-exist-evar' )->text() );
-               $this->assertEquals( '⧼i&lt;dont&gt;exist-evar⧽', wfMessage( 'i<dont>exist-evar' )->text() );
-               $this->assertEquals( '⧼i-dont-exist-evar⧽', wfMessage( 'i-dont-exist-evar' )->plain() );
-               $this->assertEquals( '⧼i&lt;dont&gt;exist-evar⧽', wfMessage( 'i<dont>exist-evar' )->plain() );
-               $this->assertEquals( '⧼i-dont-exist-evar⧽', wfMessage( 'i-dont-exist-evar' )->escaped() );
-               $this->assertEquals(
+               $this->assertSame( 'Main Page', wfMessage( 'mainpage' )->text() );
+               $this->assertSame( '⧼i-dont-exist-evar⧽', wfMessage( 'i-dont-exist-evar' )->text() );
+               $this->assertSame( '⧼i&lt;dont&gt;exist-evar⧽', wfMessage( 'i<dont>exist-evar' )->text() );
+               $this->assertSame( '⧼i-dont-exist-evar⧽', wfMessage( 'i-dont-exist-evar' )->plain() );
+               $this->assertSame( '⧼i&lt;dont&gt;exist-evar⧽', wfMessage( 'i<dont>exist-evar' )->plain() );
+               $this->assertSame( '⧼i-dont-exist-evar⧽', wfMessage( 'i-dont-exist-evar' )->escaped() );
+               $this->assertSame(
                        '⧼i&lt;dont&gt;exist-evar⧽',
                        wfMessage( 'i<dont>exist-evar' )->escaped()
                );
@@ -236,11 +236,14 @@ class MessageTest extends MediaWikiLangTestCase {
 
        public static function provideToString() {
                return [
-                       [ 'mainpage', 'Main Page' ],
-                       [ 'i-dont-exist-evar', '⧼i-dont-exist-evar⧽' ],
-                       [ 'i-dont-exist-evar', '⧼i-dont-exist-evar⧽', 'escaped' ],
-                       [ 'script>alert(1)</script', '⧼script&gt;alert(1)&lt;/script⧽', 'escaped' ],
-                       [ 'script>alert(1)</script', '⧼script&gt;alert(1)&lt;/script⧽' ],
+                       // key, transformation, transformed, transformed implicitly
+                       [ 'mainpage', 'plain', 'Main Page', 'Main Page' ],
+                       [ 'i-dont-exist-evar', 'plain', '⧼i-dont-exist-evar⧽', '⧼i-dont-exist-evar⧽' ],
+                       [ 'i-dont-exist-evar', 'escaped', '⧼i-dont-exist-evar⧽', '⧼i-dont-exist-evar⧽' ],
+                       [ 'script>alert(1)</script', 'escaped', '⧼script&gt;alert(1)&lt;/script⧽',
+                               '⧼script&gt;alert(1)&lt;/script⧽' ],
+                       [ 'script>alert(1)</script', 'plain', '⧼script&gt;alert(1)&lt;/script⧽',
+                               '⧼script&gt;alert(1)&lt;/script⧽' ],
                ];
        }
 
@@ -249,25 +252,59 @@ class MessageTest extends MediaWikiLangTestCase {
         * @covers Message::__toString
         * @dataProvider provideToString
         */
-       public function testToString( $key, $expect, $format = 'plain' ) {
+       public function testToString( $key, $format, $expect, $expectImplicit ) {
                $msg = new Message( $key );
-               $msg->$format();
-               $this->assertEquals( $expect, $msg->toString() );
-               $this->assertEquals( $expect, $msg->__toString() );
+               $this->assertSame( $expect, $msg->$format() );
+               $this->assertSame( $expect, $msg->toString(), 'toString is unaffected by previous call' );
+               $this->assertSame( $expectImplicit, $msg->__toString() );
+               $this->assertSame( $expect, $msg->toString(), 'toString is unaffected by __toString' );
+       }
+
+       public static function provideToString_raw() {
+               return [
+                       [ '<span>foo</span>', 'parse', '<span>foo</span>', '<span>foo</span>' ],
+                       [ '<span>foo</span>', 'escaped', '&lt;span&gt;foo&lt;/span&gt;',
+                         '<span>foo</span>' ],
+                       [ '<span>foo</span>', 'plain', '<span>foo</span>', '<span>foo</span>' ],
+                       [ '<script>alert(1)</script>', 'parse', '&lt;script&gt;alert(1)&lt;/script&gt;',
+                               '&lt;script&gt;alert(1)&lt;/script&gt;' ],
+                       [ '<script>alert(1)</script>', 'escaped', '&lt;script&gt;alert(1)&lt;/script&gt;',
+                               '&lt;script&gt;alert(1)&lt;/script&gt;' ],
+                       [ '<script>alert(1)</script>', 'plain', '<script>alert(1)</script>',
+                         '&lt;script&gt;alert(1)&lt;/script&gt;' ],
+               ];
+       }
+
+       /**
+        * @covers Message::toString
+        * @covers Message::__toString
+        * @dataProvider provideToString_raw
+        */
+       public function testToString_raw( $message, $format, $expect, $expectImplicit ) {
+               // make the message behave like RawMessage and use the key as-is
+               $msg = $this->getMockBuilder( Message::class )->setMethods( [ 'fetchMessage' ] )
+                       ->disableOriginalConstructor()
+                       ->getMock();
+               $msg->expects( $this->any() )->method( 'fetchMessage' )->willReturn( $message );
+               /** @var Message $msg */
+               $this->assertSame( $expect, $msg->$format() );
+               $this->assertSame( $expect, $msg->toString(), 'toString is unaffected by previous call' );
+               $this->assertSame( $expectImplicit, $msg->__toString() );
+               $this->assertSame( $expect, $msg->toString(), 'toString is unaffected by __toString' );
        }
 
        /**
         * @covers Message::inLanguage
         */
        public function testInLanguage() {
-               $this->assertEquals( 'Main Page', wfMessage( 'mainpage' )->inLanguage( 'en' )->text() );
-               $this->assertEquals( 'Заглавная страница',
+               $this->assertSame( 'Main Page', wfMessage( 'mainpage' )->inLanguage( 'en' )->text() );
+               $this->assertSame( 'Заглавная страница',
                        wfMessage( 'mainpage' )->inLanguage( 'ru' )->text() );
 
                // NOTE: make sure internal caching of the message text is reset appropriately
                $msg = wfMessage( 'mainpage' );
-               $this->assertEquals( 'Main Page', $msg->inLanguage( Language::factory( 'en' ) )->text() );
-               $this->assertEquals(
+               $this->assertSame( 'Main Page', $msg->inLanguage( Language::factory( 'en' ) )->text() );
+               $this->assertSame(
                        'Заглавная страница',
                        $msg->inLanguage( Language::factory( 'ru' ) )->text()
                );
@@ -278,19 +315,19 @@ class MessageTest extends MediaWikiLangTestCase {
         * @covers Message::rawParams
         */
        public function testRawParams() {
-               $this->assertEquals(
+               $this->assertSame(
                        '(Заглавная страница)',
                        wfMessage( 'parentheses', 'Заглавная страница' )->plain()
                );
-               $this->assertEquals(
+               $this->assertSame(
                        '(Заглавная страница $1)',
                        wfMessage( 'parentheses', 'Заглавная страница $1' )->plain()
                );
-               $this->assertEquals(
+               $this->assertSame(
                        '(Заглавная страница)',
                        wfMessage( 'parentheses' )->rawParams( 'Заглавная страница' )->plain()
                );
-               $this->assertEquals(
+               $this->assertSame(
                        '(Заглавная страница $1)',
                        wfMessage( 'parentheses' )->rawParams( 'Заглавная страница $1' )->plain()
                );
@@ -302,8 +339,8 @@ class MessageTest extends MediaWikiLangTestCase {
         */
        public function testRawMessage() {
                $msg = new RawMessage( 'example &' );
-               $this->assertEquals( 'example &', $msg->plain() );
-               $this->assertEquals( 'example &amp;', $msg->escaped() );
+               $this->assertSame( 'example &', $msg->plain() );
+               $this->assertSame( 'example &amp;', $msg->escaped() );
        }
 
        /**
@@ -315,7 +352,7 @@ class MessageTest extends MediaWikiLangTestCase {
                $msg = new RawMessage( '$1$2$3$4$5$6$7$8$9$10$11$12' );
                // One less than above has placeholders
                $params = [ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k' ];
-               $this->assertEquals(
+               $this->assertSame(
                        'abcdefghijka2',
                        $msg->params( $params )->plain(),
                        'Params > 9 are replaced correctly'
@@ -323,7 +360,7 @@ class MessageTest extends MediaWikiLangTestCase {
 
                $msg = new RawMessage( 'Params$*' );
                $params = [ 'ab', 'bc', 'cd' ];
-               $this->assertEquals(
+               $this->assertSame(
                        'Params: ab, bc, cd',
                        $msg->params( $params )->text()
                );
@@ -337,7 +374,7 @@ class MessageTest extends MediaWikiLangTestCase {
                $lang = Language::factory( 'en' );
                $msg = new RawMessage( '$1' );
 
-               $this->assertEquals(
+               $this->assertSame(
                        $lang->formatNum( 123456.789 ),
                        $msg->inLanguage( $lang )->numParams( 123456.789 )->plain(),
                        'numParams is handled correctly'
@@ -352,7 +389,7 @@ class MessageTest extends MediaWikiLangTestCase {
                $lang = Language::factory( 'en' );
                $msg = new RawMessage( '$1' );
 
-               $this->assertEquals(
+               $this->assertSame(
                        $lang->formatDuration( 1234 ),
                        $msg->inLanguage( $lang )->durationParams( 1234 )->plain(),
                        'durationParams is handled correctly'
@@ -369,7 +406,7 @@ class MessageTest extends MediaWikiLangTestCase {
                $lang = Language::factory( 'en' );
                $msg = new RawMessage( '$1' );
 
-               $this->assertEquals(
+               $this->assertSame(
                        $lang->formatExpiry( wfTimestampNow() ),
                        $msg->inLanguage( $lang )->expiryParams( wfTimestampNow() )->plain(),
                        'expiryParams is handled correctly'
@@ -384,7 +421,7 @@ class MessageTest extends MediaWikiLangTestCase {
                $lang = Language::factory( 'en' );
                $msg = new RawMessage( '$1' );
 
-               $this->assertEquals(
+               $this->assertSame(
                        $lang->formatTimePeriod( 1234 ),
                        $msg->inLanguage( $lang )->timeperiodParams( 1234 )->plain(),
                        'timeperiodParams is handled correctly'
@@ -399,7 +436,7 @@ class MessageTest extends MediaWikiLangTestCase {
                $lang = Language::factory( 'en' );
                $msg = new RawMessage( '$1' );
 
-               $this->assertEquals(
+               $this->assertSame(
                        $lang->formatSize( 123456 ),
                        $msg->inLanguage( $lang )->sizeParams( 123456 )->plain(),
                        'sizeParams is handled correctly'
@@ -414,7 +451,7 @@ class MessageTest extends MediaWikiLangTestCase {
                $lang = Language::factory( 'en' );
                $msg = new RawMessage( '$1' );
 
-               $this->assertEquals(
+               $this->assertSame(
                        $lang->formatBitrate( 123456 ),
                        $msg->inLanguage( $lang )->bitrateParams( 123456 )->plain(),
                        'bitrateParams is handled correctly'
@@ -468,13 +505,41 @@ class MessageTest extends MediaWikiLangTestCase {
                        'one $2',
                        '<div>foo</div> [[Bar]] {{Baz}} &lt;',
                ];
-               $this->assertEquals(
+               $this->assertSame(
                        $expect,
                        $msg->inLanguage( $lang )->plaintextParams( $params )->$format(),
                        "Fail formatting for $format"
                );
        }
 
+       /**
+        * @covers Message::extractParam
+        */
+       public function testMessageAsParam() {
+               $this->setMwGlobals( [
+                       'wgScript' => '/wiki/index.php',
+                       'wgArticlePath' => '/wiki/$1',
+               ] );
+
+               $msg = new Message( 'returnto', [
+                       new Message( 'apihelp-link', [
+                               'foo', new Message( 'mainpage', [], Language::factory( 'en' ) )
+                       ], Language::factory( 'de' ) )
+               ], Language::factory( 'es' ) );
+
+               $this->assertEquals(
+                       'Volver a [[Special:ApiHelp/foo|Página principal]].',
+                       $msg->text(),
+                       'Process with ->text()'
+               );
+               $this->assertEquals(
+                       '<p>Volver a <a href="/wiki/Special:ApiHelp/foo" title="Special:ApiHelp/foo">Página '
+                               . "principal</a>.\n</p>",
+                       $msg->parseAsBlock(),
+                       'Process with ->parseAsBlock()'
+               );
+       }
+
        public static function provideParser() {
                return [
                        [
@@ -509,7 +574,7 @@ class MessageTest extends MediaWikiLangTestCase {
         */
        public function testParser( $expect, $format ) {
                $msg = new RawMessage( "''&'' <x><!-- x -->" );
-               $this->assertEquals(
+               $this->assertSame(
                        $expect,
                        $msg->inLanguage( 'en' )->$format()
                );
@@ -523,9 +588,9 @@ class MessageTest extends MediaWikiLangTestCase {
 
                // NOTE: make sure internal caching of the message text is reset appropriately
                $msg = wfMessage( 'mainpage' );
-               $this->assertEquals( 'Hauptseite', $msg->inLanguage( 'de' )->plain(), "inLanguage( 'de' )" );
-               $this->assertEquals( 'Main Page', $msg->inContentLanguage()->plain(), "inContentLanguage()" );
-               $this->assertEquals( 'Accueil', $msg->inLanguage( 'fr' )->plain(), "inLanguage( 'fr' )" );
+               $this->assertSame( 'Hauptseite', $msg->inLanguage( 'de' )->plain(), "inLanguage( 'de' )" );
+               $this->assertSame( 'Main Page', $msg->inContentLanguage()->plain(), "inContentLanguage()" );
+               $this->assertSame( 'Accueil', $msg->inLanguage( 'fr' )->plain(), "inLanguage( 'fr' )" );
        }
 
        /**
@@ -540,18 +605,18 @@ class MessageTest extends MediaWikiLangTestCase {
                // NOTE: make sure internal caching of the message text is reset appropriately.
                // NOTE: wgForceUIMsgAsContentMsg forces the messages *current* language to be used.
                $msg = wfMessage( 'mainpage' );
-               $this->assertEquals(
+               $this->assertSame(
                        'Accueil',
                        $msg->inContentLanguage()->plain(),
                        'inContentLanguage() with ForceUIMsg override enabled'
                );
-               $this->assertEquals( 'Main Page', $msg->inLanguage( 'en' )->plain(), "inLanguage( 'en' )" );
-               $this->assertEquals(
+               $this->assertSame( 'Main Page', $msg->inLanguage( 'en' )->plain(), "inLanguage( 'en' )" );
+               $this->assertSame(
                        'Main Page',
                        $msg->inContentLanguage()->plain(),
                        'inContentLanguage() with ForceUIMsg override enabled'
                );
-               $this->assertEquals( 'Hauptseite', $msg->inLanguage( 'de' )->plain(), "inLanguage( 'de' )" );
+               $this->assertSame( 'Hauptseite', $msg->inLanguage( 'de' )->plain(), "inLanguage( 'de' )" );
        }
 
        /**
@@ -570,18 +635,18 @@ class MessageTest extends MediaWikiLangTestCase {
                $msg = new Message( 'parentheses' );
                $msg->rawParams( '<a>foo</a>' );
                $msg->title( Title::newFromText( 'Testing' ) );
-               $this->assertEquals( '(<a>foo</a>)', $msg->parse(), 'Sanity check' );
+               $this->assertSame( '(<a>foo</a>)', $msg->parse(), 'Sanity check' );
                $msg = unserialize( serialize( $msg ) );
-               $this->assertEquals( '(<a>foo</a>)', $msg->parse() );
+               $this->assertSame( '(<a>foo</a>)', $msg->parse() );
                $title = TestingAccessWrapper::newFromObject( $msg )->title;
                $this->assertInstanceOf( 'Title', $title );
-               $this->assertEquals( 'Testing', $title->getFullText() );
+               $this->assertSame( 'Testing', $title->getFullText() );
 
                $msg = new Message( 'mainpage' );
                $msg->inLanguage( 'de' );
-               $this->assertEquals( 'Hauptseite', $msg->plain(), 'Sanity check' );
+               $this->assertSame( 'Hauptseite', $msg->plain(), 'Sanity check' );
                $msg = unserialize( serialize( $msg ) );
-               $this->assertEquals( 'Hauptseite', $msg->plain() );
+               $this->assertSame( 'Hauptseite', $msg->plain() );
        }
 
        /**
@@ -614,4 +679,3 @@ class MessageTest extends MediaWikiLangTestCase {
                ];
        }
 }
-
index c637d34..6269872 100644 (file)
@@ -305,6 +305,37 @@ class OutputPageTest extends MediaWikiTestCase {
                $request->setCookie( 'Token', '123' );
                $this->assertTrue( $outputPage->haveCacheVaryCookies() );
        }
+
+       /*
+        * @covers OutputPage::addCategoryLinks
+        * @covers OutputPage::getCategories
+        */
+       function testGetCategories() {
+               $fakeResultWrapper = new FakeResultWrapper( [
+                       (object) [
+                               'pp_value' => 1,
+                               'page_title' => 'Test'
+                       ],
+                       (object) [
+                               'page_title' => 'Test2'
+                       ]
+               ] );
+               $outputPage = $this->getMockBuilder( 'OutputPage' )
+                       ->setConstructorArgs( [ new RequestContext() ] )
+                       ->setMethods( [ 'addCategoryLinksToLBAndGetResult' ] )
+                       ->getMock();
+               $outputPage->expects( $this->any() )
+                       ->method( 'addCategoryLinksToLBAndGetResult' )
+                       ->will( $this->returnValue( $fakeResultWrapper ) );
+
+               $outputPage->addCategoryLinks( [
+                       'Test' => 'Test',
+                       'Test2' => 'Test2',
+               ] );
+               $this->assertEquals( [ 0 => 'Test', '1' => 'Test2' ], $outputPage->getCategories() );
+               $this->assertEquals( [ 0 => 'Test2' ], $outputPage->getCategories( 'normal' ) );
+               $this->assertEquals( [ 0 => 'Test' ], $outputPage->getCategories( 'hidden' ) );
+       }
 }
 
 /**
index a45015a..8764b41 100644 (file)
@@ -5,17 +5,17 @@
  */
 class ApiMessageTest extends MediaWikiTestCase {
 
-       private function compareMessages( $msg, $msg2 ) {
+       private function compareMessages( Message $msg, Message $msg2 ) {
                $this->assertSame( $msg->getKey(), $msg2->getKey(), 'getKey' );
                $this->assertSame( $msg->getKeysToTry(), $msg2->getKeysToTry(), 'getKeysToTry' );
                $this->assertSame( $msg->getParams(), $msg2->getParams(), 'getParams' );
-               $this->assertSame( $msg->getFormat(), $msg2->getFormat(), 'getFormat' );
                $this->assertSame( $msg->getLanguage(), $msg2->getLanguage(), 'getLanguage' );
 
                $msg = TestingAccessWrapper::newFromObject( $msg );
                $msg2 = TestingAccessWrapper::newFromObject( $msg2 );
                $this->assertSame( $msg->interface, $msg2->interface, 'interface' );
                $this->assertSame( $msg->useDatabase, $msg2->useDatabase, 'useDatabase' );
+               $this->assertSame( $msg->format, $msg2->format, 'format' );
                $this->assertSame(
                        $msg->title ? $msg->title->getFullText() : null,
                        $msg2->title ? $msg2->title->getFullText() : null,
index a1cdf7e..a57682b 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace MediaWiki\Auth;
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group AuthManager
  * @covers MediaWiki\Auth\AbstractPasswordPrimaryAuthenticationProvider
@@ -26,7 +28,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                $provider = $this->getMockForAbstractClass(
                        AbstractPasswordPrimaryAuthenticationProvider::class
                );
-               $provider->setConfig( \ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $provider->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
                $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
 
                $obj = $providerPriv->getPasswordFactory();
@@ -38,7 +40,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                $provider = $this->getMockForAbstractClass(
                        AbstractPasswordPrimaryAuthenticationProvider::class
                );
-               $provider->setConfig( \ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $provider->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
                $provider->setLogger( new \Psr\Log\NullLogger() );
                $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
 
@@ -56,7 +58,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                );
                $provider->setConfig( new \MultiConfig( [
                        $config,
-                       \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                ] ) );
                $provider->setLogger( new \Psr\Log\NullLogger() );
                $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
@@ -105,7 +107,7 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                $provider = $this->getMockForAbstractClass(
                        AbstractPasswordPrimaryAuthenticationProvider::class
                );
-               $provider->setConfig( \ConfigFactory::getDefaultInstance()->makeConfig( 'main' ) );
+               $provider->setConfig( MediaWikiServices::getInstance()->getMainConfig() );
                $provider->setLogger( new \Psr\Log\NullLogger() );
                $providerPriv = \TestingAccessWrapper::newFromObject( $provider );
 
@@ -121,7 +123,8 @@ class AbstractPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCa
                ] );
 
                $manager = new AuthManager(
-                       new \FauxRequest(), \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       new \FauxRequest(),
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
 
                $provider = $this->getMockForAbstractClass(
index d482453..b96455e 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace MediaWiki\Auth;
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group AuthManager
  * @group Database
@@ -17,7 +19,8 @@ class LegacyHookPreAuthenticationProviderTest extends \MediaWikiTestCase {
                $request->expects( $this->any() )->method( 'getIP' )->will( $this->returnValue( '127.0.0.42' ) );
 
                $manager = new AuthManager(
-                       $request, \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       $request,
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
 
                $provider = new LegacyHookPreAuthenticationProvider();
index caf1680..cb34be2 100644 (file)
@@ -2,6 +2,8 @@
 
 namespace MediaWiki\Auth;
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group AuthManager
  * @group Database
@@ -28,7 +30,7 @@ class LocalPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestCase
                }
                $config = new \MultiConfig( [
                        $this->config,
-                       \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                ] );
 
                if ( !$this->manager ) {
index d4ebe34..bc7d65e 100644 (file)
@@ -2,6 +2,7 @@
 
 namespace MediaWiki\Auth;
 
+use MediaWiki\MediaWikiServices;
 use Wikimedia\ScopedCallback;
 
 /**
@@ -32,7 +33,7 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                }
                $config = new \MultiConfig( [
                        $this->config,
-                       \ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                ] );
 
                if ( !$this->manager ) {
@@ -520,10 +521,6 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                $provider = $this->getProvider( [ 'emailEnabled' => false ] );
                $status = $provider->providerAllowsAuthenticationDataChange( $req, true );
                $this->assertEquals( \StatusValue::newFatal( 'passwordreset-emaildisabled' ), $status );
-               $req->hasBackchannel = true;
-               $status = $provider->providerAllowsAuthenticationDataChange( $req, true );
-               $this->assertFalse( $status->hasMessage( 'passwordreset-emaildisabled' ) );
-               $req->hasBackchannel = false;
 
                $provider = $this->getProvider( [ 'passwordReminderResendTime' => 10 ] );
                $status = $provider->providerAllowsAuthenticationDataChange( $req, true );
@@ -686,18 +683,10 @@ class TemporaryPasswordPrimaryAuthenticationProviderTest extends \MediaWikiTestC
                $provider = $this->getProvider( [ 'emailEnabled' => false ] );
                $status = $provider->testForAccountCreation( $user, $creator, [ $req ] );
                $this->assertEquals( \StatusValue::newFatal( 'emaildisabled' ), $status );
-               $req->hasBackchannel = true;
-               $status = $provider->testForAccountCreation( $user, $creator, [ $req ] );
-               $this->assertFalse( $status->hasMessage( 'emaildisabled' ) );
-               $req->hasBackchannel = false;
 
                $provider = $this->getProvider( [ 'emailEnabled' => true ] );
                $status = $provider->testForAccountCreation( $user, $creator, [ $req ] );
                $this->assertEquals( \StatusValue::newFatal( 'noemailcreate' ), $status );
-               $req->hasBackchannel = true;
-               $status = $provider->testForAccountCreation( $user, $creator, [ $req ] );
-               $this->assertFalse( $status->hasMessage( 'noemailcreate' ) );
-               $req->hasBackchannel = false;
 
                $user->setEmail( 'test@localhost.localdomain' );
                $status = $provider->testForAccountCreation( $user, $creator, [ $req ] );
index 5806003..c945885 100644 (file)
@@ -196,7 +196,7 @@ class ThrottlerTest extends \MediaWikiTestCase {
                        ->setMethods( [ 'log' ] )
                        ->getMockForAbstractClass();
                $logger->expects( $this->once() )->method( 'log' )->with( $this->anything(), $this->anything(), [
-                       'type' => 'custom',
+                       'throttle' => 'custom',
                        'index' => 0,
                        'ip' => '1.2.3.4',
                        'username' => 'SomeUser',
index 9c723c0..e5bb237 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+use MediaWiki\MediaWikiServices;
 
 /**
  * @group Database
@@ -39,7 +40,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         * @covers GenderCache::getGenderOf
         */
        public function testUserName( $userKey, $expectedGender ) {
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
                $gender = $genderCache->getGenderOf( $username );
                $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
@@ -53,7 +54,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         */
        public function testUserObjects( $userKey, $expectedGender ) {
                $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $gender = $genderCache->getGenderOf( $username );
                $this->assertEquals( $gender, $expectedGender, "GenderCache normal" );
        }
@@ -79,7 +80,7 @@ class GenderCacheTest extends MediaWikiLangTestCase {
         */
        public function testStripSubpages( $userKey, $expectedGender ) {
                $username = isset( self::$nameMap[$userKey] ) ? self::$nameMap[$userKey] : $userKey;
-               $genderCache = GenderCache::singleton();
+               $genderCache = MediaWikiServices::getInstance()->getGenderCache();
                $gender = $genderCache->getGenderOf( "$username/subpage" );
                $this->assertEquals( $gender, $expectedGender, "GenderCache must strip of subpages" );
        }
index 697eb2d..ed82153 100644 (file)
@@ -61,14 +61,14 @@ class LocalisationCacheTest extends MediaWikiTestCase {
 
        public function testRecacheFallbacks() {
                $lc = $this->getMockLocalisationCache();
-               $lc->recache( 'uk' );
+               $lc->recache( 'ba' );
                $this->assertEquals(
                        [
-                               'present-uk' => 'uk',
+                               'present-ba' => 'ba',
                                'present-ru' => 'ru',
                                'present-en' => 'en',
                        ],
-                       $lc->getItem( 'uk', 'messages' ),
+                       $lc->getItem( 'ba', 'messages' ),
                        'Fallbacks are only used to fill missing data'
                );
        }
@@ -84,7 +84,7 @@ class LocalisationCacheTest extends MediaWikiTestCase {
                                        array &$cache
                                ) {
                                        if ( $code === 'ru' ) {
-                                               $cache['messages']['present-uk'] = 'ru-override';
+                                               $cache['messages']['present-ba'] = 'ru-override';
                                                $cache['messages']['present-ru'] = 'ru-override';
                                                $cache['messages']['present-en'] = 'ru-override';
                                        }
@@ -93,14 +93,14 @@ class LocalisationCacheTest extends MediaWikiTestCase {
                ] );
 
                $lc = $this->getMockLocalisationCache();
-               $lc->recache( 'uk' );
+               $lc->recache( 'ba' );
                $this->assertEquals(
                        [
-                               'present-uk' => 'uk',
+                               'present-ba' => 'ba',
                                'present-ru' => 'ru-override',
                                'present-en' => 'ru-override',
                        ],
-                       $lc->getItem( 'uk', 'messages' ),
+                       $lc->getItem( 'ba', 'messages' ),
                        'Updates provided by hooks follow the normal fallback order.'
                );
        }
index f42cb95..8a76618 100644 (file)
@@ -1,5 +1,7 @@
 <?php
 
+use MediaWiki\MediaWikiServices;
+
 class ConfigFactoryTest extends MediaWikiTestCase {
 
        /**
@@ -140,7 +142,7 @@ class ConfigFactoryTest extends MediaWikiTestCase {
        public function testGetDefaultInstance() {
                // NOTE: the global config factory returned here has been overwritten
                // for operation in test mode. It may not reflect LocalSettings.
-               $factory = ConfigFactory::getDefaultInstance();
+               $factory = MediaWikiServices::getInstance()->getConfigFactory();
                $this->assertInstanceOf( 'Config', $factory->makeConfig( 'main' ) );
        }
 
diff --git a/tests/phpunit/includes/debug/logger/monolog/LogstashFormatterTest.php b/tests/phpunit/includes/debug/logger/monolog/LogstashFormatterTest.php
new file mode 100644 (file)
index 0000000..8086b4b
--- /dev/null
@@ -0,0 +1,55 @@
+<?php
+
+namespace MediaWiki\Logger\Monolog;
+
+class LogstashFormatterTest extends \PHPUnit_Framework_TestCase {
+       /**
+        * @dataProvider provideV1
+        * @param array $record The input record.
+        * @param array $expected Associative array of expected keys and their values.
+        * @param array $notExpected List of keys that should not exist.
+        */
+       public function testV1( array $record, array $expected, array $notExpected ) {
+               $formatter = new LogstashFormatter( 'app', 'system', null, null, LogstashFormatter::V1 );
+               $formatted = json_decode( $formatter->format( $record ), true );
+               foreach ( $expected as $key => $value ) {
+                       $this->assertArrayHasKey( $key, $formatted );
+                       $this->assertSame( $value, $formatted[$key] );
+               }
+               foreach ( $notExpected as $key ) {
+                       $this->assertArrayNotHasKey( $key, $formatted );
+               }
+       }
+
+       public function provideV1() {
+               return [
+                       [
+                               [ 'extra' => [ 'foo' => 1 ], 'context' => [ 'bar' => 2 ] ],
+                               [ 'foo' => 1, 'bar' => 2 ],
+                               [ 'logstash_formatter_key_conflict' ],
+                       ],
+                       [
+                               [ 'extra' => [ 'url' => 1 ], 'context' => [ 'url' => 2 ] ],
+                               [ 'url' => 1, 'c_url' => 2, 'logstash_formatter_key_conflict' => [ 'url' ] ],
+                               [],
+                       ],
+                       [
+                               [ 'channel' => 'x', 'context' => [ 'channel' => 'y' ] ],
+                               [ 'channel' => 'x', 'c_channel' => 'y',
+                                       'logstash_formatter_key_conflict' => [ 'channel' ] ],
+                               [],
+                       ],
+               ];
+       }
+
+       public function testV1WithPrefix() {
+               $formatter = new LogstashFormatter( 'app', 'system', null, 'ctx_', LogstashFormatter::V1 );
+               $record = [ 'extra' => [ 'url' => 1 ], 'context' => [ 'url' => 2 ] ];
+               $formatted = json_decode( $formatter->format( $record ), true );
+               $this->assertArrayHasKey( 'url', $formatted );
+               $this->assertSame( 1, $formatted['url'] );
+               $this->assertArrayHasKey( 'ctx_url', $formatted );
+               $this->assertSame( 2, $formatted['ctx_url'] );
+               $this->assertArrayNotHasKey( 'c_url', $formatted );
+       }
+}
index fbabf7f..33e3a25 100644 (file)
@@ -49,9 +49,9 @@ class HtmlAutoCompleteSelectFieldTest extends MediaWikiTestCase {
         */
        function testOptionalSelectElement() {
                $params = [
-                       'fieldname'    => 'Test',
-                       'autocomplete' => $this->options,
-                       'options'      => $this->options,
+                       'fieldname'         => 'Test',
+                       'autocomplete-data' => $this->options,
+                       'options'           => $this->options,
                ];
 
                $field = new HTMLAutoCompleteSelectField( $params );
index dd5b58b..f97716b 100644 (file)
@@ -51,7 +51,7 @@ class HtmlCheckMatrixTest extends MediaWikiTestCase {
 
        public function testValidateAllowsOnlyKnownTags() {
                $field = new HTMLCheckMatrix( self::$defaultOptions );
-               $this->assertInternalType( 'string', $this->validate( $field, [ 'foo' ] ) );
+               $this->assertInstanceOf( Message::class, $this->validate( $field, [ 'foo' ] ) );
        }
 
        public function testValidateAcceptsPartialTagList() {
index 5e3c626..8e06f9e 100644 (file)
@@ -1,4 +1,6 @@
 <?php
+use MediaWiki\MediaWikiServices;
+
 /**
  * Integration test that checks import success and
  * LinkCache integration.
@@ -77,7 +79,7 @@ class ImportLinkCacheIntegrationTest extends MediaWikiTestCase {
 
                $importer = new WikiImporter(
                        $importStreamSource->value,
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
                $importer->setDebug( true );
 
index 9d05d15..53d91c6 100644 (file)
@@ -1,4 +1,5 @@
 <?php
+use MediaWiki\MediaWikiServices;
 
 /**
  * Test class for Import methods.
@@ -25,7 +26,7 @@ class ImportTest extends MediaWikiLangTestCase {
 
                $importer = new WikiImporter(
                        $source,
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
 
                $importer->doImport();
@@ -92,7 +93,7 @@ EOF
 
                $importer = new WikiImporter(
                        $source,
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
                $importer->setPageOutCallback( $callback );
                $importer->doImport();
@@ -175,7 +176,7 @@ EOF
 
                $importer = new WikiImporter(
                        $source,
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' )
+                       MediaWikiServices::getInstance()->getMainConfig()
                );
                $importer->setSiteInfoCallback( $callback );
                $importer->doImport();
index d2a0724..528c322 100644 (file)
@@ -114,22 +114,22 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                                'test.scripts.mixed.user.empty' => 'ready',
                        ],
                        'general' => [
-                               'top' => [ 'test.top' ],
-                               'bottom' => [ 'test' ],
+                               'test',
+                               'test.top',
                        ],
                        'styles' => [
                                'test.styles.mixed',
                                'test.styles.pure',
                        ],
                        'scripts' => [
-                               'top' => [ 'test.scripts.top' ],
-                               'bottom' => [ 'test.scripts' ],
+                               'test.scripts',
+                               'test.scripts.top',
                        ],
                        'embed' => [
                                'styles' => [ 'test.styles.private' ],
                                'general' => [
-                                       'top' => [ 'test.private.top' ],
-                                       'bottom' => [ 'test.private.bottom' ],
+                                       'test.private.bottom',
+                                       'test.private.top',
                                ],
                        ],
                ];
@@ -202,13 +202,7 @@ class ResourceLoaderClientHtmlTest extends PHPUnit_Framework_TestCase {
                        'test.scripts',
                ] );
 
-               // @codingStandardsIgnoreStart Generic.Files.LineLength
-               $expected = '<script>(window.RLQ=window.RLQ||[]).push(function(){'
-                       . 'mw.loader.implement("test.private.bottom@{blankVer}",function($,jQuery,require,module){},{"css":[]});'
-                       . 'mw.loader.load("/w/load.php?debug=false\u0026lang=nl\u0026modules=test.scripts\u0026only=scripts\u0026skin=fallback");'
-                       . 'mw.loader.load(["test"]);'
-                       . '});</script>';
-               // @codingStandardsIgnoreEnd
+               $expected = '';
                $expected = self::expandVariables( $expected );
 
                $this->assertEquals( $expected, $client->getBodyHtml() );
index c24a321..1ecdf21 100644 (file)
@@ -51,6 +51,16 @@ class ResourceLoaderTest extends ResourceLoaderTestCase {
                $this->assertEquals( $module, $resourceLoader->getModule( 'test' ) );
        }
 
+       /**
+        * @covers ResourceLoader::register
+        */
+       public function testRegisterEmptyString() {
+               $module = new ResourceLoaderTestModule();
+               $resourceLoader = new EmptyResourceLoader();
+               $resourceLoader->register( '', $module );
+               $this->assertEquals( $module, $resourceLoader->getModule( '' ) );
+       }
+
        /**
         * @covers ResourceLoader::register
         */
index 145ffb3..f79f6e4 100644 (file)
@@ -57,17 +57,19 @@ class SpecialPageFactoryTest extends MediaWikiTestCase {
                $specialPageTestHelper = new SpecialPageTestHelper();
 
                return [
-                       'class name' => [ 'SpecialAllPages' ],
+                       'class name' => [ 'SpecialAllPages', false ],
                        'closure' => [ function () {
                                return new SpecialAllPages();
-                       } ],
-                       'function' => [ [ $this, 'newSpecialAllPages' ] ],
-                       'callback string' => [ 'SpecialPageTestHelper::newSpecialAllPages' ],
+                       }, false ],
+                       'function' => [ [ $this, 'newSpecialAllPages' ], false ],
+                       'callback string' => [ 'SpecialPageTestHelper::newSpecialAllPages', false ],
                        'callback with object' => [
-                               [ $specialPageTestHelper, 'newSpecialAllPages' ]
+                               [ $specialPageTestHelper, 'newSpecialAllPages' ],
+                               false
                        ],
                        'callback array' => [
-                               [ 'SpecialPageTestHelper', 'newSpecialAllPages' ]
+                               [ 'SpecialPageTestHelper', 'newSpecialAllPages' ],
+                               false
                        ]
                ];
        }
@@ -76,7 +78,7 @@ class SpecialPageFactoryTest extends MediaWikiTestCase {
         * @covers SpecialPageFactory::getPage
         * @dataProvider specialPageProvider
         */
-       public function testGetPage( $spec ) {
+       public function testGetPage( $spec, $shouldReuseInstance ) {
                $this->mergeMwGlobalArrayValue( 'wgSpecialPages', [ 'testdummy' => $spec ] );
                SpecialPageFactory::resetList();
 
@@ -84,7 +86,7 @@ class SpecialPageFactoryTest extends MediaWikiTestCase {
                $this->assertInstanceOf( 'SpecialPage', $page );
 
                $page2 = SpecialPageFactory::getPage( 'testdummy' );
-               $this->assertEquals( true, $page2 === $page, "Should re-use instance:" );
+               $this->assertEquals( $shouldReuseInstance, $page2 === $page, "Should re-use instance:" );
        }
 
        /**
index cc16e5f..c51217c 100644 (file)
@@ -22,9 +22,17 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
        protected $rc;
 
        /** helper to test SpecialRecentchanges::buildMainQueryConds() */
-       private function assertConditions( $expected, $requestOptions = null, $message = '' ) {
+       private function assertConditions(
+               $expected,
+               $requestOptions = null,
+               $message = '',
+               $user = null
+       ) {
                $context = new RequestContext;
                $context->setRequest( new FauxRequest( $requestOptions ) );
+               if ( $user ) {
+                       $context->setUser( $user );
+               }
 
                # setup the rc object
                $this->rc = new SpecialRecentChanges();
@@ -129,4 +137,82 @@ class SpecialRecentchangesTest extends MediaWikiTestCase {
                        [ NS_TALK, NS_MAIN ],
                ];
        }
+
+       public function testRcHidemyselfFilter() {
+               $user = $this->getTestUser()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               0 => "rc_user != '{$user->getId()}'",
+                               1 => "rc_type != '6'",
+                       ],
+                       [
+                               'hidemyself' => 1,
+                       ],
+                       "rc conditions: hidemyself=1 (logged in)",
+                       $user
+               );
+
+               $user = User::newFromName( '10.11.12.13', false );
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               0 => "rc_user_text != '10.11.12.13'",
+                               1 => "rc_type != '6'",
+                       ],
+                       [
+                               'hidemyself' => 1,
+                       ],
+                       "rc conditions: hidemyself=1 (anon)",
+                       $user
+               );
+       }
+
+       public function testRcHidebyothersFilter() {
+               $user = $this->getTestUser()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               0 => "rc_user = '{$user->getId()}'",
+                               1 => "rc_type != '6'",
+                       ],
+                       [
+                               'hidebyothers' => 1,
+                       ],
+                       "rc conditions: hidebyothers=1 (logged in)",
+                       $user
+               );
+
+               $user = User::newFromName( '10.11.12.13', false );
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               0 => "rc_user_text = '10.11.12.13'",
+                               1 => "rc_type != '6'",
+                       ],
+                       [
+                               'hidebyothers' => 1,
+                       ],
+                       "rc conditions: hidebyothers=1 (anon)",
+                       $user
+               );
+       }
+
+       public function testRcHidemyselfHidebyothersFilter() {
+               $user = $this->getTestUser()->getUser();
+               $this->assertConditions(
+                       [ # expected
+                               'rc_bot' => 0,
+                               0 => "rc_user != '{$user->getId()}'",
+                               1 => "rc_user = '{$user->getId()}'",
+                               2 => "rc_type != '6'",
+                       ],
+                       [
+                               'hidemyself' => 1,
+                               'hidebyothers' => 1,
+                       ],
+                       "rc conditions: hidemyself=1 hidebyothers=1 (logged in)",
+                       $user
+               );
+       }
 }
index 4db636b..7ff882a 100644 (file)
@@ -11,7 +11,7 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
         */
        public function testIsAllowed( $passwordResetRoutes, $enableEmail,
                $allowsAuthenticationDataChange, $canEditPrivate, $canSeePassword,
-               $userIsBlocked, $isAllowed, $isAllowedToDisplayPassword
+               $userIsBlocked, $isAllowed
        ) {
                $config = new HashConfig( [
                        'PasswordResetRoutes' => $passwordResetRoutes,
@@ -40,8 +40,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                $passwordReset = new PasswordReset( $config, $authManager );
 
                $this->assertSame( $isAllowed, $passwordReset->isAllowed( $user )->isGood() );
-               $this->assertSame( $isAllowedToDisplayPassword,
-                       $passwordReset->isAllowed( $user, true )->isGood() );
        }
 
        public function provideIsAllowed() {
@@ -54,7 +52,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => true,
                                'userIsBlocked' => false,
                                'isAllowed' => false,
-                               'isAllowedToDisplayPassword' => false,
                        ],
                        [
                                'passwordResetRoutes' => [ 'username' => true ],
@@ -64,7 +61,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => true,
                                'userIsBlocked' => false,
                                'isAllowed' => false,
-                               'isAllowedToDisplayPassword' => false,
                        ],
                        [
                                'passwordResetRoutes' => [ 'username' => true ],
@@ -74,7 +70,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => true,
                                'userIsBlocked' => false,
                                'isAllowed' => false,
-                               'isAllowedToDisplayPassword' => false,
                        ],
                        [
                                'passwordResetRoutes' => [ 'username' => true ],
@@ -84,7 +79,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => true,
                                'userIsBlocked' => false,
                                'isAllowed' => false,
-                               'isAllowedToDisplayPassword' => false,
                        ],
                        [
                                'passwordResetRoutes' => [ 'username' => true ],
@@ -94,7 +88,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => true,
                                'userIsBlocked' => true,
                                'isAllowed' => false,
-                               'isAllowedToDisplayPassword' => false,
                        ],
                        [
                                'passwordResetRoutes' => [ 'username' => true ],
@@ -104,7 +97,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => false,
                                'userIsBlocked' => false,
                                'isAllowed' => true,
-                               'isAllowedToDisplayPassword' => false,
                        ],
                        [
                                'passwordResetRoutes' => [ 'username' => true ],
@@ -114,7 +106,6 @@ class PasswordResetTest extends PHPUnit_Framework_TestCase {
                                'canSeePassword' => true,
                                'userIsBlocked' => false,
                                'isAllowed' => true,
-                               'isAllowedToDisplayPassword' => true,
                        ],
                ];
        }
index 199fc8f..0819bf2 100644 (file)
@@ -3,6 +3,8 @@
 define( 'NS_UNITTEST', 5600 );
 define( 'NS_UNITTEST_TALK', 5601 );
 
+use MediaWiki\MediaWikiServices;
+
 /**
  * @group Database
  */
@@ -347,6 +349,12 @@ class UserTest extends MediaWikiTestCase {
                $user->saveSettings();
 
                $user = User::newFromName( $user->getName() );
+               $user->load( User::READ_LATEST );
+               $this->assertEquals( 'test', $user->getOption( 'userjs-someoption' ) );
+               $this->assertEquals( 200, $user->getOption( 'cols' ) );
+
+               $user = User::newFromName( $user->getName() );
+               MediaWikiServices::getInstance()->getMainWANObjectCache()->clearProcessCache();
                $this->assertEquals( 'test', $user->getOption( 'userjs-someoption' ) );
                $this->assertEquals( 200, $user->getOption( 'cols' ) );
        }
@@ -578,4 +586,162 @@ class UserTest extends MediaWikiTestCase {
                $users->rewind();
                $this->assertTrue( $user->equals( $users->current() ) );
        }
+
+       /**
+        * When a user is autoblocked a cookie is set with which to track them
+        * in case they log out and change IP addresses.
+        * @link https://phabricator.wikimedia.org/T5233
+        */
+       public function testAutoblockCookies() {
+               // Set up the bits of global configuration that we use.
+               $this->setMwGlobals( [
+                       'wgCookieSetOnAutoblock' => true,
+                       'wgCookiePrefix' => 'wmsitetitle',
+               ] );
+
+               // 1. Log in a test user, and block them.
+               $user1tmp = $this->getTestUser()->getUser();
+               $request1 = new FauxRequest();
+               $request1->getSession()->setUser( $user1tmp );
+               $expiryFiveDays = time() + ( 5 * 24 * 60 * 60 );
+               $block = new Block( [
+                       'enableAutoblock' => true,
+                       'expiry' => wfTimestamp( TS_MW, $expiryFiveDays ),
+               ] );
+               $block->setTarget( $user1tmp );
+               $block->insert();
+               $user1 = User::newFromSession( $request1 );
+               $user1->mBlock = $block;
+               $user1->load();
+
+               // Confirm that the block has been applied as required.
+               $this->assertTrue( $user1->isLoggedIn() );
+               $this->assertTrue( $user1->isBlocked() );
+               $this->assertEquals( Block::TYPE_USER, $block->getType() );
+               $this->assertTrue( $block->isAutoblocking() );
+               $this->assertGreaterThanOrEqual( 1, $block->getId() );
+
+               // Test for the desired cookie name, value, and expiry.
+               $cookies = $request1->response()->getCookies();
+               $this->assertArrayHasKey( 'wmsitetitleBlockID', $cookies );
+               $this->assertEquals( $block->getId(), $cookies['wmsitetitleBlockID']['value'] );
+               $this->assertEquals( $expiryFiveDays, $cookies['wmsitetitleBlockID']['expire'] );
+
+               // 2. Create a new request, set the cookies, and see if the (anon) user is blocked.
+               $request2 = new FauxRequest();
+               $request2->setCookie( 'BlockID', $block->getId() );
+               $user2 = User::newFromSession( $request2 );
+               $user2->load();
+               $this->assertNotEquals( $user1->getId(), $user2->getId() );
+               $this->assertNotEquals( $user1->getToken(), $user2->getToken() );
+               $this->assertTrue( $user2->isAnon() );
+               $this->assertFalse( $user2->isLoggedIn() );
+               $this->assertTrue( $user2->isBlocked() );
+               $this->assertEquals( true, $user2->getBlock()->isAutoblocking() ); // Non-strict type-check.
+               // Can't directly compare the objects becuase of member type differences.
+               // One day this will work: $this->assertEquals( $block, $user2->getBlock() );
+               $this->assertEquals( $block->getId(), $user2->getBlock()->getId() );
+               $this->assertEquals( $block->getExpiry(), $user2->getBlock()->getExpiry() );
+
+               // 3. Finally, set up a request as a new user, and the block should still be applied.
+               $user3tmp = $this->getTestUser()->getUser();
+               $request3 = new FauxRequest();
+               $request3->getSession()->setUser( $user3tmp );
+               $request3->setCookie( 'BlockID', $block->getId() );
+               $user3 = User::newFromSession( $request3 );
+               $user3->load();
+               $this->assertTrue( $user3->isLoggedIn() );
+               $this->assertTrue( $user3->isBlocked() );
+               $this->assertEquals( true, $user3->getBlock()->isAutoblocking() ); // Non-strict type-check.
+
+               // Clean up.
+               $block->delete();
+       }
+
+       /**
+        * Make sure that no cookie is set to track autoblocked users
+        * when $wgCookieSetOnAutoblock is false.
+        */
+       public function testAutoblockCookiesDisabled() {
+               // Set up the bits of global configuration that we use.
+               $this->setMwGlobals( [
+                       'wgCookieSetOnAutoblock' => false,
+                       'wgCookiePrefix' => 'wm_no_cookies',
+               ] );
+
+               // 1. Log in a test user, and block them.
+               $testUser = $this->getTestUser()->getUser();
+               $request1 = new FauxRequest();
+               $request1->getSession()->setUser( $testUser );
+               $block = new Block( [ 'enableAutoblock' => true ] );
+               $block->setTarget( $testUser );
+               $block->insert();
+               $user = User::newFromSession( $request1 );
+               $user->mBlock = $block;
+               $user->load();
+
+               // 2. Test that the cookie IS NOT present.
+               $this->assertTrue( $user->isLoggedIn() );
+               $this->assertTrue( $user->isBlocked() );
+               $this->assertEquals( Block::TYPE_USER, $block->getType() );
+               $this->assertTrue( $block->isAutoblocking() );
+               $this->assertGreaterThanOrEqual( 1, $user->getBlockId() );
+               $this->assertGreaterThanOrEqual( $block->getId(), $user->getBlockId() );
+               $cookies = $request1->response()->getCookies();
+               $this->assertArrayNotHasKey( 'wm_no_cookiesBlockID', $cookies );
+
+               // Clean up.
+               $block->delete();
+       }
+
+       /**
+        * When a user is autoblocked and a cookie is set to track them, the expiry time of the cookie
+        * should match the block's expiry. If the block is infinite, the cookie expiry time should
+        * match $wgCookieExpiration. If the expiry time is changed, the cookie's should change with it.
+        */
+       public function testAutoblockCookieInfiniteExpiry() {
+               $cookieExpiration = 20 * 24 * 60 * 60; // 20 days
+               $this->setMwGlobals( [
+                       'wgCookieSetOnAutoblock' => true,
+                       'wgCookieExpiration' => $cookieExpiration,
+                       'wgCookiePrefix' => 'wm_infinite_block',
+               ] );
+               // 1. Log in a test user, and block them indefinitely.
+               $user1Tmp = $this->getTestUser()->getUser();
+               $request1 = new FauxRequest();
+               $request1->getSession()->setUser( $user1Tmp );
+               $block = new Block( [ 'enableAutoblock' => true, 'expiry' => 'infinity' ] );
+               $block->setTarget( $user1Tmp );
+               $block->insert();
+               $user1 = User::newFromSession( $request1 );
+               $user1->mBlock = $block;
+               $user1->load();
+
+               // 2. Test the cookie's expiry timestamp.
+               $this->assertTrue( $user1->isLoggedIn() );
+               $this->assertTrue( $user1->isBlocked() );
+               $this->assertEquals( Block::TYPE_USER, $block->getType() );
+               $this->assertTrue( $block->isAutoblocking() );
+               $this->assertGreaterThanOrEqual( 1, $user1->getBlockId() );
+               $cookies = $request1->response()->getCookies();
+               // Calculate the expected cookie expiry date.
+               $this->assertArrayHasKey( 'wm_infinite_blockBlockID', $cookies );
+               $this->assertEquals( time() + $cookieExpiration, $cookies['wm_infinite_blockBlockID']['expire'] );
+
+               // 3. Change the block's expiry (to 2 days), and the cookie's should be changed also.
+               $newExpiry = time() + 2 * 24 * 60 * 60;
+               $block->mExpiry = wfTimestamp( TS_MW, $newExpiry );
+               $block->update();
+               $user2tmp = $this->getTestUser()->getUser();
+               $request2 = new FauxRequest();
+               $request2->getSession()->setUser( $user2tmp );
+               $user2 = User::newFromSession( $request2 );
+               $user2->mBlock = $block;
+               $user2->load();
+               $cookies = $request2->response()->getCookies();
+               $this->assertEquals( $newExpiry, $cookies['wm_infinite_blockBlockID']['expire'] );
+
+               // Clean up.
+               $block->delete();
+       }
 }
index bd10856..cbf94d6 100644 (file)
@@ -5,6 +5,7 @@
 // without changing the visibility and without working around hacks in
 // Maintenance.php
 // For the same reason, we cannot just use FakeMaintenance.
+use MediaWiki\MediaWikiServices;
 
 /**
  * makes parts of the API of Maintenance that is hidden by protected visibily
@@ -826,7 +827,7 @@ class MaintenanceTest extends MediaWikiTestCase {
        public function testGetConfig() {
                $this->assertInstanceOf( 'Config', $this->m->getConfig() );
                $this->assertSame(
-                       ConfigFactory::getDefaultInstance()->makeConfig( 'main' ),
+                       MediaWikiServices::getInstance()->getMainConfig(),
                        $this->m->getConfig()
                );
        }
index 2049e38..bc5a6bd 100644 (file)
@@ -137,6 +137,8 @@ class ApiDocumentationTest extends MediaWikiTestCase {
 
                // Messages for examples.
                foreach ( $module->getExamplesMessages() as $qs => $msg ) {
+                       $this->assertStringStartsNotWith( 'api.php?', $qs,
+                               "Query string must not begin with 'api.php?'" );
                        $this->checkMessage( $msg, "Example $qs" );
                }
        }
index 16299aa..11a25c4 100644 (file)
@@ -43,6 +43,9 @@
                <testsuite name="structure">
                        <directory>structure</directory>
                </testsuite>
+               <testsuite name="tests">
+                       <directory>tests</directory>
+               </testsuite>
                <testsuite name="uploadfromurl">
                        <file>suites/UploadFromUrlTestSuite.php</file>
                </testsuite>
index 5d2f37e..edc81ff 100644 (file)
@@ -9,8 +9,6 @@ use Psr\Log\LoggerInterface;
  */
 class MediaWikiTestCaseTest extends MediaWikiTestCase {
 
-       const GLOBAL_KEY_NONEXISTING = 'MediaWikiTestCaseTestGLOBAL-NONExisting';
-
        private static $startGlobals = [
                'MediaWikiTestCaseTestGLOBAL-ExistingString' => 'foo',
                'MediaWikiTestCaseTestGLOBAL-ExistingStringEmpty' => '',
@@ -90,14 +88,22 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
 
        /**
         * @covers MediaWikiTestCase::stashMwGlobals
+        * @covers MediaWikiTestCase::tearDown
         */
-       public function testExceptionThrownWhenStashingNonExistentGlobals() {
-               $this->setExpectedException(
-                       'Exception',
-                       'Global with key ' . self::GLOBAL_KEY_NONEXISTING . ' doesn\'t exist and cant be stashed'
+       public function testSetNonExistentGlobalsAreUnsetOnTearDown() {
+               $globalKey = 'abcdefg1234567';
+               $this->setMwGlobals( $globalKey, true );
+               $this->assertTrue(
+                       $GLOBALS[$globalKey],
+                       'Global failed to correctly set'
                );
 
-               $this->stashMwGlobals( self::GLOBAL_KEY_NONEXISTING );
+               $this->tearDown();
+
+               $this->assertFalse(
+                       isset( $GLOBALS[$globalKey] ),
+                       'Global failed to be correctly unset'
+               );
        }
 
        public function testOverrideMwServices() {
@@ -132,10 +138,9 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
 
        /**
         * @covers MediaWikiTestCase::setLogger
-        * @covers MediaWikiTestCase::restoreLogger
+        * @covers MediaWikiTestCase::restoreLoggers
         */
-       public function testLoggersAreRestoredOnTearDown() {
-               // replacing an existing logger
+       public function testLoggersAreRestoredOnTearDown_replacingExistingLogger() {
                $logger1 = LoggerFactory::getInstance( 'foo' );
                $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
                $logger2 = LoggerFactory::getInstance( 'foo' );
@@ -144,17 +149,27 @@ class MediaWikiTestCaseTest extends MediaWikiTestCase {
 
                $this->assertSame( $logger1, $logger3 );
                $this->assertNotSame( $logger1, $logger2 );
+       }
 
-               // replacing a non-existing logger
+       /**
+        * @covers MediaWikiTestCase::setLogger
+        * @covers MediaWikiTestCase::restoreLoggers
+        */
+       public function testLoggersAreRestoredOnTearDown_replacingNonExistingLogger() {
                $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
-               $logger1 = LoggerFactory::getInstance( 'bar' );
+               $logger1 = LoggerFactory::getInstance( 'foo' );
                $this->tearDown();
-               $logger2 = LoggerFactory::getInstance( 'bar' );
+               $logger2 = LoggerFactory::getInstance( 'foo' );
 
                $this->assertNotSame( $logger1, $logger2 );
                $this->assertInstanceOf( '\Psr\Log\LoggerInterface', $logger2 );
+       }
 
-               // replacing same logger twice
+       /**
+        * @covers MediaWikiTestCase::setLogger
+        * @covers MediaWikiTestCase::restoreLoggers
+        */
+       public function testLoggersAreRestoredOnTearDown_replacingSameLoggerTwice() {
                $logger1 = LoggerFactory::getInstance( 'baz' );
                $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
                $this->setLogger( 'foo', $this->getMock( LoggerInterface::class ) );
index b79c192..0b28684 100644 (file)
@@ -25,6 +25,9 @@
        // killing the test and assuming timeout failure.
        QUnit.config.testTimeout = 60 * 1000;
 
+       // Reduce default animation duration from 400ms to 0ms for unit tests
+       $.fx.speeds._default = 0;
+
        // Add a checkbox to QUnit header to toggle MediaWiki ResourceLoader debug mode.
        QUnit.config.urlConfig.push( {
                id: 'debug',
index 9afd793..ca6a512 100644 (file)
@@ -1,18 +1,15 @@
 ( function ( $ ) {
-       QUnit.module( 'jquery.color', QUnit.newMwEnvironment( {
-               setup: function () {
-                       this.clock = this.sandbox.useFakeTimers();
-               }
-       } ) );
+       QUnit.module( 'jquery.color', QUnit.newMwEnvironment() );
 
-       QUnit.test( 'animate', 1, function ( assert ) {
-               var $canvas = $( '<div>' ).css( 'background-color', '#fff' );
+       QUnit.test( 'animate', function ( assert ) {
+               var done = assert.async(),
+                       $canvas = $( '<div>' ).css( 'background-color', '#fff' ).appendTo( '#qunit-fixture' );
 
-               $canvas.animate( { backgroundColor: '#000' }, 10 ).promise().then( function () {
-                       var endColors = $.colorUtil.getRGB( $canvas.css( 'background-color' ) );
-                       assert.deepEqual( endColors, [ 0, 0, 0 ], 'end state' );
-               } );
-
-               this.clock.tick( 20 );
+               $canvas.animate( { 'background-color': '#000' }, 3 ).promise()
+                       .done( function () {
+                               var endColors = $.colorUtil.getRGB( $canvas.css( 'background-color' ) );
+                               assert.deepEqual( endColors, [ 0, 0, 0 ], 'end state' );
+                       } )
+                       .always( done );
        } );
 }( jQuery ) );
index c51e409..9c7660f 100644 (file)
@@ -1,11 +1,7 @@
 ( function ( mw, $ ) {
        var loremIpsum = 'Lorem ipsum dolor sit amet, consectetuer adipiscing elit.';
 
-       QUnit.module( 'jquery.makeCollapsible', QUnit.newMwEnvironment( {
-               setup: function () {
-                       this.clock = this.sandbox.useFakeTimers();
-               }
-       } ) );
+       QUnit.module( 'jquery.makeCollapsible', QUnit.newMwEnvironment() );
 
        function prepareCollapsible( html, options ) {
                return $( $.parseHTML( html ) )
 
                        // ...expanding happens here
                        $toggle.trigger( 'click' );
-                       test.clock.tick( 500 );
                } );
 
                // ...collapsing happens here
                $toggle.trigger( 'click' );
-               test.clock.tick( 500 );
        } );
 
        QUnit.test( 'basic operation (<div>)', 5, function ( assert ) {
                        } );
 
                        $toggle.trigger( 'click' );
-                       test.clock.tick( 500 );
                } );
 
                $toggle.trigger( 'click' );
-               test.clock.tick( 500 );
        } );
 
        QUnit.test( 'basic operation (<table>)', 7, function ( assert ) {
                        } );
 
                        $toggle.trigger( 'click' );
-                       test.clock.tick( 500 );
                } );
 
                $toggle.trigger( 'click' );
-               test.clock.tick( 500 );
        } );
 
        function tableWithCaptionTest( $collapsible, test, assert ) {
                        } );
 
                        $toggle.trigger( 'click' );
-                       test.clock.tick( 500 );
                } );
 
                $toggle.trigger( 'click' );
-               test.clock.tick( 500 );
        }
 
        QUnit.test( 'basic operation (<table> with caption)', 10, function ( assert ) {
                        } );
 
                        $toggle.trigger( 'click' );
-                       test.clock.tick( 500 );
                } );
 
                $toggle.trigger( 'click' );
-               test.clock.tick( 500 );
        }
 
        QUnit.test( 'basic operation (<ul>)', 7, function ( assert ) {
                } );
 
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
-               this.clock.tick( 500 );
        } );
 
        QUnit.test( 'initial collapse (options.collapsed)', 2, function ( assert ) {
                } );
 
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
-               this.clock.tick( 500 );
        } );
 
        QUnit.test( 'clicks on links inside toggler pass through (options.linksPassthru)', 2, function ( assert ) {
                } );
 
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
-               this.clock.tick( 500 );
        } );
 
        QUnit.test( 'collapse/expand text (options.collapseText, options.expandText)', 2, function ( assert ) {
                } );
 
                $collapsible.find( '.mw-collapsible-toggle' ).trigger( 'click' );
-               this.clock.tick( 500 );
        } );
 
        QUnit.test( 'cloned collapsibles can be made collapsible again', 2, function ( assert ) {
                } );
 
                $clone.find( '.mw-collapsible-toggle a' ).trigger( 'click' );
-               test.clock.tick( 500 );
        } );
 }( mediaWiki, jQuery ) );
index 9d0fdf5..1676130 100644 (file)
@@ -3,16 +3,10 @@
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
                        this.server.respondImmediately = true;
-                       this.clock = this.sandbox.useFakeTimers();
-               },
-               teardown: function () {
-                       // https://github.com/jquery/jquery/issues/2453
-                       this.clock.tick();
                }
        } ) );
 
-       QUnit.test( 'origin is included in GET requests', function ( assert ) {
-               QUnit.expect( 1 );
+       QUnit.test( 'origin is included in GET requests', 1, function ( assert ) {
                var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
 
                this.server.respond( function ( request ) {
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
 
-               api.get( {} );
+               return api.get( {} );
        } );
 
-       QUnit.test( 'origin is included in POST requests', function ( assert ) {
-               QUnit.expect( 2 );
+       QUnit.test( 'origin is included in POST requests', 2, function ( assert ) {
                var api = new mw.ForeignApi( '//localhost:4242/w/api.php' );
 
                this.server.respond( function ( request ) {
@@ -33,7 +26,7 @@
                        request.respond( 200, { 'Content-Type': 'application/json' }, '[]' );
                } );
 
-               api.post( {} );
+               return api.post( {} );
        } );
 
 }( mediaWiki ) );
index a0c7daf..a79bff6 100644 (file)
@@ -2,29 +2,24 @@
        QUnit.module( 'mediawiki.api.category', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
                }
        } ) );
 
-       QUnit.test( '.getCategoriesByPrefix()', function ( assert ) {
-               QUnit.expect( 1 );
+       QUnit.test( '.getCategoriesByPrefix()', 1, function ( assert ) {
+               this.server.respondWith( [ 200, { 'Content-Type': 'application/json' },
+                       '{ "query": { "allpages": [ ' +
+                               '{ "title": "Category:Food" },' +
+                               '{ "title": "Category:Fool Supermarine S.6" },' +
+                               '{ "title": "Category:Fools" }' +
+                               '] } }'
+               ] );
 
-               var api = new mw.Api();
-
-               api.getCategoriesByPrefix( 'Foo' ).done( function ( matches ) {
+               return new mw.Api().getCategoriesByPrefix( 'Foo' ).then( function ( matches ) {
                        assert.deepEqual(
                                matches,
                                [ 'Food', 'Fool Supermarine S.6', 'Fools' ]
                        );
                } );
-
-               this.server.respond( function ( req ) {
-                       req.respond( 200, { 'Content-Type': 'application/json' },
-                               '{ "query": { "allpages": [ ' +
-                                       '{ "title": "Category:Food" },' +
-                                       '{ "title": "Category:Fool Supermarine S.6" },' +
-                                       '{ "title": "Category:Fools" }' +
-                                       '] } }'
-                       );
-               } );
        } );
 }( mediaWiki ) );
index 5880962..d8b5db8 100644 (file)
@@ -2,14 +2,21 @@
        QUnit.module( 'mediawiki.api.messages', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
                }
        } ) );
 
-       QUnit.test( '.getMessages()', function ( assert ) {
-               QUnit.expect( 1 );
+       QUnit.test( '.getMessages()', 1, function ( assert ) {
+               this.server.respondWith( /ammessages=foo%7Cbaz/, [
+                       200,
+                       { 'Content-Type': 'application/json' },
+                       '{ "query": { "allmessages": [' +
+                               '{ "name": "foo", "content": "Foo bar" },' +
+                               '{ "name": "baz", "content": "Baz Quux" }' +
+                               '] } }'
+               ] );
 
-               var api = new mw.Api();
-               api.getMessages( [ 'foo', 'baz' ] ).then( function ( messages ) {
+               return new mw.Api().getMessages( [ 'foo', 'baz' ] ).then( function ( messages ) {
                        assert.deepEqual(
                                messages,
                                {
                                }
                        );
                } );
-
-               this.server.respond( /ammessages=foo%7Cbaz/, [
-                       200,
-                       { 'Content-Type': 'application/json' },
-                       '{ "query": { "allmessages": [' +
-                               '{ "name": "foo", "content": "Foo bar" },' +
-                               '{ "name": "baz", "content": "Baz Quux" }' +
-                               '] } }'
-               ] );
        } );
 }( mediaWiki ) );
index 0797f32..7ed1875 100644 (file)
@@ -2,14 +2,12 @@
        QUnit.module( 'mediawiki.api.options', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
                }
        } ) );
 
-       QUnit.test( 'saveOption', function ( assert ) {
-               QUnit.expect( 2 );
-
-               var
-                       api = new mw.Api(),
+       QUnit.test( 'saveOption', 2, function ( assert ) {
+               var api = new mw.Api(),
                        stub = this.sandbox.stub( mw.Api.prototype, 'saveOptions' );
 
                api.saveOption( 'foo', 'bar' );
@@ -18,9 +16,7 @@
                assert.deepEqual( stub.getCall( 0 ).args, [ { foo: 'bar' } ], '#saveOptions called correctly' );
        } );
 
-       QUnit.test( 'saveOptions without Unit Separator', function ( assert ) {
-               QUnit.expect( 13 );
-
+       QUnit.test( 'saveOptions without Unit Separator', 13, function ( assert ) {
                var api = new mw.Api( { useUS: false } );
 
                // We need to respond to the request for token first, otherwise the other requests won't be sent
                                '{ "query": { "tokens": { "csrftoken": "+\\\\" } } }' ]
                );
 
-               api.saveOptions( {} ).done( function () {
-                       assert.ok( true, 'Request completed: empty case' );
-               } );
-               api.saveOptions( { foo: 'bar' } ).done( function () {
-                       assert.ok( true, 'Request completed: simple' );
-               } );
-               api.saveOptions( { foo: 'bar', baz: 'quux' } ).done( function () {
-                       assert.ok( true, 'Request completed: two options' );
-               } );
-               api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', baz: 'quux' } ).done( function () {
-                       assert.ok( true, 'Request completed: not bundleable' );
-               } );
-               api.saveOptions( { foo: null } ).done( function () {
-                       assert.ok( true, 'Request completed: reset an option' );
-               } );
-               api.saveOptions( { 'foo|bar=quux': null } ).done( function () {
-                       assert.ok( true, 'Request completed: reset an option, not bundleable' );
-               } );
-
                // Requests are POST, match requestBody instead of url
                this.server.respond( function ( request ) {
                        switch ( request.requestBody ) {
                                        assert.ok( false, 'Unexpected request: ' + request.requestBody );
                        }
                } );
-       } );
 
-       QUnit.test( 'saveOptions with Unit Separator', function ( assert ) {
-               QUnit.expect( 14 );
+               return QUnit.whenPromisesComplete(
+                       api.saveOptions( {} ).then( function () {
+                               assert.ok( true, 'Request completed: empty case' );
+                       } ),
+                       api.saveOptions( { foo: 'bar' } ).then( function () {
+                               assert.ok( true, 'Request completed: simple' );
+                       } ),
+                       api.saveOptions( { foo: 'bar', baz: 'quux' } ).then( function () {
+                               assert.ok( true, 'Request completed: two options' );
+                       } ),
+                       api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', baz: 'quux' } ).then( function () {
+                               assert.ok( true, 'Request completed: not bundleable' );
+                       } ),
+                       api.saveOptions( { foo: null } ).then( function () {
+                               assert.ok( true, 'Request completed: reset an option' );
+                       } ),
+                       api.saveOptions( { 'foo|bar=quux': null } ).then( function () {
+                               assert.ok( true, 'Request completed: reset an option, not bundleable' );
+                       } )
+               );
+       } );
 
+       QUnit.test( 'saveOptions with Unit Separator', 14, function ( assert ) {
                var api = new mw.Api( { useUS: true } );
 
                // We need to respond to the request for token first, otherwise the other requests won't be sent
                                '{ "query": { "tokens": { "csrftoken": "+\\\\" } } }' ]
                );
 
-               api.saveOptions( {} ).done( function () {
-                       assert.ok( true, 'Request completed: empty case' );
-               } );
-               api.saveOptions( { foo: 'bar' } ).done( function () {
-                       assert.ok( true, 'Request completed: simple' );
-               } );
-               api.saveOptions( { foo: 'bar', baz: 'quux' } ).done( function () {
-                       assert.ok( true, 'Request completed: two options' );
-               } );
-               api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', baz: 'quux' } ).done( function () {
-                       assert.ok( true, 'Request completed: bundleable with unit separator' );
-               } );
-               api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', 'baz=baz': 'quux' } ).done( function () {
-                       assert.ok( true, 'Request completed: not bundleable with unit separator' );
-               } );
-               api.saveOptions( { foo: null } ).done( function () {
-                       assert.ok( true, 'Request completed: reset an option' );
-               } );
-               api.saveOptions( { 'foo|bar=quux': null } ).done( function () {
-                       assert.ok( true, 'Request completed: reset an option, not bundleable' );
-               } );
-
                // Requests are POST, match requestBody instead of url
                this.server.respond( function ( request ) {
                        switch ( request.requestBody ) {
                                        assert.ok( false, 'Unexpected request: ' + request.requestBody );
                        }
                } );
+
+               return QUnit.whenPromisesComplete(
+                       api.saveOptions( {} ).done( function () {
+                               assert.ok( true, 'Request completed: empty case' );
+                       } ),
+                       api.saveOptions( { foo: 'bar' } ).done( function () {
+                               assert.ok( true, 'Request completed: simple' );
+                       } ),
+                       api.saveOptions( { foo: 'bar', baz: 'quux' } ).done( function () {
+                               assert.ok( true, 'Request completed: two options' );
+                       } ),
+                       api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', baz: 'quux' } ).done( function () {
+                               assert.ok( true, 'Request completed: bundleable with unit separator' );
+                       } ),
+                       api.saveOptions( { foo: 'bar|quux', bar: 'a|b|c', 'baz=baz': 'quux' } ).done( function () {
+                               assert.ok( true, 'Request completed: not bundleable with unit separator' );
+                       } ),
+                       api.saveOptions( { foo: null } ).done( function () {
+                               assert.ok( true, 'Request completed: reset an option' );
+                       } ),
+                       api.saveOptions( { 'foo|bar=quux': null } ).done( function () {
+                               assert.ok( true, 'Request completed: reset an option, not bundleable' );
+                       } )
+               );
        } );
 }( mediaWiki ) );
index dc0cff4..7d27352 100644 (file)
@@ -2,42 +2,44 @@
        QUnit.module( 'mediawiki.api.parse', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
                }
        } ) );
 
-       QUnit.test( 'Hello world', function ( assert ) {
-               QUnit.expect( 3 );
+       QUnit.test( '.parse( string )', function ( assert ) {
+               this.server.respondWith( /action=parse.*&text='''Hello(\+|%20)world'''/, [ 200,
+                       { 'Content-Type': 'application/json' },
+                       '{ "parse": { "text": "<p><b>Hello world</b></p>" } }'
+               ] );
 
-               var api = new mw.Api();
-
-               api.parse( '\'\'\'Hello world\'\'\'' ).done( function ( html ) {
+               return new mw.Api().parse( '\'\'\'Hello world\'\'\'' ).done( function ( html ) {
                        assert.equal( html, '<p><b>Hello world</b></p>', 'Parse wikitext by string' );
                } );
+       } );
 
-               api.parse( {
+       QUnit.test( '.parse( Object.toString )', function ( assert ) {
+               this.server.respondWith( /action=parse.*&text='''Hello(\+|%20)world'''/, [ 200,
+                       { 'Content-Type': 'application/json' },
+                       '{ "parse": { "text": "<p><b>Hello world</b></p>" } }'
+               ] );
+
+               return new mw.Api().parse( {
                        toString: function () {
                                return '\'\'\'Hello world\'\'\'';
                        }
                } ).done( function ( html ) {
                        assert.equal( html, '<p><b>Hello world</b></p>', 'Parse wikitext by toString object' );
                } );
+       } );
 
-               this.server.respondWith( /action=parse.*&text='''Hello\+world'''/, function ( request ) {
-                       request.respond( 200, { 'Content-Type': 'application/json' },
-                               '{ "parse": { "text": "<p><b>Hello world</b></p>" } }'
-                       );
-               } );
+       QUnit.test( '.parse( mw.Title )', function ( assert ) {
+               this.server.respondWith( /action=parse.*&page=Earth/, [ 200,
+                       { 'Content-Type': 'application/json' },
+                       '{ "parse": { "text": "<p><b>Earth</b> is a planet.</p>" } }'
+               ] );
 
-               api.parse( new mw.Title( 'Earth' ) ).done( function ( html ) {
+               return new mw.Api().parse( new mw.Title( 'Earth' ) ).done( function ( html ) {
                        assert.equal( html, '<p><b>Earth</b> is a planet.</p>', 'Parse page by Title object'  );
                } );
-
-               this.server.respondWith( /action=parse.*&page=Earth/, function ( request ) {
-                       request.respond( 200, { 'Content-Type': 'application/json' },
-                               '{ "parse": { "text": "<p><b>Earth</b> is a planet.</p>" } }'
-                       );
-               } );
-
-               this.server.respond();
        } );
 }( mediaWiki ) );
index 10fcd5d..b1bd12b 100644 (file)
@@ -1,8 +1,7 @@
 ( function ( mw, $ ) {
        QUnit.module( 'mediawiki.api.upload', QUnit.newMwEnvironment( {} ) );
 
-       QUnit.test( 'Basic functionality', function ( assert ) {
-               QUnit.expect( 2 );
+       QUnit.test( 'Basic functionality', 2, function ( assert ) {
                var api = new mw.Api();
                assert.ok( api.upload );
                assert.throws( function () {
@@ -10,8 +9,7 @@
                } );
        } );
 
-       QUnit.test( 'Set up iframe upload', function ( assert ) {
-               QUnit.expect( 5 );
+       QUnit.test( 'Set up iframe upload', 5, function ( assert ) {
                var $iframe, $form, $input,
                        api = new mw.Api();
 
index 64a5184..8641469 100644 (file)
@@ -2,37 +2,45 @@
        QUnit.module( 'mediawiki.api.watch', QUnit.newMwEnvironment( {
                setup: function () {
                        this.server = this.sandbox.useFakeServer();
+                       this.server.respondImmediately = true;
                }
        } ) );
 
-       QUnit.test( '.watch()', function ( assert ) {
-               QUnit.expect( 4 );
-
-               var api = new mw.Api();
-
-               // Ensure we don't mistake a single item array for a single item and vice versa.
-               // The query parameter in request is the same either way (separated by pipe).
-               api.watch( 'Foo' ).done( function ( item ) {
-                       assert.equal( item.title, 'Foo' );
-               } );
-
-               api.watch( [ 'Foo' ] ).done( function ( items ) {
-                       assert.equal( items[ 0 ].title, 'Foo' );
+       QUnit.test( '.watch( string )', function ( assert ) {
+               this.server.respond( function ( req ) {
+                       // Match POST requestBody
+                       if ( /action=watch.*&titles=Foo(&|$)/.test( req.requestBody ) ) {
+                               req.respond( 200, { 'Content-Type': 'application/json' },
+                                       '{ "watch": [ { "title": "Foo", "watched": true, "message": "<b>Added</b>" } ] }'
+                               );
+                       }
                } );
 
-               api.watch( [ 'Foo', 'Bar' ] ).done( function ( items ) {
-                       assert.equal( items[ 0 ].title, 'Foo' );
-                       assert.equal( items[ 1 ].title, 'Bar' );
+               return new mw.Api().watch( 'Foo' ).done( function ( item ) {
+                       assert.equal( item.title, 'Foo' );
                } );
+       } );
 
-               // Requests are POST, match requestBody instead of url
+       // Ensure we don't mistake a single item array for a single item and vice versa.
+       // The query parameter in request is the same either way (separated by pipe).
+       QUnit.test( '.watch( Array ) - single', function ( assert ) {
                this.server.respond( function ( req ) {
+                       // Match POST requestBody
                        if ( /action=watch.*&titles=Foo(&|$)/.test( req.requestBody ) ) {
                                req.respond( 200, { 'Content-Type': 'application/json' },
                                        '{ "watch": [ { "title": "Foo", "watched": true, "message": "<b>Added</b>" } ] }'
                                );
                        }
+               } );
+
+               return new mw.Api().watch( [ 'Foo' ] ).done( function ( items ) {
+                       assert.equal( items[ 0 ].title, 'Foo' );
+               } );
+       } );
 
+       QUnit.test( '.watch( Array ) - multi', function ( assert ) {
+               this.server.respond( function ( req ) {
+                       // Match POST requestBody
                        if ( /action=watch.*&titles=Foo%7CBar/.test( req.requestBody ) ) {
                                req.respond( 200, { 'Content-Type': 'application/json' },
                                        '{ "watch": [ ' +
                                );
                        }
                } );
+
+               return new mw.Api().watch( [ 'Foo', 'Bar' ] ).done( function ( items ) {
+                       assert.equal( items[ 0 ].title, 'Foo' );
+                       assert.equal( items[ 1 ].title, 'Bar' );
+               } );
        } );
+
 }( mediaWiki ) );
index 886e2b6..124c49f 100644 (file)
@@ -1,4 +1,3 @@
-/*jshint -W024 */
 ( function ( mw, $ ) {
        var repeat = function ( input, multiplier ) {
                return new Array( multiplier + 1 ).join( input );
                }, 'Throw error on empty string' );
        } );
 
-       QUnit.test( 'Case-sensivity', 3, function ( assert ) {
+       QUnit.test( 'Case-sensivity', 5, function ( assert ) {
                var title;
 
                // Default config
                title = new mw.Title( 'article' );
                assert.equal( title.toString(), 'Article', 'Default config: No sensitive namespaces by default. First-letter becomes uppercase' );
 
+               title = new mw.Title( 'ß' );
+               assert.equal( title.toString(), 'ß', 'Uppercasing matches PHP behaviour (ß -> ß, not SS)' );
+
+               title = new mw.Title( 'dž (digraph)' );
+               assert.equal( title.toString(), 'Dž_(digraph)', 'Uppercasing matches PHP behaviour (dž -> Dž, not DŽ)' );
+
                // $wgCapitalLinks = false;
                mw.config.set( 'wgCaseSensitiveNamespaces', [ 0, -2, 1, 4, 5, 6, 7, 10, 11, 12, 13, 14, 15 ] );
 
index b12803d..97185fc 100644 (file)
@@ -1,4 +1,3 @@
-/*jshint -W024 */
 ( function ( mw, $ ) {
        QUnit.module( 'mediawiki.Uri', QUnit.newMwEnvironment( {
                setup: function () {
index caaef83..7a00943 100644 (file)
        QUnit.test( 'Match PHP parser', mw.libs.phpParserData.tests.length, function ( assert ) {
                mw.messages.set( mw.libs.phpParserData.messages );
                var tasks = $.map( mw.libs.phpParserData.tests, function ( test ) {
+                       var done = assert.async();
                        return function ( next, abort ) {
-                               var done = assert.async();
                                getMwLanguage( test.lang )
                                        .then( function ( langClass ) {
                                                mw.config.set( 'wgUserLanguage', test.lang );
 
                assert.equal(
                        formatParse( 'uses-missing-int' ),
-                       '[doesnt-exist]',
+                       '⧼doesnt-exist⧽',
                        'int: where nested message does not exist'
                );
        } );
                mw.messages.set( 'formatnum-msg', '{{formatnum:$1}}' );
                mw.messages.set( 'formatnum-msg-int', '{{formatnum:$1|R}}' );
                var queue = $.map( formatnumTests, function ( test ) {
+                       var done = assert.async();
                        return function ( next, abort ) {
-                               var done = assert.async();
                                getMwLanguage( test.lang )
                                        .then( function ( langClass ) {
                                                mw.config.set( 'wgUserLanguage', test.lang );
index 7233a2e..92ee7dd 100644 (file)
                .done( function () {
                        assert.strictEqual( isAwesomeDone, true, 'test.promise module should\'ve caused isAwesomeDone to be true' );
                        delete mw.loader.testCallback;
-
                } )
                .fail( function () {
                        assert.ok( false, 'Error callback fired while loader.using "test.promise" module' );
                } );
        } );
 
+       QUnit.test( '.using() Error: Circular dependency', function ( assert ) {
+               var done = assert.async();
+
+               mw.loader.register( [
+                       [ 'test.circle1', '0', [ 'test.circle2' ] ],
+                       [ 'test.circle2', '0', [ 'test.circle3' ] ],
+                       [ 'test.circle3', '0', [ 'test.circle1' ] ]
+               ] );
+               mw.loader.using( 'test.circle3' ).then(
+                       function done() {
+                               assert.ok( false, 'Unexpected resolution, expected error.' );
+                       },
+                       function fail( e ) {
+                               assert.ok( /Circular/.test( String( e ) ), 'Detect circular dependency' );
+                       }
+               )
+               .always( done );
+       } );
+
+       QUnit.test( '.load() - Error: Circular dependency', function ( assert ) {
+               mw.loader.register( [
+                       [ 'test.circleA', '0', [ 'test.circleB' ] ],
+                       [ 'test.circleB', '0', [ 'test.circleC' ] ],
+                       [ 'test.circleC', '0', [ 'test.circleA' ] ]
+               ] );
+               assert.throws( function () {
+                       mw.loader.load( 'test.circleC' );
+               }, /Circular/, 'Detect circular dependency' );
+       } );
+
+       QUnit.test( '.using() - Error: Unregistered', function ( assert ) {
+               var done = assert.async();
+
+               mw.loader.using( 'test.using.unreg' ).then(
+                       function done() {
+                               assert.ok( false, 'Unexpected resolution, expected error.' );
+                       },
+                       function fail( e ) {
+                               assert.ok( /Unknown/.test( String( e ) ), 'Detect unknown dependency' );
+                       }
+               ).always( done );
+       } );
+
+       QUnit.test( '.load() - Error: Unregistered (ignored)', 0, function ( assert ) {
+               mw.loader.load( 'test.using.unreg2' );
+       } );
+
        QUnit.test( '.implement( styles={ "css": [text, ..] } )', 2, function ( assert ) {
                var $element = $( '<div class="mw-test-implement-a"></div>' ).appendTo( '#qunit-fixture' );
 
                assert.strictEqual( mw.track.callCount, 1 );
        } );
 
-       QUnit.test( 'Circular dependency', 1, function ( assert ) {
-               mw.loader.register( [
-                       [ 'test.circle1', '0', [ 'test.circle2' ] ],
-                       [ 'test.circle2', '0', [ 'test.circle3' ] ],
-                       [ 'test.circle3', '0', [ 'test.circle1' ] ]
-               ] );
-               assert.throws( function () {
-                       mw.loader.using( 'test.circle3' );
-               }, /Circular/, 'Detect circular dependency' );
-       } );
-
        QUnit.test( 'Out-of-order implementation', 9, function ( assert ) {
                mw.loader.register( [
                        [ 'test.module4', '0' ],
                mw.loader.load( target );
        } );
 
+       QUnit.test( 'Empty string module name - T28804', function ( assert ) {
+               var done = false;
+
+               assert.strictEqual( mw.loader.getState( '' ), null, 'State (unregistered)' );
+
+               mw.loader.register( '', 'v1' );
+               assert.strictEqual( mw.loader.getState( '' ), 'registered', 'State (registered)' );
+               assert.strictEqual( mw.loader.getVersion( '' ), 'v1', 'Version' );
+
+               mw.loader.implement( '', function () {
+                       done = true;
+               } );
+
+               return mw.loader.using( '', function () {
+                       assert.strictEqual( done, true, 'script ran' );
+                       assert.strictEqual( mw.loader.getState( '' ), 'ready', 'State (ready)' );
+               } );
+       } );
+
        QUnit.test( 'Executing race - T112232', 2, function ( assert ) {
                var done = false;
 
index 1518a80..bac8274 100644 (file)
@@ -1,4 +1,3 @@
-/*jshint -W024 */
 ( function ( mw ) {
        var specialCharactersPageName,
                // Can't mock SITENAME since jqueryMsg caches it at load
                goodbye = mw.message( 'goodbye' );
                assert.strictEqual( goodbye.exists(), false, 'Message.exists returns false for nonexistent messages' );
 
-               assertMultipleFormats( [ 'goodbye' ], [ 'plain', 'text' ], '<goodbye>', 'Message.toString returns <key> if key does not exist' );
-               // bug 30684
-               assertMultipleFormats( [ 'goodbye' ], [ 'parse', 'escaped' ], '&lt;goodbye&gt;', 'Message.toString returns properly escaped &lt;key&gt; if key does not exist' );
+               assertMultipleFormats( [ 'good<>bye' ], [ 'plain', 'text', 'parse', 'escaped' ], '⧼good&lt;&gt;bye⧽', 'Message.toString returns ⧼key⧽ if key does not exist' );
 
                assert.ok( mw.messages.set( 'plural-test-msg', 'There {{PLURAL:$1|is|are}} $1 {{PLURAL:$1|result|results}}' ), 'mw.messages.set: Register' );
                assertMultipleFormats( [ 'plural-test-msg', 6 ], [ 'text', 'parse', 'escaped' ], 'There are 6 results', 'plural get resolved' );
        QUnit.test( 'mw.msg', 14, function ( assert ) {
                assert.ok( mw.messages.set( 'hello', 'Hello <b>awesome</b> world' ), 'mw.messages.set: Register' );
                assert.equal( mw.msg( 'hello' ), 'Hello <b>awesome</b> world', 'Gets message with default options (existing message)' );
-               assert.equal( mw.msg( 'goodbye' ), '<goodbye>', 'Gets message with default options (nonexistent message)' );
+               assert.equal( mw.msg( 'goodbye' ), '⧼goodbye⧽', 'Gets message with default options (nonexistent message)' );
 
                assert.ok( mw.messages.set( 'plural-item', 'Found $1 {{PLURAL:$1|item|items}}' ), 'mw.messages.set: Register' );
                assert.equal( mw.msg( 'plural-item', 5 ), 'Found 5 items', 'Apply plural for count 5' );
index fca25c5..c38b89c 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -341,6 +341,7 @@ function wfStreamThumb( array $params ) {
        // Check for thumbnail generation errors...
        $msg = wfMessage( 'thumbnail_error' );
        $errorCode = 500;
+
        if ( !$thumb ) {
                $errorMsg = $errorMsg ?: $msg->rawParams( 'File::transform() returned false' )->escaped();
                if ( $errorMsg instanceof MessageSpecifier &&
@@ -350,6 +351,7 @@ function wfStreamThumb( array $params ) {
                }
        } elseif ( $thumb->isError() ) {
                $errorMsg = $thumb->getHtmlMsg();
+               $errorCode = $thumb->getHttpStatusCode();
        } elseif ( !$thumb->hasFile() ) {
                $errorMsg = $msg->rawParams( 'No path supplied in thumbnail object' )->escaped();
        } elseif ( $thumb->fileIsSource() ) {